{"version":3,"file":"static/js/11.f65415b9223efef83aa5.chunk.js","mappings":"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","sources":["webpack://Msdyn365.Commerce.Online/./src/modules/gift-with-purchase/gift-with-purchase.tsx?4361","webpack://Msdyn365.Commerce.Online/./src/modules/gift-with-purchase/gift-with-purchase.view.tsx?55d6","webpack://Msdyn365.Commerce.Online/./src/themes/venchi/utilities/popup/Popup.tsx?8e42","webpack://Msdyn365.Commerce.Online/./src/themes/venchi/views/components/cartlineitem.component.tsx?e58f","webpack://Msdyn365.Commerce.Online/./src/themes/venchi/views/components/product.component.tsx?a3c6","webpack://Msdyn365.Commerce.Online/./src/themes/venchi/views/product-collection.view.tsx?495a","webpack://Msdyn365.Commerce.Online/./src/themes/venchi/views/search-result-container.view.tsx?5f49","webpack://Msdyn365.Commerce.Online/./src/modules/active-image-utilities/active-product.tsx?69b2","webpack://Msdyn365.Commerce.Online/./src/modules/active-image-utilities/additional-content.tsx?6946","webpack://Msdyn365.Commerce.Online/./src/modules/active-image-utilities/image-mapper.tsx?dd86","webpack://Msdyn365.Commerce.Online/./src/modules/active-image/active-image.tsx?00d3","webpack://Msdyn365.Commerce.Online/./src/modules/active-image/active-image.view.tsx?a935","webpack://Msdyn365.Commerce.Online/./src/modules/carousel/carousel.tsx?80d4","webpack://Msdyn365.Commerce.Online/./src/modules/carousel/carousel.view.tsx?d82f","webpack://Msdyn365.Commerce.Online/./src/validate-cart.ts?cd50","webpack://Msdyn365.Commerce.Online/./src/Common/get-product.ts?0a21","webpack://Msdyn365.Commerce.Online/./src/modules/cart/actions/get-pickup-options-for-cartlines.ts?acad","webpack://Msdyn365.Commerce.Online/./src/modules/cart/components/cart-pick-up-in-store.tsx?dca8","webpack://Msdyn365.Commerce.Online/./src/modules/cart/components/cart-line-items.tsx?f6b2","webpack://Msdyn365.Commerce.Online/./src/modules/cart/components/cart-line-groups.tsx?f076","webpack://Msdyn365.Commerce.Online/./src/modules/cart/utils/get-promotion-in-cart.ts?4195","webpack://Msdyn365.Commerce.Online/./src/modules/cart/cart.tsx?d4e4","webpack://Msdyn365.Commerce.Online/./src/modules/cart/components/cart-line-items-promotion.tsx?80d9","webpack://Msdyn365.Commerce.Online/./src/modules/cart/cart.view.tsx?d8c2","webpack://Msdyn365.Commerce.Online/./src/modules/fabrikam/views/components/cartlineitem.component.tsx?eb8c","webpack://Msdyn365.Commerce.Online/./src/modules/fabrikam/views/components/promocode.component.tsx?d9d6","webpack://Msdyn365.Commerce.Online/./src/invoice-summary-lineitem.tsx?5f61","webpack://Msdyn365.Commerce.Online/./src/order-summary-lineitem.tsx?8a98","webpack://Msdyn365.Commerce.Online/./src/modules/order-template-list/components/order-template-list.tsx?86c4","webpack://Msdyn365.Commerce.Online/./src/modules/order-template-list/components/orderTemplateList-status-message.tsx?183c","webpack://Msdyn365.Commerce.Online/./src/modules/order-template-list/components/create-order-template.tsx?ea38","webpack://Msdyn365.Commerce.Online/./src/modules/order-template-list/order-template-list.tsx?18d0","webpack://Msdyn365.Commerce.Online/./src/modules/order-template-list/order-template-list.view.tsx?103b","webpack://Msdyn365.Commerce.Online/./src/modules/order-template/components/add-line/spinner.tsx?b423","webpack://Msdyn365.Commerce.Online/./src/modules/order-template/components/add-line/add-line.tsx?5f8a","webpack://Msdyn365.Commerce.Online/./src/modules/order-template/components/add-line/dropdown.tsx?1cba","webpack://Msdyn365.Commerce.Online/./src/modules/order-template/components/add-line/not-found.tsx?392d","webpack://Msdyn365.Commerce.Online/./src/modules/order-template/components/common/order-template-quantity.tsx?99a1","webpack://Msdyn365.Commerce.Online/./src/modules/order-template/components/add-line/product-configuration.tsx?b256","webpack://Msdyn365.Commerce.Online/./src/modules/order-template/components/add-line/product-list.tsx?4284","webpack://Msdyn365.Commerce.Online/./src/modules/order-template/components/bulk-actions.tsx?dbe8","webpack://Msdyn365.Commerce.Online/./src/modules/order-template/components/order-template-actions.tsx?8136","webpack://Msdyn365.Commerce.Online/./src/modules/order-template/components/order-template-lines.tsx?3703","webpack://Msdyn365.Commerce.Online/./src/modules/order-template/components/order-template-lines-status-message.tsx?2986","webpack://Msdyn365.Commerce.Online/./src/modules/order-template/components/order-template-table-heading.tsx?665c","webpack://Msdyn365.Commerce.Online/./src/modules/order-template/order-template.tsx?4ecb","webpack://Msdyn365.Commerce.Online/./src/modules/order-template/order-template.view.tsx?a45e","webpack://Msdyn365.Commerce.Online/./src/modules/product-collection/product-collection.tsx?4008","webpack://Msdyn365.Commerce.Online/./src/modules/product-collection/product-collection.view.tsx?5d36","webpack://Msdyn365.Commerce.Online/./src/modules/quick-order/components/quick-order-drawer.tsx?f8b4","webpack://Msdyn365.Commerce.Online/./src/modules/quick-order/components/quick-order-form.tsx?eb54","webpack://Msdyn365.Commerce.Online/./src/modules/quick-order/components/quick-order-product.ts?7702","webpack://Msdyn365.Commerce.Online/./src/modules/quick-order/components/quick-order-table/components/quick-order-table-header-component.tsx?49e7","webpack://Msdyn365.Commerce.Online/./src/modules/quick-order/components/quick-order-table/components/quick-order-table-row-component.tsx?e487","webpack://Msdyn365.Commerce.Online/./src/modules/quick-order/components/quick-order-table/quick-order-table-component.tsx?46c1","webpack://Msdyn365.Commerce.Online/./src/modules/quick-order/quick-order.tsx?ef21","webpack://Msdyn365.Commerce.Online/./src/modules/quick-order/quick-order.view.tsx?a96d","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/utilities.ts?8569","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/choice-summary.tsx?3f71","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/error-message.tsx?6302","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/feature-search-result-item.tsx?71fa","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/link.tsx?52c2","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/modal.tsx?d78e","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/product-search-result-items.tsx?5174","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/range-refine-item.tsx?6288","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/refine-item.tsx?a594","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/range-refine-item-input.tsx?09aa","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/refine-submenu.tsx?1292","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/separator.tsx?4ea6","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/title.tsx?c269","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/search-result-container.tsx?7500","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/search-result-container.view.tsx?b779","webpack://Msdyn365.Commerce.Online/./src/search-state.ts?dd10","webpack://Msdyn365.Commerce.Online/./src/modules/search/actions/get-auto-suggest-suggestions.ts?4735","webpack://Msdyn365.Commerce.Online/./src/modules/search/components/search.categorysuggest.tsx?c65d","webpack://Msdyn365.Commerce.Online/./src/modules/search/components/search.form.tsx?25a5","webpack://Msdyn365.Commerce.Online/./src/modules/search/components/search.keywordsuggest.tsx?297c","webpack://Msdyn365.Commerce.Online/./src/modules/search/components/search.label.tsx?0c17","webpack://Msdyn365.Commerce.Online/./src/modules/search/components/search.productsuggest.tsx?2af9","webpack://Msdyn365.Commerce.Online/./src/modules/search/search.tsx?72fb","webpack://Msdyn365.Commerce.Online/./src/modules/search/search.view.tsx?1505","webpack://Msdyn365.Commerce.Online/./src/modules/video-player/components/additional-content.tsx?b368","webpack://Msdyn365.Commerce.Online/./src/modules/video-player/video-player.tsx?53e5","webpack://Msdyn365.Commerce.Online/./src/modules/video-player/video-player.view.tsx?fedb","webpack://Msdyn365.Commerce.Online/./src/modules/adventureworks/views/components/product-v2.component.tsx?d155","webpack://Msdyn365.Commerce.Online/./src/modules/adventureworks/views/components/product.component.tsx?fd23","webpack://Msdyn365.Commerce.Online/./src/modules/adventureworks/views/search-result-container-v2.view.tsx?6eaa","webpack://Msdyn365.Commerce.Online/./src/modules/adventureworks/views/search-result-container.view.tsx?6e86"],"sourcesContent":["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// import {\r\n// ArrayExtensions,\r\n// IProductInventoryInformation,\r\n// ProductAvailabilitiesForSelectedVariantInput,\r\n// getProductAvailabilitiesForSelectedVariant\r\n// // ProductInput,\r\n// // getSimpleProductsAction\r\n// } from '@msdyn365-commerce-modules/retail-actions';\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","/*!\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\nimport ProductComponent from '../../themes/venchi/views/components/product.component';\r\n\r\nconst GiftWithPurchaseView: React.FC = (props: IGiftWithPurchaseViewProps) => {\r\n const { promotionProps, modalVisible, context, config } = props;\r\n if (!promotionProps) {\r\n return null;\r\n }\r\n const tempProducts = promotionProps && promotionProps.productSelection && promotionProps.productSelection.length > 0 && (\r\n
    \r\n {promotionProps.productSelection.map((product: ProductSearchResult, index: number) => (\r\n
  • \r\n {promotionProps.gwpType === GiftWithPurchaseType.AUTO ? (\r\n

    \r\n +{promotionProps.numberProductsOfGift} {config.modalFreeLabel?.toUpperCase()}\r\n

    \r\n ) : null}\r\n
    \r\n \r\n
    \r\n
  • \r\n ))}\r\n
\r\n );\r\n return (\r\n \r\n {config.modalHeader}\r\n
\r\n \r\n
\r\n

{config.modalMainText}

\r\n {tempProducts}\r\n
\r\n
\r\n
\r\n \r\n );\r\n};\r\n\r\nexport default GiftWithPurchaseView;\r\n","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","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 {\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
\r\n \r\n {DimensionStrings.colorString}:\r\n {productDimension.DimensionValue && productDimension.DimensionValue.Value}\r\n \r\n
\r\n );\r\n }\r\n\r\n if (productDimension.DimensionTypeValue === 2) {\r\n return (\r\n
\r\n \r\n {DimensionStrings.configString}:\r\n {productDimension.DimensionValue && productDimension.DimensionValue.Value}\r\n \r\n
\r\n );\r\n }\r\n\r\n if (productDimension.DimensionTypeValue === 3) {\r\n return (\r\n
\r\n \r\n {DimensionStrings.sizeString}:\r\n {productDimension.DimensionValue && productDimension.DimensionValue.Value}\r\n \r\n
\r\n );\r\n }\r\n\r\n if (productDimension.DimensionTypeValue === 4) {\r\n return (\r\n
\r\n \r\n {Product.IsGiftCard ? DimensionStrings.amountString : DimensionStrings.styleString}:\r\n {productDimension.DimensionValue && productDimension.DimensionValue.Value}\r\n \r\n
\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
\r\n \r\n {offerName}:{` ${props.resources.discountStringText || 'Discount'} `}\r\n \r\n \r\n \r\n \r\n {` (${discountLine.Percentage !== undefined ? discountLine.Percentage : ''}%)`}\r\n
\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 {props.inventoryInformationLabel};\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 \r\n );\r\n return (\r\n <>\r\n \r\n {priceComponent}\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
\r\n \r\n \r\n \r\n \r\n
\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 = (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
\r\n \r\n {props.errorMessage}\r\n
\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 ) ? true : false;\r\n const isItemFree = cartLine.TotalAmount === 0;\r\n if (props.isQuantityEditable && !(isItemGWPAddedAutomatically && isItemFree)) {\r\n nodes.push(\r\n
\r\n
{resources.quantityDisplayString}
\r\n {_generateErrorMessage()}\r\n\r\n \r\n
\r\n );\r\n } else {\r\n nodes.push(\r\n
\r\n \r\n\r\n {_generateErrorMessage()}\r\n\r\n {props.data.cartLine.Quantity}\r\n
\r\n );\r\n }\r\n\r\n nodes.push(\r\n
\r\n \r\n {(props.data.cartLine.DiscountAmount && props.data.cartLine.DiscountAmount > 0 && (\r\n <>\r\n {` ${props.resources.discountStringText ||\r\n 'Discount'} `}\r\n \r\n \r\n )) ||\r\n null}\r\n
\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
0 ? 'pick-mix' : 'default'}`}>\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n {productName}\r\n \r\n {ArrayExtensions.hasElements(productDimensions) ? (\r\n
{productDimensions}
\r\n ) : (\r\n ''\r\n )}\r\n {pmProductsInfo && pmProductsInfo.length > 0 ? (\r\n
    \r\n {pmProductsInfo.map(\r\n pmProduct =>\r\n pmProduct?.name !== '' && (\r\n
  • \r\n {pmProduct?.qty} x {pmProduct?.name}{' '}\r\n {pmProduct?.price}\r\n
  • \r\n )\r\n )}\r\n
\r\n ) : (\r\n ''\r\n )}\r\n
\r\n {props.data.cartLine.ProductId}\r\n {props.data.cartLine.ItemId}\r\n
\r\n
\r\n {productDimensions && productDimensions.length > 0 ? (\r\n
{productDimensions}
\r\n ) : (\r\n ''\r\n )}\r\n
\r\n \r\n
\r\n {renderDisountLines}\r\n {renderInventoryLabel}\r\n {props.showShippingChargesForLineItems &&
{renderShippingLabel}
}\r\n {renderOtherCharges}\r\n
\r\n {_generateQuantityandPrice()}\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default CartLine;\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 {\r\n trackAddToCartFromListing,\r\n trackProductTileClick\r\n} from '../../utilities/datalayer/index';\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}\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}) => {\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 = async () => {\r\n await getEstimatedAvailabilityAsync(\r\n { callerContext: context.actionContext },\r\n { ProductIds: [product.RecordId], DefaultWarehouseOnly: true, QuantityUnitTypeValue: 2 }\r\n )\r\n .then(productAvailabilites => {\r\n if (\r\n productAvailabilites &&\r\n productAvailabilites.ProductWarehouseInventoryAvailabilities &&\r\n productAvailabilites.ProductWarehouseInventoryAvailabilities?.length > 0\r\n ) {\r\n if (product.ItemId !== '99991') {\r\n if (\r\n (productAvailabilites.ProductWarehouseInventoryAvailabilities[0].MaximumPurchasablePhysicalAvailableQuantity ||\r\n 0) <= 0\r\n ) {\r\n setAvailable(false);\r\n setLoading(false);\r\n setAvailableLabel(\r\n productAvailabilites.ProductWarehouseInventoryAvailabilities[0].PhysicalAvailableInventoryLevelLabel ||\r\n 'OUT OF STOCK'\r\n );\r\n } else if (\r\n (productAvailabilites.ProductWarehouseInventoryAvailabilities[0].MaximumPurchasablePhysicalAvailableQuantity ||\r\n 0) >= 1\r\n ) {\r\n setAvailable(true);\r\n setLoading(false);\r\n } else if (\r\n (productAvailabilites.ProductWarehouseInventoryAvailabilities[0].MaximumPurchasablePhysicalAvailableQuantity ||\r\n 0) > 0 &&\r\n (productAvailabilites.ProductWarehouseInventoryAvailabilities[0].MaximumPurchasablePhysicalAvailableQuantity ||\r\n 0) < 1\r\n ) {\r\n // To cover the scenario where Maximum[...]Quantity is 0.5 or so\r\n setAvailable(false);\r\n setLoading(false);\r\n // Without this it would say \"Available\", which it technically is but it also can't be bought\r\n //TODO move in resources\r\n switch (context.request.locale) {\r\n case 'it':\r\n setAvailableLabel('NON DISPONIBILE');\r\n break;\r\n case 'en-GB':\r\n setAvailableLabel('OUT OF STOCK');\r\n break;\r\n case 'en-US':\r\n setAvailableLabel('OUT OF STOCK');\r\n break;\r\n case 'de':\r\n setAvailableLabel('NICHT VERFÜGBAR');\r\n break;\r\n case 'fr':\r\n setAvailableLabel('NON DISPONIBLE');\r\n break;\r\n default:\r\n setAvailableLabel('OUT OF STOCK');\r\n break;\r\n }\r\n }\r\n }\r\n } else {\r\n setAvailable(false);\r\n // Without this it would say \"Available\", which it technically is but it also can't be bought\r\n switch (context.request.locale) {\r\n //TODO move in resources\r\n case 'it':\r\n setAvailableLabel('NON DISPONIBILE');\r\n break;\r\n case 'en-GB':\r\n setAvailableLabel('OUT OF STOCK');\r\n break;\r\n case 'en-US':\r\n setAvailableLabel('OUT OF STOCK');\r\n break;\r\n case 'de':\r\n setAvailableLabel('NICHT VERFÜGBAR');\r\n break;\r\n case 'fr':\r\n setAvailableLabel('NON DISPONIBLE');\r\n break;\r\n default:\r\n setAvailableLabel('OUT OF STOCK');\r\n break;\r\n }\r\n }\r\n })\r\n .catch(err => {\r\n console.error(err);\r\n });\r\n return;\r\n };\r\n\r\n React.useEffect(() => {\r\n void _isAvailable();\r\n }, [product]);\r\n\r\n //FINISHAVAILABILITY\r\n\r\n //GOOGLEANALTICS //TODO MOVE IN NEW DATALAYER CLASS\r\n\r\n const _ontoProductPDP = () => {\r\n trackProductTileClick(\r\n context,\r\n product as SimpleProduct,\r\n productCategoryUserPath ?? '',\r\n productListName ?? ''\r\n );\r\n\r\n //TODO OLD DATALAYER IMPLEMENTATION. AFTER SWITCHING TO V2, remove this one.\r\n const [list_name, category_name] = ['', ''];\r\n const productInfo = {\r\n name: product.Name,\r\n id: product.ItemId, //product SKU\r\n price: product.Price.toFixed(2),\r\n // 'dimension12': product.RecordId, //product ID (microsoft)\r\n list: list_name,\r\n category: category_name\r\n };\r\n window.dataLayer?.push?.({\r\n event: 'productClick',\r\n ecommerce: {\r\n // @ts-ignore\r\n currencyCode: window.___initialData___.requestContext.channel.Currency,\r\n click: {\r\n actionField: { list: list_name },\r\n products: [productInfo]\r\n }\r\n }\r\n });\r\n\r\n // setTimeout(() => {\r\n // window.location.href = productUrl;\r\n // }, 0);\r\n };\r\n //FINISHGA FOR CLICK ON TILE\r\n\r\n //ADDTOCART\r\n //TODO MOVE THIS INTO NEW DATALAYER CLASS\r\n const _onAddSelectionToBag = async (event: React.MouseEvent): Promise => {\r\n event?.stopPropagation();\r\n event?.preventDefault();\r\n //TODO CHANGE\r\n const [list_name, category_name] = ['', ''];\r\n var productInfo = {\r\n name: product.Name,\r\n id: product.ItemId, //product SKU\r\n price: product.Price.toFixed(2),\r\n quantity: 1,\r\n // 'dimension12': product.RecordId, //product ID (microsoft)\r\n category: category_name,\r\n list: list_name\r\n };\r\n //TODO restore way of saving list attribute\r\n // sessionStorage.setItem(product?.ItemId ?? '', category_name + ';' + list_name);\r\n\r\n window.dataLayer?.push?.({\r\n event: 'addToCart',\r\n ecommerce: {\r\n currencyCode: context.request.channel?.Currency,\r\n add: {\r\n actionField: {\r\n list: list_name,\r\n action: 'add'\r\n },\r\n products: [productInfo]\r\n }\r\n }\r\n });\r\n\r\n // Also manage the removal from cart?\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- read config file.\r\n const addToCartBehavior = 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(\r\n context,\r\n product as SimpleProduct,\r\n productCategoryUserPath ?? '',\r\n productListName ?? ''\r\n )\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 //TODO move in resources\r\n let cart_string = '';\r\n switch (context.request.locale) {\r\n case 'it':\r\n cart_string = 'Aggiungi';\r\n break;\r\n case 'en-GB':\r\n cart_string = 'Add';\r\n break;\r\n case 'en-US':\r\n cart_string = 'Add';\r\n break;\r\n case 'fr':\r\n cart_string = 'Ajouter';\r\n break;\r\n case 'de':\r\n cart_string = 'In den';\r\n break;\r\n default:\r\n cart_string = 'Add';\r\n break;\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 let omnibus_string: React.ReactNode;\r\n switch (context.request.locale) {\r\n case 'it':\r\n omnibus_string = 'Prezzo più basso recente:';\r\n break;\r\n case 'en-GB':\r\n omnibus_string = 'Lowest recent price:';\r\n break;\r\n case 'en-us':\r\n omnibus_string = 'Lowest recent price:';\r\n break;\r\n case 'fr':\r\n omnibus_string = 'Prix le plus bas récemment:';\r\n break;\r\n case 'de':\r\n omnibus_string = 'niedrigster aktueller Preis:';\r\n break;\r\n default:\r\n omnibus_string = 'Lowest recent price:';\r\n break;\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 \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 {omnibus_string} \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","/*!\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 {\r\n IProductCollectionViewProps,\r\n IProductComponentViewProps\r\n} from '@msdyn365-commerce-modules/product-collection/src/modules/product-collection/./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 { trackViewItemList } from '../utilities/datalayer/index';\r\n\r\nconst ProductCollectionView: React.FC = 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(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(\r\n 'Product collection content is empty, module wont render.'\r\n );\r\n\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n {heading}\r\n {seeAllButton}\r\n {isCarousel\r\n ? _renderCarousel(SingleSlideCarouselComponentProps, _getProductTiles(props))\r\n : _renderGrid(GridComponentProps, _getProductTiles(props))}\r\n \r\n );\r\n};\r\n\r\nconst _renderCarousel = (carouselContainer: INodeProps, items: IProductComponentViewProps[]): JSX.Element => {\r\n return {items && items.map(_renderProduct)};\r\n};\r\n\r\nconst _renderGrid = (gridContainer: INodeProps, items: IProductComponentViewProps[]): JSX.Element => {\r\n return {items && items.map(_renderProduct)};\r\n};\r\n\r\nconst _renderProduct = (product: IProductComponentViewProps): JSX.Element => {\r\n const { ProductContainer, productComponent } = product;\r\n\r\n return {productComponent};\r\n};\r\n\r\nconst _getProductTiles = (props: IProductCollectionViewProps) : 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 = (props: IProductCollectionViewProps, product: ProductSearchResult, index: number): 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 \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 ISearchResultContainerExtentionProps } 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 {\r\n CartLine,\r\n CommerceProperty,\r\n ProductRefinerValue,\r\n ProductSearchResult,\r\n SimpleProduct,\r\n} 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 {\r\n getCategoryPageString,\r\n getSearchPageString,\r\n} from '../utilities/datalayer/helpers'\r\nimport {\r\n trackAddToCartFromListing,\r\n trackAddVenchiMix,\r\n trackViewItemList,\r\n trackClickFilter,\r\n} from '../utilities/datalayer/index';\r\n\r\nconst SearchResultContainerView: React.FC> = 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(\r\n props.context,\r\n products.filter(p => p) as SimpleProduct[],\r\n listName,\r\n categoryUserPathString\r\n );\r\n }, []);\r\n\r\n const currentFilterCount = props.data.listPageState.result?.activeFilters?.length || 0\r\n\r\n const [isFilterSeen, setIsFilterSeen] = React.useState(false)\r\n const [prevFilterCount, setPrevFilterCount] = React.useState(currentFilterCount)\r\n const [prevFilters, setPrevFilters] = React.useState(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(\r\n item.KeyName,\r\n '',\r\n {\r\n min: Number(currentFilter?.LeftValueBoundString),\r\n max: Number(currentFilter?.RightValueBoundString)\r\n }\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) { // 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(\r\n item.KeyName,\r\n '',\r\n {\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\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\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 \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 introCtn.appendChild(intro);\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(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 window.dataLayer?.push?.({\r\n event: 'addToCart',\r\n ecommerce: {\r\n //@ts-ignore\r\n currencyCode: window.___initialData___.requestContext.channel.Currency,\r\n add: {\r\n actionField: {\r\n list: 'Pick&mix',\r\n action: 'add'\r\n },\r\n products: productsInfo\r\n }\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(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 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(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 ? 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 if (cartLinesUpdated.length) {\r\n await currentCartState.updateCartLines(\r\n {\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 \r\n {/* tslint:disable-next-line:jsx-no-lambda react-this-binding-issue */}\r\n\r\n
{pmCartMessage.message}
\r\n \r\n );\r\n }\r\n\r\n return (\r\n <>\r\n \r\n {/* tslint:disable-next-line:jsx-no-lambda react-this-binding-issue */}\r\n \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
\r\n
\r\n
\r\n {products}\r\n
\r\n
\r\n
\r\n

{props.resources.pickAndMixCartTitle}

\r\n \r\n <>\r\n
\r\n
\r\n
\r\n \r\n {totalItems}\r\n
\r\n
\r\n {props?.context.cultureFormatter.formatCurrency(totalPrice)}\r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n {Object.keys(pmProducts).map((keyName, i) => {\r\n return (\r\n
\r\n
\r\n \r\n
\r\n
\r\n
{pmProducts[keyName]?.Item}
\r\n
Quantity: {pmProducts[keyName]?.Qty}
\r\n
\r\n {props?.context.cultureFormatter.formatCurrency(pmProducts[keyName]?.Price)}\r\n
\r\n
\r\n {pmProducts[keyName]?.Id}\r\n {pmProducts[keyName]?.Description}\r\n
\r\n
\r\n {/* tslint:disable-next-line:jsx-no-lambda */}\r\n removeProductFromPmCart(Number(keyName))}\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\n // if (isMobile) {\r\n // return (\r\n // \r\n // {renderCategoryHierarchy(categoryHierarchy)}\r\n // {renderTitle(TitleViewProps)}\r\n // {choiceSummary}\r\n // {modalToggle}\r\n // {createSearchResultModal(searchResultModal, refineMenu, sortByOptions, isRecoSearchPage)}\r\n // {similarLookProduct}\r\n // \r\n // {errorMessage}\r\n // {products}\r\n // \r\n // {pagination}\r\n // \r\n // );\r\n // }\r\n // return (\r\n // \r\n // \r\n // {categoryHierarchy && renderCategoryHierarchy(categoryHierarchy)}\r\n // {TitleViewProps && renderTitleCount(TitleViewProps)}\r\n // \r\n // \r\n // {refineMenu && renderRefiner(refineMenu)}\r\n // \r\n // {TitleViewProps && renderTitle(TitleViewProps)}\r\n // {choiceSummary}\r\n // {sortByOptions && !isRecoSearchPage && renderSort(sortByOptions)}\r\n // {similarLookProduct}\r\n // \r\n // {errorMessage}\r\n // {products}\r\n // \r\n // {pagination}\r\n // \r\n // \r\n // \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 {renderCategoryHierarchy(categoryHierarchy, data, config.categoryH1Title)}\r\n )}\r\n {/* TODO change categorytitle */}\r\n {TitleViewProps && renderTitle(TitleViewProps, displayTitle || false, isSearchPage || false, categoryH1Title)}\r\n\r\n \r\n \r\n
\r\n {modalToggle}\r\n {refinerStatusCount ?
{refinerStatusCount}
: null}\r\n
\r\n
{TitleViewProps.title.titleCount}
\r\n
\r\n
\r\n \r\n {createSearchResultModal(searchResultModal, refineMenu, choiceSummary, sortByOptions, isRecoSearchPage)}\r\n \r\n
{refineMenu && renderRefiner(refineMenu)}
\r\n \r\n \r\n {TitleViewProps.title.titleCount}\r\n
\r\n {sortByOptions && !isRecoSearchPage && renderSort(sortByOptions)}\r\n
\r\n
\r\n
{choiceSummary}
\r\n {similarLookProduct}\r\n \r\n {errorMessage}\r\n {_getProducts()}\r\n {pagination}\r\n \r\n
\r\n
\r\n
\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 \r\n \r\n {refiners.map((submenu, index) => (\r\n {submenu}\r\n ))}\r\n \r\n \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 {sortByDropDown};\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 \r\n {categoryHierarchyList.map((category, index) => (\r\n \r\n {!categoryHierarchyList[index + 1] && titleOvverride ? (\r\n \r\n {' '}\r\n {titleOvverride || ''}{' '}\r\n \r\n ) : (\r\n category\r\n )}\r\n {categoryHierarchyList && categoryHierarchyList[index + 1] && categoryHierarchySeparator}\r\n \r\n ))}\r\n \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 \r\n

\r\n {renderPrefix ? title.titlePrefix : null}\r\n {titleOvverride ? titleOvverride : title.titleText}\r\n

\r\n
\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 IProductSearchResultItemsExtended {\r\n products: ProductSearchResult[];\r\n context: ICoreContext;\r\n resources: ISearchResultContainerResources;\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 = ({\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
    \r\n {products.map((product: ProductSearchResult, index: number) => (\r\n
  • \r\n \r\n ArrayExtensions.hasElements(dimensionAvailability) &&\r\n dimensionAvailability[0].masterProductId === product.MasterProductId\r\n )}\r\n productCategoryUserPath={productCategoryUserPath}\r\n productListName={productListName}\r\n />\r\n
  • \r\n ))}\r\n
\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 { 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 { 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 \n {additionalContent.heading}\n \n {additionalContent.text}\n {additionalContent.links}\n \n \n );\n};\n\n/**\n * Render View.\n * @param props - The view props.\n * @returns -The JSX Element.\n */\nexport const activeImageView: React.FC = props => {\n return (\n \n \n {props.imageMapper}\n \n {props.title}\n {props.text}\n {props.additionalContent && renderAdditionalContent(props.additionalContent)}\n \n {props.links}\n \n \n \n \n {props.overlay}\n {props.productCard}\n \n \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 { 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 { 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 = props => (\n \n \n \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 { 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,\n telemetry: ITelemetry,\n propsContext: ICoreContext,\n shouldRetry: boolean = true\n): Promise {\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 {\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 {\n if (cartResult) {\n let isUsingDefaultOrderSettingsMax: boolean = false;\n if (ArrayExtensions.hasElements(products) && isQuantityLimitsFeatureEnabled) {\n const modifiedProduct: SimpleProduct | undefined = products.find(\n (product: SimpleProduct) => product.RecordId === cartLineToUpdate.ProductId\n );\n isUsingDefaultOrderSettingsMax = !!modifiedProduct && !!modifiedProduct.Behavior?.MaximumQuantity;\n } else {\n isUsingDefaultOrderSettingsMax = false;\n }\n\n const input = {\n cartLineId: cartLineToUpdate.LineId!.toString(),\n newQuantity: quantity,\n additionalProperties: { isUsingDefaultOrderSettingsMax }\n };\n\n try {\n const updateLineResult: ICartActionResult = await cartResult.updateCartLineQuantity(input);\n return await AsyncResult.resolve(updateLineResult);\n } catch (error) {\n telemetry.warning((error as Error).message);\n telemetry.debug('Unable to update Cart Line quantity');\n }\n }\n\n return AsyncResult.resolve();\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\n\n/**\n * Find the product in array of products considering product id.\n * @param productId - The searched product id.\n * @param products - The array of products in which search is executed.\n * @returns - The found product.\n */\nexport function getProductByProductId(productId: number | undefined, products?: SimpleProduct[]): SimpleProduct | undefined {\n if (productId !== undefined && ArrayExtensions.hasElements(products)) {\n return products.find(product => {\n return productId === product.RecordId;\n });\n }\n\n return undefined;\n}\n\n/**\n * Find the product in array of products considering product id and product behavior's warehouse.\n * @param productId - The searched product id.\n * @param products - The array of products in which search is executed.\n * @param warehouseId - Warehouse id of cartLine.\n * @param cartState - The cart start in case cart line has no warehouse.\n * @returns - The found product.\n */\nexport function getProductByProductIdAndWarehouse(\n productId: number | undefined,\n products?: SimpleProduct[],\n warehouseId?: string,\n cartState?: ICartState\n): SimpleProduct | undefined {\n const targetWarehouseValue = warehouseId ?? cartState?.cart.WarehouseId;\n\n if (productId !== undefined && ArrayExtensions.hasElements(products)) {\n return products.find(product => {\n return productId === product.RecordId && product.Behavior?.InventoryLocationId === targetWarehouseValue;\n });\n }\n\n return undefined;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\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 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
\n {cartLine.cartline}\n {storeSelector && cartLine.pickUpInStore ? (\n {cartLine.pickUpInStore.defaultComponent}\n ) : null}\n {cartLine.addToOrderTemplate ? (\n \n {cartLine.remove}\n {cartLine.addToWishlist}\n {cartLine.addToOrderTemplate}\n \n ) : (\n <>\n {cartLine.remove}\n {cartLine.addToWishlist}\n \n )}\n
\n );\n });\n }\n return cartDataResult ? (\n
\n

{cartEmptyText}

\n {backToShoppingButton}\n
\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 \n {errorData.header}\n {errorData.errors}\n \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 \n {invoiceSummaryLines.invoices}\n {invoiceSummaryLines.giftCard}\n {invoiceSummaryLines.loyalty}\n {invoiceSummaryLines.orderTotal}\n \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 \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 \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 \n {promotions.promotionMessage}\n {promotions.promotionSeeAllLink}\n {promotions.promotionDialog}\n \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 \n {isBopisSelected ? (\n

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

\n ) : null}\n
\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
\n

\n

{groupTitle}

\n {renderCartLinesGroupTitle(cartLine, titleSeparate)}\n
\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
\n {props.cartLinesGroup.map(cartlines => {\n return (\n
\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
\n );\n })}\n
\n );\n }\n return props.cartDataResult ? (\n
\n
\n

{props.resources.emptyCartText}

\n {props.backToShoppingButton}\n
\n
\n ) : (\n <>{props.waitingComponent}\n );\n};\n\nconst CartView: React.FC = (props: ICartViewProps) => (\n
\n {props.title}\n {!props.cart?.hasInvoiceLine && props.promotionOptions && _renderPromotions(props.promotionOptions)}\n {props.multiplePickUpEnabled ? (\n renderCartLinesGroup(props)\n ) : (\n \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 \n )}\n {props.orderSummaryHeading && (\n \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 {props.expressCheckoutButton}\n ) : null}\n {props.backToShoppingButton}\n {props.createTemplateFromCartButton}\n \n )}\n {props.storeSelector}\n
\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 { 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 {\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 = (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
{catalog.Name}
;\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
\n \n {DimensionStrings.colorString}:\n {productDimension.DimensionValue && productDimension.DimensionValue.Value}\n \n
\n );\n }\n\n if (productDimension.DimensionTypeValue === 2) {\n return (\n
\n \n {DimensionStrings.configString}:\n {productDimension.DimensionValue && productDimension.DimensionValue.Value}\n \n
\n );\n }\n\n if (productDimension.DimensionTypeValue === 3) {\n return (\n
\n \n {DimensionStrings.sizeString}:\n {productDimension.DimensionValue && productDimension.DimensionValue.Value}\n \n
\n );\n }\n\n if (productDimension.DimensionTypeValue === 4) {\n return (\n
\n \n {Product.IsGiftCard ? DimensionStrings.amountString : DimensionStrings.styleString}:\n {productDimension.DimensionValue && productDimension.DimensionValue.Value}\n \n
\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
\n \n {discountLine.OfferName ? discountLine.OfferName : ''}:{` ${props.resources.discountStringText || 'Discount'} `}\n \n \n \n \n {` (${discountLine.EffectivePercentage !== undefined ? discountLine.EffectivePercentage : ''}%)`}\n
\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 {props.inventoryInformationLabel};\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
\n {product.DefaultUnitOfMeasure}\n
\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 \n );\n return (\n <>\n \n {priceComponent}\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
\n \n \n \n \n
\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
{props.resources.salesAgreementPricePrompt}
;\n }\n};\n\n// eslint-disable-next-line no-redeclare\nconst CartLine: React.FC = (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
\n \n {props.errorMessage}\n
\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
\n
{resources.quantityDisplayString}
\n \n
\n );\n } else {\n nodes.push(\n
\n \n {props.data.cartLine.Quantity}\n
\n );\n }\n }\n\n nodes.push(\n
\n \n {(props.data.cartLine.DiscountAmount && props.data.cartLine.DiscountAmount > 0 && (\n <>\n \n {` ${props.resources.discountStringText || 'Discount'} `}\n \n \n \n )) ||\n null}\n
\n );\n\n return nodes;\n };\n\n return (\n <>\n
\n
\n \n
\n
\n
\n \n {MsDyn365.isBrowser ? (\n \n {productName}\n \n ) : null}\n {ArrayExtensions.hasElements(productDimensions) ? (\n
{productDimensions}
\n ) : (\n ''\n )}\n {renderUnitOfMeasure}\n
\n \n
\n {renderDisountLines}\n {renderInventoryLabel}\n {props.showShippingChargesForLineItems &&
{renderShippingLabel}
}\n {renderOtherCharges}\n {renderSalesAgreementPrompt}\n
\n {_generateQuantityandPrice()}\n {props.data.cartLine.IsInvoiceLine && props.data.cartState && props.resources.priceEditorResources && (\n \n )}\n
\n
\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}\n */\nclass PromoCode extends React.Component {\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
\n
{this.props.promoCodeHeadingText}
\n {this._renderForm(this.props.promoPlaceholderText, this.props.promoCodeApplyButtonText, this.props.cart)}\n

\n {this.state.error}\n

\n {this._renderAppliedPromoCode(this.props)}\n
\n );\n }\n\n private readonly _onInputChangeHandler = (e: React.ChangeEvent) => {\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) => {\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
\n
\n \n \n {promoCodeApplyButtonText}\n \n
\n
\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) => {\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
\n
{this.props.appliedPromoCodeHeadingText}
\n \n
\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
\n
\n {coupon.Code}{' '}\n \n
\n \n {props.removePromoText}\n \n
\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 { 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 = ({\n price,\n label,\n context,\n id,\n typeName,\n toBeCalculatedText,\n freeText,\n cssLabel\n}) => {\n return (\n

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

\n );\n};\n\nconst _buildPaymentSummarySection = (\n props: IInvoiceSummaryProps,\n price: number | undefined,\n label: string,\n cssLabel: string\n): React.ReactNode => {\n return (\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 = ({\n price,\n label,\n context,\n id,\n typeName,\n toBeCalculatedText,\n freeText,\n cssLabel,\n priceCurrency\n}) => {\n return (\n

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

\n );\n};\n\nconst _buildOrderSummarySection = (\n props: IOrderSummaryProps,\n price: number | undefined,\n cssLabel: string,\n label: string = ''\n): React.ReactNode => {\n return (\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 { 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
\n \n
\n {orderTemplate.totalLines}\n {` `}\n line items\n
\n
\n
\n ),\n addToCartButton: (\n
\n \n
\n ),\n removeButton: (\n \n ),\n orderTemplateStatusMessage: orderTemplateState && orderTemplateState.isOpen && orderTemplateState.userMessage && (\n
\n \n {orderTemplateState.userMessage}\n \n
\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
\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 \n );\n })}\n
\n );\n }\n return
;\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 = ({ 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 { 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","/*!\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
\n {props?.msg &&
{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 { 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 { 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 { 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 { 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 = 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 \n {heading}\n {seeAllButton}\n {isCarousel ? _renderCarousel(SingleSlideCarouselComponentProps, products) : _renderGrid(GridComponentProps, products)}\n \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 \n {heading}\n {seeAllButton}\n {_renderNoProduct(resources)}\n \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 {items && items.map(_renderProduct)};\n};\n\nconst _renderGrid = (gridContainer: INodeProps, items: IProductComponentViewProps[]): JSX.Element => {\n return {items && items.map(_renderProduct)};\n};\n\nconst _renderNoProduct = (resources: IProductCollectionResources): JSX.Element => {\n return (\n \n

{resources.noProductToRenderText}

\n
\n );\n};\n\nconst _renderProduct = (product: IProductComponentViewProps): JSX.Element => {\n const { ProductContainer, productComponent } = product;\n\n return {productComponent};\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 { Button, Collapse, ICollapseProps } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { IQuickOrderDrawerProps } from './quick-order-drawer-props';\n\nexport interface IQuickOrderDrawerState {\n isOpen: boolean;\n}\n\nexport type GlyphPlacement = 'start' | 'end';\n\n/**\n * Quick Order Drawer - This is a full width uncontrolled collapse where the button glyph changes\n * when the drawer is open and closed.\n */\n\nexport default class QuickOrderDrawer extends React.Component {\n public state: IQuickOrderDrawerState;\n\n private readonly drawerOpenGlyph: string;\n\n private readonly drawerCloseGlyph: string;\n\n private readonly drawerGlyphClass: string;\n\n private isManuallyToggled: boolean;\n\n constructor(props: IQuickOrderDrawerProps) {\n super(props);\n this._toggle = this._toggle.bind(this);\n this.isManuallyToggled = false;\n this.state = { isOpen: (props.collapseProps && props.collapseProps.isOpen) || false };\n this.drawerGlyphClass = classnames('drawer__glyph', this.props.toggleGlyphClassName ? this.props.toggleGlyphClassName : '');\n\n if (this.props.animateGlyph) {\n this.drawerOpenGlyph = classnames(\n this.drawerGlyphClass,\n this.props.openGlyph ? this.props.openGlyph : this.props.closeGlyph ? this.props.closeGlyph : ''\n );\n this.drawerCloseGlyph = this.drawerOpenGlyph;\n } else {\n this.drawerOpenGlyph = classnames(this.drawerGlyphClass, this.props.openGlyph ? this.props.openGlyph : '');\n this.drawerCloseGlyph = classnames(this.drawerGlyphClass, this.props.closeGlyph ? this.props.closeGlyph : '');\n }\n }\n\n public shouldComponentUpdate(nextProps: IQuickOrderDrawerProps, nextState: IQuickOrderDrawerState): boolean {\n if (this.state === nextState && this.props === nextProps) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element {\n const collapseProps = { ...this.props.collapseProps } as ICollapseProps;\n\n // If the drawer is manually toggled by pressing the button, then we use the internal state\n if (collapseProps.isOpen === undefined || this.isManuallyToggled) {\n collapseProps.isOpen = this.state.isOpen;\n } else {\n // eslint-disable-next-line react/no-direct-mutation-state\n this.state.isOpen = collapseProps.isOpen;\n }\n collapseProps.children = this.props.children;\n const drawerClass = classnames('drawer', this.props.className ? this.props.className : '');\n this.isManuallyToggled = false;\n return (\n
\n \n {this._generateDrawerButtonInnerMarkup(collapseProps.isOpen)}\n \n \n
\n );\n }\n\n private _generateDrawerButtonInnerMarkup(collapseState: boolean): JSX.Element {\n const drawerButtonTextClass = classnames(\n 'drawer__buttontext',\n this.props.toggleButtonClassName ? this.props.toggleButtonClassName : ''\n );\n return (\n <>\n

{this.props.moduleHeadingText}

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

\n {ariaLabelProduct}\n

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

\n {ariaLabelQuantity}\n

\n \n
\n );\n\n const addtoCartNode = (\n
\n \n {ariaLabelAddtoCart}\n \n
\n );\n\n const userMessageNode =\n quickOrderState && quickOrderState.stateMessage ? (\n \n \n {quickOrderState.stateMessage.messageText}\n \n ) : (\n undefined\n );\n\n return {\n product: productNode,\n addToCartBtn: addtoCartNode,\n quantity: quantityNode,\n userMessage: userMessageNode\n };\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { CartLine, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { observable } from 'mobx';\n\n/**\n * Represents a product for quick order.\n */\nexport class QuickOrderProduct {\n @observable\n public isSelected: boolean;\n\n public readonly cartLine: CartLine;\n\n public readonly simpleProduct: SimpleProduct;\n\n public constructor(cartLine: CartLine, simpleProduct: SimpleProduct) {\n this.cartLine = cartLine;\n this.simpleProduct = simpleProduct;\n this.isSelected = false;\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IComponent, IComponentProps, ICoreContext } from '@msdyn365-commerce/core';\nimport classnames from 'classnames';\nimport React from 'react';\n\n/**\n * Interface for quick order table header resources.\n */\nexport interface IQuickOrderTableHeaderResources {\n quickOrderProductNumberText: string;\n quickOrderProductText: string;\n quickOrderUnitPriceText: string;\n quickOrderUnitOfMeasureText: string;\n quickOrderQuantityText: string;\n quickOrderTotalText: string;\n quickOrderActionsText: string;\n}\n\n/**\n * Interface for quick order table props.\n */\nexport interface IQuickOrderTableHeaderProps extends IComponentProps {\n context: ICoreContext;\n className: string;\n\n isMobile: boolean;\n resources: IQuickOrderTableHeaderResources;\n}\n\n/**\n * Interface for quick order table header component.\n */\nexport interface IQuickOrderTableHeaderComponent extends IComponent {}\n\n/**\n * Get the quick order header cells for desktop.\n * @param props -- The quick order table header props.\n * @returns The list of cells for quick order header component in desktop version.\n */\nconst QuickOrderDesktopHeaderCellsComponent: React.FC = (props: IQuickOrderTableHeaderProps) => {\n const { resources } = props;\n const columnWithNumberClassName = `${props.className}__row__column-with-number`;\n return (\n <>\n \n \n \n {resources.quickOrderProductNumberText}\n {resources.quickOrderProductText}\n {resources.quickOrderUnitPriceText}\n {resources.quickOrderUnitOfMeasureText}\n {resources.quickOrderQuantityText}\n {resources.quickOrderTotalText}\n {resources.quickOrderActionsText}\n \n );\n};\n\n/**\n * Get the quick order header cells for mobile.\n * @param props -- The quick order table header props.\n * @returns The quick order header component in desktop version.\n */\nconst QuickOrderMobileHeaderCellsComponent: React.FC = (props: IQuickOrderTableHeaderProps) => {\n const { resources } = props;\n return (\n <>\n \n {resources.quickOrderProductNumberText}\n \n \n );\n};\n\n/**\n * Quick order table header component.\n * @param props - Configuration of the component.\n * @returns React node with the header.\n */\nexport const QuickOrderTableHeaderComponent: React.FC = (props: IQuickOrderTableHeaderProps) => {\n const rowClassName = `${props.className}__row`;\n\n let headerCells: JSX.Element;\n if (props.isMobile) {\n headerCells = ;\n } else {\n headerCells = ;\n }\n\n return (\n \n {headerCells}\n \n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IComponentProps, ICoreContext, IImageSettings, Image } from '@msdyn365-commerce/core';\nimport { CartLine, format, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { getFallbackImageUrl, getProductPageUrlSync, ObjectExtensions, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, IncrementalQuantity } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\n/**\n * Data required to render each quick order row.\n */\nexport interface IQuickOrderTableRowData {\n cartLine: CartLine;\n product: SimpleProduct;\n}\n\n/**\n * Resources for quick order table rows.\n */\nexport interface IQuickOrderTableRowResources {\n quickOrderQuantityMobileText: string;\n quickOrderProductDimensionsSeparator: string;\n quickOrderViewDetailsButtonText: string;\n quickOrderViewDetailsButtonAriaLabel: string;\n quickOrderRemoveItemButtonAriaLabel: string;\n quickOrderInputQuantityAriaLabel: string;\n quickOrderDecrementButtonAriaLabel: string;\n quickOrderIncrementButtonAriaLabel: string;\n}\n\n/**\n * Interface for quick order table props.\n */\nexport interface IQuickOrderTableRowProps extends IComponentProps {\n context: ICoreContext;\n className: string;\n\n imageSettings?: IImageSettings;\n isMobile: boolean;\n resources: IQuickOrderTableRowResources;\n}\n\n/**\n * The default image settings for quick order table row.\n */\nconst defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=80&h=80&m=6', w: 0, h: 0 },\n lg: { q: 'w=147&h=147&m=6', w: 0, h: 0 }\n },\n lazyload: true,\n cropFocalRegion: true\n};\n\n/**\n * Renders product image for quick order row.\n * @param props - Quick order table row props.\n * @returns React element.\n */\nconst QuickOrderTableRowProductImageComponent: React.FC = (props: IQuickOrderTableRowProps) => {\n const fallbackImageUrl = getFallbackImageUrl(\n props.data.product.ItemId,\n props.context.actionContext.requestContext.apiSettings,\n props.context.request.app?.config?.OmniChannelMedia\n );\n\n const containerClassName = `${props.className}__product-image-container`;\n\n return (\n
\n \n
\n );\n};\n\n/**\n * Renders actions popup for the mobile view.\n * @param props - Configuration for popup.\n * @returns A react node with actions..\n */\nconst QuickOrderExtraActionsPopupComponent: React.FC = (props: IQuickOrderTableRowProps): JSX.Element | null => {\n const product: SimpleProduct = props.data.product;\n\n let productUrl = '';\n if (!StringExtensions.isNullOrWhitespace(product.Name) && !ObjectExtensions.isNullOrUndefined(product.RecordId)) {\n productUrl = getProductPageUrlSync(product.Name!, product.RecordId, props.context.actionContext);\n }\n\n if (StringExtensions.isNullOrWhitespace(productUrl)) {\n return null;\n }\n\n const className = `${props.className}__extra-actions-cell`;\n\n return (\n
\n
\n );\n};\n\n/**\n * Renders quick order table rows for desktop view.\n * @param props - Configuration for the rows.\n * @returns A react node with a list of quick order rows for desktop view.\n */\nexport const QuickOrderDesktopTableRowCellComponent: React.FC = (props: IQuickOrderTableRowProps) => {\n const product: SimpleProduct = props.data.product;\n const cartLine: CartLine = props.data.cartLine;\n const columnWithNumberClassName = `${props.className}__column-with-number`;\n\n let productUrl = '';\n if (!StringExtensions.isNullOrWhitespace(product.Name) && !ObjectExtensions.isNullOrUndefined(product.RecordId)) {\n productUrl = getProductPageUrlSync(product.Name!, product.RecordId, props.context.actionContext);\n }\n\n return (\n <>\n \n \n \n {product.ItemId}\n \n
\n \n {product.Name}\n \n \n {product.Dimensions?.map(dimension => dimension.DimensionValue?.Value)\n .filter(dimensionValue => !StringExtensions.isNullOrWhitespace(dimensionValue))\n .join(props.resources.quickOrderProductDimensionsSeparator)}\n \n
\n \n {cartLine.Price}\n {cartLine.UnitOfMeasureSymbol}\n \n \n \n {cartLine.TotalAmount}\n \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 { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISearchResultModalViewProps } from './components';\nimport {\n ICategoryHierarchyViewProps,\n IRefineMenuViewProps,\n ISearchResultContainerViewProps,\n ISortByViewProps,\n ITitleViewProps\n} from './search-result-container';\n\nconst SearchResultContainerView: React.FC<ISearchResultContainerViewProps> = props => {\n const {\n SearchResultContainer,\n products,\n pagination,\n ProductsContainer,\n ProductSectionContainer,\n choiceSummary,\n isMobile,\n modalToggle,\n searchResultModal,\n TitleViewProps,\n refineMenu,\n categoryHierarchy,\n sortByOptions,\n CategoryNavContainer,\n RefineAndProductSectionContainer,\n errorMessage,\n FeatureSearchContainer,\n similarLookProduct\n } = props;\n const isRecoSearchPage = props.context.actionContext.requestContext.query?.recommendation;\n if (isMobile) {\n return (\n <Module {...SearchResultContainer}>\n {renderCategoryHierarchy(categoryHierarchy)}\n {renderTitle(TitleViewProps)}\n {choiceSummary}\n {modalToggle}\n {createSearchResultModal(searchResultModal, refineMenu, sortByOptions, isRecoSearchPage)}\n <Node {...FeatureSearchContainer}>{similarLookProduct}</Node>\n <Node {...ProductsContainer}>\n {errorMessage}\n {products}\n </Node>\n {pagination}\n </Module>\n );\n }\n return (\n <Module {...SearchResultContainer}>\n <Node {...CategoryNavContainer}>\n {categoryHierarchy && renderCategoryHierarchy(categoryHierarchy)}\n {TitleViewProps && renderTitleCount(TitleViewProps)}\n </Node>\n <Node {...RefineAndProductSectionContainer}>\n {refineMenu && renderRefiner(refineMenu)}\n <Node {...ProductSectionContainer}>\n {TitleViewProps && renderTitle(TitleViewProps)}\n {choiceSummary}\n {sortByOptions && !isRecoSearchPage && renderSort(sortByOptions)}\n <Node {...FeatureSearchContainer}>{similarLookProduct}</Node>\n <Node {...ProductsContainer}>\n {errorMessage}\n {products}\n </Node>\n {pagination}\n </Node>\n </Node>\n </Module>\n );\n};\n\nconst createSearchResultModal = (\n modalProps: ISearchResultModalViewProps,\n refineMenu: IRefineMenuViewProps,\n sortByDropDown: ISortByViewProps,\n isRecoSearchPage?: string\n): JSX.Element => {\n return React.cloneElement(\n modalProps.modal,\n {},\n modalProps.modalHeader,\n createModalBody(modalProps, refineMenu, sortByDropDown, isRecoSearchPage),\n modalProps.modalFooter\n );\n};\n\nconst createModalBody = (\n props: ISearchResultModalViewProps,\n refineMenu: IRefineMenuViewProps,\n sortByDropDown: ISortByViewProps,\n isRecoSearchPage?: string\n): JSX.Element | null => {\n if (sortByDropDown) {\n return React.cloneElement(props.modalBody, {}, renderSort(sortByDropDown, isRecoSearchPage), renderRefiner(refineMenu));\n }\n return null;\n};\n\nconst renderRefiner = (props: IRefineMenuViewProps): JSX.Element | null => {\n const { refiners, RefineMenuContainer, RefinerSectionContainer } = props;\n if (refiners) {\n return (\n <Node {...RefinerSectionContainer}>\n <Node {...RefineMenuContainer}>\n {refiners.map((submenu, index) => (\n <React.Fragment key={index}>{submenu}</React.Fragment>\n ))}\n </Node>\n </Node>\n );\n }\n return null;\n};\n\nconst renderSort = (props: ISortByViewProps, isRecoSearchPage?: string): JSX.Element | null => {\n const { SortingContainer, sortByDropDown } = props;\n if (sortByDropDown && !isRecoSearchPage) {\n return <Node {...SortingContainer}>{sortByDropDown}</Node>;\n }\n return null;\n};\n\nconst renderCategoryHierarchy = (props: ICategoryHierarchyViewProps): JSX.Element | null => {\n const { CategoryHierarchyContainer, categoryHierarchyList, categoryHierarchySeparator } = props;\n if (categoryHierarchyList) {\n return (\n <Node {...CategoryHierarchyContainer}>\n {categoryHierarchyList.map((category, index) => (\n <React.Fragment key={index}>\n {category}\n {categoryHierarchyList && categoryHierarchyList[index + 1] && categoryHierarchySeparator}\n </React.Fragment>\n ))}\n </Node>\n );\n }\n\n return null;\n};\n\nconst renderTitle = (props: ITitleViewProps): JSX.Element | null => {\n const { title, TitleContainer } = props;\n if (title) {\n return (\n <Node {...TitleContainer}>\n <h2>\n {title.titlePrefix}\n {title.titleText}\n </h2>\n </Node>\n );\n }\n return null;\n};\n\nconst renderTitleCount = (props: ITitleViewProps): JSX.Element | null => {\n const { title, TitleContainer } = props;\n if (title) {\n return (\n <Node {...TitleContainer}>\n <h5>{title.titleCount}</h5>\n </Node>\n );\n }\n return null;\n};\n\nexport default SearchResultContainerView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { observable } from 'mobx';\n\n/**\n * State information related to what is needed to succesfully perform a autosuggest.\n */\nexport class SearchState {\n @observable public searchText?: string;\n\n @observable public defaultBasicSearchUrl?: string;\n\n @observable public searchQueryStringParameter?: string;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { 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<Autosuggestions | null> {\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<void> {\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: <IAction<Autosuggestions>>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<ISearchData>;\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 <li className='msc-autoSuggest__categoryResults-title'>{categoryAutoSuggestionHeading}</li>;\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 <li className='msc-autoSuggest__categoryResults-item' key={item.Id}>\n <a aria-label={ariaLabel} href={_generateLink(item, searchText, props)} {...attribute}>\n {_generateLink(item, searchText, props) && _getHighlightedText(splitValue ? splitValue : '', hitPrefix, hitSuffix)}\n </a>\n </li>\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'), '<strong>')\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '</strong>');\n\n // eslint-disable-next-line react/no-danger\n return <span dangerouslySetInnerHTML={getRichTextHtml(formattedText)} />;\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<HTMLInputElement>;\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<HTMLInputElement>) => {\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 <input\n className='ms-search__form-control'\n type='text'\n aria-label={ariaLabelSearch}\n name={searchQsp}\n placeholder={searchPlaceholder}\n ref={searchTextInput}\n onChange={onInputChange}\n maxLength={maxChars}\n value={query}\n />\n ) : (\n <input\n className='ms-search__form-control'\n type='text'\n aria-label={ariaLabelSearch}\n name={searchQsp}\n placeholder={searchPlaceholder}\n ref={searchTextInput}\n onChange={onInputChange}\n value={query}\n />\n );\n\n const submitBtnNode = !disableSubmitSearch && <Button className='ms-search__form-submitSearch' aria-label={ariaLabelSubmit} />;\n\n const cancelBtNoden = (\n <Button\n className={!disableSubmitSearch ? 'ms-search__form-cancelSearch' : 'ms-search__form-cancelSearchNoSumbit'}\n aria-label={ariaLabelCancel}\n onClick={handleCancelSearchChange}\n type='button'\n />\n );\n\n return { input: inputNode, cancelBtn: cancelBtNoden, submitBtn: submitBtnNode };\n};\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 { SearchSuggestion } from '@msdyn365-commerce/retail-proxy';\nimport { 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 ISearchKeywordSuggestProps {\n searchKeywordSuggestClass: string;\n searchPageURL: string;\n searchQsp: string | undefined;\n hitPrefix: string;\n hitSuffix: string;\n autoSuggestProps: ISearchProps<ISearchData>;\n searchText: string;\n suggestions: SearchSuggestion[] | undefined;\n telemetryContent?: ITelemetryContent;\n}\n\nexport interface ISearchKeywordViewProps {\n text: React.ReactNode[];\n}\n\nlet payLoad: IPayLoad;\n\n/**\n * KeywordSuggestionsComponent.\n * @param props\n */\nexport const KeywordSuggestionsComponent = (props: ISearchKeywordSuggestProps): ISearchKeywordViewProps | undefined => {\n const { suggestions, hitPrefix, hitSuffix } = props;\n\n payLoad = getPayloadObject('click', props.telemetryContent!, '');\n\n const reactNodes: React.ReactNode[] = [];\n\n suggestions?.map(item => {\n reactNodes.push(_assembleNode(item, hitPrefix, hitSuffix, props));\n });\n\n return { text: reactNodes };\n};\n\nconst _assembleNode = (item: SearchSuggestion, hitPrefix: string, hitSuffix: string, props: ISearchKeywordSuggestProps) => {\n const ariaLabel =\n item.Value && item.Value.replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n payLoad.contentAction.etext = ariaLabel;\n const attribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n return (\n <li className='msc-autoSuggest__keywordResults-item' key={item.Id}>\n <a aria-label={ariaLabel} href={_generateLink(item, hitPrefix, hitSuffix, props)} {...attribute}>\n {_generateLink(item, hitPrefix, hitSuffix, props) &&\n _getHighlightedText(item.Value ? item.Value : '', hitPrefix, hitSuffix)}\n </a>\n </li>\n );\n};\n\nconst _generateLink = (suggestion: SearchSuggestion, hitPrefix: string, hitSuffix: string, props: ISearchKeywordSuggestProps): string => {\n const { searchPageURL, searchQsp } = props;\n\n const formattedLink = (suggestion.Value as string)\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '')\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n\n if (!MsDyn365.isBrowser) {\n return '';\n }\n\n const queryUrl = new URL(searchPageURL, window.location.href);\n if (searchQsp && formattedLink) {\n queryUrl.searchParams.set(searchQsp, formattedLink);\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'), '<strong>')\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '</strong>');\n\n // eslint-disable-next-line react/no-danger\n return <span dangerouslySetInnerHTML={getRichTextHtml(formattedText)} />;\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Button, getPayloadObject, getTelemetryAttributes, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface ISearchLabelProps {\n isSearchFormExpanded: boolean;\n searchLabelClass: string;\n searchLabelArialLabel: string;\n searchtext: string;\n searchCollapsedLabel: React.RefObject<HTMLButtonElement>;\n hideSearchLabel?: boolean;\n telemetryContent: ITelemetryContent;\n handleCancelSearchChange(): void;\n}\n\nexport const LabelComponent = (props: ISearchLabelProps) => {\n const {\n searchLabelClass,\n searchLabelArialLabel,\n isSearchFormExpanded,\n searchtext,\n searchCollapsedLabel,\n hideSearchLabel,\n handleCancelSearchChange,\n telemetryContent\n } = props;\n const payLoad = getPayloadObject('click', telemetryContent, searchtext, '');\n const attributes = getTelemetryAttributes(telemetryContent, payLoad);\n\n return (\n <div className={searchLabelClass}>\n <Button\n className='ms-search__icon'\n aria-expanded={isSearchFormExpanded}\n aria-label={searchLabelArialLabel}\n onClick={handleCancelSearchChange}\n innerRef={searchCollapsedLabel}\n {...attributes}\n >\n {!hideSearchLabel && (\n <span className='ms-search__icon-text' aria-hidden>\n {searchtext}\n </span>\n )}\n </Button>\n </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 { 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<ISearchData>;\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 <li className='msc-autoSuggest__productResults-title'>{productAutoSuggestionHeading}</li>;\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'), '<strong>')\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '</strong>');\n\n return (\n // eslint-disable-next-line react/no-danger\n <span className='msc-price msc-autoSuggest__productResults-item-text' dangerouslySetInnerHTML={getRichTextHtml(formattedText)} />\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 <PriceComponent\n id={moduleId}\n typeName={moduleType}\n context={context}\n data={{\n price: {\n CustomerContextualPrice: adjustedPrice,\n BasePrice: basePrice\n }\n }}\n className='msc-autoSuggest__productResults-item-price'\n freePriceText={props.resources?.freePriceText}\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 <Image\n requestContext={props.autoSuggestProps.context.actionContext.requestContext}\n altText={altText}\n className='msc-autoSuggest__productResults-item-img'\n src={suggestion.ImageUrl}\n gridSettings={gridSettings!}\n imageSettings={imageSettings ? imageSettings : defaultImageSettings}\n loadFailureBehavior='empty'\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<ISearchData> {\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<ISearchProps<ISearchData>, ISearchState>}\n */\nclass Search extends React.Component<ISearchProps<ISearchData>, ISearchState> {\n private readonly searchTextInput: React.RefObject<HTMLInputElement>;\n\n private readonly searchCollapsedLabel: React.RefObject<HTMLButtonElement>;\n\n private readonly formReference: React.RefObject<HTMLButtonElement>;\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<HTMLDivElement>;\n\n private readonly autoSuggestResultDiv: React.RefObject<HTMLDivElement>;\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<ISearchData>) {\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<void> {\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<ISearchData>, 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<ISearchData>),\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 <Spinner className='msc-autoSuggest__loadingResult' label={loadingText} size={SpinnerSize.medium} labelPosition='right' />;\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<ProductRefiner[]> {\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<HTMLElement> | React.KeyboardEvent<HTMLElement> | React.FormEvent<HTMLFormElement>\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 { 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 * as Msdyn365 from '@msdyn365-commerce/core';\nimport { INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IAdditionalContentData, ILinksData } from '../video-player.props.autogenerated';\n\n/**\n * IVideoPlayerAdditionalContentProps: Interface for\n * Video Player Additional Content Component props.\n */\nexport interface IVideoPlayerAdditionalContentProps {\n requestContext: Msdyn365.IRequestContext;\n additionalContent: IAdditionalContentData | undefined;\n handleAdditionalTextChange(event: Msdyn365.ContentEditableEvent): void;\n handleAdditionalParagraphChange(event: Msdyn365.ContentEditableEvent): void;\n handleAdditionalLinkTextChange(linkIndex: number, event: Msdyn365.ContentEditableEvent): void;\n}\n\n/**\n * IVideoPlayerAdditionalContentProps: Interface for\n * Video Player Additional Content view props.\n */\nexport interface IVideoPlayerAdditionalContentViewProps {\n additionalContentNode: INodeProps;\n additionalContentItems?: IVideoPlayerAdditionalContentItemViewProps;\n}\n\n/**\n * IVideoPlayerAdditionalContentProps: Interface for\n * Video Player Additional Content Item view props.\n */\nexport interface IVideoPlayerAdditionalContentItemViewProps {\n heading: React.ReactNode;\n text: React.ReactNode;\n links: React.ReactNode;\n additionalContentItemContainer: INodeProps;\n additionalContentItemLinks: INodeProps;\n}\n\n/**\n * Renders additional content heading.\n * @param additionalContentHeading - Additional content heading.\n * @param props - Video Player Additional content component props.\n * @returns Heading Node.\n */\nconst renderHeading = (additionalContentHeading: string, props: IVideoPlayerAdditionalContentProps) => {\n const requestContext = props.requestContext;\n return (\n <Msdyn365.Text\n text={additionalContentHeading}\n tag='p'\n className='ms-video-player__details__additional-content__text'\n editProps={{\n /**\n * On edit event for heading text change.\n * @param event - Change event.\n */\n onEdit: event => {\n props.handleAdditionalTextChange(event);\n },\n requestContext\n }}\n />\n );\n};\n\n/**\n * Renders additional content heading.\n * @param additionalContentParagraphText - Additional content paragraph text.\n * @param props - Video Player Additional content component props.\n * @returns Paragraph Node.\n */\nconst renderParagraph = (additionalContentParagraphText: string, props: IVideoPlayerAdditionalContentProps) => {\n const requestContext = props.requestContext;\n return (\n <Msdyn365.Text\n text={additionalContentParagraphText}\n tag='p'\n className='ms-video-player__details__additional-content__paragraph'\n editProps={{\n /**\n * On edit event for heading text change.\n * @param event - Change event.\n */\n onEdit: event => {\n props.handleAdditionalParagraphChange(event);\n },\n requestContext\n }}\n />\n );\n};\n\n/**\n * Renders additional content heading.\n * @param ctaLink - Additional content link.\n * @param props - Video Player Additional content component props.\n * @param linkIndex - Additional content link index.\n * @returns Link Node.\n */\nconst renderLinks = (ctaLink: ILinksData, props: IVideoPlayerAdditionalContentProps, linkIndex: number) => {\n const editableLink: Msdyn365.ILinksData = {\n ariaLabel: ctaLink.ariaLabel,\n className: 'ms-video-player__details__additional-content__cta__links',\n linkText: ctaLink.linkText,\n linkUrl: ctaLink.linkUrl.destinationUrl,\n openInNewTab: ctaLink.openInNewTab,\n role: 'link'\n };\n const requestContext = props.requestContext;\n return (\n <Msdyn365.Link\n key={linkIndex}\n link={editableLink}\n editProps={{\n /**\n * Handle additional Link Text change.\n * @param event - The keyboard event.\n */\n onTextChange: event => {\n props.handleAdditionalLinkTextChange(linkIndex, event);\n },\n requestContext\n }}\n />\n );\n};\n\n/**\n * Create node for each additonal content item.\n * @param item - Video Player additonal content item props.\n * @param props - Video Player Additional content component props.\n * @returns IVideoPlayerAdditionalContentItemViewProps.\n */\nconst getAdditionalContentItems = (\n item: IAdditionalContentData,\n props: IVideoPlayerAdditionalContentProps\n): IVideoPlayerAdditionalContentItemViewProps => {\n const headingNode = item.heading && renderHeading(item.heading, props);\n const paragraphNode = item.subtext && renderParagraph(item.subtext, props);\n const linksNode = item.links?.map((ctaLink: ILinksData, index: number) => {\n return renderLinks(ctaLink, props, index);\n });\n\n return {\n heading: headingNode,\n text: paragraphNode,\n links: linksNode,\n additionalContentItemContainer: { className: 'ms-video-player__details__additional-content__container' },\n additionalContentItemLinks: { className: 'ms-video-player__details__additional-content__cta' }\n };\n};\n\n/**\n * VideoPlayerAdditionalContent component.\n * @param props - Video Player Additional content component props.\n * @returns Video Player Additional content view props.\n */\nexport const videoPlayerAdditionalContent = (\n props: IVideoPlayerAdditionalContentProps\n): IVideoPlayerAdditionalContentViewProps | undefined => {\n const { additionalContent } = props;\n if (!additionalContent) {\n return undefined;\n }\n\n const reactNodes: IVideoPlayerAdditionalContentItemViewProps = getAdditionalContentItems(additionalContent, props);\n return {\n additionalContentNode: { className: 'ms-video-player__details__additional-content' },\n additionalContentItems: reactNodes\n };\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IPlayerData, IPlayerOptions, IPlayerResources, IVideoMetadata, Player } from '@msdyn365-commerce/components';\nimport * as MsDyn365 from '@msdyn365-commerce/core';\nimport {\n getPayloadObject,\n getTelemetryAttributes,\n getTelemetryObject,\n INodeProps,\n isMobile,\n ITelemetryContent,\n VariantType\n} from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IVideoPlayerAdditionalContentViewProps, videoPlayerAdditionalContent } from './components/additional-content';\nimport { ILinksData, IVideoPlayerConfig, IVideoPlayerProps } from './video-player.props.autogenerated';\n\nexport interface IVideoPlayerViewProps extends IVideoPlayerProps<{}> {\n player: React.ReactNode;\n title?: React.ReactNode;\n text?: React.ReactNode;\n links?: React.ReactNode;\n detailsContainer?: INodeProps;\n detailsContainerCta?: INodeProps;\n additionalContent?: IVideoPlayerAdditionalContentViewProps;\n handleText?(): void;\n handleParagraph?(): void;\n handleAdditionalText?(): void;\n handleAdditionalParagraph?(): void;\n handleLink?(): void;\n handleAdditionalLink?(): void;\n}\n\n/**\n *\n * VideoPlayer component.\n * @extends {React.PureComponent<IVideoPlayerProps<IVideoPlayerData>>}\n */\nclass VideoPlayer extends React.PureComponent<IVideoPlayerProps<IVideoPlayerConfig>> {\n private readonly telemetryContent: ITelemetryContent;\n\n private readonly isMobileDevice: boolean;\n\n public constructor(props: IVideoPlayerProps<IVideoPlayerConfig>) {\n super(props);\n this.isMobileDevice = isMobile({ variant: VariantType.Viewport, context: this.props.context.request }) === 'xs';\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n }\n\n public render(): JSX.Element {\n const options = {\n ...this.props.config,\n isMobileDevice: this.isMobileDevice\n };\n const video: MsDyn365.IVideoData = this.props.config.video;\n const playerResources: IPlayerResources = {\n playAriaLabel: this.props.resources.playLabel,\n pauseAriaLabel: this.props.resources.pauseLabel,\n playingAriaLabel: this.props.resources.playingLabel,\n pausedAriaLabel: this.props.resources.pausedLabel,\n muteAriaLabel: this.props.resources.muteLabel,\n unMuteAriaLabel: this.props.resources.unMuteLabel,\n fullScreenAriaLabel: this.props.resources.fullScreenLabel,\n exitFullScreenAriaLabel: this.props.resources.exitFullScreenLabel,\n seekBarLabel: this.props.resources.seekBarLabel,\n videoTimeDurationLabel: this.props.resources.videoTimeDurationLabel,\n closedCaptionLabel: this.props.resources.closedCaptionLabel\n };\n const videoMetaData: IVideoMetadata = {};\n\n if (video) {\n videoMetaData.videoId = video.id;\n videoMetaData.title = video.title;\n videoMetaData.duration = video.playTime;\n\n if (video.thumbnail) {\n videoMetaData.posterframeUrl = video.thumbnail.src;\n }\n\n if (video._links?.binaryReferences) {\n videoMetaData.videoBinaryReferences = video._links.binaryReferences;\n }\n }\n const videoPlayerData: IPlayerData = { options: options as IPlayerOptions, metaData: videoMetaData };\n const viewProps = {\n // Context for telemetry and raw data for C1 to do customization\n // Including computed data, state data and methods\n ...this.props,\n\n player: (\n <MsDyn365.Video className='' editProps={{ key: this.props.config.video, requestContext: this.props.context.request }}>\n <Player\n playerData={videoPlayerData}\n playerResources={playerResources}\n telemetryContent={this.telemetryContent}\n isEditor={this.props.context.request.params.isEditor}\n />\n </MsDyn365.Video>\n ),\n title: this._getVideoDetailsHeading(),\n text: this._getVideoDetailsParagraph(),\n links: this._getVideoDetailsLinks(),\n detailsContainer: { className: 'ms-video-player__details' },\n detailsContainerCTA: { className: 'ms-video-player__details__cta' },\n additionalContent: videoPlayerAdditionalContent({\n requestContext: this.props.context.request,\n additionalContent: this.props.config.additionalContent,\n handleAdditionalTextChange: this.handleAdditionalTextChange,\n handleAdditionalParagraphChange: this.handleAdditionalParagraphChange,\n handleAdditionalLinkTextChange: this.handleAdditionalLinkTextChange\n }),\n handleText: this.handleTextChange,\n handleParagraph: this.handleParagraphChange,\n handleAdditionalText: this.handleAdditionalTextChange,\n handleAdditionalParagraph: this.handleAdditionalParagraphChange,\n handleLink: this.handleLinkTextChange,\n handleAdditionalLink: this.handleAdditionalTextChange\n };\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n /**\n * Handle link text change.\n * @param linkIndex - The link index.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleLinkTextChange(linkIndex: number, event: MsDyn365.ContentEditableEvent): void {\n if (this.props.config.links && this.props.config.links[Number(linkIndex)]) {\n this.props.config.links[Number(linkIndex)].linkText = event.target.value;\n }\n }\n\n /**\n * Handle text change.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleTextChange = (event: MsDyn365.ContentEditableEvent): void => {\n this.props.config.heading!.text = event.target.value;\n };\n\n /**\n * Handle paragraph change.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleParagraphChange = (event: MsDyn365.ContentEditableEvent): void => {\n this.props.config.paragraph = event.target.value;\n };\n\n /**\n * Handle additional text change.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleAdditionalTextChange(event: MsDyn365.ContentEditableEvent): void {\n if (this.props.config.additionalContent) {\n this.props.config.additionalContent.heading = event.target.value;\n }\n }\n\n /**\n * Handle additional link text change.\n * @param linkIndex - The link index.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleAdditionalLinkTextChange(linkIndex: number, event: MsDyn365.ContentEditableEvent): void {\n const additionalContent = this.props.config.additionalContent ?? {};\n if (additionalContent.links) {\n additionalContent.links[Number(linkIndex)].linkText = event.target.value;\n }\n }\n\n /**\n * Handle additional paragraph change.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleAdditionalParagraphChange(event: MsDyn365.ContentEditableEvent): void {\n if (this.props.config.additionalContent) {\n this.props.config.additionalContent.subtext = event.target.value;\n }\n }\n\n /**\n * Get video details links.\n * @returns - React node.\n */\n private _getVideoDetailsLinks(): React.ReactNode[] | undefined {\n const { links } = this.props.config;\n const payLoad = getPayloadObject('click', this.telemetryContent, '');\n\n return links?.map((linkData: ILinksData, index: number) => {\n payLoad.contentAction.etext = linkData.linkText;\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\n const linkId = index;\n const editableLink: MsDyn365.ILinksData = {\n ariaLabel: linkData.ariaLabel,\n className: 'ms-video-player__details__cta__link',\n linkText: linkData.linkText,\n linkUrl: linkData.linkUrl.destinationUrl,\n openInNewTab: linkData.openInNewTab,\n role: 'button',\n additionalProperties: attributes\n };\n\n return (\n <MsDyn365.Link\n key={linkId}\n link={editableLink}\n editProps={{\n /**\n * Handle additional paragraph change.\n * @param event - The keyboard event.\n */\n onTextChange: event => {\n this.handleLinkTextChange(index, event);\n },\n requestContext: this.props.context.request\n }}\n />\n );\n });\n }\n\n private _getVideoDetailsHeading(): React.ReactNode | undefined {\n const { heading } = this.props.config;\n\n return (\n heading && (\n <MsDyn365.Text\n className='ms-video-player__details__title'\n tag={heading.tag ?? 'h1'}\n text={heading.text}\n editProps={{ onEdit: this.handleTextChange, requestContext: this.props.context.request }}\n />\n )\n );\n }\n\n private _getVideoDetailsParagraph(): React.ReactNode | undefined {\n const { paragraph } = this.props.config;\n\n return (\n paragraph && (\n <MsDyn365.RichTextComponent\n text={paragraph}\n className='ms-video-player__details__text'\n editProps={{ onEdit: this.handleParagraphChange, requestContext: this.props.context.request }}\n />\n )\n );\n }\n}\n\nexport default VideoPlayer;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IVideoPlayerAdditionalContentViewProps, 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 { IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\nimport {\n IPriceComponentResources,\n ISwatchItem,\n PriceComponent,\n ProductComponentV2SwatchComponent,\n RatingComponent\n} from '@msdyn365-commerce/components';\nimport {\n getCatalogId,\n IAny,\n IComponent,\n IComponentProps,\n ICoreContext,\n IGeneric,\n IGridSettings,\n IImageData,\n IImageSettings,\n Image,\n msdyn365Commerce\n} from '@msdyn365-commerce/core';\n\nimport {\n ArrayExtensions,\n convertDimensionTypeToProductDimensionType,\n Dictionary,\n DimensionTypes,\n generateImageUrl,\n getProductPageUrlSync,\n IDimensionsApp,\n StringExtensions,\n validateCatalogId\n} from '@msdyn365-commerce-modules/retail-actions';\nimport {\n format,\n getPayloadObject,\n getTelemetryAttributes,\n ITelemetryContent,\n onTelemetryClick\n} from '@msdyn365-commerce-modules/utilities';\nimport React, { useState } from 'react';\n\n/**\n * AttributeSwatch entity interface.\n */\ninterface IAttributeSwatch {\n swatchValue?: string;\n swatchImageUrl?: string;\n swatchColorHexCode?: string;\n isDefault?: boolean;\n productImageUrls?: string[];\n extensionProperties?: ICommerceProperty[];\n}\n\n/**\n * CommerceProperty entity interface.\n */\ninterface ICommerceProperty {\n propertyKey?: string;\n value?: IExtensionPropertyValue;\n}\n\n/**\n * Extension property value entity interface.\n */\ninterface IExtensionPropertyValue {\n isBooleanValue?: boolean;\n byteValue?: number;\n dateTimeOffsetValue?: Date;\n decimalValue?: number;\n integerValue?: number;\n longValue?: number;\n stringValue?: string;\n}\n\n/**\n * ProductDimension entity interface.\n */\ninterface IProductDimension {\n dimensionTypeValue: number;\n dimensionValue?: IProductDimensionValue;\n extensionProperties?: ICommerceProperty[];\n}\n\n/**\n * ProductDimensionValue entity interface.\n */\ninterface IProductDimensionValue {\n recordId: number;\n value?: string;\n dimensionId?: string;\n colorHexCode?: string;\n imageUrl?: string;\n refinerGroup?: string;\n extensionProperties?: ICommerceProperty[];\n}\n\n/**\n * ProductSearchResult entity interface.\n */\nexport interface IProductSearchResult {\n itemId?: string;\n name?: string;\n price: number;\n primaryImageUrl?: string;\n recordId: number;\n trackingId?: string;\n averageRating?: number;\n totalRatings?: number;\n description?: string;\n basePrice?: number;\n minVariantPrice?: number;\n maxVariantPrice?: number;\n displayOrder?: number;\n attributeValues?: IAttributeValue[];\n defaultUnitOfMeasure?: string;\n masterProductId?: number;\n extensionProperties?: ICommerceProperty[];\n}\n\n/**\n * AttributeValue entity interface.\n */\ninterface IAttributeValue {\n name?: string;\n keyName?: string;\n unitOfMeasureSymbol?: string;\n dataTypeValue?: number;\n isBooleanValue?: boolean;\n dateTimeOffsetValue?: Date;\n floatValue?: number;\n integerValue?: number;\n textValue?: string;\n currencyValue?: number;\n currencyCode?: string;\n attributeValueId?: number;\n recordId?: number;\n swatches?: IAttributeSwatch[];\n extensionProperties?: ICommerceProperty[];\n}\n\nexport interface IProductComponentV2Props extends IComponentProps<{ product?: IProductSearchResult }> {\n className?: string;\n imageSettings?: IImageSettings;\n savingsText?: string;\n freePriceText?: string;\n originalPriceText?: string;\n currentPriceText?: string;\n ratingAriaLabel?: string;\n ratingCountAriaLabel?: string;\n allowBack?: boolean;\n telemetryContent?: ITelemetryContent;\n quickViewButton?: React.ReactNode;\n productComparisonButton?: React.ReactNode;\n isEnabledProductDescription?: boolean;\n isPriceMinMaxEnabled?: boolean;\n priceResources?: IPriceComponentResources;\n inventoryLabel?: string;\n dimensionAvailabilities?: IProductsDimensionsAvailabilities[];\n swatchItemAriaLabel?: string;\n}\n\nexport interface IProductComponentV2 extends IComponent<IProductComponentV2Props> {}\n\nconst PriceComponentActions = {};\n\n/**\n * Gets the product page url from the default swatch selected.\n * @param productData - Product card to be rendered.\n * @returns The default color swatch selected if any.\n */\nfunction getDefaultColorSwatchSelected(productData?: IProductSearchResult): IAttributeSwatch | null {\n if (!productData || !productData.attributeValues) {\n return null;\n }\n\n const colorAttribute = productData.attributeValues.find(\n attributeValue => attributeValue.keyName?.toLocaleLowerCase() === DimensionTypes.color\n );\n if (!colorAttribute) {\n return null;\n }\n\n const defaultSwatch = colorAttribute.swatches?.find(item => item.isDefault === true) ?? colorAttribute.swatches?.[0];\n return defaultSwatch ?? null;\n}\n\n/**\n * Gets the product image from the default swatch selected.\n * @param coreContext - Context of the module using the component.\n * @param productData - Product card to be rendered.\n * @returns The product card image url.\n */\nfunction getProductImageUrlFromDefaultColorSwatch(coreContext: ICoreContext, productData?: IProductSearchResult): string | undefined {\n const siteContext = coreContext as ICoreContext<IDimensionsApp>;\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\n if (dimensionToPreSelectInProductCard === DimensionTypes.none) {\n return productData?.primaryImageUrl;\n }\n const defaultSwatch = getDefaultColorSwatchSelected(productData);\n return defaultSwatch && ArrayExtensions.hasElements(defaultSwatch.productImageUrls)\n ? generateImageUrl(defaultSwatch.productImageUrls[0], coreContext.request.apiSettings)\n : productData?.primaryImageUrl;\n}\n\n/**\n * Updates the product url link to product details page.\n * @param productDetailsPageUrl - Product page url.\n * @param coreContext - Context of the module using the component.\n * @param queryString - Querystring to be added to the URL.\n * @returns The update product page url.\n */\nfunction updateProductUrl(productDetailsPageUrl: string, coreContext: ICoreContext, queryString: string): string {\n const sourceUrl = new URL(productDetailsPageUrl, coreContext.request.apiSettings.baseUrl);\n if (sourceUrl.search) {\n sourceUrl.search += `&${queryString}`;\n } else {\n sourceUrl.search += queryString;\n }\n\n const updatedUrl = new URL(sourceUrl.href);\n return updatedUrl.pathname + sourceUrl.search;\n}\n\n/**\n * Gets the react node for product unit of measure display.\n * @param unitOfMeasure - DefaultUnitOfMeasure property from product.\n * @returns The node representing markup for unit of measure component.\n */\nfunction renderProductUnitOfMeasure(unitOfMeasure?: string): JSX.Element | null {\n if (!unitOfMeasure) {\n return null;\n }\n return (\n <div className='msc-product__unit-of-measure'>\n <span>{unitOfMeasure}</span>\n </div>\n );\n}\n\n/**\n * Gets the react node for product availability.\n * @param inventoryAvailabilityLabel - The product information.\n * @returns The node representing markup for product availability.\n */\nfunction renderProductAvailability(inventoryAvailabilityLabel: string | undefined): JSX.Element | null {\n if (!inventoryAvailabilityLabel || inventoryAvailabilityLabel === '') {\n return null;\n }\n\n return (\n <div className='msc-product__availability'>\n <span>{inventoryAvailabilityLabel}</span>\n </div>\n );\n}\n\n/**\n * Renders product comparison button similar to the quick view button.\n * @param productComparisonButton - React element of the button.\n * @param product - Current product info.\n * @param catalogId - Current catalog.\n * @returns React element for the specific product.\n */\nfunction renderProductComparisonButton(\n productComparisonButton: React.ReactNode,\n product: IProductSearchResult,\n catalogId: number\n): JSX.Element | undefined {\n validateCatalogId(catalogId);\n return React.cloneElement(productComparisonButton as React.ReactElement, { product, catalogId });\n}\n\n/**\n * Gets the product page url from the default swatch selected.\n * @param coreContext - Context of the module using the component.\n * @param productUrl - Product page url for the product card.\n * @param productData - Product card to be rendered.\n * @returns The product card image url.\n */\nfunction getProductPageUrlFromDefaultSwatch(\n coreContext: ICoreContext,\n productUrl: string,\n productData?: IProductSearchResult\n): string | undefined {\n const siteContext = coreContext as ICoreContext<IDimensionsApp>;\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\n if (dimensionToPreSelectInProductCard === DimensionTypes.none) {\n return productUrl;\n }\n\n const defaultSwatch = getDefaultColorSwatchSelected(productData);\n if (!defaultSwatch || !defaultSwatch.swatchValue) {\n return productUrl;\n }\n\n const queryString = `color=${defaultSwatch.swatchValue}`;\n return updateProductUrl(productUrl, coreContext, queryString);\n}\n\nconst ProductCardV2: React.FC<IProductComponentV2Props> = ({\n data,\n context,\n imageSettings,\n savingsText,\n freePriceText,\n originalPriceText,\n currentPriceText,\n ratingAriaLabel,\n ratingCountAriaLabel,\n allowBack,\n typeName,\n id,\n telemetryContent,\n quickViewButton,\n productComparisonButton,\n isEnabledProductDescription,\n isPriceMinMaxEnabled,\n priceResources,\n inventoryLabel,\n dimensionAvailabilities,\n swatchItemAriaLabel\n}) => {\n const product = data.product;\n\n let productUrl = getProductPageUrlSync(product?.name ?? '', product?.recordId ?? Number.MIN_VALUE, context.actionContext, undefined);\n if (allowBack) {\n productUrl = updateProductUrl(productUrl, context, 'back=true');\n }\n const productImageUrlFromSwatch = getProductImageUrlFromDefaultColorSwatch(context, product) ?? product?.primaryImageUrl;\n const productPageUrlFromSwatch = getProductPageUrlFromDefaultSwatch(context, productUrl, product) ?? productUrl;\n const [productPageUrl, setProductPageUrl] = useState<string>(productPageUrlFromSwatch);\n const [productImageUrl, setProductImageUrl] = useState<string | undefined>(productImageUrlFromSwatch);\n React.useEffect(() => {\n setProductPageUrl(productPageUrlFromSwatch);\n setProductImageUrl(productImageUrlFromSwatch);\n }, [productUrl, productPageUrlFromSwatch, productImageUrlFromSwatch]);\n const [selectedSwatchItems] = useState(new Dictionary<DimensionTypes, ISwatchItem>());\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-member-access -- app context is generic\n const enableStockCheck = context.app.config.enableStockCheck;\n\n /**\n * Updates the product page and Image url based on swatch selected.\n * @param coreContext - Context of the caller.\n * @param swatchItem - Dimension swatch selected.\n */\n const updatePageAndImageUrl = React.useCallback(\n (coreContext: ICoreContext, swatchItem: ISwatchItem) => {\n const dimensionType = swatchItem.dimensionType;\n selectedSwatchItems.setValue(dimensionType, swatchItem);\n if (StringExtensions.isNullOrWhitespace(swatchItem.value)) {\n return;\n }\n const queryString = `${dimensionType}=${swatchItem.value}`;\n let productPageUrlWithSwatch = '';\n if (productPageUrl.includes(dimensionType)) {\n const newUrl = new URL(productPageUrl, coreContext.request.apiSettings.baseUrl);\n newUrl.searchParams.delete(dimensionType);\n productPageUrlWithSwatch = updateProductUrl(newUrl.toString(), context, queryString);\n } else {\n productPageUrlWithSwatch = updateProductUrl(productPageUrl, context, queryString);\n }\n setProductPageUrl(productPageUrlWithSwatch);\n if (dimensionType === DimensionTypes.color) {\n const swatchProductImageUrl = ArrayExtensions.hasElements(swatchItem.productImageUrls)\n ? swatchItem.productImageUrls[0]\n : undefined;\n const newImageUrl = generateImageUrl(swatchProductImageUrl, coreContext.request.apiSettings);\n setProductImageUrl(newImageUrl);\n }\n },\n [selectedSwatchItems, context, productPageUrl]\n );\n\n if (!product) {\n return null;\n }\n\n /**\n * Checks if rendering the particular dimensions is allowed for product card.\n * @param dimensionType - Dimension to be displayed.\n * @returns Updates the state with new product page url.\n */\n function shouldDisplayDimension(dimensionType: string): boolean {\n const dimensionsContext = context as ICoreContext<IDimensionsApp>;\n const dimensionsToDisplayOnProductCard = dimensionsContext.app.config.dimensionsInProductCard;\n return (\n ArrayExtensions.hasElements(dimensionsToDisplayOnProductCard) &&\n !dimensionsToDisplayOnProductCard.includes(DimensionTypes.none) &&\n dimensionsToDisplayOnProductCard.includes(dimensionType.toLocaleLowerCase() as DimensionTypes)\n );\n }\n\n /**\n * Gets the react node for product dimension as swatch.\n * @param attributeValues - Attribute value property from product.\n * @returns The node representing markup for unit of measure component.\n */\n function renderProductDimensions(attributeValues?: IAttributeValue[]): JSX.Element | null {\n if (!attributeValues) {\n return null;\n }\n\n return (\n <div className='msc-product__dimensions'>\n {attributeValues.map((item: IAttributeValue) => {\n const dimensionTypeValue = item.keyName?.toLocaleLowerCase() ?? '';\n if (!shouldDisplayDimension(dimensionTypeValue)) {\n return null;\n }\n\n const siteContext = context as ICoreContext<IDimensionsApp>;\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\n const dimensionType = dimensionTypeValue as DimensionTypes;\n const swatches =\n item.swatches?.map<ISwatchItem>(swatchItem => {\n return {\n itemId: `${item.recordId ?? ''}-${dimensionTypeValue}-${swatchItem.swatchValue ?? ''}`,\n value: swatchItem.swatchValue ?? '',\n dimensionType,\n colorHexCode: swatchItem.swatchColorHexCode,\n imageUrl: swatchItem.swatchImageUrl,\n productImageUrls: swatchItem.productImageUrls,\n isDefault: swatchItem.isDefault,\n swatchItemAriaLabel: swatchItemAriaLabel ? format(swatchItemAriaLabel, dimensionType) : '',\n isDisabled:\n enableStockCheck &&\n dimensionAvailabilities?.find(\n dimensionAvailability => dimensionAvailability.value === (swatchItem.swatchValue ?? '')\n )?.isDisabled\n };\n }) ?? [];\n if (\n dimensionToPreSelectInProductCard !== DimensionTypes.none &&\n ArrayExtensions.hasElements(swatches) &&\n !swatches.some(swatch => swatch.isDefault) &&\n dimensionType === DimensionTypes.color\n ) {\n swatches[0].isDefault = true;\n }\n return (\n <ProductComponentV2SwatchComponent\n context={context}\n swatches={swatches}\n onSelectDimension={updatePageAndImageUrl}\n key={item.recordId}\n />\n );\n })}\n </div>\n );\n }\n\n function renderQuickView(quickview: React.ReactNode, item?: number): JSX.Element | undefined {\n if (quickview === null) {\n return undefined;\n }\n const selectedDimensions: IProductDimension[] = selectedSwatchItems.getValues().map<IProductDimension>(swatches => {\n return {\n dimensionTypeValue: convertDimensionTypeToProductDimensionType(swatches.dimensionType),\n dimensionValue: {\n recordId: 0,\n Value: swatches.value\n }\n };\n });\n return React.cloneElement(quickview as React.ReactElement, { selectedProductId: item, selectedDimensions });\n }\n\n // Construct telemetry attribute to render\n const payLoad = getPayloadObject('click', telemetryContent!, '', product.recordId.toString());\n\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- -- Do not need type check for appsettings\n const isUnitOfMeasureEnabled = context.app.config && context.app.config.unitOfMeasureDisplayType === 'buyboxAndBrowse';\n\n return (\n <>\n {isEnabledProductDescription ? (\n <a\n href={productPageUrl}\n onClick={onTelemetryClick(telemetryContent!, payLoad, product.name!)}\n aria-label={renderLabel(\n product.name,\n context.cultureFormatter.formatCurrency(product.price),\n product.averageRating,\n ratingAriaLabel,\n product.totalRatings,\n ratingCountAriaLabel\n )}\n className='msc-product'\n {...attribute}\n >\n <div className='msc-product__image__description'>\n <div className='msc-product__image'>\n {renderProductPlacementImage(\n imageSettings,\n context.request.gridSettings,\n productImageUrl,\n product.primaryImageUrl,\n product.name,\n context\n )}\n </div>\n <div className='msc-product__title_description'>\n <h5 className='msc-product__title__text'>{product.name}</h5>\n {renderPrice(\n context,\n typeName,\n id,\n product.basePrice,\n product.price,\n savingsText,\n freePriceText,\n originalPriceText,\n currentPriceText,\n isPriceMinMaxEnabled,\n priceResources\n )}\n {isUnitOfMeasureEnabled && renderProductUnitOfMeasure(product.defaultUnitOfMeasure)}\n {renderDescription(product.description)}\n </div>\n </div>\n </a>\n ) : (\n <a\n href={productPageUrl}\n onClick={onTelemetryClick(telemetryContent!, payLoad, product.name!)}\n aria-label={renderLabel(\n product.name,\n context.cultureFormatter.formatCurrency(product.price),\n product.averageRating,\n ratingAriaLabel\n )}\n className='msc-product'\n {...attribute}\n >\n <div className='msc-product__image'>\n {renderProductPlacementImage(\n imageSettings,\n context.request.gridSettings,\n productImageUrl,\n product.primaryImageUrl,\n product.name,\n context\n )}\n </div>\n <div className='msc-product__details'>\n <h5 className='msc-product__title'>{product.name}</h5>\n {renderPrice(\n context,\n typeName,\n id,\n product.basePrice,\n product.price,\n savingsText,\n freePriceText,\n originalPriceText,\n currentPriceText\n )}\n {isUnitOfMeasureEnabled && renderProductUnitOfMeasure(product.defaultUnitOfMeasure)}\n </div>\n </a>\n )}\n {renderProductDimensions(product.attributeValues)}\n {!context.app.config.hideRating &&\n renderRating(context, typeName, id, product.averageRating, product.totalRatings, ratingAriaLabel, ratingCountAriaLabel)}\n {renderProductAvailability(inventoryLabel)}\n {quickViewButton && renderQuickView(quickViewButton, product.recordId)}\n {productComparisonButton && renderProductComparisonButton(productComparisonButton, product, getCatalogId(context.request))}\n </>\n );\n};\n\nfunction renderLabel(\n name?: string,\n price?: string,\n rating?: number,\n ratingAriaLabelText?: string,\n reviewCount?: number,\n ratingCountAriaLabelText?: string\n): string {\n const reviewCountArialableText = getReviewAriaLabel(reviewCount, ratingCountAriaLabelText ?? '');\n return `${name ?? ''} ${price ?? ''} ${getRatingAriaLabel(rating, ratingAriaLabelText)}${\n reviewCountArialableText ? ` ${reviewCountArialableText}` : ''\n }`;\n}\n\nfunction renderDescription(description?: string): JSX.Element | null {\n return <p className='msc-product__text'>{description}</p>;\n}\n\nfunction getRatingAriaLabel(rating?: number, ratingAriaLabel?: string): string {\n if (rating && ratingAriaLabel) {\n const roundedRating = rating.toFixed(2);\n return format(ratingAriaLabel || '', roundedRating, '5');\n }\n return '';\n}\n\nfunction getReviewAriaLabel(reviewCount?: number, ratingCountAriaLabelText?: string): string {\n if (reviewCount && ratingCountAriaLabelText) {\n return format(ratingCountAriaLabelText || '', reviewCount);\n }\n return '';\n}\n\nfunction renderRating(\n coreContext: ICoreContext,\n moduleTypeName: string,\n moduleId: string,\n avgRating?: number,\n totalRatings?: number,\n ariaLabel?: string,\n ratingCountAriaLabel?: string\n): JSX.Element | null {\n if (!avgRating) {\n return null;\n }\n\n const numberRatings = totalRatings?.toString() || undefined;\n const ratingAriaLabelText = getRatingAriaLabel(avgRating, ariaLabel);\n const ratingCountAriaLabelText = getReviewAriaLabel(Number(numberRatings), ratingCountAriaLabel);\n\n return (\n <RatingComponent\n context={coreContext}\n id={moduleId}\n typeName={moduleTypeName}\n avgRating={avgRating}\n ratingCount={numberRatings}\n readOnly\n ariaLabel={ratingAriaLabelText}\n ratingCountAriaLabel={ratingCountAriaLabelText}\n data={{}}\n />\n );\n}\n\nfunction renderPrice(\n context: ICoreContext,\n typeName: string,\n id: string,\n basePrice?: number,\n adjustedPrice?: number,\n savingsText?: string,\n freePriceText?: string,\n originalPriceText?: string,\n currentPriceText?: string,\n isPriceMinMaxEnabled?: boolean,\n priceResources?: IPriceComponentResources\n): JSX.Element | null {\n const price = {\n BasePrice: basePrice,\n AdjustedPrice: adjustedPrice,\n CustomerContextualPrice: adjustedPrice\n };\n\n return (\n <PriceComponent\n context={context}\n id={id}\n typeName={typeName}\n data={{ price }}\n savingsText={savingsText}\n freePriceText={freePriceText}\n originalPriceText={originalPriceText}\n isPriceMinMaxEnabled={isPriceMinMaxEnabled}\n priceResources={priceResources}\n />\n );\n}\n\nfunction renderProductPlacementImage(\n imageSettings?: IImageSettings,\n gridSettings?: IGridSettings,\n imageUrl?: string,\n fallbackImageUrl?: string,\n altText?: string,\n context?: ICoreContext<IGeneric<IAny>>\n): JSX.Element | null {\n if (!imageUrl || !gridSettings || !imageSettings) {\n return null;\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment -- Site level config can be of any type.\n const contextConfig = context?.app.config?.placeholderImageName;\n const emptyPlaceHolderImage = contextConfig as string;\n let fallbackImageSource = fallbackImageUrl;\n if (emptyPlaceHolderImage && fallbackImageUrl) {\n fallbackImageSource = `${fallbackImageUrl},${emptyPlaceHolderImage}`;\n }\n const img: IImageData = {\n src: imageUrl,\n altText: altText ? altText : '',\n fallBackSrc: fallbackImageSource\n };\n const imageProps = {\n gridSettings,\n imageSettings\n };\n imageProps.imageSettings.cropFocalRegion = true;\n return (\n <Image\n requestContext={context?.actionContext.requestContext}\n {...img}\n {...imageProps}\n loadFailureBehavior='empty'\n bypassHideOnFailure\n />\n );\n}\n\nexport const ProductComponentV2: React.FunctionComponent<IProductComponentV2Props> = msdyn365Commerce.createComponentOverride<\n IProductComponentV2\n>('ProductV2', { component: ProductCardV2, ...PriceComponentActions });\n\nexport default ProductComponentV2;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\nimport {\n IPriceComponentResources,\n ISwatchItem,\n PriceComponent,\n ProductComponentSwatchComponent,\n RatingComponent\n} from '@msdyn365-commerce/components';\nimport {\n getCatalogId,\n IAny,\n IComponent,\n IComponentProps,\n ICoreContext,\n IGeneric,\n IGridSettings,\n IImageData,\n IImageSettings,\n Image,\n msdyn365Commerce\n} from '@msdyn365-commerce/core';\nimport {\n AttributeSwatch,\n AttributeValue,\n ProductDimension,\n ProductPrice,\n ProductSearchResult,\n ProductType,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy';\nimport {\n ArrayExtensions,\n convertDimensionTypeToProductDimensionType,\n Dictionary,\n DimensionTypes,\n generateImageUrl,\n getProductPageUrlSync,\n IDimensionsApp,\n StringExtensions,\n validateCatalogId\n} from '@msdyn365-commerce-modules/retail-actions';\nimport {\n format,\n getPayloadObject,\n getTelemetryAttributes,\n ITelemetryContent,\n onTelemetryClick\n} from '@msdyn365-commerce-modules/utilities';\nimport React, { useState } from 'react';\n\nexport interface IProductComponentProps extends IComponentProps<{ product?: ProductSearchResult; productPrice?: ProductPrice }> {\n className?: string;\n imageSettings?: IImageSettings;\n savingsText?: string;\n freePriceText?: string;\n originalPriceText?: string;\n currentPriceText?: string;\n ratingAriaLabel?: string;\n ratingCountAriaLabel?: string;\n allowBack?: boolean;\n telemetryContent?: ITelemetryContent;\n quickViewButton?: React.ReactNode;\n productComparisonButton?: React.ReactNode;\n isEnabledProductDescription?: boolean;\n isPriceMinMaxEnabled?: boolean;\n priceResources?: IPriceComponentResources;\n inventoryLabel?: string;\n dimensionAvailabilities?: IProductsDimensionsAvailabilities[];\n swatchItemAriaLabel?: string;\n}\n\nexport interface IProductComponent extends IComponent<IProductComponentProps> {}\n\nconst PriceComponentActions = {};\n\n/**\n * Gets the product page url from the default swatch selected.\n * @param productData - Product card to be rendered.\n * @returns The default color swatch selected if any.\n */\nfunction getDefaultSwatchSelected(coreContext: ICoreContext, productData?: ProductSearchResult): AttributeSwatch | null {\n if (!productData || !productData.AttributeValues) {\n return null;\n }\n\n const siteContext = coreContext as ICoreContext<IDimensionsApp>;\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\n\n const attributeSwatches = productData.AttributeValues.find(\n attributeValue => attributeValue.KeyName?.toLocaleLowerCase() === dimensionToPreSelectInProductCard\n )?.Swatches;\n\n if (!ArrayExtensions.hasElements(attributeSwatches)) {\n return null;\n }\n\n const defaultSwatch = attributeSwatches.find(item => item.IsDefault === true) ?? attributeSwatches[0];\n return defaultSwatch;\n}\n\n/**\n * Gets the product image from the default swatch selected.\n * @param coreContext - Context of the module using the component.\n * @param productData - Product card to be rendered.\n * @returns The product card image url.\n */\nfunction getProductImageUrlFromDefaultSwatch(coreContext: ICoreContext, productData?: ProductSearchResult): string | undefined {\n const defaultSwatch = getDefaultSwatchSelected(coreContext, productData);\n const swatchProductImageUrls = defaultSwatch?.ProductImageUrls;\n if (!ArrayExtensions.hasElements(swatchProductImageUrls)) {\n return productData?.PrimaryImageUrl;\n }\n\n return generateImageUrl(swatchProductImageUrls[0], coreContext.request.apiSettings);\n}\n\n/**\n * Updates the product url link to product details page.\n * @param productDetailsPageUrl - Product page url.\n * @param coreContext - Context of the module using the component.\n * @param queryString - Querystring to be added to the URL.\n * @returns The update product page url.\n */\nfunction updateProductUrl(productDetailsPageUrl: string, coreContext: ICoreContext, queryString: string): string {\n const sourceUrl = new URL(productDetailsPageUrl, coreContext.request.apiSettings.baseUrl);\n if (sourceUrl.search) {\n sourceUrl.search += `&${queryString}`;\n } else {\n sourceUrl.search += queryString;\n }\n\n const updatedUrl = new URL(sourceUrl.href);\n return updatedUrl.pathname + sourceUrl.search;\n}\n\n/**\n * Gets the react node for product unit of measure display.\n * @param unitOfMeasure - DefaultUnitOfMeasure property from product.\n * @returns The node representing markup for unit of measure component.\n */\nfunction renderProductUnitOfMeasure(unitOfMeasure?: string): JSX.Element | null {\n if (!unitOfMeasure) {\n return null;\n }\n return (\n <div className='msc-product__unit-of-measure'>\n <span>{unitOfMeasure}</span>\n </div>\n );\n}\n\n/**\n * Gets the react node for product availability.\n * @param inventoryAvailabilityLabel - The product information.\n * @returns The node representing markup for product availability.\n */\nfunction renderProductAvailability(inventoryAvailabilityLabel: string | undefined): JSX.Element | null {\n if (!inventoryAvailabilityLabel || inventoryAvailabilityLabel === '') {\n return null;\n }\n\n return (\n <div className='msc-product__availability'>\n <span>{inventoryAvailabilityLabel}</span>\n </div>\n );\n}\n\n/**\n * Renders product comparison button similar to the quick view button.\n * @param productComparisonButton - React element of the button.\n * @param product - Current product info.\n * @param catalogId - Current catalog.\n * @returns React element for the specific product.\n */\nfunction renderProductComparisonButton(\n productComparisonButton: React.ReactNode,\n product: ProductSearchResult,\n catalogId: number\n): JSX.Element | undefined {\n validateCatalogId(catalogId);\n return React.cloneElement(productComparisonButton as React.ReactElement, { product, catalogId });\n}\n\n/**\n * Gets the product page url from the default swatch selected.\n * @param coreContext - Context of the module using the component.\n * @param productUrl - Product page url for the product card.\n * @param productData - Product card to be rendered.\n * @returns The product card image url.\n */\nfunction getProductPageUrlFromDefaultSwatch(\n coreContext: ICoreContext,\n productUrl: string,\n productData?: ProductSearchResult\n): string | undefined {\n const defaultSwatch = getDefaultSwatchSelected(coreContext, productData);\n if (!defaultSwatch?.SwatchValue) {\n return productUrl;\n }\n\n const siteContext = coreContext as ICoreContext<IDimensionsApp>;\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\n\n const queryStringEncoded = encodeURIComponent(defaultSwatch.SwatchValue);\n const queryString = `${dimensionToPreSelectInProductCard}=${queryStringEncoded}`;\n return updateProductUrl(productUrl, coreContext, queryString);\n}\n\nconst ProductCard: React.FC<IProductComponentProps> = ({\n data,\n context,\n imageSettings,\n savingsText,\n freePriceText,\n originalPriceText,\n currentPriceText,\n ratingAriaLabel,\n ratingCountAriaLabel,\n allowBack,\n typeName,\n id,\n telemetryContent,\n quickViewButton,\n productComparisonButton,\n isEnabledProductDescription,\n isPriceMinMaxEnabled,\n priceResources,\n inventoryLabel,\n dimensionAvailabilities,\n swatchItemAriaLabel\n}) => {\n const product = data.product;\n const productPrice = data.productPrice;\n\n let productUrl = getProductPageUrlSync(product?.Name ?? '', product?.RecordId ?? Number.MIN_VALUE, context.actionContext, undefined);\n if (allowBack) {\n productUrl = updateProductUrl(productUrl, context, 'back=true');\n }\n const productImageUrlFromSwatch = getProductImageUrlFromDefaultSwatch(context, product) ?? product?.PrimaryImageUrl;\n const productPageUrlFromSwatch = getProductPageUrlFromDefaultSwatch(context, productUrl, product) ?? productUrl;\n const [productPageUrl, setProductPageUrl] = useState<string>(productPageUrlFromSwatch);\n const [productImageUrl, setProductImageUrl] = useState<string | undefined>(productImageUrlFromSwatch);\n React.useEffect(() => {\n setProductPageUrl(productPageUrlFromSwatch);\n setProductImageUrl(productImageUrlFromSwatch);\n }, [productUrl, productPageUrlFromSwatch, productImageUrlFromSwatch]);\n const [selectedSwatchItems] = useState(new Dictionary<DimensionTypes, ISwatchItem>());\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-member-access -- app context is generic\n const enableStockCheck = context.app.config.enableStockCheck;\n\n const siteContext = context as ICoreContext<IDimensionsApp>;\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\n\n /**\n * Updates the product page and Image url based on swatch selected.\n * @param coreContext - Context of the caller.\n * @param swatchItem - Dimension swatch selected.\n */\n const updatePageAndImageUrl = React.useCallback(\n (coreContext: ICoreContext, swatchItem: ISwatchItem) => {\n const dimensionType = swatchItem.dimensionType;\n selectedSwatchItems.setValue(dimensionType, swatchItem);\n if (StringExtensions.isNullOrWhitespace(swatchItem.value)) {\n return;\n }\n const queryString = `${dimensionType}=${swatchItem.value}`;\n let productPageUrlWithSwatch = '';\n if (productPageUrl.includes(dimensionType)) {\n const newUrl = new URL(productPageUrl, coreContext.request.apiSettings.baseUrl);\n newUrl.searchParams.delete(dimensionType);\n productPageUrlWithSwatch = updateProductUrl(newUrl.toString(), context, queryString);\n } else {\n productPageUrlWithSwatch = updateProductUrl(productPageUrl, context, queryString);\n }\n setProductPageUrl(productPageUrlWithSwatch);\n if (dimensionType === dimensionToPreSelectInProductCard) {\n const swatchProductImageUrl = ArrayExtensions.hasElements(swatchItem.productImageUrls)\n ? swatchItem.productImageUrls[0]\n : undefined;\n const newImageUrl = generateImageUrl(swatchProductImageUrl, coreContext.request.apiSettings);\n setProductImageUrl(newImageUrl);\n }\n },\n [selectedSwatchItems, context, productPageUrl]\n );\n\n if (!product) {\n return null;\n }\n\n /**\n * Checks if rendering the particular dimensions is allowed for product card.\n * @param dimensionType - Dimension to be displayed.\n * @returns Updates the state with new product page url.\n */\n function shouldDisplayDimension(dimensionType: string): boolean {\n const dimensionsContext = context as ICoreContext<IDimensionsApp>;\n const dimensionsToDisplayOnProductCard = dimensionsContext.app.config.dimensionsInProductCard;\n return (\n ArrayExtensions.hasElements(dimensionsToDisplayOnProductCard) &&\n !dimensionsToDisplayOnProductCard.includes(DimensionTypes.none) &&\n dimensionsToDisplayOnProductCard.includes(dimensionType.toLocaleLowerCase() as DimensionTypes)\n );\n }\n\n /**\n * Gets the react node for product dimension as swatch.\n * @param attributeValues - Attribute value property from product.\n * @returns The node representing markup for unit of measure component.\n */\n function renderProductDimensions(attributeValues?: AttributeValue[]): JSX.Element | null {\n if (!attributeValues) {\n return null;\n }\n\n return (\n <div className='msc-product__dimensions'>\n {attributeValues.map((item: AttributeValue) => {\n const dimensionTypeValue = item.KeyName?.toLocaleLowerCase() ?? '';\n if (!shouldDisplayDimension(dimensionTypeValue)) {\n return null;\n }\n\n const siteContext = context as ICoreContext<IDimensionsApp>;\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\n const dimensionType = dimensionTypeValue as DimensionTypes;\n const swatches =\n item.Swatches?.map<ISwatchItem>(swatchItem => {\n return {\n itemId: `${item.RecordId ?? ''}-${dimensionTypeValue}-${swatchItem.SwatchValue ?? ''}`,\n value: swatchItem.SwatchValue ?? '',\n dimensionType,\n colorHexCode: swatchItem.SwatchColorHexCode,\n imageUrl: swatchItem.SwatchImageUrl,\n productImageUrls: swatchItem.ProductImageUrls,\n isDefault: swatchItem.IsDefault,\n swatchItemAriaLabel: swatchItemAriaLabel ? format(swatchItemAriaLabel, dimensionType) : '',\n isDisabled:\n enableStockCheck &&\n dimensionAvailabilities?.find(\n dimensionAvailability => dimensionAvailability.value === (swatchItem.SwatchValue ?? '')\n )?.isDisabled\n };\n }) ?? [];\n if (\n dimensionType === dimensionToPreSelectInProductCard &&\n ArrayExtensions.hasElements(swatches) &&\n !swatches.some(swatch => swatch.isDefault)\n ) {\n swatches[0].isDefault = true;\n }\n return (\n <ProductComponentSwatchComponent\n context={context}\n swatches={swatches}\n onSelectDimension={updatePageAndImageUrl}\n key={item.RecordId}\n />\n );\n })}\n </div>\n );\n }\n\n function renderQuickView(quickview: React.ReactNode, item?: number): JSX.Element | undefined {\n if (quickview === null) {\n return undefined;\n }\n const selectedDimensions: ProductDimension[] = selectedSwatchItems.getValues().map<ProductDimension>(swatches => {\n return {\n DimensionTypeValue: convertDimensionTypeToProductDimensionType(swatches.dimensionType),\n DimensionValue: {\n RecordId: 0,\n Value: swatches.value\n }\n };\n });\n return React.cloneElement(quickview as React.ReactElement, { selectedProductId: item, selectedDimensions });\n }\n\n // Construct telemetry attribute to render\n const payLoad = getPayloadObject('click', telemetryContent!, '', product.RecordId.toString());\n\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- -- Do not need type check for appsettings\n const isUnitOfMeasureEnabled = context.app.config && context.app.config.unitOfMeasureDisplayType === 'buyboxAndBrowse';\n\n return (\n <>\n {isEnabledProductDescription ? (\n <a\n href={productPageUrl}\n onClick={onTelemetryClick(telemetryContent!, payLoad, product.Name!)}\n aria-label={renderLabel(\n product.Name,\n context.cultureFormatter.formatCurrency(product.Price),\n product.AverageRating,\n ratingAriaLabel,\n product.TotalRatings,\n ratingCountAriaLabel\n )}\n className='msc-product'\n {...attribute}\n >\n <div className='msc-product__image__description'>\n <div className='msc-product__image'>\n {renderProductPlacementImage(\n imageSettings,\n context.request.gridSettings,\n productImageUrl,\n product.PrimaryImageUrl,\n product.Name,\n context\n )}\n </div>\n <div className='msc-product__title_description'>\n <h2 className='msc-product__title__text'>{product.Name}</h2>\n {renderPrice(\n context,\n typeName,\n id,\n product,\n savingsText,\n freePriceText,\n originalPriceText,\n currentPriceText,\n isPriceMinMaxEnabled,\n priceResources,\n productPrice\n )}\n {isUnitOfMeasureEnabled && renderProductUnitOfMeasure(product.DefaultUnitOfMeasure)}\n {renderDescription(product.Description)}\n </div>\n </div>\n </a>\n ) : (\n <a\n href={productPageUrl}\n onClick={onTelemetryClick(telemetryContent!, payLoad, product.Name!)}\n aria-label={renderLabel(\n product.Name,\n context.cultureFormatter.formatCurrency(product.Price),\n product.AverageRating,\n ratingAriaLabel\n )}\n className='msc-product'\n {...attribute}\n >\n <div className='msc-product__image'>\n {renderProductPlacementImage(\n imageSettings,\n context.request.gridSettings,\n productImageUrl,\n product.PrimaryImageUrl,\n product.Name,\n context\n )}\n </div>\n <div className='msc-product__details'>\n <h2 className='msc-product__title'>{product.Name}</h2>\n {renderPrice(\n context,\n typeName,\n id,\n product,\n savingsText,\n freePriceText,\n originalPriceText,\n currentPriceText,\n isPriceMinMaxEnabled,\n priceResources,\n productPrice\n )}\n {isUnitOfMeasureEnabled && renderProductUnitOfMeasure(product.DefaultUnitOfMeasure)}\n </div>\n </a>\n )}\n {renderProductDimensions(product.AttributeValues)}\n {!context.app.config.hideRating &&\n renderRating(context, typeName, id, product.AverageRating, product.TotalRatings, ratingAriaLabel, ratingCountAriaLabel)}\n {renderProductAvailability(inventoryLabel)}\n {quickViewButton && renderQuickView(quickViewButton, product.RecordId)}\n {productComparisonButton && renderProductComparisonButton(productComparisonButton, product, getCatalogId(context.request))}\n </>\n );\n};\n\nfunction renderLabel(\n name?: string,\n price?: string,\n rating?: number,\n ratingAriaLabelText?: string,\n reviewCount?: number,\n ratingCountAriaLabelText?: string\n): string {\n const reviewCountArialableText = getReviewAriaLabel(reviewCount, ratingCountAriaLabelText ?? '');\n return `${name ?? ''} ${price ?? ''} ${getRatingAriaLabel(rating, ratingAriaLabelText)}${\n reviewCountArialableText ? ` ${reviewCountArialableText}` : ''\n }`;\n}\n\nfunction renderDescription(description?: string): JSX.Element | null {\n return <p className='msc-product__text'>{description}</p>;\n}\n\nfunction getRatingAriaLabel(rating?: number, ratingAriaLabel?: string): string {\n if (rating && ratingAriaLabel) {\n const roundedRating = rating.toFixed(2);\n return format(ratingAriaLabel || '', roundedRating, '5');\n }\n return '';\n}\n\nfunction getReviewAriaLabel(reviewCount?: number, ratingCountAriaLabelText?: string): string {\n if (reviewCount && ratingCountAriaLabelText) {\n return format(ratingCountAriaLabelText || '', reviewCount);\n }\n return '';\n}\n\nfunction renderRating(\n coreContext: ICoreContext,\n moduleTypeName: string,\n moduleId: string,\n avgRating?: number,\n totalRatings?: number,\n ariaLabel?: string,\n ratingCountAriaLabel?: string\n): JSX.Element | null {\n if (!avgRating) {\n return null;\n }\n\n const numberRatings = totalRatings?.toString() || undefined;\n const ratingAriaLabelText = getRatingAriaLabel(avgRating, ariaLabel);\n const ratingCountAriaLabelText = getReviewAriaLabel(Number(numberRatings), ratingCountAriaLabel);\n\n return (\n <RatingComponent\n context={coreContext}\n id={moduleId}\n typeName={moduleTypeName}\n avgRating={avgRating}\n ratingCount={numberRatings}\n readOnly\n ariaLabel={ratingAriaLabelText}\n ratingCountAriaLabel={ratingCountAriaLabelText}\n data={{}}\n />\n );\n}\n\nfunction renderPrice(\n context: ICoreContext,\n typeName: string,\n id: string,\n productSearchResult: ProductSearchResult,\n savingsText?: string,\n freePriceText?: string,\n originalPriceText?: string,\n currentPriceText?: string,\n isPriceMinMaxEnabled?: boolean,\n priceResources?: IPriceComponentResources,\n productPrice?: ProductPrice\n): JSX.Element | null {\n const product: SimpleProduct = {\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.\n ProductTypeValue: productSearchResult.IsMasterProduct ? ProductType.Master : ProductType.Standalone\n } as SimpleProduct;\n\n const price: ProductPrice = productPrice ?? {\n BasePrice: productSearchResult.BasePrice,\n AdjustedPrice: productSearchResult.Price,\n CustomerContextualPrice: productSearchResult.Price,\n MaxVariantPrice: productSearchResult.MaxVariantPrice ? productSearchResult.MaxVariantPrice : productSearchResult.Price,\n MinVariantPrice: productSearchResult.MinVariantPrice ? productSearchResult.MinVariantPrice : productSearchResult.Price\n };\n\n return (\n <PriceComponent\n context={context}\n id={id}\n typeName={typeName}\n product={product}\n data={{ price }}\n savingsText={savingsText}\n freePriceText={freePriceText}\n originalPriceText={originalPriceText}\n isPriceMinMaxEnabled={isPriceMinMaxEnabled}\n priceResources={priceResources}\n />\n );\n}\n\nfunction renderProductPlacementImage(\n imageSettings?: IImageSettings,\n gridSettings?: IGridSettings,\n imageUrl?: string,\n fallbackImageUrl?: string,\n altText?: string,\n context?: ICoreContext<IGeneric<IAny>>\n): JSX.Element | null {\n if (!imageUrl || !gridSettings || !imageSettings) {\n return null;\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment -- Site level config can be of any type.\n const contextConfig = context?.app.config?.placeholderImageName;\n const emptyPlaceHolderImage = contextConfig as string;\n let fallbackImageSource = fallbackImageUrl;\n if (emptyPlaceHolderImage && fallbackImageUrl) {\n fallbackImageSource = `${fallbackImageUrl},${emptyPlaceHolderImage}`;\n }\n const img: IImageData = {\n src: imageUrl,\n altText: altText ? altText : '',\n fallBackSrc: fallbackImageSource\n };\n const imageProps = {\n gridSettings,\n imageSettings\n };\n imageProps.imageSettings.cropFocalRegion = true;\n return (\n <Image\n requestContext={context?.actionContext.requestContext}\n {...img}\n {...imageProps}\n loadFailureBehavior='empty'\n bypassHideOnFailure\n />\n );\n}\n\nexport const ProductComponent: React.FunctionComponent<IProductComponentProps> = msdyn365Commerce.createComponentOverride<\n IProductComponent\n>('Product', { component: ProductCard, ...PriceComponentActions });\n\nexport default ProductComponent;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\n/* --------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { IPriceComponentResources } from '@msdyn365-commerce/components';\nimport MsDyn365 from '@msdyn365-commerce/core';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n IRefineMenuViewProps,\n ISearchResultContainerV2ViewProps,\n ISortByViewProps,\n ITitleViewProps,\n ISearchResultV2ModalViewProps\n} from '@msdyn365-commerce-modules/search-result-container-v2';\nimport { Button, getTelemetryObject, Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { MouseEventHandler } from 'react';\nimport { IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\nimport ProductComponentV2, { IProductSearchResult } from './components/product-v2.component';\nimport {\n ISearchResultContainerV2Props,\n ISearchResultContainerV2Resources\n} from '../definition-extensions/search-result-container-v2.ext.props.autogenerated';\n\n/**\n * DescriptionInterval.\n */\nenum DescriptionInterval {\n productDescriptionInterval = 14,\n productDescriptionIntervalRemainder0 = 0,\n productDescriptionIntervalRemainder9 = 9\n}\n\n/**\n * Render Clear button for mobile viewport.\n * @param props - The view props.\n * @returns The JSX Element.\n */\nconst renderProductCards = (props: ISearchResultContainerV2ViewProps & ISearchResultContainerV2Props<{}>): JSX.Element | null => {\n return (\n <Node {...props.productsContainer}>\n {props.errorMessage}\n {props.products}\n </Node>\n );\n};\n\n/**\n * Returns the product inventory label.\n * @param channelInventoryConfigurationId - The channel configuration Id.\n * @param product - The product.\n * @returns The inventory label.\n */\nfunction getInventoryLabel(channelInventoryConfigurationId: number | undefined, product: IProductSearchResult): string | undefined {\n if (!channelInventoryConfigurationId || !ArrayExtensions.hasElements(product.attributeValues)) {\n return undefined;\n }\n const inventoryAttribute = product.attributeValues.find(attribute => attribute.recordId === channelInventoryConfigurationId);\n if (inventoryAttribute) {\n return inventoryAttribute.textValue;\n }\n return undefined;\n}\n\n/**\n * Render Clear button for mobile viewport.\n * @param props - The view props.\n * @param product - The product item data.\n * @param index - The index of each product item.\n * @param isEnabledProductDescription - The flag for showing Product desription tile.\n * @returns The JSX Element.\n */\nconst renderProductCardsDescription = (\n props: ISearchResultContainerV2ViewProps & ISearchResultContainerV2Props<{}>,\n product: IProductSearchResult,\n index: number,\n isEnabledProductDescription?: boolean\n): JSX.Element | null => {\n const { config, context, resources, productsDimensionAvailabilities } = props;\n const telemetryContent = getTelemetryObject(props.context.request.telemetryPageName!, props.friendlyName, props.telemetry);\n const breadCrumbType = props.context.app.config.breadcrumbType;\n const isAllowBack = props.config.allowBackNavigation && (breadCrumbType === 'back' || breadCrumbType === 'categoryAndBack');\n const classname = isEnabledProductDescription\n ? 'ms-product-search-result__item product__description'\n : 'ms-product-search-result__item';\n const quickviewslot = ArrayExtensions.hasElements(props.slots.quickView) ? props.slots.quickView[0] : undefined;\n const channelInventoryConfigurationId = props.data.products.result?.channelInventoryConfigurationId;\n const isPriceMinMaxFeatureState = props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailSearchPriceRangeFeature'\n );\n const priceResources: IPriceComponentResources = {\n priceRangeSeparator: resources.priceRangeSeparator\n };\n\n const productComparisonButton = ArrayExtensions.hasElements(props.slots.productComparisonButton)\n ? props.slots.productComparisonButton[0]\n : null;\n\n return (\n <li className={classname} key={index}>\n <ProductComponentV2\n context={context}\n telemetryContent={telemetryContent}\n imageSettings={config.imageSettings}\n freePriceText={resources.priceFree}\n originalPriceText={resources.originalPriceText}\n currentPriceText={resources.currentPriceText}\n ratingAriaLabel={resources.ratingAriaLabel}\n allowBack={isAllowBack}\n id={props.id}\n key={product.recordId}\n typeName={props.typeName}\n data={{ product }}\n quickViewButton={quickviewslot}\n productComparisonButton={productComparisonButton}\n isEnabledProductDescription={isEnabledProductDescription}\n inventoryLabel={getInventoryLabel(channelInventoryConfigurationId, product)}\n isPriceMinMaxEnabled={isPriceMinMaxFeatureState?.IsEnabled}\n priceResources={priceResources}\n swatchItemAriaLabel={resources.swatchItemAriaLabel}\n dimensionAvailabilities={productsDimensionAvailabilities?.find(\n (dimensionAvailability: IProductsDimensionsAvailabilities[]) =>\n ArrayExtensions.hasElements(dimensionAvailability) &&\n dimensionAvailability[0].masterProductId === product.masterProductId\n )}\n />\n </li>\n );\n};\n\n/**\n * Render Clear button for mobile viewport.\n * @param props - The view props.\n * @returns The JSX Element.\n */\nconst renderProducts = (props: ISearchResultContainerV2ViewProps & ISearchResultContainerV2Props<{}>): JSX.Element | null => {\n const { listPageState, data } = props;\n const activeProducts = listPageState!.activeProducts;\n const products =\n !MsDyn365.isBrowser && !ArrayExtensions.hasElements(activeProducts)\n ? (data.products.result?.products as IProductSearchResult[]) ?? []\n : activeProducts;\n if (!ArrayExtensions.hasElements(products)) {\n return null;\n }\n const productDescriptionInterval: number = DescriptionInterval.productDescriptionInterval;\n const productDescriptionIntervalRemainder0: number = DescriptionInterval.productDescriptionIntervalRemainder0;\n const productDescriptionIntervalRemainder9: number = DescriptionInterval.productDescriptionIntervalRemainder9;\n return (\n <Node {...props.productsContainer}>\n {props.errorMessage}\n <ul className='list-unstyled'>\n {products.map((product: IProductSearchResult, index: number) =>\n index % productDescriptionInterval === productDescriptionIntervalRemainder0 ||\n index % productDescriptionInterval === productDescriptionIntervalRemainder9\n ? renderProductCardsDescription(props, product, index, true)\n : renderProductCardsDescription(props, product, index, false)\n )}\n </ul>\n </Node>\n );\n};\n\n/**\n * Render Title Count.\n * @param props - The title view props.\n * @returns The JSX Element.\n */\nconst renderTitleCount = (props: ITitleViewProps): JSX.Element | null => {\n const { title, titleContainer } = props;\n if (title) {\n return <Node {...titleContainer}>{title.titleCount}</Node>;\n }\n return null;\n};\n\n/**\n * Function to make filter sticky.\n * @param isMobile - The boolean prop.\n * @param isStickyHeader - The boolean prop.\n */\nexport const configureStickyFilter = (isMobile: boolean, isStickyHeader: boolean): void => {\n // Get heights of cookie and promotion banners\n const defaultValue = 0;\n const defaultOffset = 28;\n const headerContainer: HTMLElement | null = document.querySelector('.ms-header');\n\n const headerHeight: number | undefined = headerContainer?.offsetHeight;\n const containerHeight: number = headerHeight ?? defaultOffset;\n const bannerHeights = isStickyHeader ? defaultValue : containerHeight;\n const headerElement = document.querySelector('header .lock-opaque');\n const defaultContainer = document.querySelector('header .default-container');\n const refinerElement = isMobile ? document.querySelector('.msc-sort-filter-wrapper') : document.querySelector('.ms-refiner-heading');\n if (refinerElement && headerElement && defaultContainer) {\n if (MsDyn365.isBrowser && document.documentElement.scrollTop > bannerHeights) {\n refinerElement.classList.add('lock-Filter');\n refinerElement.setAttribute('style', `top: ${defaultContainer.clientHeight}px`);\n } else {\n refinerElement.classList.remove('lock-Filter');\n }\n } else if (refinerElement) {\n if (MsDyn365.isBrowser && document.documentElement.scrollTop > bannerHeights) {\n refinerElement.classList.add('lock-top');\n } else {\n refinerElement.classList.remove('lock-top');\n refinerElement.classList.remove('lock-Filter');\n refinerElement.removeAttribute('style');\n }\n }\n};\n\n/**\n * Function to setup filter sticky.\n * @param isMobile - The boolean prop.\n * @param isStickyHeader - The boolean prop.\n */\nfunction stickyFilterSetup(isMobile: boolean, isStickyHeader: boolean): void {\n window.addEventListener('scroll', () => {\n configureStickyFilter(isMobile, isStickyHeader);\n });\n configureStickyFilter(isMobile, isStickyHeader);\n}\n\n/**\n * Function to make filter sticky.\n * @param refinerRefernce - Ref prop for filter.\n * @param toggle - Toggle function for filter menu.\n */\nfunction useOutsideClick(refinerRefernce: React.RefObject<HTMLElement>, toggle: (event: Event) => void) {\n React.useEffect(() => {\n /**\n * Function to make filter sticky.\n * @param event - Event prop for filter.\n */\n function handleClickOutside(event: Event) {\n const element = document.querySelector('.ms-refine-filter__toggle_collapsed');\n if (refinerRefernce.current && !refinerRefernce.current.contains(event.target as Node) && !element) {\n toggle(event);\n }\n }\n if (MsDyn365.isBrowser) {\n document.addEventListener('click', handleClickOutside);\n }\n return () => {\n if (MsDyn365.isBrowser) {\n document.removeEventListener('click', handleClickOutside);\n }\n };\n }, [refinerRefernce, toggle]);\n}\n\n/**\n * Render the category page items.\n * @param props - The view props.\n * @returns The search Result container module view.\n */\nconst SearchResultContainerView: React.FC<ISearchResultContainerV2ViewProps & ISearchResultContainerV2Props<{}>> = props => {\n const {\n searchResultContainer,\n pagination,\n productSectionContainer,\n choiceSummary,\n isMobile,\n modalToggle,\n searchResultModal,\n titleViewProps,\n refineMenu,\n sortByOptions,\n categoryNavContainer,\n refineAndProductSectionContainer,\n featureSearchContainer,\n similarLookProduct,\n errorMessage,\n resources\n } = props;\n React.useEffect(() => {\n if (props.config.useStickyFilter && MsDyn365.isBrowser) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app context is generic\n stickyFilterSetup(props.isMobile, props.context.app.config.enableStickyHeader as boolean);\n }\n }, [props]);\n const [isExpanded, setIsExpanded] = React.useState<boolean>(false);\n const toggle = () => {\n setIsExpanded(!isExpanded);\n };\n const wrapperRefiner = React.useRef(null);\n useOutsideClick(wrapperRefiner, toggle);\n const isRecoSearchPage = props.context.actionContext.requestContext.query?.recommendation;\n if (isMobile) {\n return (\n <Module {...searchResultContainer}>\n {similarLookProduct ? null : (\n <Node {...categoryNavContainer}>\n {renderTitle(titleViewProps)}\n {renderTitleCount(titleViewProps)}\n </Node>\n )}\n {choiceSummary}\n <Node className='msc-sort-filter-wrapper'>{modalToggle}</Node>\n {createSearchResultModal(searchResultModal, refineMenu, sortByOptions, isRecoSearchPage)}\n <Node {...featureSearchContainer}>{similarLookProduct}</Node>\n {errorMessage}\n {props.config.enableProdutDescription ? renderProducts(props) : renderProductCards(props)}\n {pagination}\n </Module>\n );\n }\n return (\n <Module {...searchResultContainer}>\n {similarLookProduct ? null : (\n <Node {...categoryNavContainer}>\n {titleViewProps && renderTitle(titleViewProps)}\n {titleViewProps && renderTitleCount(titleViewProps)}\n </Node>\n )}\n <Node {...featureSearchContainer}>{similarLookProduct}</Node>\n <Node {...refineAndProductSectionContainer}>\n <Node ref={wrapperRefiner} className='ms-refiner-heading'>\n <Node className='ms-refiner-heading_title'>\n <Button\n className={isExpanded ? 'ms-refine-filter__toggle_expanded' : 'ms-refine-filter__toggle_collapsed'}\n aria-label='Filter'\n onClick={toggle}\n aria-expanded={isExpanded}\n tabIndex={0}\n >\n {resources.filterText}\n </Button>\n <div className='ms-search-result-wrapper-title-choice-summary'>{choiceSummary}</div>\n <div className='ms-search-result-wrapper-sort-by-category'>\n {sortByOptions && !isRecoSearchPage && renderSort(sortByOptions)}\n </div>\n </Node>\n {refineMenu && isExpanded && renderRefiner(refineMenu)}\n <Node className='ms-refine__footer'>\n {refineMenu && isExpanded && renderRefinerFooter(refineMenu, toggle, resources)}\n </Node>\n </Node>\n\n <Node {...productSectionContainer}>\n {errorMessage}\n {props.config.enableProdutDescription ? renderProducts(props) : renderProductCards(props)}\n {pagination}\n </Node>\n </Node>\n </Module>\n );\n};\n\n/**\n * Render Search result Modal.\n * @param modalProps - The Search Result Modal view props.\n * @param refineMenu - The Refine Menu view props.\n * @param sortByDropDown - The Sort by view props.\n * @param isRecoSearchPage - The recomandation search page flag.\n * @returns The JSX Element.\n */\nconst createSearchResultModal = (\n modalProps: ISearchResultV2ModalViewProps,\n refineMenu: IRefineMenuViewProps,\n sortByDropDown?: ISortByViewProps,\n isRecoSearchPage?: string\n): JSX.Element => {\n return React.cloneElement(\n modalProps.modal,\n {},\n modalProps.modalHeader,\n createModalBody(modalProps, refineMenu, sortByDropDown, isRecoSearchPage),\n modalProps.modalFooter\n );\n};\n\n/**\n * Render Refiner Mobile.\n * @param props - The Refine Menu view props.\n * @returns The JSX Element.\n */\nconst renderRefinerMobile = (props: IRefineMenuViewProps): JSX.Element | null => {\n const { refiners, refineMenuContainer, refinerSectionContainer } = props;\n if (refiners) {\n return (\n <Node {...refinerSectionContainer}>\n <Node {...refineMenuContainer}>\n {refiners.map((submenu, index) => (\n <React.Fragment key={index}>{submenu}</React.Fragment>\n ))}\n </Node>\n </Node>\n );\n }\n return null;\n};\n\n/**\n * Render Search result Body.\n * @param props - The Search Result Modal view props.\n * @param refineMenu - The Refine Menu view props.\n * @param sortByDropDown - The Sort by view props.\n * @param isRecoSearchPage - The recomandation search page flag.\n * @returns The JSX Element.\n */\nconst createModalBody = (\n props: ISearchResultV2ModalViewProps,\n refineMenu: IRefineMenuViewProps,\n sortByDropDown?: ISortByViewProps,\n isRecoSearchPage?: string\n): JSX.Element | null => {\n if (sortByDropDown) {\n return React.cloneElement(props.modalBody, {}, renderSort(sortByDropDown, isRecoSearchPage), renderRefinerMobile(refineMenu));\n }\n return null;\n};\n\n/**\n * Render Refiner.\n * @param props - The Refine Menu view props.\n * @returns The JSX Element.\n */\nconst renderRefiner = (props: IRefineMenuViewProps): JSX.Element | null => {\n const { refiners, refineMenuContainer, refinerSectionContainer } = props;\n if (refiners) {\n return (\n <Node {...refinerSectionContainer}>\n <Node {...refineMenuContainer}>\n {refiners.map((submenu, index) => (\n <React.Fragment key={index}>{submenu}</React.Fragment>\n ))}\n </Node>\n </Node>\n );\n }\n return null;\n};\n\n/**\n * Render Refiner Footer.\n * @param props - The Refine Menu view props.\n * @param handler - The Refine menu toggle function.\n * @param resources - Resources to get the done text and aria label.\n * @returns The JSX Element.\n */\nconst renderRefinerFooter = (\n props: IRefineMenuViewProps,\n handler: MouseEventHandler,\n resources: ISearchResultContainerV2Resources\n): JSX.Element | null => {\n const { refiners } = props;\n if (refiners) {\n return (\n <Node className='ms-refine__footer__done'>\n <Node tag='button' className='ms-refine-filter-done' aria-label={resources.doneAriaLabel} tabIndex={0} onClick={handler}>\n {resources.doneText}\n </Node>\n </Node>\n );\n }\n return null;\n};\n\n/**\n * Render sort by drop down.\n * @param props - The sort by view props.\n * @param isRecoSearchPage - The recomandation search page flag.\n * @returns The JSX Element.\n */\nconst renderSort = (props: ISortByViewProps, isRecoSearchPage?: string): JSX.Element | null => {\n const { sortingContainer, sortByDropDown } = props;\n if (sortByDropDown && !isRecoSearchPage) {\n return <Node {...sortingContainer}>{sortByDropDown}</Node>;\n }\n return null;\n};\n\n/**\n * Render Title.\n * @param props - The title view props.\n * @returns The JSX Element.\n */\nconst renderTitle = (props: ITitleViewProps): JSX.Element | null => {\n const { title, titleContainer } = props;\n if (title) {\n return (\n <Node {...titleContainer}>\n <Node tag='h1' className=''>\n {title.titlePrefix}\n {title.titleText}\n </Node>\n </Node>\n );\n }\n return null;\n};\n\nexport default SearchResultContainerView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IPriceComponentResources } from '@msdyn365-commerce/components';\nimport MsDyn365 from '@msdyn365-commerce/core';\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n ICategoryHierarchyViewProps,\n IRefineMenuViewProps,\n ISearchResultContainerViewProps,\n ISearchResultModalViewProps,\n ISortByViewProps,\n ITitleViewProps\n} from '@msdyn365-commerce-modules/search-result-container';\nimport { Button, getTelemetryObject, Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport React, { MouseEventHandler, useEffect, useState } from 'react';\n\nimport { IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\nimport {\n ISearchResultContainerProps,\n ISearchResultContainerResources\n} from '../definition-extensions/search-result-container.ext.props.autogenerated';\nimport { ProductComponent } from './components/product.component';\n\n/**\n * DescriptionInterval.\n */\nenum DescriptionInterval {\n productDescriptionInterval = 14,\n productDescriptionIntervalRemainder0 = 0,\n productDescriptionIntervalRemainder9 = 9\n}\n\n/**\n * Render Clear button for mobile viewport.\n * @param props - The view props.\n * @returns The JSX Element.\n */\nconst renderProductCards = (props: ISearchResultContainerViewProps & ISearchResultContainerProps<{}>): JSX.Element | null => {\n return <Node {...props.ProductsContainer}>{props.products}</Node>;\n};\n\n/**\n * Returns the product inventory label.\n * @param channelInventoryConfigurationId - The channel configuration Id.\n * @param product - The product.\n * @returns The inventory label.\n */\nfunction getInventoryLabel(channelInventoryConfigurationId: number | undefined, product: ProductSearchResult): string | undefined {\n if (!channelInventoryConfigurationId || !ArrayExtensions.hasElements(product.AttributeValues)) {\n return undefined;\n }\n const inventoryAttribute = product.AttributeValues.find(attribute => attribute.RecordId === channelInventoryConfigurationId);\n if (inventoryAttribute) {\n return inventoryAttribute.TextValue;\n }\n return undefined;\n}\n\n/**\n * Render Clear button for mobile viewport.\n * @param props - The view props.\n * @param product - The product item data.\n * @param index - The index of each product item.\n * @param isEnabledProductDescription - The flag for showing Product desription tile.\n * @returns The JSX Element.\n */\nconst renderProductCardsDescription = (\n props: ISearchResultContainerViewProps & ISearchResultContainerProps<{}>,\n product: ProductSearchResult,\n index: number,\n isEnabledProductDescription?: boolean\n): JSX.Element | null => {\n const { config, context, resources, productsDimensionAvailabilities } = props;\n const telemetryContent = getTelemetryObject(props.context.request.telemetryPageName!, props.friendlyName, props.telemetry);\n const breadCrumbType = props.context.app.config.breadcrumbType;\n const isAllowBack = props.config.allowBackNavigation && (breadCrumbType === 'back' || breadCrumbType === 'categoryAndBack');\n const classname = isEnabledProductDescription\n ? 'ms-product-search-result__item product__description'\n : 'ms-product-search-result__item';\n const quickviewslot = ArrayExtensions.hasElements(props.slots.quickview) ? props.slots.quickview[0] : undefined;\n const channelInventoryConfigurationId = props.data.products.result?.channelInventoryConfigurationId;\n const isPriceMinMaxFeatureState = props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailSearchPriceRangeFeature'\n );\n const priceResources: IPriceComponentResources = {\n priceRangeSeparator: resources.priceRangeSeparator\n };\n\n const productComparisonButton = ArrayExtensions.hasElements(props.slots.productComparisonButton)\n ? props.slots.productComparisonButton[0]\n : null;\n\n return (\n <li className={classname} key={index}>\n <ProductComponent\n context={context}\n telemetryContent={telemetryContent}\n imageSettings={config.imageSettings}\n freePriceText={resources.priceFree}\n originalPriceText={resources.originalPriceText}\n currentPriceText={resources.currentPriceText}\n ratingAriaLabel={resources.ratingAriaLabel}\n allowBack={isAllowBack}\n id={props.id}\n key={product.RecordId}\n typeName={props.typeName}\n data={{ product }}\n quickViewButton={quickviewslot}\n productComparisonButton={productComparisonButton}\n isEnabledProductDescription={isEnabledProductDescription}\n inventoryLabel={getInventoryLabel(channelInventoryConfigurationId, product)}\n isPriceMinMaxEnabled={isPriceMinMaxFeatureState?.IsEnabled}\n priceResources={priceResources}\n swatchItemAriaLabel={resources.swatchItemAriaLabel}\n dimensionAvailabilities={productsDimensionAvailabilities?.find(\n (dimensionAvailability: IProductsDimensionsAvailabilities[]) =>\n ArrayExtensions.hasElements(dimensionAvailability) &&\n dimensionAvailability[0].masterProductId === product.MasterProductId\n )}\n />\n </li>\n );\n};\n\n/**\n * Render Clear button for mobile viewport.\n * @param props - The view props.\n * @returns The JSX Element.\n */\nconst renderProducts = (props: ISearchResultContainerViewProps & ISearchResultContainerProps<{}>): JSX.Element | null => {\n const products = props.data.listPageState.result?.activeProducts;\n if (!products || !ArrayExtensions.hasElements(products)) {\n return null;\n }\n const productDescriptionInterval: number = DescriptionInterval.productDescriptionInterval;\n const productDescriptionIntervalRemainder0: number = DescriptionInterval.productDescriptionIntervalRemainder0;\n const productDescriptionIntervalRemainder9: number = DescriptionInterval.productDescriptionIntervalRemainder9;\n return (\n <Node {...props.ProductsContainer}>\n {props.errorMessage}\n <ul className='list-unstyled'>\n {products.map((product: ProductSearchResult, index: number) =>\n index % productDescriptionInterval === productDescriptionIntervalRemainder0 ||\n index % productDescriptionInterval === productDescriptionIntervalRemainder9\n ? renderProductCardsDescription(props, product, index, true)\n : renderProductCardsDescription(props, product, index, false)\n )}\n </ul>\n </Node>\n );\n};\n\n/**\n * Render Title Count.\n * @param props - The title view props.\n * @returns The JSX Element.\n */\nconst renderTitleCount = (props: ITitleViewProps): JSX.Element | null => {\n const { title, TitleContainer } = props;\n if (title) {\n return <Node {...TitleContainer}>{title.titleCount}</Node>;\n }\n return null;\n};\n\n/**\n * Render Category Hierarchy.\n * @param props - The category hierarchy view props.\n * @returns The JSX Element.\n */\nconst renderCategoryHierarchy = (props: ICategoryHierarchyViewProps): JSX.Element | null => {\n const { CategoryHierarchyContainer, categoryHierarchyList, categoryHierarchySeparator } = props;\n if (categoryHierarchyList) {\n return (\n <Node {...CategoryHierarchyContainer}>\n {categoryHierarchyList.map((category, index) => (\n <React.Fragment key={index}>\n {category}\n {categoryHierarchyList[index + 1] && categoryHierarchySeparator}\n </React.Fragment>\n ))}\n </Node>\n );\n }\n\n return null;\n};\n\n/**\n * Function to make filter sticky.\n * @param isMobile - The boolean prop.\n * @param isStickyHeader - The boolean prop.\n */\nexport const configureStickyFilter = (isMobile: boolean, isStickyHeader: boolean): void => {\n // Get heights of cookie and promotion banners\n const defaultValue = 0;\n const defaultOffset = 28;\n const headerContainer: HTMLElement | null = document.querySelector('.ms-header');\n\n const headerHeight: number | undefined = headerContainer?.offsetHeight;\n const containerHeight: number = headerHeight ?? defaultOffset;\n const bannerHeights = isStickyHeader ? defaultValue : containerHeight;\n const headerElement = document.querySelector('header .lock-opaque');\n const defaultContainer = document.querySelector('header .default-container');\n const refinerElement = isMobile ? document.querySelector('.msc-sort-filter-wrapper') : document.querySelector('.ms-refiner-heading');\n if (refinerElement && headerElement && defaultContainer) {\n if (MsDyn365.isBrowser && document.documentElement.scrollTop > bannerHeights) {\n refinerElement.classList.add('lock-Filter');\n refinerElement.setAttribute('style', `top: ${defaultContainer.clientHeight}px`);\n } else {\n refinerElement.classList.remove('lock-Filter');\n }\n } else if (refinerElement) {\n if (MsDyn365.isBrowser && document.documentElement.scrollTop > bannerHeights) {\n refinerElement.classList.add('lock-top');\n } else {\n refinerElement.classList.remove('lock-top');\n refinerElement.classList.remove('lock-Filter');\n refinerElement.removeAttribute('style');\n }\n }\n};\n\n/**\n * Function to setup filter sticky.\n * @param isMobile - The boolean prop.\n * @param isStickyHeader - The boolean prop.\n */\nfunction stickyFilterSetup(isMobile: boolean, isStickyHeader: boolean): void {\n window.addEventListener('scroll', () => {\n configureStickyFilter(isMobile, isStickyHeader);\n });\n configureStickyFilter(isMobile, isStickyHeader);\n}\n\n/**\n * Function to make filter sticky.\n * @param refinerRefernce - Ref prop for filter.\n * @param toggle - Toggle function for filter menu.\n */\nfunction useOutsideClick(refinerRefernce: React.RefObject<HTMLElement>, toggle: (event: Event) => void) {\n React.useEffect(() => {\n /**\n * Function to make filter sticky.\n * @param event - Event prop for filter.\n */\n function handleClickOutside(event: Event) {\n const element = document.querySelector('.ms-refine-filter__toggle_collapsed');\n if (refinerRefernce.current && !refinerRefernce.current.contains(event.target as Node) && !element) {\n toggle(event);\n }\n }\n if (MsDyn365.isBrowser) {\n document.addEventListener('click', handleClickOutside);\n }\n return () => {\n if (MsDyn365.isBrowser) {\n document.removeEventListener('click', handleClickOutside);\n }\n };\n }, [refinerRefernce, toggle]);\n}\n\n/**\n * Render the category page items.\n * @param props - The view props.\n * @returns The search Result container module view.\n */\nconst SearchResultContainerView: React.FC<ISearchResultContainerViewProps & ISearchResultContainerProps<{}>> = props => {\n const {\n SearchResultContainer,\n pagination,\n ProductSectionContainer,\n choiceSummary,\n isMobile,\n modalToggle,\n searchResultModal,\n TitleViewProps,\n refineMenu,\n categoryHierarchy,\n sortByOptions,\n CategoryNavContainer,\n RefineAndProductSectionContainer,\n FeatureSearchContainer,\n similarLookProduct,\n errorMessage,\n resources\n } = props;\n useEffect(() => {\n if (props.config.useStickyFilter && MsDyn365.isBrowser) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app context is generic\n stickyFilterSetup(props.isMobile, props.context.app.config.enableStickyHeader as boolean);\n }\n }, [props]);\n const [isExpanded, setIsExpanded] = useState<boolean>(false);\n const toggle = () => {\n setIsExpanded(!isExpanded);\n };\n const wrapperRefiner = React.useRef(null);\n useOutsideClick(wrapperRefiner, toggle);\n const isRecoSearchPage = props.context.actionContext.requestContext.query?.recommendation;\n if (isMobile) {\n return (\n <Module {...SearchResultContainer}>\n {similarLookProduct ? null : (\n <Node {...CategoryNavContainer}>\n {renderCategoryHierarchy(categoryHierarchy)}\n {renderTitle(TitleViewProps)}\n {renderTitleCount(TitleViewProps)}\n </Node>\n )}\n {choiceSummary}\n <Node className='msc-sort-filter-wrapper'>{modalToggle}</Node>\n {createSearchResultModal(searchResultModal, refineMenu, sortByOptions, isRecoSearchPage)}\n <Node {...FeatureSearchContainer}>{similarLookProduct}</Node>\n {errorMessage}\n {props.config.enableProdutDescription ? renderProducts(props) : renderProductCards(props)}\n {pagination}\n </Module>\n );\n }\n return (\n <Module {...SearchResultContainer}>\n {similarLookProduct ? null : (\n <Node {...CategoryNavContainer}>\n {categoryHierarchy && renderCategoryHierarchy(categoryHierarchy)}\n {TitleViewProps && renderTitle(TitleViewProps)}\n {TitleViewProps && renderTitleCount(TitleViewProps)}\n </Node>\n )}\n <Node {...FeatureSearchContainer}>{similarLookProduct}</Node>\n <Node {...RefineAndProductSectionContainer}>\n <Node ref={wrapperRefiner} className='ms-refiner-heading'>\n <Node className='ms-refiner-heading_title'>\n <Button\n className={isExpanded ? 'ms-refine-filter__toggle_expanded' : 'ms-refine-filter__toggle_collapsed'}\n aria-label='Filter'\n onClick={toggle}\n aria-expanded={isExpanded}\n tabIndex={0}\n >\n {resources.filterText}\n </Button>\n <div className='ms-search-result-wrapper-title-choice-summary'>{choiceSummary}</div>\n <div className='ms-search-result-wrapper-sort-by-category'>\n {sortByOptions && !isRecoSearchPage && renderSort(sortByOptions)}\n </div>\n </Node>\n {refineMenu && isExpanded && renderRefiner(refineMenu)}\n <Node className='ms-refine__footer'>\n {refineMenu && isExpanded && renderRefinerFooter(refineMenu, toggle, resources)}\n </Node>\n </Node>\n\n <Node {...ProductSectionContainer}>\n {errorMessage}\n {props.config.enableProdutDescription ? renderProducts(props) : renderProductCards(props)}\n {pagination}\n </Node>\n </Node>\n </Module>\n );\n};\n\n/**\n * Render Search result Modal.\n * @param modalProps - The Search Result Modal view props.\n * @param refineMenu - The Refine Menu view props.\n * @param sortByDropDown - The Sort by view props.\n * @param isRecoSearchPage - The recomandation search page flag.\n * @returns The JSX Element.\n */\nconst createSearchResultModal = (\n modalProps: ISearchResultModalViewProps,\n refineMenu: IRefineMenuViewProps,\n sortByDropDown: ISortByViewProps,\n isRecoSearchPage?: string\n): JSX.Element => {\n return React.cloneElement(\n modalProps.modal,\n {},\n modalProps.modalHeader,\n createModalBody(modalProps, refineMenu, sortByDropDown, isRecoSearchPage),\n modalProps.modalFooter\n );\n};\n\n/**\n * Render Refiner Mobile.\n * @param props - The Refine Menu view props.\n * @returns The JSX Element.\n */\nconst renderRefinerMobile = (props: IRefineMenuViewProps): JSX.Element | null => {\n const { refiners, RefineMenuContainer, RefinerSectionContainer } = props;\n if (refiners) {\n return (\n <Node {...RefinerSectionContainer}>\n <Node {...RefineMenuContainer}>\n {refiners.map((submenu, index) => (\n <React.Fragment key={index}>{submenu}</React.Fragment>\n ))}\n </Node>\n </Node>\n );\n }\n return null;\n};\n\n/**\n * Render Search result Body.\n * @param props - The Search Result Modal view props.\n * @param refineMenu - The Refine Menu view props.\n * @param sortByDropDown - The Sort by view props.\n * @param isRecoSearchPage - The recomandation search page flag.\n * @returns The JSX Element.\n */\nconst createModalBody = (\n props: ISearchResultModalViewProps,\n refineMenu: IRefineMenuViewProps,\n sortByDropDown: ISortByViewProps,\n isRecoSearchPage?: string\n): JSX.Element | null => {\n if (sortByDropDown) {\n return React.cloneElement(props.modalBody, {}, renderSort(sortByDropDown, isRecoSearchPage), renderRefinerMobile(refineMenu));\n }\n return null;\n};\n\n/**\n * Render Refiner.\n * @param props - The Refine Menu view props.\n * @returns The JSX Element.\n */\nconst renderRefiner = (props: IRefineMenuViewProps): JSX.Element | null => {\n const { refiners, RefineMenuContainer, RefinerSectionContainer } = props;\n if (refiners) {\n return (\n <Node {...RefinerSectionContainer}>\n <Node {...RefineMenuContainer}>\n {refiners.map((submenu, index) => (\n <React.Fragment key={index}>{submenu}</React.Fragment>\n ))}\n </Node>\n </Node>\n );\n }\n return null;\n};\n\n/**\n * Render Refiner Footer.\n * @param props - The Refine Menu view props.\n * @param handler - The Refine menu toggle function.\n * @param resources - Resources to get the done text and aria label.\n * @returns The JSX Element.\n */\nconst renderRefinerFooter = (\n props: IRefineMenuViewProps,\n handler: MouseEventHandler,\n resources: ISearchResultContainerResources\n): JSX.Element | null => {\n const { refiners } = props;\n if (refiners) {\n return (\n <Node className='ms-refine__footer__done'>\n <Node tag='button' className='ms-refine-filter-done' aria-label={resources.doneAriaLabel} tabIndex={0} onClick={handler}>\n {resources.doneText}\n </Node>\n </Node>\n );\n }\n return null;\n};\n\n/**\n * Render sort by drop down.\n * @param props - The sort by view props.\n * @param isRecoSearchPage - The recomandation search page flag.\n * @returns The JSX Element.\n */\nconst renderSort = (props: ISortByViewProps, isRecoSearchPage?: string): JSX.Element | null => {\n const { SortingContainer, sortByDropDown } = props;\n if (sortByDropDown && !isRecoSearchPage) {\n return <Node {...SortingContainer}>{sortByDropDown}</Node>;\n }\n return null;\n};\n\n/**\n * Render Title.\n * @param props - The title view props.\n * @returns The JSX Element.\n */\nconst renderTitle = (props: ITitleViewProps): JSX.Element | null => {\n const { title, TitleContainer } = props;\n if (title) {\n return (\n <Node {...TitleContainer}>\n <Node tag='h1' className=''>\n {title.titlePrefix}\n {title.titleText}\n </Node>\n </Node>\n );\n }\n return null;\n};\n\nexport default SearchResultContainerView;\n"],"names":["GiftWithPurchaseType","props","modalVisible","setModalVisible","useState","gwpData","setGwpData","productAddedAttempt","useRef","window","___initialData___","requestContext","telemetryPageName","toLowerCase","baseImageUrl","context","request","apiSettings","useEffect","disposeReaction","reaction","_props$data$cart$resu","data","cart","result","TotalItems","async","_props$context$reques","_defaultRoutes$orderC","currentURLPathName","url","requestUrl","pathname","replace","isOrderConfirmPage_temp","app","routes","orderConfirmation","destinationUrl","totalItems","current","gwpType","AUTO","document","visibilityState","_props$data$cart$resu2","response","availableGiftsWithPurchase_DLXAsync","callerContext","actionContext","Id","GWPItems","length","Items","Qty","_firstGWPItem$Items$l","_firstGWPItem$Items","_firstGWPItem$Items2","firstGWPItem","gwpTypeTemp","MANUALADD","_availabilityResult$A","availabilityResult","getEstimatedAvailabilityAsync","ProductIds","ProductId","DefaultWarehouseOnly","QuantityUnitTypeValue","AggregatedProductInventoryAvailabilities","MaximumPurchasablePhysicalAvailableQuantity","cartLinesToAdd","ItemId","Quantity","TrackingId","ExtensionProperties","Key","Value","BooleanValue","StringValue","cartState","getCartState","addCartLinesAsync","Version","then","_firstGWPItem$Items3","refreshCart","trackAddToCartFromGWP","RecordId","Name","Description","BasePrice","Price","AdjustedPrice","ProductTypeValue","gwpProps","numberProductsOfGift","productSelection","map","product","ProductNumber","PrimaryImageUrl","catch","error","console","renderView","_objectSpread","promotionProps","closePopupCallback","closePopup","config","tempProducts","React","className","index","_config$modalFreeLabe","key","modalFreeLabel","toUpperCase","ProductComponent","imageSettings","allowBack","id","typeName","Modal","isOpen","autoFocus","fade","verticalPosition","toggle","modalClassName","ModalHeader","modalHeader","ModalBody","modalMainText","popupProps","_product$AttributeVal","_product$AttributeVal2","dialogStrings","gridSettings","productQuantity","modalOpen","setModalOpen","closeModal","fallbackImageUrl","getFallbackImageUrl","quantity","undefined","itemsString","headerItemOneText","headerItemFormatText","toString","tags","tagFriendlyNames","specificationsList","specificationsListFiendly","onClosed","headerMessageText","Image","src","fallBackSrc","altText","loadFailureBehavior","cultureFormatter","formatCurrency","AttributeValues","slice","item","i","KeyName","includes","TextValue","tagFriendlyName","indexOf","tagId","specificationFriendlyName","specificationId","CartLineItemFunctions","renderProductDimensions","Product","DimensionStrings","Dimensions","productDimension","DimensionTypeValue","colorString","DimensionValue","configString","sizeString","IsGiftCard","amountString","styleString","cartLine","DiscountLines","filter","discountLine","_discountLine$Effecti","EffectiveAmount","offerName","offerDescriptions","JSON","parse","OfferDescription","currentLanguage","locale","split","e","OfferName","OfferId","resources","discountStringText","PriceComponent","isSalesLine","price","CustomerContextualPrice","PeriodicDiscount","Percentage","inventoryInformationLabel","inventoryCssName","inventoryLabelClassName","pickupDeliveryModeCode","channel","PickupDeliveryModeCode","channelDeliveryOptionConfig","cartline","hasShippingMethod","_channelDeliveryOptio","DeliveryMode","PickupDeliveryModeCodes","some","deliveryMode","shippingChargeLines","ChargeLines","chargeLine","IsShipping","freightFee","reduce","chargeTotal","CalculatedAmount","priceComponent","freePriceText","shippingChargesText","_cartline$ChargeLines","otherCharges","chargeline","otherCharge","_props$data","productUrl","destructDimensionStrings","productDimensions","cropFocalRegion","renderDisountLines","renderInventoryLabel","renderShippingLabel","renderOtherCharges","payLoad","getPayloadObject","telemetryContent","prodAttribute","getTelemetryAttributes","productName","onChange","newValue","quantityOnChange","_generateErrorMessage","errorMessage","pmProductsVal","fieldVal","pmProducts","pmProductsInfo","pmProduct","info","PMname","PMqty","PMprice","push","name","qty","primaryImageUrl","Object","assign","href","ArrayExtensions","hasElements","showShippingChargesForLineItems","_generateQuantityandPrice","_cartLine$ExtensionPr","nodes","isOutOfStock","isItemGWPAddedAutomatically","prop","_prop$Value","isItemFree","TotalAmount","_props$data$product","isQuantityEditable","classNames","quantityDisplayString","max","maxQuantity","currentCount","currentQuantity","inputQuantityAriaLabel","decrementButtonAriaLabel","incrementButtonAriaLabel","LineId","disabled","isCartStateReady","isGiftCard","NetAmount","NetAmountWithoutTax","NetPrice","originalPriceText","currentPriceText","DiscountAmount","DiscountAmountWithoutTax","msdyn365Commerce","createComponentOverride","component","_ref","_data$product","_product$Name","savingsText","ratingAriaLabel","isPriceMinMaxEnabled","priceResources","productCategoryUserPath","productListName","navigationUrl","renderModalPopup","Popup","catPage","urlTokens","categories","available","setAvailable","loading","setLoading","availableLabel","setAvailableLabel","productAvailabilites","_productAvailabilites","ProductWarehouseInventoryAvailabilities","PhysicalAvailableInventoryLevelLabel","err","_isAvailable","cart_string","percent_discount","discount_string","toFixed","custom_basePrice","custom_adjustedPrice","omnibus_price","attribute","_attribute$Name","omnibus_string","omnibus_price_currency","CurrencyValue","CurrencyCode","getProductPageUrlSync","renderLabel","rating","ratingAriaLabelText","reviewCount","ratingCountAriaLabelText","availability","reviewCountArialableText","format","getReviewAriaLabel","roundedRating","getRatingAriaLabel","renderProductPlacementImage","productCardimageSettings","imageUrl","emptyPlaceHolderImage","placeholderImageName","fallbackImageSource","image","imageProps","bypassHideOnFailure","productDetailsPageUrl","coreContext","queryString","sourceUrl","URL","baseUrl","search","updateProductUrl","_context$actionContex","searchContainerResaurces","requestCache","internalCache","__MR","initialQuntity","add","setAdd","setQuantity","removedFromCart","localPm","localStorage","getItem","localPmProds","stringify","setItem","wrapper","getElementsByClassName","handleButtonClick","event","target","nodeName","timer","setTimeout","clearTimeout","addEventListener","removeEventListener","AddToCartButtons","_ref2","showadd","onClick","pRecordId","pQuantity","pmProductsList","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","IsMasterProduct","ProductType","Master","Standalone","MaxVariantPrice","MinVariantPrice","renderPrice","_ontoProductPDP","_window$dataLayer","_window$dataLayer$pus","trackProductTileClick","list_name","category_name","productInfo","list","category","dataLayer","call","ecommerce","currencyCode","Currency","click","actionField","products","onTelemetryClick","style","textDecoration","_window$dataLayer2","_window$dataLayer2$pu","_context$request$chan","stopPropagation","preventDefault","action","addToCartBehavior","getUrlSync","catalogId","getCatalogId","trackAddToCartFromListing","addProductToCart","count","availableQuantity","additionalProperties","enableStockCheck","isPriceKeyedIn","customPrice","isAddEmailDeliveryItemToCart","shouldSkipSiteSettings","status","AddToCartBehavior","showModal","showNotification","MsDyn365","isBrowser","goToCart","location","visibility","_renderCarousel","carouselContainer","items","Node","_renderProduct","_renderGrid","gridContainer","ProductContainer","productComponent","_getProductTiles","_props$config3","productCollection","getProductData","_getProduct","ObjectExtensions","isNullOrUndefined","_props$data$featureSt","telemetry","trace","getTelemetryObject","friendlyName","allowBackNavigation","breaCrumbType","breadcrumbType","quickviewSlot","slots","quickview","productComparisonButtonSlot","productComparisonButton","reviewCountAriaLabelValue","TotalRatings","ratingCountAriaLabel","ratingCountAriaLabelSingleUser","featureState","find","priceRangeSeparator","tag","priceFree","quickViewButton","IsEnabled","dimensionAvailabilities","heading","text","ProductCollectionContainer","SingleSlideCarouselComponentProps","GridComponentProps","isCarousel","seeAllButton","isViewItemTracked","setIsViewItemTracked","_props$config","_props$config2","trackViewItemList","Module","createSearchResultModal","modalProps","refineMenu","choiceSummary_element","sortByDropDown","isRecoSearchPage","modal","createModalBody","modalFooter","modalBody","renderSort","renderRefiner","refiners","RefineMenuContainer","RefinerSectionContainer","submenu","SortingContainer","renderCategoryHierarchy","dataObj","titleOvverride","CategoryHierarchyContainer","categoryHierarchyList","categoryHierarchySeparator","currentCategory","categoryHierarchy","_currentCategory$inde","Url","renderTitle","displayTitle","renderPrefix","TitleContainer","titlePrefix","titleText","getInventoryLabel","channelInventoryConfigurationId","inventoryAttribute","ProductSearchResultItems","_ref4","moduleType","productsDimensionAvailabilities","inventoryLabel","swatchItemAriaLabel","dimensionAvailability","masterProductId","MasterProductId","_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","SearchResultContainer","pagination","ProductsContainer","ProductSectionContainer","choiceSummary","modalToggle","searchResultModal","TitleViewProps","sortByOptions","CategoryNavContainer","RefineAndProductSectionContainer","FeatureSearchContainer","similarLookProduct","query","recommendation","categoryH1Title","isSearchPage","refinerStatusCount","listPageState","activeFilters","categoryUserPathString","concat","Array","fill","join","listName","getSearchPageString","getCategoryPageString","activeProducts","p","currentFilterCount","isFilterSeen","setIsFilterSeen","prevFilterCount","setPrevFilterCount","prevFilters","setPrevFilters","_props$data$listPageS5","_props$data$listPageS6","_props$data$listPageS10","_props$data$listPageS7","set1","Set","a","set2","difference","x","has","size","_props$data$listPageS8","uniqueString","values","next","currentFilter","LeftValueBoundString","RefinerRecordId","Values","UnitText","trackClickFilter","min","RightValueBoundString","_props$data$listPageS9","introCtn","intro","appendChild","setPmProducts","initialTotalItems","t","totalProducts","tp","initialTotalPrice","qp","totalPrice","setTotalPrice","setTotalItems","pmCartMessage","setPmCartMessage","message","productSelectionSpaceText","openPmCart","setOpenPmCart","cookiePMset","updatePmCart","removeProductFromPmCart","totalNewProducts","_addToCart","_props$context","_props$context2","currentCartState","pickAndMixItems","productsInfo","forEach","_data$Id","dataPrice","parseFloat","trackAddVenchiMix","label","v","addPickAndMixListAsInfocodes_CAPAsync","_currentCartState$car","cartLinesToPatch","CartLines","c","_c$ExtensionPropertie","_c$ExtensionPropertie2","cartLinesUpdated","commerceProperties","updateCartLines","updatedCartLinesObject","pmSuccessAddedToCartMessage","_ref3","total","addToCartButtonText","removeAllButtonText","pickAndMixCartTitle","body","classList","remove","keys","keyName","_pmProducts$keyName","_pmProducts$keyName2","_pmProducts$keyName3","_pmProducts$keyName4","_pmProducts$keyName5","alt","search_qParam","q","eventCategory","eventAction","eventLabel","Row","fluid","Container","titleCount","_getProducts","_props$slots","_props$data$products$","shouldAllowBackNavigation","breadCrumbType","shouldAllowBack","isPriceMinMaxFeatureState","renderRating","ratingId","avgRating","totalRatings","ariaLabel","_totalRatings$toStrin","numberRatings","RatingComponent","ratingCount","ActiveProductComponent","imgData","productId","basePrice","adjustedPrice","description","hideRating","assembleNode","_item$links","additionalContentNode","renderHeading","additionalContentHeading","Msdyn365","editProps","onEdit","handleAdditionalTextChange","subtext","renderParagraph","additionalContentParagraphText","links","ctaLink","renderLinks","linkIndex","editableLink","linkText","linkUrl","openInNewTab","isOpenInNewTab","link","onTextChange","handleAdditionalLinkTextChange","additionalContentContainer","additionalContentItemLinks","activeImageAdditionalContent","additionalContent","CanvasCalculations","CanvasStyles","ImageMapper","constructor","super","_isDesktopViewPort","_context","getActiveImageWidth","activeImageReferenceValue","this","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","parentElement","getAttribute","fillText","drawButton","_this$_canvas$current3","_this$_canvas$current4","buttonTextClor","buttonHeight","buttonPositionX","buttonPositionY","arcsize","beginPath","moveTo","lineTo","arcTo","stroke","closePath","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","hoverOn","onMouseEnter","hoverOff","onMouseLeave","renderAreas","_this$props$imageMapp3","_this$props$imageMapp4","_area$productSearchRe","xsRadius","extendedArea","areaKey","altTextWithProductName","shape","onFocus","onBlur","tabIndex","initCanvas","_this$getActiveImageW","_this$getActiveImageH","_this$_canvas$current12","_backgroundImage","_container","onLoad","defaultHeight","canvasWidth","canvasHeight","componentDidMount","componentDidUpdate","shouldComponentUpdate","nextProps","shouldRender","render","_requestContext$gridS","imageData","ref","useMap","ActiveImageConstants","ActiveImage","_defaultProductCardWidth","_defaultProdutCardHight","_activePoints","addActivePoints","_product$PrimaryImage","areaId","updateClientWidth","viewport","isMobile","variant","VariantType","Browser","setState","renderImageMapper","_this$props$config$ac","productResults","activePoints","configProduct","itemId","_configProduct$xPosit","_configProduct$yPosit","_configProduct$radius","xPosition","yPosition","activePoint","mappedArea","_activeImageClass","state","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","viewports","lg","w","productCardWidth","leftAllignPosition","position","getProductCardPositionY","_this$props$config$pr3","_this$props$config$pr4","_defaultImageSettings2","productImageSettingsHeight","h","produtCardHight","_area$center$2","_area$center2","xs","xl","lazyload","keyDown","enterKey","escKey","handleTextChange","handleParagraphChange","paragraph","renderActiveImageDetailsLinks","_telemetryContent","linkData","contentAction","etext","attributes","linkId","willOpenInNewTab","handleLinkTextChange","renderActiveImageDetailsHeading","_heading$tag","renderActiveImageDetailsParagraph","getActiveImageId","activeImageId","_activeImageIdPart$","activeImageSource","decrementOne","_handleOutsideClick","_this$_productCardDiv","contains","timeoutInterval","images","from","removeAttribute","componentWillUnmount","viewProps","activePointContainer","moduleProps","classnames","activePointDetailsContainer","imageMapper","overlay","productCard","productCardleftPosition","productCardtopPosition","detailsContainer","detailsContainerCta","handleAdditionalParagraphChange","handleAdditionalText","handleAdditionalParagraph","handleAdditionalLinkText","_this$props$config$ad","activeImageView","top","left","CarouselModule","_handleDismissCarousel","cookies","set","dismissCarousel","_next","nextIndex","activeIndex","content","animating","closeNow","_previous","_onExiting","_onExited","_goToIndex","newIndex","get","closeAnimation","previous","onIndicatorsClickHandler","handleDismissCarousel","handleOnExited","handleOnExiting","retrieveItems","renderModuleAttributes","Carousel","pause","pauseOnHover","ride","autoplay","interval","transitionType","hideFlipper","dismissEnabled","dismissCarouselAriaText","ariaLabelForDismissButton","indicatorAriaText","ariaLabelForSlide","directionTextPrev","flipperPrevious","directionTextNext","flipperNext","keyboard","validateCartAsync","propsContext","cartResult","cartVersion","shouldRetry","arguments","warning","debug","AsyncResult","resolve","_validationResult$Val","validationResult","CartsDataActions","bypassCache","ValidationResultsByLineId","refreshError","validateError","cartLineQuantityUpdatedAsync","isQuantityLimitsFeatureEnabled","cartLineToUpdate","isUsingDefaultOrderSettingsMax","_modifiedProduct$Beha2","modifiedProduct","Behavior","MaximumQuantity","input","cartLineId","newQuantity","updateLineResult","updateCartLineQuantity","getProductByProductId","getProductByProductIdAndWarehouse","warehouseId","targetWarehouseValue","WarehouseId","_product$Behavior","InventoryLocationId","ProductPickUpOptionsForCartLineItems","getCacheKey","buildCacheKey","getCacheObjectType","dataCacheType","getPickUpOptionsForCartLineItems","channelId","Error","getActiveCartProductsAction","ActiveCartProductsInput","Promise","ProductsDataActions","queryResultSettings","QueryResultSettingsProxy","getPagingFromInputDataOrDefaultValue","createObservableDataAction","inputData","PickUpInStore","_toggleBOPIS","isBopisSelected","storeSelectorStateManager","storeSelectorModuleId","openDialog","alreadySelectedLocation","OrgUnitNumber","FulfillmentStoreId","deliveryOptions","onLocationSelected","orgUnitLocation","updateCartLinePickupLocation","locationChangedHandler","_onLocationChangedCallback","ShippingAddress","clearCartLinePickupLocation","_getOrgUnitName","fulfillmentStoreId","orgUnitLocations","foundLocation","OrgUnitName","DeliveryOptions","_props$channelDeliver","retailMulitplePickupFeatureState","matchDeliveryOptions","productdeliveryOptions","storePickUpOptionList","deliveryOption","delivery","pickup","deliveryCode","Code","option","callbacks","toggleBopis","defaultComponent","_renderShippingMethod","shipItText","pickupInStoretext","changeStoreText","orgUnitName","bopisSelected","toggleBOPIS","checked","shipitText","pickUpInStoreText","_getDeliveryOption","pickupStore","_deliveryOptions$Deli","ContainerProps","_assembleNode","foundProductAvailability","productPickUpOptions","_foundProductAvailabi","_product$Dimensions","_props$cartState","removeButtonText","removeItemClickHandler","moveToWishlistSuccessHandler","addToOrderTemplateButtonText","addToOrderTemplateButtonTooltip","addToOrderTemplateDialogResources","createOrderTemplateDialogResources","itemAddedToOrderTemplateDialogResources","duplicateItemsWhenAddingToOrderTemplateDialogResources","addToWishlistButtonText","removeFromWishlistButtonText","orderTemplates","customerInformation","wishlists","defaultWishlistName","isMultipleCatalogFeatureEnabledInHq","isAuthenticated","user","nameOfWishlist","availableQuantityInStock","isStockCheckEnabled","productAvailability","ProductAvailableQuantity","IsProductAvailable","AvailableQuantity","_getCartItemAvailableQuantity","_getCartItemMaxQuantity","maxQuantityByConfig","maxByQuantityLimitsFeature","maxByQuantityLimitsFeatureResult","maxCartlineQuantity","shouldSkipStockCheck","ItemTypeValue","ReleasedProductType","Service","IsInvoiceLine","_getErrorMessage","lineId","_props$productAvailab","finalErrorMessages","outOfStockText","includeErrors","outOfRangeOneText","outOfRangeFormatText","checkForErrors","cartlinesErrors","ValidationResultsPairs","errorsFoundByLineId","ValidationFailures","validation","ErrorContext","onRemoveClickHandler","onRemoveClickFunction","payload","TelemetryEvent","RemoveFromCart","inventoryLbl","StockLevelLabel","inventoryCode","StockLevelCode","isCustomPriceSelected","dimension","getProductUrlSync","isChannelTypeB2B","_cartline$CatalogId","fullUrl","searchParams","CatalogId","getInvoiceDetailsPageUrlSync","cartlineId","hasError","StringExtensions","isNullOrEmpty","CartLineItemComponent","catalogs","lineIndex","updateCartLinesQuantitySuccessHandler","priceCurrency","pickUpInStore","pickitUpText","Button","addToWishlist","AddToWishlistComponent","showButtonText","showStatusMessage","showRemoveButton","showButtonTooltip","ariaRole","onSuccess","addToOrderTemplate","AddToOrderTemplateComponent","shouldShowButtonFailedTooltip","disableButton","disableTooltip","assembleCartlines","cartlines","reactNodes","isPickUpItem","isCartLineItemPickUpType","_productAvailability$","_productAvailability$2","_cartline$WarehouseId","shouldIgnoreWarehouse","InventLocationId","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","sm","removeItemFromCartHandler","cartlineToRemove","cartLineIds","removeCartLines","validateCart","updateCartlineQuantity","cartlineToUpdate","cartActionResult","_cartActionResult$err","lineUpdateFailure","validationResults","LocalizedMessage","errorDetails","fulfillmentStoreIdUpdated","bind","isCartValid","_this$props$data$cart","getOrderQuantityLimitsFeatureFlag","_isChannelLimitsFeatureEnabled","showAvailablePromotions","_this$props$data$cart2","_this$props$data$cart3","nextState","_this$props$context$r","_cart$cart$CartLines","_this$props$data$prod","_this$props$data$feat","_featureState$result","signInUrl","guestCheckoutUrl","backToShoppingUrl","checkoutURL","getCheckoutURL","isCartEmpty","_getCartLines","emailDeliveryModeCode","EmailDeliveryModeCode","validInventoryAcrossCartLines","validateCartLinesInventory","isValid","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","_generateOrderTemplateNameDialogResources","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","ModalFooter","cartPromotions","promotionCloseButtonAriaLabel","cartLineInventoryValidationResult","productIdWithErrors","productIdWithError","element","_element$data","outOfStockErrorMessage","allErrors","_cartline$data","_cartline$data$produc","fullError","line","Wrapper","Alert","assertive","outOfStockErrorMessageHeader","header","errors","InvoiceSummary","orderTotalLabel","totalAmountLabel","invoiceLabel","_this$props","_featureState$result2","_this$props$context$r2","channelConfiguration","retailMultiplePickUpOptionEnabled","isShowOrHideTaxEnabled","isEnableShowOrHideSalesTaxECommerceEnabled","OrderSummary","subTotalLabel","itemsWithCountLabel","shippingLabel","estimatedShippingLabel","otherChargeLabel","taxLabel","estimatedTaxLabel","orderTotal","totalDiscountsLabel","toBeCalculatedText","yetToBeCalculatedText","freeText","isTaxIncludedInPrice","IsTaxIncludedInPrice","isShowTaxBreakup","PromoCodeComponent","promoCodeHeadingText","promoPlaceholderText","promoCodeApplyButtonText","appliedPromoCodeHeadingText","collapseTimeOut","removePromoText","invalidPromoCodeErrorText","failedToAddPromoCodeErrorText","failedToRemovePromoCodeErrorText","duplicatePromoCodeErrorText","duplicatePromotionErrorText","addToOrderTemplateHeader","noOrderTemplatesMessage","noOrderTemplatesDescription","createAnOrderTemplateButtonText","createNewOrderTemplateButtonText","cancelOrderTemplateCreationButtonText","selectTemplatesText","addToTemplateButtonText","lineItemsText","_generateItemAddedToOrderTemplateDialogResources","viewOrderTemplateButtonText","continueShoppingButtonText","itemAddedToOrderTemplateHeaderItemOneText","itemAddedToOrderTemplateHeaderItemFormatText","itemAddedToOrderTemplateHeaderMessageText","linesAddedToOrderTemplateHeaderItemsOneText","linesAddedToOrderTemplateHeaderItemsFormatText","linesAddedToOrderTemplateHeaderLinesOneText","linesAddedToOrderTemplateHeaderLinesFormatText","linesAddedToOrderTemplateHeaderMessageText","linesAddedToOrderTemplateCustomPriceAlertMessageText","duplicatedProductsHeader","duplicatedProductsDescription","updateQuantityButtonText","cancelDuplicateItemsButtonText","orderTemplateHeaderLabel","createOrderTemplateHeader","orderTemplateTitleLabel","orderTemplateTitle","orderTemplateNameAriaLabel","orderTemplateDescription","createOrderTemplateDescription","defaultOrderTemplateName","orderTemplateButtonLabel","createOrderTemplateButtonText","orderTemplateCancelButtonLabel","cancelNewOrderTemplateCreationButtonText","_this$props$data$feat2","_this$props$data$feat3","_this$props$data$cata","modules","storeSelectorId","CartLineItems","productDeliveryOptions","updateMaxQuantityForCartLineItem","maxQuantityForCartLineItem","warehouseAggregation","productDimensionTypeSize","productDimensionTypeColor","productDimensionTypeConfiguration","productDimensionTypeStyle","productDimensionTypeAmount","quantityDisplayText","shippingCharges","salesAgreementPricePrompt","priceEditorResources","removeCartButtonText","shipInsteadDisplayText","pickItUpDisplayText","changeStoreDisplayText","errorMessageOutOfRangeOneLeft","errorMessageOutOfRangeFormat","showOutOfStockErrors","addToOrderTemplateMessage","addItemToOrderTemplateError","isAbsoluteUrl","urlCheck","returnURL","origin","_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","__decorate","observer","_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","tax","totalDiscounts","CatalogLabelComponent","isB2b","catalog","EffectivePercentage","unitOfMeasureDisplayType","DefaultUnitOfMeasure","SalesAgreementLineRecordId","_props$context$reques2","_props$primaryImageUr","OmniChannelMedia","renderUnitOfMeasure","renderSalesAgreementPrompt","productAttribute","imgeClassName","NetAmountWithAllInclusiveTax","GrossAmount","ExtendedPrice","salesAgreementLineId","IncrementalQuantity","CartLinePriceEditor","PromoCode","_onInputChangeHandler","promoCodeInputValue","trim","canApply","_applyPromotion","appliedPromo","addPromoCode","substatus","_onSubmitHandler","_applyPromotionHandler","_renderForm","onSubmit","placeholder","_removePromotion","code","currentTarget","removePromoCodes","promoCodes","_calculateDiscount","discountAmount","DiscountCode","DiscountCost","_renderAppliedPromoCode","Coupons","removePromotionHandler","promoCodTotalDiscount","coupon","ApplyPromoCode","isCollapseOpen","InvoiceSummaryLine","cssLabel","_buildPaymentSummarySection","_computedLoyaltyAmount","checkoutState","loyaltyAmount","invoiceLines","invoiceLine","InvoiceAmount","InvoiceId","giftCardAmount","_computeGiftCardAmount","giftCardTotalValue","giftCardExtends","giftCardCounter","Balance","amount","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","OrderTemplateActions","onRemoveOrderTemplate","handlers","itemKey","removeOrderTemplateActionHandler","OrderTemplateRender","orderTemplate","removeFromOrderTemplateListText","orderTemplateState","enableImageProductLink","onDismiss","orderTemplateImage","_renderOrderTemplateImages","orderTemplateLines","orderTemplateAriaLabel","_renderAriaLabel","orderTemplateName","_getOrderTemplatePageUrl","_getUrlSync","separator","totalLines","addToCartButton","AddOrderTemplateToCartComponent","addToCartText","addToBagText","removeButton","orderTemplateStatusMessage","userMessage","statusCssString","onClickHandler","_line$productListLine","_line$fullProduct$Pro","_line$fullProduct","_line$fullProduct2","_line$fullProduct$Pro2","_line$fullProduct3","_getFallbackImageUrl","_line$fullProduct4","_context$request$app","fullProduct","_updateProductUrlCatalog","ProductDetails","productListLine","productDetails","isNullOrWhitespace","OrderTemplateListStatusMessage","errorType","modalCloseButtonReference","onCancelHandler","isCreateOrderTemplateDialogOpen","setOrderTemplateNameDialogOpen","onCreateButtonClick","createOrderTemplateText","OrderTemplateNameDialog","isUpdateDialog","onCancel","onOrderTemplateCreated","parentElementRef","OrderTemplateList","_isChannelMultipleCatalogsFeatureEnabled","feature","_onDismiss","_reloadPage","reload","_onRemoveFromOrderTemplateList","productListId","token","productList","deleteAsync","headerStatusMessage","deleteOrderTemplateFailedText","messageGlyph","_heading$text","_heading$tag3","emptyOrderTemplateText","createNewTemplateButtonText","orderTemplatesData","orderTemplateListHeading","orderTemplateListTitle","errorProps","statusMessage","Spinner","msg","progressNotificationText","Heading","_heading$tag2","emptyViewProps","createOrderTemplateButton","CreateNewTemplateButtonComponent","templateHeaderStatusMessage","OrderTemplates","OrderTemplate","_renderOrderTemplateList","currentTemplateProps","addToBagButtonText","closeWindowButtonText","addToCartFailureMessage","addToCartSuccessMessage","addToCartProcessMessage","orderTemplateErrorMessage","linesAddedToCartDialogResources","viewCartButtonText","orderTemplateCloseButtonText","linesAddedToCartHeaderItemsOneText","linesAddedToCartHeaderLinesOneText","linesAddedToCartHeaderLinesFormatText","linesAddedToCartHeaderMessageText","OrderTemplateListView","_renderOrderTemplate","CONTENT","AddLineToTemplate","productCatalogs","Search","selectedProduct","selectedCatalogId","searchTextInput","addLineButtonRef","_renderSearchForm","searchButtonAriaLabel","searchModalPlaceholderText","selectCatalogTitleText","autoComplete","_onSearchSubmit","htmlFor","_onCatalogSelectionChange","_getCatalogNodes","_onInputChange","maxLength","_get","Loading","_getSearchResults","NotFound","ProductList","_onQuantityChangeHandler","selectedQuantity","_onSelectItem","varianteInput","SelectedVariantInput","productVariant","getSelectedVariant","dimensions","_getProductDimensions","selectedProductDimensions","ProductConfiguration","_onBackButtonClickHandler","_highlightSearchTerm","parsedName","unescape","dangerouslySetInnerHTML","__html","_resultCountText","searchResultsCountVerbage","searchResultsCountSubject","_addItemToTemplateHandler","orderTemplateId","AddItemToOrderTemplateInput","addItemToOrderTemplate","reloadPage","_toggleModalHandler","_getCatalogs","focus","onComponentDidMount","_this$searchTextInput","onComponentDidUpdate","_this$searchTextInput2","addLineModalLinkText","backToResultsText","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","isNaN","currentInput","_handleChange","glyphMinusClassName","decrementGlyphClass","glyphPlusClassName","incrementGlyphClass","incDisabled","currentValue","extraClass","getChangeHandler","_onIncrementalChange","updatedQuantity","inputElement","HTMLInputElement","_debounce","setAttribute","defaultProps","selectedDimensions","_getDimensionsError","dimensionName","dimensionMissingError","_addToTemplateHandler","isBusy","showAddConfirmation","missingDimensions","ProductListId","addToTemplateDuplicateError","addToTemplateGenericError","_onQuantityChange","_updateDimensionValue","productDimensionFull","newValueId","DimensionValues","_onDimensionChanged","_this$state$errors","remainingDimensionsErrors","selection","buttonDisabled","mappedDimensions","variantProduct","dimensionInput","variantDimensions","availabilityInput","ProductAvailabilitiesForSelectedVariantInput","newAvailableQuantity","getProductAvailabilitiesForSelectedVariant","priceInput","PriceForSelectedVariantInput","productPrice","getPriceForSelectedVariant","productAvailableQuantity","unitPrice","sort","b","_getDropdownName","dimensionType","_product$Name2","addItemToTemplateText","addLineProductUnitPricePrefix","quantitySelectLabel","addLineProductUnitOfMeasurePrefix","totalPriceLabel","isMultipleCatalogSelect","_formatPrice","_getDimensionsNodes","_getConfirmationMessage","selectedDimensionNames","_dimension$DimensionV","addToTemplateConfirmation","_this$state$errors2","unshift","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","_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","onAddToBag","onRemoveItem","getAddToBag","getRemoveItem","PopUp","removeFromOrderTemplateLinesText","moreButtonText","viewProductDetailsText","showMobile","setShowMobile","toggleDetailsDisplayed","getActionButton","removeButtonClassName","addButtonClassName","getDesktopActionButton","onSelectLineHandler","isChecked","onSelect","ExtraActionsPopup","showActions","setShowActions","actionsContainerClassName","OrderTemplateMobileLineView","_context$request$app2","UnitOfMeasure","fallbackImage","productLineCatalog","renderProductCatalog","productImage","_renderProductImage","renderProductInfo","_renderPrice","productNumber","productUnitOfMeasure","productQuantityView","_generateQuantity","onChangeHandler","onChangeQuantity","isQuantityDisabledForUpdate","_context$request","_renderProductError","OOS","outOfStockProductErrorMessage","UNASSORTED","unavailableProductErrorMessage","NONE","_orderTemplateLine$fu","_renderProductDimensions","dimensionsLine","OrderTemplateLinesStatusMessage","OrderTemplateTableHeading","componentClassName","getOnChange","checkedLines","lines","scope","selectAllRowsText","productLineCatalogName","productUnitPrice","productUOM","productActions","OrderTemplateLines","_onRemoveSelection","removeSelectedFailureMessage","removeSelectedSuccessMessage","productListLines","maxWaitTimeInMilliSeconds","removeProductListLinesAsync","_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","previousText","nextText","UncontrolledPagination","paginationAriaLabel","qsp","startingItem","_renderPrev","_renderNext","previousAriaLabel","nextAriaLabel","_toggleDetailsDisplayed","isDetailsDisplayed","detailedProductView","absoluteUrl","_changeQuantity","orderTemplateLinesData","orderLineIndex","findIndex","newProductListLine","prevQuantity","_objectWithoutProperties","_excluded","updateProductListLinesAsync","newLine","updatedLines","updatedOrderTemplate","ProductListLines","update","ActiveOrderTemplateLinesInput","editOrderTemplateLineQuantityError","maxQuantityLimitText","addedToCartFailureMessage","addProductToCartInput","priceResult","reject","isMiniCart","_cart$result","_cart$result2","cartLineQuantity","defaultMessage","_result$errorDetails","_removeItemFromOrderTemplateLines","userToken","featureStates","getFeatureState","createGetFeatureStateInput","_featureStates$find","_renameTemplate","_removeTemplate","_orderTemplate$result","newLink","_getViewport","device","Type","innerWidth","md","paginationPreviousText","paginationNextText","_viewport","_updateViewport","isConfirmAddSelectionToBagModalOpen","params","isEditor","emptyOrderTemplateLinesText","errorGettingOrderTemplateLines","orderTemplateResult","_isFirstPage","orderActions","_renderOrderTemplateActions","bulkOrderLineActions","_getOrderTemplateLineActions","productsStatusMessage","ProductsTable","ProductsTableRow","ProductsTableHeading","_renderProductListHeader","orderLines","_renderProductList","updateQuantity","debounce","itemAddedToCartDialog","updated","_product$fullProduct","onSelectAll","productNumberText","productText","productUnitPriceText","productUOMText","productQuantityText","productActionsText","headers","_generateLinesAddedToCartDialogResources","itemAddedToCartHeaderItemOneText","itemAddedToCartHeaderItemFormatText","itemAddedToCartHeaderMessageText","deleteTemplateButtonText","addTemplateToBag","renameTemplate","removeTemplate","actionsSplitButton","OrderTemplateActionsView","renameOrderTemplateTitleText","cancelBtnLabel","skip","selectOneRowText","addOrderTemplateItemToBagButtonText","removeItemFromOrderTemplateButtonText","deleteButtonText","selectLine","addToBagButton","extraActionsPopup","popUp","shouldDisable","OrderTemplateLineView","ProductPrice","observable","_renderItem","quantityLabel","disableElement","pointerEvents","opacity","toggleDetails","wrapClassName","applicationNode","ProductCollection","handleHeadingChange","_getProductsDimensionsAvailabilities","dimensionsToDisplayOnProductCard","dimensionsInProductCard","dimensionsToDisplayAsSwatch","dimensionsAsSwatchType","validProducts","validValues","DimensionTypes","none","getDimensionAvailabilitiesForProductSearchResultAction","DimensionAvailabilitiesForProductSearchResultInput","DimensionSwatchDisplayTypes","initProductState","productPrices","productCollectionProducts","equals","listType","getProductPriceForSelectedProducts","ProductPriceForSelectedProductsInput","_this$state$productsD","_product$MasterProduc","_getActivePrice","productsList","getPriceForProductSearchResult","PriceForProductSearchResultInput","_getSeeAllButton","headingLabel","discountIds","searchPageLink","seeAllButtonText","enableAffiliationBasedPricing","shouldDisplaySeeAllButton","recommendationListId","layout","headingComponent","updatedProducts","productCollectionViewProps","SingleSlideCarousel","flipperPrevLabel","flipperNextLabel","parentId","_renderNoProduct","noProductToRenderText","QuickOrderDrawer","_toggle","isManuallyToggled","collapseProps","drawerGlyphClass","toggleGlyphClassName","animateGlyph","drawerOpenGlyph","openGlyph","closeGlyph","drawerCloseGlyph","children","drawerClass","toggleButtonProps","block","_generateDrawerButtonInnerMarkup","Collapse","collapseState","drawerButtonTextClass","toggleButtonClassName","moduleHeadingText","moduleDescriptionText","_generateGlyphMarkup","glyphClass","onToggle","QuickOrderFormComponent","productTextInput","quantityTextInput","quickOrderState","maxChars","disableAddtoCart","ariaLabelQuantity","ariaLabelProduct","ariaLabelAddtoCart","addQuantityPlaceholderText","handleQuantityChange","handleInputChange","handleAddToCartClick","onInputChange","onInputChangeFunction","onQuantityInputChange","onQuantityChangeFunction","productNode","quantityNode","addToCartBtn","stateMessage","messageText","QuickOrderProduct","simpleProduct","QuickOrderDesktopHeaderCellsComponent","columnWithNumberClassName","quickOrderProductNumberText","quickOrderProductText","quickOrderUnitPriceText","quickOrderUnitOfMeasureText","quickOrderQuantityText","quickOrderTotalText","quickOrderActionsText","QuickOrderMobileHeaderCellsComponent","QuickOrderTableHeaderComponent","rowClassName","headerCells","QuickOrderTableRowProductImageComponent","_props$data$product$P","_props$imageSettings","containerClassName","QuickOrderExtraActionsPopupComponent","QuickOrderDesktopTableRowCellComponent","_cartLine$LineId","dimensionValue","quickOrderProductDimensionsSeparator","UnitOfMeasureSymbol","quickOrderInputQuantityAriaLabel","quickOrderDecrementButtonAriaLabel","quickOrderIncrementButtonAriaLabel","quickOrderRemoveItemButtonAriaLabel","QuickOrderMobileTableRowCellComponent","quickOrderQuantityMobileText","QuickOrderTableRowComponent","QuickOrderTableComponent","setIsMobile","isMobileView","quickOrderProducts","updateViewport","headerClassName","quickOrderProduct","QuickOrder","waitTime","dimensionUpdateQueue","FinitePromiseQueue","initializedDimensions","cssClassNameConfigure","quickOrderCallbacks","initializeDimension","initializedDimension","dimensionSelectedAsync","selectedDimensionId","selectedDimensionValueId","_this$state$productDi","enqueue","_updateDimensions","FinitePromiseQueueError","ProcessWasDiscardedFromTheQueue","getDropdownName","changeUpdatingDimension","isUpdatingDimension","_handleInputChange","productResponse","inputQuantityText","quantityInput","cancellableDebounce","cancel","isQuickOrderFormExpanded","getScanResult","GetScanResultInput","results","ProductDimensionFull","_addItemToCart","quickOrderAddedToCartSuccessMessage","quickOrderAddedToCartFailureMessage","_validateCart","_this$props$context$a","getDeliveryOptionsAsync","defaultDeliveryOption","_updateAvailability","shouldValidateQuantityLimits","_shouldValidateQuantityLimits","orderQuantityLimitsFeatureIsEnabled","inputProductText","maxQtyLimitReachedMessage","_getMaxQtyMessage","isOrderQuantityLimitsFeatureEnabledInSiteSettings","_getConcatenatedMaxQtyMessage","quickOrderMaxQuantityLimitText","quickOrderAlreadyItemQuantityText","_handleQuantityChange","_this$state$productRe","dimensionsToUpdate","productDimensionErrorState","otherError","clearOtherErrorState","configureErrors","errorState","newProduct","productAvailable","_getDimensionErrorString","dimensionTypeValue","quickOrderproductDimensionTypeColorErrorMessage","quickOrderproductDimensionTypeConfigurationErrorMessage","quickOrderproductDimensionTypeSizeErrorMessage","quickOrderproductDimensionTypeAmountErrorMessage","quickOrderproductDimensionTypeStyleErrorMessage","_updateProductAvailability","_productResponse$Dime","_getConfigureErrors","quickOrderWrongQuantityErrorMsg","quickOrderOutofStockErrorMsg","quickOrderFormClass","quickOrderFormProductContent","quickOrderFormMsgContent","quickOrderModuleHeading","quickOrderModuleDescription","quickOrderAddtobag","quickOrderProductQuantityInputLabel","quickOrderProductInputLabel","quickOrderProductDimensionTypeColor","quickOrderProductDimensionTypeConfiguration","quickOrderSelectDimensionFormatString","quickOrderProductDimensionTypeSize","quickOrderProductDimensionTypeStyle","quickOrderProductDimensionTypeAmount","quickAddQuantityPlaceholderText","productConfigureResources","selectDimensionFormatString","quickOrderProps","contentProps","isB2B","drawer","quickOrderForm","quickOrderList","_renderQuickOrderTable","form","configure","getProductConfigure","_initQuickOrderProducts","tableClassName","productInventoryInfo","maxQuantityForLineItem","addedQuantity","_item$ItemId","_this$state$productRe2","minInventory","renderConfigure","containerProps","dropdowns","renderConfigureDropdown","dropdown","labelContainerProps","select","renderForm","quickOrderProductContent","quickOrderMsgContent","ProductRefinerValueDataTypeValue","ProductRefinerTypeValue","ProductRefinerSource","isRangeType","dataTypeValue","AttributeDataType","Decimal","isRangeTypeForInteger","Integer","isCustomRangeTypeIntegerSelected","selectedRefinementCriterion","parentProductRefinerHierarchy","RowNumber","DataTypeValue","DisplayTemplateValue","DisplayTemplate","Range","isSingleSelectRangeTypeIntegerSelected","productRefinerValue","findMatchingRefinementCriterion","refinementCriteria","refinementCriterion","isMatchingRefinementCriterion","parent","RefinerSourceValue","getIntegerRangeName","rangeValue","RightValueBoundLocalizedString","LeftValueBoundLocalizedString","getUpdatedRefinementCriteria","itemToggleNotification","currentRefinementCriteria","updatedRefinementCriteria","toggledItemFound","r","selectedCriterion","isSelecting","rangeStart","rangeEnd","Text","TrueFalse","RefinerTypeValue","RefinerType","SingleSelect","child","matchingIndex","criterion","splice","ChoiceSummary","closeButtonGlyph","_onClick","clearAll","selectedRefiner","_getSelectedRefinerChoice","onChoiceClicked","itemClicked","choiceClicked","nextItemToFocus","nextSibling","selectedChoices","refinerHierarchy","productListInventoryDisplay","ProductListInventoryFilteringOptions","HideOOS","choice","hierarchy","_rangeParentDisplay$","rangeParentDisplay","_getKeyForRefinerValue","rangeDisplayType","clearAllText","choiceAriaLabel","closeAriaLabel","selectedRefinersMap","clearAllAttributes","newIntRange","urlBuilder","_parent","choiceFormat","choiceRangeValueFormat","refinerValues","overallFormat","rangeFormat","refinerValueName","refinerName","filterValue","refiner","currency","ErrorMessage","FeatureSearchResultItem","productRecordId","featureSimilarDescriptionTitle","featureSimilarLooksTitle","img","Link","ModalToggle","modalNode","returnFocusRef","returnRef","onModalToggle","zIndex","modalHeaderNode","modalTitle","modalFooterNode","modalCloseButtonText","RangeRefineItem","_selectedRefinementCr","_this$props$selectedR","_this$props$selectedR2","_this$props$selectedR3","_this$props$selectedR4","_formattedPriceReverseLookup","Map","getLabels","sliderId","minPrice","maxPrice","labelId","labelString","labelPositioning","getSliderThumbs","sliderKey","selectedMin","selectedMinPrice","selectedMax","selectedMaxPrice","_this$props$minValueS","_this$props$maxValueS","minValueSliderThumbAriaLabel","ariaValueText","maxValueSliderThumbAriaLabel","_onRangeUpdate","_onRangeUpdateEnd","_handleRangeTooltipText","_changeMin","_changeMax","_finishChangeMin","_finishChangeMax","minInput","maxInput","initialMin","initialMax","String","maxValue","labels","sliderKeyString","sliderThumbs","validationErrorMin","validationErrorMax","touchedMin","touchedMax","previousProps","updateSliderProps","refineItemCommonProps","rangeType","_renderInputFields","_renderSlider","_this$props$selectedR5","_this$props$selectedR6","_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","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","SourceValue","Rating","_renderRating","productCount","Count","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","hideCount","RangeRefineItemInput","_changeMinInputRange","_changeMaxInputRange","_applyCustom","invalidData","updateInputRangerProps","_isUndefined","RefineSubmenu","_onToggleItem","_onToggleSubmenu","isExpanded","isExpandedOnInitialLoad","expanded","productRefinerHierarchy","timeout","_renderChildItems","_renderSingleMultiSelect","_renderRange","refinerValuesList","listItems","_getRangeType","SliderWithBars","onUpdateRefiners","prevState","Separator","Title","SearchResultContainer_1","sortByDropdownOptions","sortOptions","sortByOptionRelevanceDesc","sortByOptionNameAsc","sortByOptionNameDesc","sortByOptionPriceAsc","sortByOptionPriceDesc","sortByOptionRatingDesc","sortByOptionBestSelling","sortByOptionNewScore","sortByOptionTrendingScore","_pageType","pageType","expandrefinerCount","defaultPageNumber","isListPageStateUpdated","_updateVariantAvailability","includeAttributes","_updateListPageState","_this$props$config$it","_this$props$config$it2","_this$props$context$r3","querySorting","sorting","decodeURIComponent","currentPageNumber","sortingCritera","Columns","pageSize","totalProductCount","hydrateRefinersFromUrl","featureProduct","_this$props$data$list","_this$props$data$list2","_this$props$data$list3","_this$props$data$list4","_getSearchResultModal","SearchResultModal","modalIsOpen","_modalToggleRef","_toggleModal","_getCollectionTitle","collectionTitle","_this$props$context$r4","getFriendlyName","NameTranslations","productCountNumber","productCountText","numberOfProducts","oneProduct","searchTextPrefix","_getCategoryHierarchy","categoryLinkAriaLabel","_getSortingDropDown","activeDropdown","_getCurrentlySelectedOption","sortingState","selectedSortByOption","dropdownOptions","_getAllSortByOptions","dropdownOption","LabeledDropdown","labelClassname","labelText","sortByDropdownLabel","dropdownClassname","toggleColor","selectedOption","onSelectOption","_updateSortByDropdown","_sortAndFilterContainerRef","_getPagination","getCurrentUrl","_getRefineMenu","tempRangeTypeTODO","inputRange","validRefiners","updateRefinerPanel","_shouldHideFromRefiners","activeRefiners","_getexpandRefinerCount","expandRefinersCount","expandedRefiners","_refineItemCommonProps","_onUpdateRefiners","_buildRefinerUrl","_this$props$data$prod2","_this$props$data$prod3","_this$props$data$prod4","channelInventoryConfiguration","isInventorySortableAttribute","inventoryAwareSortableAttributeId","ProductAvailabilitySortableAttributeRecordId","isInventoryProductAttribute","InventoryProductAttributeRecordId","_getChoiceSummary","_this$props$data$refi","selectedRefiners","choiceSummaryLabel","_onChoiceClicked","_buildRefinerUrlForChoiceSummary","_this$props$slots","_this$props$data$prod5","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","_this$props$context$a2","StoreOperationsDataActions","_listPageState$active","_listPageState$sortin","_newListPageState$cur","_newListPageState$sor","_newListPageState$act","_this$props$context$r5","_this$props$context$r6","_this$props$context$r7","newListPageState","GetFullProductsByCollectionInput","Paging","Top","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","disableHierarchy","Viewport","renderTitleCount","SearchState","SuggestionType","AutoSuggestInput","suggestionType","hitPrefix","hitSuffix","searchQuery","topResultsCount","_getAutoSuggest","autosuggest","_ctx$requestContext$a","productSearchCriteria","inventoryRefinerValue","getInventorySortableRefinerValue","isInStock","Attribute","getInventoryConfigurationAsync","Refinement","searchCriteria","ProductSearchCriteria","HitPrefix","HitSuffix","searchSuggestions","getSearchSuggestionsAsync","ImageUrl","AllSearchResults","autoSuggestPromises","all","CategorySuggestionsComponent","suggestions","autoSuggestProps","categorySuggestionHeading","_renderTitle","categoryAutoSuggestionHeading","shouldShowFullPath","splitValue","pop","_generateLink","_getHighlightedText","suggestion","_getCategoryLink","_categoryRefiners$Val","searchPageURL","searchQsp","searchRefiners","queryUrl","categoryRefiners","Category","encodedRefiner","compressRefiners","formattedText","getRichTextHtml","compressedRefinerKeys","compressedRefiners","compressedRefiner","refinerKey","FormComponent","searchPlaceholder","hideSearchLabel","disableSubmitSearch","handleCancelSearchChange","ariaLabelCancel","ariaLabelSearch","ariaLabelSubmit","inputNode","submitBtnNode","cancelBtn","submitBtn","KeywordSuggestionsComponent","formattedLink","LabelComponent","searchLabelClass","searchLabelArialLabel","isSearchFormExpanded","searchtext","searchCollapsedLabel","ProductSuggestionsComponent","productSuggestionHeading","productAutoSuggestionHeading","_item$Value","Value3","DecimalValue","thumbnail","_renderThumbnail","LiProduct","_getLiWrapper","AProduct","_getAWrapper","recid","_props$resources","_isLoadingNode","loadingText","autoSuggestResultLoadingMessage","SpinnerSize","medium","labelPosition","_focusOutTarget","closest","_clearAutoSuggestState","_keyup","keyCode","KeyCodes","Escape","formReference","autoSuggestResultDiv","searchState","defaultBasicSearchUrl","searchQueryStringParameter","createSearchStateInput","cancellabelDebounce","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","categorySuggestions","_item$RefinerRecordId","AutoSuggestAriaLabel","AutoSuggestAriaLabelText","AutoSuggest","KeywordSuggest","ProductSuggest","CategorySuggest","SearchForm","FormWrapper","UlKeyword","UlProduct","UlCategory","autosuggestKeyword","autosuggestProduct","autosuggestCategory","handleCancelSearchFocused","isLoadingNode","suggestionTypes","suggestionTypeCriterion","unique","validSuggestions","loadSuggestionsRequestId","getSearchSuggestionsAction","_getSuggestionType","_getSearchRefiners","_getSearchSuggestions","_updateSearchRefiners","suggestionTypeItem","charAt","_renderKeywordSuggestions","_renderProductSuggestions","_renderCategorySuggestions","getAdditionalContentItems","additionalContentItemContainer","videoPlayerAdditionalContent","additionalContentItems","VideoPlayer","isMobileDevice","options","video","playerResources","playAriaLabel","playLabel","pauseAriaLabel","pauseLabel","playingAriaLabel","playingLabel","pausedAriaLabel","pausedLabel","muteAriaLabel","muteLabel","unMuteAriaLabel","unMuteLabel","fullScreenAriaLabel","fullScreenLabel","exitFullScreenAriaLabel","exitFullScreenLabel","seekBarLabel","videoTimeDurationLabel","closedCaptionLabel","videoMetaData","_video$_links","videoId","duration","playTime","posterframeUrl","_links","binaryReferences","videoBinaryReferences","videoPlayerData","metaData","player","Player","playerData","_getVideoDetailsHeading","_getVideoDetailsParagraph","_getVideoDetailsLinks","detailsContainerCTA","handleText","handleParagraph","handleLink","handleAdditionalLink","getDefaultColorSwatchSelected","productData","_colorAttribute$swatc","_colorAttribute$swatc2","_colorAttribute$swatc3","attributeValues","colorAttribute","attributeValue","_attributeValue$keyNa","defaultSwatch","swatches","isDefault","renderProductUnitOfMeasure","unitOfMeasure","_context$app$config","contextConfig","ProductComponentV2","_product$name","_product$recordId","_getProductImageUrlFr","_getProductPageUrlFro","isEnabledProductDescription","MIN_VALUE","productImageUrlFromSwatch","dimensionToPreSelectInProductCard","productImageUrls","getProductImageUrlFromDefaultColorSwatch","productPageUrlFromSwatch","swatchValue","getProductPageUrlFromDefaultSwatch","productPageUrl","setProductPageUrl","productImageUrl","setProductImageUrl","selectedSwatchItems","Dictionary","updatePageAndImageUrl","swatchItem","setValue","productPageUrlWithSwatch","newUrl","delete","swatchProductImageUrl","newImageUrl","isUnitOfMeasureEnabled","averageRating","defaultUnitOfMeasure","_item$keyName$toLocal","_item$keyName","_item$swatches$map","_item$swatches","shouldDisplayDimension","_item$recordId","_swatchItem$swatchVal","_swatchItem$swatchVal2","_dimensionAvailabilit","swatchColorHexCode","swatchImageUrl","_swatchItem$swatchVal3","swatch","ProductComponentV2SwatchComponent","onSelectDimension","inventoryAvailabilityLabel","getValues","convertDimensionTypeToProductDimensionType","selectedProductId","renderQuickView","renderProductComparisonButton","getDefaultSwatchSelected","_productData$Attribut","_attributeSwatches$fi","attributeSwatches","_attributeValue$KeyNa","Swatches","IsDefault","_product$RecordId","swatchProductImageUrls","ProductImageUrls","getProductImageUrlFromDefaultSwatch","SwatchValue","encodeURIComponent","_item$KeyName$toLocal","_item$KeyName","_item$Swatches$map","_item$Swatches","_item$RecordId","_swatchItem$SwatchVal","_swatchItem$SwatchVal2","_swatchItem$SwatchVal3","ProductComponentSwatchComponent","DescriptionInterval","renderProductCards","productsContainer","textValue","renderProductCardsDescription","isAllowBack","classname","quickviewslot","quickView","renderProducts","_data$products$result","_data$products$result2","productDescriptionInterval","productDescriptionIntervalRemainder0","productDescriptionIntervalRemainder9","titleContainer","configureStickyFilter","isStickyHeader","headerContainer","querySelector","headerHeight","offsetHeight","bannerHeights","headerElement","defaultContainer","refinerElement","documentElement","scrollTop","refineMenuContainer","refinerSectionContainer","renderRefinerMobile","renderRefinerFooter","handler","doneAriaLabel","doneText","sortingContainer","searchResultContainer","productSectionContainer","titleViewProps","categoryNavContainer","refineAndProductSectionContainer","featureSearchContainer","useStickyFilter","stickyFilterSetup","enableStickyHeader","setIsExpanded","wrapperRefiner","refinerRefernce","handleClickOutside","useOutsideClick","enableProdutDescription","filterText"],"sourceRoot":""}