{"version":3,"file":"static/js/7.e0e444d1e86599cb1639.chunk.js","mappings":"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","sources":["webpack://Msdyn365.Commerce.Online/./src/themes/gardner-theme-b2c/views/components/cartlineitem.component.tsx?767d","webpack://Msdyn365.Commerce.Online/./src/themes/gardner-theme-b2c/views/components/promocode.component.tsx?5a9f","webpack://Msdyn365.Commerce.Online/./src/themes/gardner-theme-b2c/views/header.view.tsx?956f","webpack://Msdyn365.Commerce.Online/./src/themes/gardner-theme-b2c/views/ratings-histogram.view.tsx?d36f","webpack://Msdyn365.Commerce.Online/./src/themes/gardner-theme/views/components/cartlineitem.component.tsx?4855","webpack://Msdyn365.Commerce.Online/./src/themes/gardner-theme/views/components/promocode.component.tsx?6892","webpack://Msdyn365.Commerce.Online/./src/utils/cartAttributeManager.ts?36c3","webpack://Msdyn365.Commerce.Online/./src/themes/gardner-theme/views/header.view.tsx?6b29","webpack://Msdyn365.Commerce.Online/./src/themes/gardner-theme/views/ratings-histogram.view.tsx?6aaa","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/bulk-purchase/bulk-purchase.tsx?9fd5","webpack://Msdyn365.Commerce.Online/./src/modules/bulk-purchase/bulk-purchase.view.tsx?feac","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/modules/header/utilities/mock-utilities.ts?d017","webpack://Msdyn365.Commerce.Online/./src/modules/header/components/header-preferred-store.tsx?ee9c","webpack://Msdyn365.Commerce.Online/./src/modules/header/components/logo.tsx?f27e","webpack://Msdyn365.Commerce.Online/./src/modules/header/components/nav-icon.tsx?2475","webpack://Msdyn365.Commerce.Online/./src/modules/header/header.tsx?e91a","webpack://Msdyn365.Commerce.Online/./src/modules/header/header.view.tsx?cf0f","webpack://Msdyn365.Commerce.Online/./src/invoice-summary-lineitem.tsx?5f61","webpack://Msdyn365.Commerce.Online/./src/modules/media-gallery/media-gallery.tsx?24d7","webpack://Msdyn365.Commerce.Online/./src/modules/media-gallery/media-gallery.view.tsx?5061","webpack://Msdyn365.Commerce.Online/./src/modules/media-gallery/utils/helper.ts?b895","webpack://Msdyn365.Commerce.Online/./src/modules/media-gallery/utils/get-valid-product-images.ts?a364","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/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/actions/submit-user-review.ts?ac78","webpack://Msdyn365.Commerce.Online/./src/actions/inputs/submit-user-review-input.ts?3afb","webpack://Msdyn365.Commerce.Online/./src/common/review-modal.tsx?54a9","webpack://Msdyn365.Commerce.Online/./src/common/rnrInterface.ts?f761","webpack://Msdyn365.Commerce.Online/./src/modules/ratings-histogram/component/components.tsx?f324","webpack://Msdyn365.Commerce.Online/./src/modules/ratings-histogram/ratings-histogram.tsx?f6bc","webpack://Msdyn365.Commerce.Online/./src/modules/ratings-histogram/ratings-histogram.view.tsx?5bff","webpack://Msdyn365.Commerce.Online/./src/actions/report-review-concern.ts?bf43","webpack://Msdyn365.Commerce.Online/./src/actions/submit-helpfulness-vote.ts?a8ab","webpack://Msdyn365.Commerce.Online/./src/actions/inputs/report-review-concern-input.ts?b071","webpack://Msdyn365.Commerce.Online/./src/modules/reviews-list/components/components.tsx?033b","webpack://Msdyn365.Commerce.Online/./src/modules/reviews-list/components/report-review-modal.tsx?53d3","webpack://Msdyn365.Commerce.Online/./src/modules/reviews-list/components/review-card.tsx?6bbd","webpack://Msdyn365.Commerce.Online/./src/actions/inputs/submit-helpfulness-vote-input.ts?07aa","webpack://Msdyn365.Commerce.Online/./src/modules/reviews-list/reviews-list.tsx?37e8","webpack://Msdyn365.Commerce.Online/./src/modules/reviews-list/reviews-list.view.tsx?0e4a","webpack://Msdyn365.Commerce.Online/./src/modules/write-review/components/components.tsx?3575","webpack://Msdyn365.Commerce.Online/./src/modules/write-review/write-review.tsx?9afc","webpack://Msdyn365.Commerce.Online/./src/modules/write-review/write-review.view.tsx?b867","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/social-share-item/social-share-item.tsx?bbcb","webpack://Msdyn365.Commerce.Online/./src/modules/social-share-item/social-share-item.view.tsx?2d3e","webpack://Msdyn365.Commerce.Online/./src/modules/video-player/components/additional-content.tsx?b368","webpack://Msdyn365.Commerce.Online/./src/modules/video-player/video-player.tsx?53e5","webpack://Msdyn365.Commerce.Online/./src/modules/video-player/video-player.view.tsx?fedb","webpack://Msdyn365.Commerce.Online/./src/modules/wishlist-items/components/wishlist-items-dimensions.tsx?15c5","webpack://Msdyn365.Commerce.Online/./src/modules/wishlist-items/components/wishlist-item.tsx?d2da","webpack://Msdyn365.Commerce.Online/./src/modules/wishlist-items/components/wishlist-items-status-message.tsx?cdb3","webpack://Msdyn365.Commerce.Online/./src/modules/wishlist-items/wishlist-items.tsx?df8b","webpack://Msdyn365.Commerce.Online/./src/modules/wishlist-items/wishlist-items.view.tsx?4d80","webpack://Msdyn365.Commerce.Online/./src/modules/adventureworks/views/cart-icon.view.tsx?7ec9","webpack://Msdyn365.Commerce.Online/./src/modules/adventureworks/views/components/cartlineitem.component.tsx?ccc2","webpack://Msdyn365.Commerce.Online/./src/modules/adventureworks/views/components/product-v2.component.tsx?d155","webpack://Msdyn365.Commerce.Online/./src/modules/adventureworks/views/header.view.tsx?9bd3","webpack://Msdyn365.Commerce.Online/./src/modules/adventureworks/views/media-gallery.view.tsx?7624","webpack://Msdyn365.Commerce.Online/./src/modules/adventureworks/views/ratings-histogram.view.tsx?bb5b","webpack://Msdyn365.Commerce.Online/./src/modules/adventureworks/views/search-result-container-v2.view.tsx?6eaa"],"sourcesContent":["/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { CartLinePriceEditor, ICartLinePriceEditorResources, PriceComponent } from '@msdyn365-commerce/components';\r\nimport { IComponentProps, IGridSettings, IImageSettings, Image } from '@msdyn365-commerce/core';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport { ChannelDeliveryOptionConfiguration, ProductDimensionType, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport { CartLine, DiscountLine, DiscountLineType, SalesLine } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport { ArrayExtensions, getFallbackImageUrl } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { getPayloadObject, getTelemetryAttributes, IncrementalQuantity, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport classNames from 'classnames';\r\nimport * as React from 'react';\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\r\n /** Display string for discount label. */\r\n discountStringText: string;\r\n\r\n /** String for size key. */\r\n sizeString: string;\r\n\r\n /** String for color key. */\r\n colorString: string;\r\n\r\n /** String associated with the configuration product dimension. */\r\n configString: string;\r\n\r\n /** String for style key. */\r\n styleString: string;\r\n\r\n /** String for amount key. */\r\n amountString?: string;\r\n\r\n /** Display string for quantity label. */\r\n quantityDisplayString: string;\r\n\r\n /** Display string for quantity label. */\r\n inputQuantityAriaLabel: string;\r\n\r\n /** Aria label for the decrement button in quantity component. */\r\n decrementButtonAriaLabel: string;\r\n\r\n /** Aria label for the increment button in quantity component. */\r\n incrementButtonAriaLabel: string;\r\n\r\n /** Original text screenreader. */\r\n originalPriceText: string;\r\n\r\n /** Current text screenreader. */\r\n currentPriceText: string;\r\n\r\n /** Shipping Charges Text. */\r\n shippingChargesText: string;\r\n\r\n /** Price Editor Charges Text. */\r\n priceEditorResources?: ICartLinePriceEditorResources;\r\n}\r\n\r\n/**\r\n * Represents cart line data interface.\r\n */\r\ninterface ICartLineData {\r\n cartLine: CartLine | SalesLine;\r\n cartState?: ICartState;\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\r\n /** The flag to change the quantity component from interactible to static. */\r\n disableQuantityInteractivity?: boolean;\r\n\r\n /** The primary image url. */\r\n primaryImageUrl?: string;\r\n\r\n /** The product url. */\r\n productUrl?: string;\r\n\r\n /** GridSettings for the product image in cartLine. */\r\n gridSettings: IGridSettings;\r\n\r\n /** ImageSettings for the product image in cartLine. */\r\n imageSettings: IImageSettings;\r\n\r\n /** Boolean flag to indicate if the item is out of stock. */\r\n isOutOfStock?: boolean;\r\n\r\n /** Flag to make quantity section editable. */\r\n isQuantityEditable?: boolean;\r\n\r\n /** Max quantity for line item. */\r\n maxQuantity?: number;\r\n\r\n /** Current quantity for line item. */\r\n currentQuantity?: number;\r\n\r\n /** Resource string for the component. */\r\n resources: ICartlineResourceString;\r\n\r\n /** SalesLine flag. */\r\n isSalesLine?: boolean;\r\n\r\n /** Error message to show in place of quantity. */\r\n errorMessage?: string;\r\n\r\n /** Inventory information label. */\r\n inventoryInformationLabel?: string;\r\n\r\n /** Inventory information class name. */\r\n inventoryLabelClassName?: string;\r\n\r\n /** Flag to show/hide shipping charges for line items. */\r\n showShippingChargesForLineItems?: boolean;\r\n\r\n /** Boolean flag to indicate if cart state status is ready. */\r\n isCartStateReady?: boolean;\r\n\r\n /** Chanel Delivery Option configuration is from api. */\r\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\r\n\r\n /** The telemetry content. */\r\n telemetryContent?: ITelemetryContent;\r\n\r\n /** Quantity onChange callback. */\r\n quantityOnChange?(cartLine: CartLine, newQuantity: number): boolean;\r\n}\r\n\r\n/**\r\n * Represents dimensions strings.\r\n */\r\ninterface IDimensionStrings {\r\n\r\n /** String for size key. */\r\n sizeString: string;\r\n\r\n /** String for color key. */\r\n colorString: string;\r\n\r\n /** String associated with the configuration product dimension. */\r\n configString: string;\r\n\r\n /** String for style key. */\r\n styleString: string;\r\n\r\n /** String for amount key. */\r\n amountString?: string;\r\n}\r\n\r\nconst cartLineItemFunctions = {\r\n\r\n /**\r\n * Render product dimensions.\r\n * @param product - Product data.\r\n * @param dimensionStrings - Dimension strings interface.\r\n * @returns JSX Element.\r\n */\r\n renderProductDimensions: (product: SimpleProduct, dimensionStrings: IDimensionStrings) => {\r\n if (!product.Dimensions) {\r\n return [];\r\n }\r\n\r\n return product.Dimensions.map(productDimension => {\r\n\r\n if (productDimension.DimensionTypeValue === ProductDimensionType.Color) {\r\n return (\r\n
\r\n \r\n {dimensionStrings.colorString}\r\n {': '}\r\n \r\n {productDimension.DimensionValue?.Value}\r\n \r\n \r\n
\r\n );\r\n }\r\n\r\n if (productDimension.DimensionTypeValue === ProductDimensionType.Configuration) {\r\n return (\r\n
\r\n \r\n {dimensionStrings.configString}\r\n {': '}\r\n \r\n {productDimension.DimensionValue?.Value}\r\n \r\n \r\n
\r\n );\r\n }\r\n\r\n if (productDimension.DimensionTypeValue === ProductDimensionType.Size) {\r\n return (\r\n
\r\n \r\n {dimensionStrings.sizeString}\r\n {': '}\r\n \r\n {productDimension.DimensionValue?.Value}\r\n \r\n \r\n
\r\n );\r\n }\r\n\r\n if (productDimension.DimensionTypeValue === ProductDimensionType.Style) {\r\n return (\r\n
\r\n \r\n {product.IsGiftCard ? dimensionStrings.amountString : dimensionStrings.styleString}\r\n {': '}\r\n \r\n {productDimension.DimensionValue?.Value}\r\n \r\n \r\n
\r\n );\r\n }\r\n return null;\r\n });\r\n },\r\n\r\n /**\r\n * Gets the react node for product unit of price display.\r\n * @param props - The cart line props.\r\n * @returns The node representing markup for unit of measure component.\r\n */\r\n renderProductUnitPrice: (props: ICartLineProps) => {\r\n if (!props.data.cartLine.Price) {\r\n return null;\r\n }\r\n const zeroQuantity: number = 0;\r\n return (\r\n
\r\n \r\n zeroQuantity ? {\r\n price: {\r\n CustomerContextualPrice: props.data.cartLine.Price\r\n }\r\n } : {\r\n price: {\r\n CustomerContextualPrice: props.data.cartLine.Price\r\n }\r\n }}\r\n context={props.context}\r\n id={props.id}\r\n typeName={props.typeName}\r\n />\r\n \r\n
\r\n );\r\n },\r\n\r\n /**\r\n * Render discount lines.\r\n * @param props - The cart line props.\r\n * @returns JSX element.\r\n */\r\n renderDiscountLines: (props: ICartLineProps) => {\r\n\r\n if (!props.data.cartLine.DiscountLines || !ArrayExtensions.hasElements(props.data.cartLine.DiscountLines)) {\r\n return null;\r\n }\r\n\r\n /**\r\n * Get the updated discount percentage.\r\n * @param discountLine - The discount line.\r\n * @param cartLine - The cart line.\r\n * @returns The updated discount percentage.\r\n */\r\n const discountPercent = (discountLine: DiscountLine, cartLine: CartLine): number => {\r\n const numberZero = 0;\r\n const decimalPrecision = 2;\r\n const fullPercentage = 100;\r\n let updatedPercent: number = discountLine.Percentage ?? numberZero;\r\n\r\n if ((discountLine.Percentage === numberZero ||\r\n (discountLine.DiscountLineTypeValue && discountLine.DiscountLineTypeValue === DiscountLineType.TenderTypeDiscount)) &&\r\n cartLine.Price && cartLine.Price > numberZero && cartLine.Quantity && cartLine.Quantity !== numberZero) {\r\n const effectiveAmount = discountLine.EffectiveAmount ?? numberZero;\r\n updatedPercent = Number(((effectiveAmount / (cartLine.Price * cartLine.Quantity)) * fullPercentage).toFixed(decimalPrecision));\r\n }\r\n\r\n return updatedPercent;\r\n };\r\n\r\n return props.data.cartLine.DiscountLines.map((discountLine, index) => {\r\n return (\r\n
\r\n \r\n {discountLine.OfferName ? discountLine.OfferName : ''}\r\n \r\n \r\n \r\n \r\n \r\n {` (${discountLine.Percentage !== undefined ? discountPercent(discountLine, props.data.cartLine) : ''}%)`}\r\n \r\n
\r\n );\r\n });\r\n },\r\n\r\n /**\r\n * Render inventory label.\r\n * @param props - The cart line props.\r\n * @returns JSX element.\r\n */\r\n renderInventoryLabel: (props: ICartLineProps) => {\r\n const inventoryCssName = props.inventoryLabelClassName ? (\r\n `msc-cart-line__product-inventory-label ${props.inventoryLabelClassName}`) : 'msc-cart-line__product-inventory-label';\r\n\r\n return (\r\n

\r\n {props.inventoryInformationLabel}\r\n

\r\n );\r\n },\r\n\r\n /**\r\n * Render shipping label.\r\n * @param props - The cart line props.\r\n * @returns JSX element.\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 = !!(cartline.DeliveryMode && channelDeliveryOptionConfig.PickupDeliveryModeCodes?.some(\r\n deliveryMode => deliveryMode !== cartline.DeliveryMode));\r\n } else {\r\n hasShippingMethod = !!(cartline.DeliveryMode && cartline.DeliveryMode !== pickupDeliveryModeCode);\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 (!ArrayExtensions.hasElements(shippingChargeLines)) {\r\n return undefined;\r\n }\r\n\r\n const defaultCharge: number = 0;\r\n const freightFee = shippingChargeLines.reduce((chargeTotal, chargeLine) => {\r\n return chargeTotal + (chargeLine.CalculatedAmount ?? defaultCharge);\r\n }, defaultCharge);\r\n\r\n const priceComponent = (\r\n \r\n );\r\n return (\r\n <>\r\n \r\n \r\n {priceComponent}\r\n \r\n \r\n );\r\n },\r\n\r\n /**\r\n * Render other charges.\r\n * @param props - The cart line props.\r\n * @returns JSX element.\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 otherCharges?.map((otherCharge, index) => {\r\n const itemIndex = index;\r\n return otherCharge.CalculatedAmount ? (\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 * Render cartline component.\r\n * @param props - The cart line props.\r\n * @returns JSX element.\r\n */\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 renderProductUnitPrice = cartLineItemFunctions.renderProductUnitPrice(props);\r\n const imageSettings = props.imageSettings;\r\n if (imageSettings) {\r\n imageSettings.cropFocalRegion = true;\r\n }\r\n const renderDiscountLines = 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 productAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\r\n const productName = product?.Name ?? cartLine.Description;\r\n const imgeClassName = props.data.cartLine.IsInvoiceLine ? 'msc-cart-line__invoice-image' : 'msc-cart-line__product-image';\r\n const cartLineContentClassName = props.data.cartLine.IsInvoiceLine ? 'msc-cart-line__invoice-content' : 'msc-cart-line__content';\r\n\r\n /**\r\n * Render other charges.\r\n * @param newValue - The cart line props.\r\n * @returns Boolean.\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 /**\r\n * Generate error message.\r\n * @returns JSX element.\r\n */\r\n const generateErrorMessage = (): JSX.Element | null => {\r\n if (props.errorMessage) {\r\n return (\r\n
\r\n \r\n \r\n {props.errorMessage}\r\n \r\n
\r\n );\r\n }\r\n\r\n return null;\r\n };\r\n\r\n /**\r\n * Render Saving component.\r\n * @returns JSX element.\r\n */\r\n // const renderSaving = (): JSX.Element | null => {\r\n\r\n // if (!props.data.cartLine.DiscountAmount) {\r\n // return null;\r\n // }\r\n // const discountAmountZero: number = 0;\r\n\r\n // if (props.data.cartLine.DiscountAmount > discountAmountZero) {\r\n // return (\r\n // <>\r\n // \r\n // {`${props.resources.discountStringText || 'Discount'}`}\r\n // \r\n // \r\n // \r\n // );\r\n // }\r\n // return null;\r\n // };\r\n\r\n /**\r\n * Gets the react node for product unit of measure display.\r\n * @returns The node representing markup for unit of measure component.\r\n */\r\n const renderUnitOfMeasure = () => {\r\n\r\n if (props.data.cartLine.IsInvoiceLine) {\r\n return null;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Do not need type check for appsettings\r\n if (!props.context.app.config.unitOfMeasureDisplayType || props.context.app.config.unitOfMeasureDisplayType === 'none') {\r\n return undefined;\r\n }\r\n\r\n if (!product || !product.DefaultUnitOfMeasure) {\r\n return undefined;\r\n }\r\n\r\n return (\r\n
\r\n \r\n {product.DefaultUnitOfMeasure}\r\n \r\n
\r\n );\r\n };\r\n\r\n /**\r\n * Generate quantity and price component.\r\n * @returns JSX element.\r\n */\r\n const generateQuantityAndPrice = (): JSX.Element[] | null => {\r\n const nodes = [];\r\n const defaultMaxQuantity: number = 10;\r\n const singleQuantity: number = 1;\r\n const unitOfMeasure = renderUnitOfMeasure();\r\n // No quantity selector for invoice line\r\n if (!props.data.cartLine.IsInvoiceLine) {\r\n if (props.data.product && props.isQuantityEditable) {\r\n nodes.push(\r\n
\r\n
\r\n {resources.quantityDisplayString}\r\n
\r\n\r\n {generateErrorMessage()}\r\n\r\n \r\n {unitOfMeasure}\r\n
\r\n );\r\n } else {\r\n nodes.push(\r\n
\r\n {unitOfMeasure}\r\n \r\n\r\n {generateErrorMessage()}\r\n\r\n \r\n {props.data.cartLine.Quantity}\r\n \r\n
\r\n );\r\n }\r\n }\r\n\r\n nodes.push(\r\n
\r\n \r\n {/* {\r\n renderSaving()\r\n } */}\r\n {props.isOutOfStock ? renderInventoryLabel : null}\r\n
\r\n );\r\n\r\n return nodes;\r\n };\r\n\r\n return (\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 {renderUnitOfMeasure()}\r\n
\r\n {renderProductUnitPrice}\r\n {renderInventoryLabel}\r\n {renderDiscountLines}\r\n {props.showShippingChargesForLineItems &&
\r\n {renderShippingLabel}\r\n
}\r\n {renderOtherCharges}\r\n
\r\n {\r\n generateQuantityAndPrice()\r\n }\r\n {\r\n props.data.cartLine.IsInvoiceLine && props.data.cartState && props.resources.priceEditorResources && \r\n }\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default CartLine;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { IComponent, IComponentProps } from '@msdyn365-commerce/core';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport { Coupon } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { Button, format, getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\n/**\r\n * IPromoCodeProps: Interface for promo code component.\r\n */\r\nexport interface IPromoCodeProps extends IComponentProps<{}> {\r\n cart: ICartState | undefined;\r\n promoCodeHeadingText: string;\r\n appliedPromoCodeHeadingText: string;\r\n removePromoAriaLabelFormat: string;\r\n promoPlaceholderText: string;\r\n promoCodeApplyButtonText: string;\r\n collapseTimeOut: number;\r\n removePromoText: string;\r\n invalidPromoCodeErrorText: string;\r\n failedToAddPromoCodeErrorText: string;\r\n duplicatePromoCodeErrorText: string;\r\n failedToRemovePromoCodeErrorText: string;\r\n\r\n /** The telemetry content. */\r\n telemetryContent?: ITelemetryContent;\r\n promoCodeApplyCallback?(): void;\r\n}\r\n\r\n/**\r\n * IPromoCodeProps: Interface for promo code component.\r\n */\r\nexport interface IPromoCodeComponent extends IComponent { }\r\n\r\n/**\r\n * IPromoCodeProps: Interface for promo code state.\r\n */\r\ninterface IPromoCodeState {\r\n promoCodeInputValue: string;\r\n error: string;\r\n canApply: boolean;\r\n}\r\n\r\n/**\r\n *\r\n * The PromoCode component renders the promocode section.\r\n * @extends {React.PureComponent}\r\n */\r\nclass PromoCode extends React.PureComponent {\r\n\r\n private readonly payLoad: IPayLoad;\r\n\r\n public constructor(props: IPromoCodeProps) {\r\n super(props);\r\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, TelemetryConstant.ApplyPromoCode);\r\n this.state = {\r\n promoCodeInputValue: '',\r\n error: '',\r\n canApply: false\r\n };\r\n }\r\n\r\n public render(): JSX.Element {\r\n return (\r\n
\r\n
\r\n {this.props.promoCodeHeadingText}\r\n
\r\n {this._renderForm(this.props.promoPlaceholderText, this.props.promoCodeApplyButtonText, this.props.cart)}\r\n

\r\n {this.state.error}\r\n

\r\n {this._renderAppliedPromoCode(this.props)}\r\n
\r\n );\r\n }\r\n\r\n /**\r\n * On input change method.\r\n * @param event - Change event.\r\n */\r\n private readonly _onInputChangeHandler = (event: React.ChangeEvent) => {\r\n const error = event.target.value === '' ? '' : this.state.error;\r\n this.setState({\r\n promoCodeInputValue: event.target.value, error,\r\n canApply: !!event.target.value\r\n });\r\n };\r\n\r\n /**\r\n * Apply promo code method.\r\n * @param cartState - Cart state interface.\r\n */\r\n private readonly _applyPromotion = (cartState: ICartState | undefined) => {\r\n if (!cartState) {\r\n return;\r\n }\r\n const appliedPromo = this.state.promoCodeInputValue;\r\n\r\n cartState.addPromoCode({ promoCode: appliedPromo })\r\n .then(result => {\r\n if (result.status === 'SUCCESS') {\r\n // Show success text\r\n this.setState({ promoCodeInputValue: '', error: '', canApply: false });\r\n } else if (result.substatus === 'ALREADYADDED') {\r\n this.setState({ error: this.props.duplicatePromoCodeErrorText });\r\n } else {\r\n this.setState({ error: this.props.invalidPromoCodeErrorText });\r\n }\r\n })\r\n .catch(() => {\r\n this.setState({ error: this.props.failedToAddPromoCodeErrorText });\r\n });\r\n };\r\n\r\n /**\r\n * On submit action.\r\n * @param cartState - Cart state.\r\n * @returns Apply promotion.\r\n */\r\n private readonly _onSubmitHandler = (cartState: ICartState | undefined) => (event: React.FormEvent) => {\r\n event.preventDefault();\r\n this._applyPromotion(cartState);\r\n };\r\n\r\n /**\r\n * On apply promotion.\r\n * @param cartState - Cart state.\r\n * @returns Apply promotion.\r\n */\r\n private readonly applyPromotionHandler = (cartState: ICartState | undefined) => () => {\r\n this._applyPromotion(cartState);\r\n };\r\n\r\n /**\r\n * Renders promo code form.\r\n * @param promoPlaceholderText - Promo code input box placeholder string.\r\n * @param promoCodeApplyButtonText - Promo code button text string.\r\n * @param cartState - Cart state interface.\r\n * @returns Promo code form.\r\n */\r\n private readonly _renderForm = (promoPlaceholderText: string, promoCodeApplyButtonText: string, cartState: ICartState | undefined) => {\r\n\r\n const attributes = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\r\n\r\n return (\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n );\r\n };\r\n\r\n /**\r\n * Remove promo code method.\r\n * @param cartState - Cart state interface.\r\n * @param event - Mouse event.\r\n */\r\n private readonly _removePromotion = (cartState: ICartState | undefined, event: React.MouseEvent) => {\r\n if (!cartState) {\r\n return;\r\n }\r\n const code = event.currentTarget.getAttribute('data-value') ?? '';\r\n cartState.removePromoCodes({\r\n promoCodes: [code]\r\n })\r\n .then(result => {\r\n if (result.status === 'SUCCESS') {\r\n this.setState({ error: '' });\r\n }\r\n })\r\n .catch(() => {\r\n this.setState({ error: this.props.failedToRemovePromoCodeErrorText });\r\n });\r\n\r\n };\r\n\r\n /**\r\n * Renders applied promo code form.\r\n * @param props - Promo code component props.\r\n * @returns Applied promo code.\r\n */\r\n private readonly _renderAppliedPromoCode = (props: IPromoCodeProps) => {\r\n if (!props.cart || !props.cart.cart.Coupons || !ArrayExtensions.hasElements(props.cart.cart.Coupons)) {\r\n return;\r\n }\r\n\r\n /**\r\n * On remove promotion action.\r\n * @param event - Mouse event.\r\n */\r\n const removePromotionHandler = (event: React.MouseEvent) => {\r\n this._removePromotion(props.cart, event);\r\n };\r\n\r\n return (\r\n <>\r\n {\r\n props.cart.cart.Coupons.map((coupon: Coupon) => {\r\n const ariaLabel = props.removePromoAriaLabelFormat ? format(props.removePromoAriaLabelFormat, props.removePromoText, coupon.Code) : '';\r\n\r\n return (\r\n
\r\n
\r\n {'Code '}\r\n \r\n {coupon.Code}\r\n \r\n {'Applied '}\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 PromoCode;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport MsDyn365, { getUrlSync } from \"@msdyn365-commerce/core\";\r\nimport { IHeaderViewProps, Logo } from '@msdyn365-commerce-modules/header';\r\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\n\r\nimport { IHeaderProps } from '../definition-extensions/header.ext.props.autogenerated';\r\n\r\n\r\n/**\r\n * GridSizes.\r\n */\r\nexport type GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\r\n\r\n/**\r\n *\r\n * HeaderView component.\r\n * @extends {React.PureComponent}\r\n */\r\nexport class HeaderView extends React.PureComponent> {\r\n private readonly menuNode: React.RefObject;\r\n\r\n public constructor(props: IHeaderViewProps & IHeaderProps<{}>) {\r\n\r\n super(props);\r\n this.menuNode = React.createRef();\r\n }\r\n\r\n public componentDidMount(): void {\r\n if (this.props.config.useStickyHeader) {\r\n // Set header update methods to trigger on scroll\r\n if (MsDyn365.isBrowser) {\r\n window.addEventListener('scroll', () => {\r\n this._configureStickyHeader();\r\n });\r\n }\r\n this._configureStickyHeader();\r\n }\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Cannot change the prop names as props are from business logic.\r\n const { HeaderTag, HeaderContainer, HeaderTopBarContainer, Divider, MobileMenuContainer, MobileMenuBodyContainer, MobileMenuLinksContainer\r\n , config: { showQuickOrderLink, showPhoneNumber, phoneNumber }\r\n } = this.props;\r\n \r\n const quickOrderUrl = getUrlSync('quickorder', this.props.context.actionContext);\r\n return (\r\n \r\n \r\n \r\n\r\n
\r\n {this.props.navIcon}\r\n
\r\n
\r\n {this.props.logo}\r\n {showPhoneNumber == \"yes\" && phoneNumber ? this._renderPhoneNumber(this.props) : null}\r\n
\r\n
\r\n
\r\n {this._renderReactFragment(this.props.menuBar)}\r\n
\r\n {this._renderMobileLogo()}\r\n {this._renderReactFragment(this.props.search)}\r\n {this.props.preferredStore}\r\n {this._renderAccountBlock(this.props)}\r\n \r\n {showQuickOrderLink ? this._renderQuickViewIcon(quickOrderUrl || '#') : null}\r\n {this.props.cartIcon}\r\n {this._renderReactFragment(this.props.siteOptions)}\r\n
\r\n\r\n
\r\n \r\n \r\n { this.props.MobileMenuHeader }\r\n {this._renderReactFragment(this.props.menuBar)}\r\n \r\n { this.props.accountLinks ? this.props.accountLinks.map(link => link) : false }\r\n { this.props.siteOptions }\r\n { this.props.wishListIconMobile }\r\n { this.props.signInLink }\r\n { this.props.signOutLink }\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n }\r\n\r\n /**\r\n * Function to render phone number beside the logo.\r\n * @param props - IHeaderProps.\r\n * @returns Returns JSX.Element | null.\r\n */\r\n private _renderPhoneNumber(props: IHeaderProps<{}>): JSX.Element | null {\r\n const { config: { phoneNumber } } = props;\r\n const telephoneLink: string = `tel:+1-${phoneNumber}`;\r\n return (\r\n \r\n );\r\n }\r\n\r\n private _renderQuickViewIcon = (quickOrderLink: string) => (\r\n \r\n )\r\n\r\n /**\r\n * Function to update header.\r\n */\r\n private readonly _configureStickyHeader = (): void => {\r\n // Get heights of cookie and promotion banners\r\n const defaultValue = 0;\r\n const headerAlertsContainer: HTMLElement | null = document.querySelector('.ms-promo-banner');\r\n const bannerHeights = headerAlertsContainer ? headerAlertsContainer.offsetHeight : defaultValue;\r\n\r\n // Triggers opacity change of header\r\n const headerElement = document.querySelector('header .default-container');\r\n if (headerElement) {\r\n if (MsDyn365.isBrowser && document.documentElement.scrollTop > defaultValue) {\r\n headerElement.classList.add('lock-opaque');\r\n headerElement.classList.add('fixed');\r\n } else {\r\n headerElement.classList.remove('lock-opaque');\r\n headerElement.classList.remove('fixed');\r\n }\r\n }\r\n\r\n // Update sticky header position and opacity\r\n const stickyHeader: HTMLElement | null = document.querySelector('.desktop-navicon-container');\r\n const headerLogo: HTMLElement | null = document.querySelector('.ms-header__logo');\r\n\r\n if (stickyHeader && headerLogo) {\r\n // Fix center sticky header\r\n const navStickyPos = headerLogo.offsetHeight + bannerHeights;\r\n if (MsDyn365.isBrowser && document.documentElement.scrollTop > navStickyPos) {\r\n stickyHeader.classList.add('fixed');\r\n } else {\r\n stickyHeader.classList.remove('fixed');\r\n }\r\n }\r\n };\r\n\r\n private _renderMobileLogo(): JSX.Element | null {\r\n const { config, context, typeName } = this.props;\r\n return (\r\n \r\n );\r\n }\r\n\r\n /**\r\n * Function to render account block.\r\n * @param props - IHeaderViewProps.\r\n * @returns Returns JSX.Element | null.\r\n */\r\n private readonly _renderAccountBlock = (props: IHeaderViewProps): JSX.Element | null => {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Cannot change the prop names as props are from business logic.\r\n const { AccountInfoDropdownParentContainer, AccountInfoDropdownPopoverConentContainer,\r\n accountInfoDropdownButton,\r\n signOutLink,\r\n signInLink,\r\n accountLinks\r\n } = props;\r\n if (AccountInfoDropdownParentContainer) {\r\n const accountClassName = classnames(AccountInfoDropdownParentContainer.className, 'account-desktop');\r\n if (AccountInfoDropdownPopoverConentContainer) {\r\n return (\r\n \r\n {accountInfoDropdownButton}\r\n \r\n { accountLinks ? accountLinks.map((link: React.ReactNode) => link) : false }\r\n {signOutLink}\r\n \r\n \r\n );\r\n } else if (signInLink) {\r\n return (\r\n \r\n {signInLink}\r\n \r\n );\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n /**\r\n * Function to render react fragment.\r\n * @param items - React nodes.\r\n * @returns Returns JSX.Element | null.\r\n */\r\n private readonly _renderReactFragment = (items: React.ReactNode[]): JSX.Element | null => {\r\n return (\r\n <>\r\n {ArrayExtensions.hasElements(items) ? items.map((slot: React.ReactNode) => {\r\n return (<>\r\n {slot}\r\n );\r\n }) : null}\r\n \r\n );\r\n };\r\n}\r\n\r\nexport default HeaderView;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { RatingComponent } from '@msdyn365-commerce/components';\r\nimport { ICoreContext } from '@msdyn365-commerce/core';\r\nimport { IHistogramItemViewProps,\r\n IRatingsHistogramData,\r\n IRatingsHistogramViewProps } from '@msdyn365-commerce-modules/ratings-reviews';\r\nimport { format, Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { IRatingsHistogramProps, IRatingsHistogramResources } from '../definition-extensions/ratings-histogram.ext.props.autogenerated';\r\n\r\n/**\r\n * Histogram item.\r\n * @param props - Histogram Item ViewProps.\r\n * @returns Histogram Item node.\r\n */\r\nconst histogramItem = (props: IHistogramItemViewProps) => {\r\n return (\r\n \r\n {props.starLabel}\r\n {props.bar}\r\n \r\n );\r\n};\r\n\r\n/**\r\n * Average ratings.\r\n * @param data - Props data.\r\n * @param context - Histogram Item ViewProps.\r\n * @param typeName - Histogram Item ViewProps.\r\n * @param componentId - Histogram Item ViewProps.\r\n * @param resources - Module resource strings.\r\n * @returns Average ratings.\r\n */\r\nconst averageRating = (data: IRatingsHistogramData, context: ICoreContext, typeName: string, componentId: string, resources: IRatingsHistogramResources) => {\r\n const defaultAverageRating: number = 0;\r\n const reviewsCount = data.ratingsSummary.result?.reviewsCount ?? defaultAverageRating;\r\n const reviewsCountString = resources.numberOfReviewsString ? format(resources.numberOfReviewsString, reviewsCount) : `${reviewsCount} reviews`;\r\n\r\n return (\r\n
\r\n
\r\n {data.ratingsSummary.result?.averageRating}\r\n
\r\n
\r\n \r\n
\r\n
\r\n {reviewsCountString}\r\n
\r\n
\r\n );\r\n};\r\n\r\n/**\r\n * Histogram view.\r\n * @param props - Ratings HistogramV iewProps.\r\n * @returns Histogram view module.\r\n */\r\nconst RatingsHistogramView: React.FC> = props => {\r\n const { heading, histogramItems, histogramProps, moduleProps, data, resources } = props;\r\n const context = props.context;\r\n const typeName = props.typeName;\r\n const moduleId = props.id;\r\n\r\n return (\r\n \r\n {heading}\r\n
\r\n {averageRating(data, context, typeName, moduleId, resources)}\r\n \r\n {histogramItems.map(item => {\r\n return histogramItem(item);\r\n })}\r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default RatingsHistogramView;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { CartLinePriceEditor, ICartLinePriceEditorResources, PriceComponent } from '@msdyn365-commerce/components';\r\nimport { IComponentProps, IGridSettings, IImageSettings, Image } from '@msdyn365-commerce/core';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport { ChannelDeliveryOptionConfiguration, ProductDimensionType, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport { CartLine, CommerceProperty, DiscountLine, DiscountLineType, SalesLine } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport { ArrayExtensions, getFallbackImageUrl } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { getPayloadObject, getTelemetryAttributes, IncrementalQuantity, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport classNames from 'classnames';\r\nimport * as React from 'react';\r\nimport { CommercePropertyValueEnum } from '../../../../modules/allowable-freight/utils/CommercePropertyValueEnum';\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\r\n /** Display string for discount label. */\r\n discountStringText: string;\r\n\r\n /** String for size key. */\r\n sizeString: string;\r\n\r\n /** String for color key. */\r\n colorString: string;\r\n\r\n /** String associated with the configuration product dimension. */\r\n configString: string;\r\n\r\n /** String for style key. */\r\n styleString: string;\r\n\r\n /** String for amount key. */\r\n amountString?: string;\r\n\r\n /** Display string for quantity label. */\r\n quantityDisplayString: string;\r\n\r\n /** Display string for quantity label. */\r\n inputQuantityAriaLabel: string;\r\n\r\n /** Aria label for the decrement button in quantity component. */\r\n decrementButtonAriaLabel: string;\r\n\r\n /** Aria label for the increment button in quantity component. */\r\n incrementButtonAriaLabel: string;\r\n\r\n /** Original text screenreader. */\r\n originalPriceText: string;\r\n\r\n /** Current text screenreader. */\r\n currentPriceText: string;\r\n\r\n /** Shipping Charges Text. */\r\n shippingChargesText: string;\r\n\r\n /** Price Editor Charges Text. */\r\n priceEditorResources?: ICartLinePriceEditorResources;\r\n}\r\n\r\n/**\r\n * Represents cart line data interface.\r\n */\r\ninterface ICartLineData {\r\n cartLine: CartLine | SalesLine;\r\n cartState?: ICartState;\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\r\n /** The flag to change the quantity component from interactible to static. */\r\n disableQuantityInteractivity?: boolean;\r\n\r\n /** The primary image url. */\r\n primaryImageUrl?: string;\r\n\r\n /** The product url. */\r\n productUrl?: string;\r\n\r\n /** GridSettings for the product image in cartLine. */\r\n gridSettings: IGridSettings;\r\n\r\n /** ImageSettings for the product image in cartLine. */\r\n imageSettings: IImageSettings;\r\n\r\n /** Boolean flag to indicate if the item is out of stock. */\r\n isOutOfStock?: boolean;\r\n\r\n /** Flag to make quantity section editable. */\r\n isQuantityEditable?: boolean;\r\n\r\n /** Max quantity for line item. */\r\n maxQuantity?: number;\r\n\r\n /** Current quantity for line item. */\r\n currentQuantity?: number;\r\n\r\n /** Resource string for the component. */\r\n resources: ICartlineResourceString;\r\n\r\n /** SalesLine flag. */\r\n isSalesLine?: boolean;\r\n\r\n /** Error message to show in place of quantity. */\r\n errorMessage?: string;\r\n\r\n /** Inventory information label. */\r\n inventoryInformationLabel?: string;\r\n\r\n /** Inventory information class name. */\r\n inventoryLabelClassName?: string;\r\n\r\n /** Flag to show/hide shipping charges for line items. */\r\n showShippingChargesForLineItems?: boolean;\r\n\r\n /** Boolean flag to indicate if cart state status is ready. */\r\n isCartStateReady?: boolean;\r\n\r\n /** Chanel Delivery Option configuration is from api. */\r\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\r\n\r\n /** The telemetry content. */\r\n telemetryContent?: ITelemetryContent;\r\n\r\n /** Quantity onChange callback. */\r\n quantityOnChange?(cartLine: CartLine, newQuantity: number): boolean;\r\n}\r\n\r\n/**\r\n * Represents dimensions strings.\r\n */\r\ninterface IDimensionStrings {\r\n\r\n /** String for size key. */\r\n sizeString: string;\r\n\r\n /** String for color key. */\r\n colorString: string;\r\n\r\n /** String associated with the configuration product dimension. */\r\n configString: string;\r\n\r\n /** String for style key. */\r\n styleString: string;\r\n\r\n /** String for amount key. */\r\n amountString?: string;\r\n}\r\n\r\nconst cartLineItemFunctions = {\r\n\r\n /**\r\n * Render product dimensions.\r\n * @param product - Product data.\r\n * @param dimensionStrings - Dimension strings interface.\r\n * @returns JSX Element.\r\n */\r\n renderProductDimensions: (product: SimpleProduct, dimensionStrings: IDimensionStrings) => {\r\n if (!product.Dimensions) {\r\n return [];\r\n }\r\n\r\n return product.Dimensions.map(productDimension => {\r\n\r\n if (productDimension.DimensionTypeValue === ProductDimensionType.Color) {\r\n return (\r\n
\r\n \r\n {dimensionStrings.colorString}\r\n {': '}\r\n \r\n {productDimension.DimensionValue?.Value}\r\n \r\n \r\n
\r\n );\r\n }\r\n\r\n if (productDimension.DimensionTypeValue === ProductDimensionType.Configuration) {\r\n return (\r\n
\r\n \r\n {dimensionStrings.configString}\r\n {': '}\r\n \r\n {productDimension.DimensionValue?.Value}\r\n \r\n \r\n
\r\n );\r\n }\r\n\r\n if (productDimension.DimensionTypeValue === ProductDimensionType.Size) {\r\n return (\r\n
\r\n \r\n {dimensionStrings.sizeString}\r\n {': '}\r\n \r\n {productDimension.DimensionValue?.Value}\r\n \r\n \r\n
\r\n );\r\n }\r\n\r\n if (productDimension.DimensionTypeValue === ProductDimensionType.Style) {\r\n return (\r\n
\r\n \r\n {product.IsGiftCard ? dimensionStrings.amountString : dimensionStrings.styleString}\r\n {': '}\r\n \r\n {productDimension.DimensionValue?.Value}\r\n \r\n \r\n
\r\n );\r\n }\r\n return null;\r\n });\r\n },\r\n//\r\n /**\r\n * Gets the react node for product unit of price display.\r\n * @param props - The cart line props.\r\n * @returns The node representing markup for unit of measure component.\r\n */\r\n renderProductUnitPrice: (props: ICartLineProps) => {\r\n if (!props.data.cartLine.Price) {\r\n return null;\r\n }\r\n const zeroQuantity: number = 0;\r\n return (\r\n
\r\n \r\n zeroQuantity ? {\r\n price: {\r\n CustomerContextualPrice: props.data.cartLine.Price\r\n }\r\n } : {\r\n price: {\r\n CustomerContextualPrice: props.data.cartLine.Price\r\n }\r\n }}\r\n context={props.context}\r\n id={props.id}\r\n typeName={props.typeName}\r\n />\r\n \r\n
\r\n );\r\n },\r\n\r\n /**\r\n * Render discount lines.\r\n * @param props - The cart line props.\r\n * @returns JSX element.\r\n */\r\n renderDiscountLines: (props: ICartLineProps) => {\r\n\r\n if (!props.data.cartLine.DiscountLines || !ArrayExtensions.hasElements(props.data.cartLine.DiscountLines)) {\r\n return null;\r\n }\r\n\r\n /**\r\n * Get the updated discount percentage.\r\n * @param discountLine - The discount line.\r\n * @param cartLine - The cart line.\r\n * @returns The updated discount percentage.\r\n */\r\n const discountPercent = (discountLine: DiscountLine, cartLine: CartLine): number => {\r\n const numberZero = 0;\r\n const decimalPrecision = 2;\r\n const fullPercentage = 100;\r\n let updatedPercent: number = discountLine.Percentage ?? numberZero;\r\n\r\n if ((discountLine.Percentage === numberZero ||\r\n (discountLine.DiscountLineTypeValue && discountLine.DiscountLineTypeValue === DiscountLineType.TenderTypeDiscount)) &&\r\n cartLine.Price && cartLine.Price > numberZero && cartLine.Quantity && cartLine.Quantity !== numberZero) {\r\n const effectiveAmount = discountLine.EffectiveAmount ?? numberZero;\r\n updatedPercent = Number(((effectiveAmount / (cartLine.Price * cartLine.Quantity)) * fullPercentage).toFixed(decimalPrecision));\r\n }\r\n\r\n return updatedPercent;\r\n };\r\n\r\n return props.data.cartLine.DiscountLines.map((discountLine, index) => {\r\n return (\r\n
\r\n \r\n {discountLine.OfferName ? discountLine.OfferName : ''}\r\n \r\n \r\n \r\n \r\n \r\n {` (${discountLine.Percentage !== undefined ? discountPercent(discountLine, props.data.cartLine) : ''}%)`}\r\n \r\n
\r\n );\r\n });\r\n },\r\n\r\n /**\r\n * Render inventory label.\r\n * @param props - The cart line props.\r\n * @returns JSX element.\r\n */\r\n renderInventoryLabel: (props: ICartLineProps) => {\r\n const inventoryCssName = props.inventoryLabelClassName ? (\r\n `msc-cart-line__product-inventory-label ${props.inventoryLabelClassName}`) : 'msc-cart-line__product-inventory-label';\r\n\r\n return (\r\n

\r\n {props.inventoryInformationLabel}\r\n

\r\n );\r\n },\r\n\r\n /**\r\n * Render shipping label.\r\n * @param props - The cart line props.\r\n * @returns JSX element.\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 = !!(cartline.DeliveryMode && channelDeliveryOptionConfig.PickupDeliveryModeCodes?.some(\r\n deliveryMode => deliveryMode !== cartline.DeliveryMode));\r\n } else {\r\n hasShippingMethod = !!(cartline.DeliveryMode && cartline.DeliveryMode !== pickupDeliveryModeCode);\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 (!ArrayExtensions.hasElements(shippingChargeLines)) {\r\n return undefined;\r\n }\r\n\r\n const defaultCharge: number = 0;\r\n const freightFee = shippingChargeLines.reduce((chargeTotal, chargeLine) => {\r\n return chargeTotal + (chargeLine.CalculatedAmount ?? defaultCharge);\r\n }, defaultCharge);\r\n\r\n const priceComponent = (\r\n \r\n );\r\n return (\r\n <>\r\n \r\n \r\n {priceComponent}\r\n \r\n \r\n );\r\n },\r\n\r\n /**\r\n * Render other charges.\r\n * @param props - The cart line props.\r\n * @returns JSX element.\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 otherCharges?.map((otherCharge, index) => {\r\n const itemIndex = index;\r\n return otherCharge.CalculatedAmount ? (\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 * Render cartline component.\r\n * @param props - The cart line props.\r\n * @returns JSX element.\r\n */\r\nconst CartLine: React.FC = (props: ICartLineProps) => {\r\n const { isSalesLine, productUrl, resources } = props;\r\n const { product, cartLine } = props.data;\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 renderProductUnitPrice = cartLineItemFunctions.renderProductUnitPrice(props);\r\n const imageSettings = props.imageSettings;\r\n if (imageSettings) {\r\n imageSettings.cropFocalRegion = true;\r\n }\r\n const renderDiscountLines = 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 productAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\r\n const productName = product?.Name ?? cartLine.Description;\r\n const imgeClassName = props.data.cartLine.IsInvoiceLine ? 'msc-cart-line__invoice-image' : 'msc-cart-line__product-image';\r\n const cartLineContentClassName = props.data.cartLine.IsInvoiceLine ? 'msc-cart-line__invoice-content' : 'msc-cart-line__content';\r\n\r\n /**\r\n * Render other charges.\r\n * @param newValue - The cart line props.\r\n * @returns Boolean.\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 /**\r\n * Generate error message.\r\n * @returns JSX element.\r\n */\r\n const generateErrorMessage = (): JSX.Element | null => {\r\n if (props.errorMessage) {\r\n return (\r\n
\r\n \r\n \r\n {props.errorMessage}\r\n \r\n
\r\n );\r\n }\r\n\r\n return null;\r\n };\r\n\r\n /**\r\n * Gets the react node for product unit of measure display.\r\n * @returns The node representing markup for unit of measure component.\r\n */\r\n const renderUnitOfMeasure = () => {\r\n\r\n if (props.data.cartLine.IsInvoiceLine) {\r\n return null;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Do not need type check for appsettings\r\n if (!props.context.app.config.unitOfMeasureDisplayType || props.context.app.config.unitOfMeasureDisplayType === 'none') {\r\n return undefined;\r\n }\r\n\r\n if (!product || !product.DefaultUnitOfMeasure) {\r\n return undefined;\r\n }\r\n\r\n return (\r\n
\r\n \r\n {product.DefaultUnitOfMeasure}\r\n \r\n
\r\n );\r\n };\r\n\r\n\r\n const getExtensionPropertyValueByKey = (\r\n properties: CommerceProperty[] | undefined,\r\n key: string,\r\n valueType: CommercePropertyValueEnum\r\n ) => {\r\n const property = properties?.find(p => p.Key === key)?.Value;\r\n\r\n // eslint-disable-next-line security/detect-object-injection\r\n const val = property ? property[valueType] : null;\r\n return val;\r\n };\r\n\r\n /**\r\n * Generate quantity and price component.\r\n * @returns JSX element.\r\n */\r\n const generateQuantityAndPrice = (): JSX.Element[] | null => {\r\n const nodes = [];\r\n const defaultMaxQuantity: number = 10;\r\n const singleQuantity: number = 1;\r\n const unitOfMeasure = renderUnitOfMeasure();\r\n const courseId = getExtensionPropertyValueByKey(props.data.cartLine.ExtensionProperties, \"CourseId\", CommercePropertyValueEnum.string);\r\n // No quantity selector for invoice line or for courseId\r\n if (!props.data.cartLine.IsInvoiceLine\r\n && !courseId // hide for courses\r\n ) {\r\n if (props.data.product && props.isQuantityEditable) {\r\n nodes.push(\r\n
\r\n
\r\n {resources.quantityDisplayString}\r\n
\r\n\r\n {generateErrorMessage()}\r\n\r\n \r\n {unitOfMeasure}\r\n
\r\n );\r\n } else {\r\n nodes.push(\r\n
\r\n {unitOfMeasure}\r\n \r\n\r\n {generateErrorMessage()}\r\n\r\n \r\n {props.data.cartLine.Quantity}\r\n \r\n
\r\n );\r\n }\r\n }\r\n\r\n nodes.push(\r\n
\r\n \r\n {props.isOutOfStock ? renderInventoryLabel : null}\r\n
\r\n );\r\n\r\n return nodes;\r\n };\r\n\r\n return (\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n {product?.ItemId || null} - {productName}\r\n \r\n {ArrayExtensions.hasElements(productDimensions) ?
\r\n {productDimensions}\r\n
: ''}\r\n
\r\n \r\n {renderUnitOfMeasure()}\r\n
\r\n {renderProductUnitPrice}\r\n {renderInventoryLabel}\r\n {renderDiscountLines}\r\n {props.showShippingChargesForLineItems &&
\r\n {renderShippingLabel}\r\n
}\r\n {renderOtherCharges}\r\n
\r\n {\r\n generateQuantityAndPrice()\r\n }\r\n {\r\n props.data.cartLine.IsInvoiceLine && props.data.cartState && props.resources.priceEditorResources && \r\n }\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default CartLine;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { IComponent, IComponentProps, msdyn365Commerce } from '@msdyn365-commerce/core';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport { Coupon } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport { Button, format, getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { PriceComponent } from '@msdyn365-commerce/components';\r\nimport { addAttributeToCart, removeAttributeFromCart } from \"../../../../utils/cartAttributeManager\";\r\nimport { ICouponCodeMapData } from '../../definition-extensions/cart.ext.props.autogenerated';\r\n\r\nexport interface IPromoCodeProps extends IComponentProps<{}> {\r\n cart: ICartState | undefined;\r\n promoCodeHeadingText: string;\r\n appliedPromoCodeHeadingText: string;\r\n removePromoAriaLabelFormat: string;\r\n promoPlaceholderText: string;\r\n promoCodeApplyButtonText: string;\r\n collapseTimeOut: number;\r\n removePromoText: string;\r\n invalidPromoCodeErrorText: string;\r\n failedToAddPromoCodeErrorText: string;\r\n duplicatePromoCodeErrorText: string;\r\n failedToRemovePromoCodeErrorText: string;\r\n couponMapping: ICouponCodeMapData[];\r\n /**\r\n * The telemetry content\r\n */\r\n telemetryContent?: ITelemetryContent;\r\n promoCodeApplyCallback?(): void;\r\n}\r\n\r\nexport interface IPromoCodeComponent extends IComponent { }\r\n\r\nconst PromoCodeComponentActions = {};\r\n\r\ninterface IPromoCodeState {\r\n isCollapseOpen: boolean;\r\n promoCodeInputValue: string;\r\n error: string;\r\n canApply: boolean;\r\n}\r\n\r\n/**\r\n *\r\n * The PromoCode component renders the promocode section.\r\n * @extends {React.PureComponent}\r\n */\r\nclass PromoCode extends React.Component {\r\n private readonly COUPON_ATTRIBUTE_KEY = 'coupon-code';\r\n private readonly payLoad: IPayLoad;\r\n\r\n constructor(props: IPromoCodeProps, state: IPromoCodeState) {\r\n super(props);\r\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, TelemetryConstant.ApplyPromoCode);\r\n this.state = {\r\n isCollapseOpen: false,\r\n promoCodeInputValue: '',\r\n error: '',\r\n canApply: false\r\n };\r\n }\r\n\r\n public shouldComponentUpdate(nextProps: IPromoCodeProps): boolean {\r\n if (this.props.appliedPromoCodeHeadingText !== nextProps.appliedPromoCodeHeadingText) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n public formatDate(date: Date) {\r\n const year = date.getFullYear();\r\n const month = String(date.getMonth() + 1).padStart(2, '0'); // Months are zero-based\r\n const day = String(date.getDate()).padStart(2, '0');\r\n return `${year}-${month}-${day}`;\r\n }\r\n\r\n public getMondayOfCurrentWeek() {\r\n const today = new Date();\r\n const day = today.getDay();\r\n const diff = today.getDate() - day + (day === 0 ? -6 : 1); // adjust when day is Sunday\r\n const monday = new Date(today.setDate(diff));\r\n return monday;\r\n }\r\n\r\n public getCouponCodeMap = (enteredCode: string) => {\r\n const foundCode = this.props.couponMapping.find(c => c.fromCouponCode?.toUpperCase() === enteredCode.toUpperCase());\r\n if (foundCode) { \r\n const mondaysDate = this.formatDate(this.getMondayOfCurrentWeek());\r\n const coupon = foundCode.toCouponCode?.find(tcc => tcc.date === mondaysDate)?.code;\r\n return coupon;\r\n }\r\n return null;\r\n }\r\n\r\n public render(): JSX.Element {\r\n return (\r\n
\r\n
\r\n {this.props.promoCodeHeadingText}\r\n
\r\n {this._renderForm(this.props.promoPlaceholderText, this.props.promoCodeApplyButtonText, this.props.cart)}\r\n

\r\n {this.state.error}\r\n

\r\n {this._renderAppliedPromoCode(this.props)}\r\n
\r\n );\r\n }\r\n\r\n private readonly _onInputChange = (e: React.ChangeEvent) => {\r\n const error = e.target.value === '' ? '' : this.state.error;\r\n this.setState({\r\n promoCodeInputValue: e.target.value, error,\r\n canApply: !!e.target.value\r\n });\r\n };\r\n\r\n private readonly _applyPromotion = (cartState: ICartState | undefined) => {\r\n if (!cartState || !cartState.cart) {\r\n return;\r\n }\r\n const appliedPromo = this.state.promoCodeInputValue;\r\n const promoCode = this.getCouponCodeMap(appliedPromo)\r\n cartState.addPromoCode({ promoCode: promoCode || appliedPromo })\r\n .then(result => {\r\n if (result.status === 'SUCCESS') {\r\n // Show success text\r\n this.setState({ promoCodeInputValue: '', error: '', canApply: false });\r\n const _cart = addAttributeToCart(this.COUPON_ATTRIBUTE_KEY, appliedPromo, cartState.cart);\r\n void cartState.updateCart({newCartObject: _cart})\r\n } else if (result.substatus === 'ALREADYADDED') {\r\n this.setState({ error: this.props.duplicatePromoCodeErrorText });\r\n } else {\r\n this.setState({ error: this.props.invalidPromoCodeErrorText });\r\n }\r\n })\r\n .catch(error => {\r\n this.setState({ error: this.props.failedToAddPromoCodeErrorText });\r\n });\r\n };\r\n\r\n private readonly _renderForm = (promoPlaceholderText: string, promoCodeApplyButtonText: string, cartState: ICartState | undefined) => {\r\n const _onSubmit = (event: React.FormEvent) => {\r\n event.preventDefault(); this._applyPromotion(cartState);\r\n };\r\n const _applyPromotion = (event: React.MouseEvent) => {\r\n this._applyPromotion(cartState);\r\n };\r\n const attributes = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\r\n\r\n return (\r\n
\r\n
\r\n \r\n \r\n {promoCodeApplyButtonText}\r\n \r\n
\r\n
\r\n );\r\n };\r\n\r\n private readonly _removePromotion = (cartState: ICartState | undefined, event: React.MouseEvent) => {\r\n if (!cartState) {\r\n return;\r\n }\r\n const code = event.currentTarget.getAttribute('data-value') || '';\r\n cartState.removePromoCodes({\r\n promoCodes: [code]\r\n })\r\n .then(result => {\r\n if (result.status === 'SUCCESS') {\r\n const _cart = removeAttributeFromCart(this.COUPON_ATTRIBUTE_KEY, cartState.cart);\r\n void cartState.updateCart({newCartObject: _cart, additionalProperties: { AttributeValues: _cart.AttributeValues || [] }});\r\n this.setState({ error: '' });\r\n\r\n }\r\n })\r\n .catch(() => {\r\n this.setState({ error: this.props.failedToRemovePromoCodeErrorText });\r\n });\r\n\r\n };\r\n\r\n private readonly _calculateDiscount = (code: string, cartState: ICartState | undefined) => {\r\n if (!cartState || !cartState.cart || !cartState.cart.CartLines || cartState.cart.CartLines.length === 0 || !code) {\r\n return;\r\n }\r\n let discountAmount = 0;\r\n for (const line of cartState.cart.CartLines) {\r\n if (line.DiscountLines) {\r\n for (const discountLine of line.DiscountLines) {\r\n if (discountLine.DiscountCode === code) {\r\n discountAmount += discountLine.DiscountCost!;\r\n }\r\n }\r\n }\r\n }\r\n return discountAmount * -1;\r\n };\r\n\r\n private readonly _renderAppliedPromoCode = (props: IPromoCodeProps) => {\r\n if (!props.cart || !props.cart.cart || !props.cart.cart.Coupons || !(props.cart.cart.Coupons.length > 0)) {\r\n return;\r\n }\r\n\r\n const _removePromotion = (event: React.MouseEvent) => {\r\n this._removePromotion(props.cart, event);\r\n };\r\n let totalCouponDiscountAmount = 0;\r\n for (const coupon of props.cart.cart.Coupons) {\r\n const discountAmount = this._calculateDiscount(coupon.Code ?? '', props.cart);\r\n if (discountAmount) {\r\n totalCouponDiscountAmount += discountAmount;\r\n }\r\n }\r\n\r\n return (\r\n <>\r\n
\r\n
\r\n {this.props.appliedPromoCodeHeadingText}\r\n
\r\n \r\n
\r\n {\r\n props.cart.cart.Coupons.map((coupon: Coupon) => {\r\n const ariaLabel = props.removePromoAriaLabelFormat ? format(props.removePromoAriaLabelFormat, props.removePromoText, coupon.Code) : '';\r\n\r\n return (\r\n
\r\n
\r\n {coupon.Code}\r\n {' '}\r\n (\r\n \r\n )\r\n
\r\n \r\n {props.removePromoText}\r\n \r\n
\r\n );\r\n })\r\n }\r\n \r\n );\r\n };\r\n}\r\n\r\n// @ts-expect-error\r\nexport const PromoCodeComponent: React.FunctionComponent = msdyn365Commerce.createComponentOverride(\r\n 'PromoCode',\r\n { component: PromoCode, ...PromoCodeComponentActions }\r\n);\r\n\r\n\r\nexport default PromoCodeComponent;\r\n","import { Cart } from '@msdyn365-commerce/retail-proxy';\r\nimport { AttributeTextValueClass } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceModels.g';\r\n\r\nconst addAttributeToCart = (attrKey: string, attrValue: string, cart: Cart): Cart => {\r\n const _cart = { ...cart };\r\n const attributeArray = _cart.AttributeValues || [];\r\n const attributeObj = {\r\n '@odata.type': '#Microsoft.Dynamics.Commerce.Runtime.DataModel.AttributeTextValue',\r\n Name: attrKey,\r\n ExtensionProperties: [],\r\n TextValue: attrValue,\r\n TextValueTranslations: []\r\n };\r\n const attrIdx = attributeArray.findIndex(a => a.Name?.toUpperCase() === attrKey.toUpperCase());\r\n\r\n //Update existing attribute if there.\r\n if (attrIdx > -1) {\r\n (attributeArray[attrIdx] as AttributeTextValueClass).TextValue = attrValue;\r\n } else {\r\n attributeArray.push(attributeObj);\r\n }\r\n\r\n _cart.AttributeValues = attributeArray;\r\n\r\n return _cart;\r\n};\r\n\r\nconst removeAttributeFromCart = (attrKey: string, cart: Cart): Cart => {\r\n const _cart = { ...cart };\r\n const attributeArray = _cart.AttributeValues || [];\r\n const attrIdx = attributeArray.findIndex(a => a.Name?.toUpperCase() === attrKey.toUpperCase());\r\n\r\n //We can't remove attribute values for some reason, so we'll just set the value to ''\r\n if (attrIdx > -1) {\r\n (attributeArray[attrIdx] as AttributeTextValueClass).TextValue = '';\r\n }\r\n _cart.AttributeValues = attributeArray;\r\n return _cart;\r\n};\r\n\r\nexport { addAttributeToCart, removeAttributeFromCart };\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport MsDyn365, { getUrlSync } from \"@msdyn365-commerce/core\";\r\nimport { IHeaderViewProps, Logo } from '@msdyn365-commerce-modules/header';\r\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\nimport { get } from 'lodash';\r\n\r\nimport { IHeaderProps } from '../definition-extensions/header.ext.props.autogenerated';\r\n\r\n\r\n/**\r\n * GridSizes.\r\n */\r\nexport type GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\r\n\r\n/**\r\n *\r\n * HeaderView component.\r\n * @extends {React.PureComponent}\r\n */\r\nexport class HeaderView extends React.PureComponent> {\r\n private readonly menuNode: React.RefObject;\r\n public constructor(props: IHeaderViewProps & IHeaderProps<{}>) {\r\n\r\n super(props);\r\n this.menuNode = React.createRef();\r\n }\r\n\r\n public componentDidMount(): void {\r\n if (this.props.config.useStickyHeader) {\r\n // Set header update methods to trigger on scroll\r\n if (MsDyn365.isBrowser) {\r\n window.addEventListener('scroll', () => {\r\n this._configureStickyHeader();\r\n });\r\n }\r\n this._configureStickyHeader();\r\n }\r\n this.handleLoginRedirect();\r\n }\r\n\r\n private handleLoginRedirect() {\r\n const { context : {\r\n actionContext,\r\n request: {\r\n user: {\r\n isAuthenticated,\r\n isOBORequest\r\n }\r\n }\r\n }} = this.props;\r\n const isHomePage = actionContext.requestContext.url.requestUrl.pathname === '/';\r\n const customer = this.props.data.accountInformation?.result;\r\n if (MsDyn365.isBrowser && typeof window !== 'undefined') { \r\n const url = new URL(window.location.href); \r\n if (url.searchParams.has('catalogid')) { \r\n url.searchParams.delete('catalogid');\r\n \r\n window.location.href = url.toString();\r\n }\r\n }\r\n \r\n if (isAuthenticated) {\r\n if (isHomePage) {\r\n if (isOBORequest && !customer) {\r\n window.location.href = getUrlSync('businesses', this.props.context.actionContext) || '/businesses';\r\n } else {\r\n window.location.href = getUrlSync('account', this.props.context.actionContext) || '/myaccount';\r\n }\r\n } else {\r\n const accountUrl = getUrlSync('account', this.props.context.actionContext);\r\n const logoAnchorTag = document.querySelector('.ms-header__logo>a');\r\n if (logoAnchorTag && accountUrl) {\r\n logoAnchorTag.href = accountUrl;\r\n }\r\n }\r\n }\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Cannot change the prop names as props are from business logic.\r\n const { HeaderTag, HeaderContainer, HeaderTopBarContainer, Divider, MobileMenuContainer, MobileMenuBodyContainer, MobileMenuLinksContainer\r\n , config: { showQuickOrderLink, showPhoneNumber, phoneNumber }\r\n } = this.props;\r\n const quickOrderUrl = getUrlSync('quickorder', this.props.context.actionContext);\r\n return (\r\n \r\n \r\n \r\n\r\n
\r\n {this.props.navIcon}\r\n
\r\n
\r\n {this.props.logo}\r\n {showPhoneNumber == \"yes\" && phoneNumber ? this._renderPhoneNumber(this.props) : null}\r\n
\r\n
\r\n
\r\n {this._renderReactFragment(this.props.menuBar)}\r\n
\r\n {this._renderMobileLogo()}\r\n {this._renderReactFragment(this.props.search)}\r\n {this.props.preferredStore}\r\n {this._renderAccountBlock(this.props)}\r\n \r\n {showQuickOrderLink ? this._renderQuickViewIcon(quickOrderUrl || '#') : null}\r\n {this.props.cartIcon}\r\n {this._renderReactFragment(this.props.siteOptions)}\r\n
\r\n\r\n
\r\n \r\n \r\n { this.props.MobileMenuHeader }\r\n {this._renderReactFragment(this.props.menuBar)}\r\n \r\n { this.props.accountLinks ? this.props.accountLinks.map(link => link) : false }\r\n { this.props.siteOptions }\r\n { this.props.wishListIconMobile }\r\n { this.props.signInLink }\r\n { this.props.signOutLink }\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n }\r\n\r\n /**\r\n * Function to render phone number beside the logo.\r\n * @param props - IHeaderProps.\r\n * @returns Returns JSX.Element | null.\r\n */\r\n private _renderPhoneNumber(props: IHeaderProps<{}>): JSX.Element | null {\r\n const { config: { phoneNumber } } = props;\r\n const telephoneLink: string = `tel:+1-${phoneNumber}`;\r\n return (\r\n \r\n );\r\n }\r\n\r\n private _renderQuickViewIcon = (quickOrderLink: string) => (\r\n \r\n )\r\n\r\n /**\r\n * Function to update header.\r\n */\r\n private readonly _configureStickyHeader = (): void => {\r\n // Get heights of cookie and promotion banners\r\n const defaultValue = 0;\r\n const headerAlertsContainer: HTMLElement | null = document.querySelector('.ms-promo-banner');\r\n const bannerHeights = headerAlertsContainer ? headerAlertsContainer.offsetHeight : defaultValue;\r\n\r\n // Triggers opacity change of header\r\n const headerElement = document.querySelector('header .default-container');\r\n if (headerElement) {\r\n if (MsDyn365.isBrowser && document.documentElement.scrollTop > defaultValue) {\r\n headerElement.classList.add('lock-opaque');\r\n headerElement.classList.add('fixed');\r\n } else {\r\n headerElement.classList.remove('lock-opaque');\r\n headerElement.classList.remove('fixed');\r\n }\r\n }\r\n\r\n // Update sticky header position and opacity\r\n const stickyHeader: HTMLElement | null = document.querySelector('.desktop-navicon-container');\r\n const headerLogo: HTMLElement | null = document.querySelector('.ms-header__logo');\r\n\r\n if (stickyHeader && headerLogo) {\r\n // Fix center sticky header\r\n const navStickyPos = headerLogo.offsetHeight + bannerHeights;\r\n if (MsDyn365.isBrowser && document.documentElement.scrollTop > navStickyPos) {\r\n stickyHeader.classList.add('fixed');\r\n } else {\r\n stickyHeader.classList.remove('fixed');\r\n }\r\n }\r\n };\r\n\r\n private _renderMobileLogo(): JSX.Element | null {\r\n const { config, context, typeName } = this.props;\r\n return (\r\n \r\n );\r\n }\r\n\r\n /**\r\n * Function to render account block.\r\n * @param props - IHeaderViewProps.\r\n * @returns Returns JSX.Element | null.\r\n */\r\n private readonly _renderAccountBlock = (props: IHeaderViewProps): JSX.Element | null => {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Cannot change the prop names as props are from business logic.\r\n const { AccountInfoDropdownParentContainer, AccountInfoDropdownPopoverConentContainer,\r\n accountInfoDropdownButton,\r\n signOutLink,\r\n signInLink,\r\n accountLinks,\r\n context: { request: { user : { isOBORequest }} }\r\n } = props;\r\n if (AccountInfoDropdownParentContainer) {\r\n const changeUserSlug = 'Change User'; // Change user page\r\n let accountLinksFiltered: React.ReactNode[] = [];\r\n if (isOBORequest) { // If we're mocking a user, show the change user button, if we are not, remove it before render.\r\n accountLinksFiltered = accountLinks || [];\r\n } else if (accountLinks) {\r\n accountLinks.forEach(node => {\r\n const linkUrl = get(node, 'props.link.linkText');\r\n if (linkUrl && (linkUrl as string) !== changeUserSlug) {\r\n accountLinksFiltered.push(node);\r\n }\r\n })\r\n }\r\n const accountClassName = classnames(AccountInfoDropdownParentContainer.className, 'account-desktop');\r\n if (AccountInfoDropdownPopoverConentContainer) {\r\n return (\r\n \r\n {accountInfoDropdownButton}\r\n \r\n { accountLinksFiltered.map((link: React.ReactNode) => link) }\r\n {signOutLink}\r\n \r\n \r\n );\r\n } else if (signInLink) {\r\n return (\r\n \r\n {signInLink}\r\n \r\n );\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n /**\r\n * Function to render react fragment.\r\n * @param items - React nodes.\r\n * @returns Returns JSX.Element | null.\r\n */\r\n private readonly _renderReactFragment = (items: React.ReactNode[]): JSX.Element | null => {\r\n return (\r\n <>\r\n {ArrayExtensions.hasElements(items) ? items.map((slot: React.ReactNode) => {\r\n return (<>\r\n {slot}\r\n );\r\n }) : null}\r\n \r\n );\r\n };\r\n}\r\n\r\nexport default HeaderView;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { RatingComponent } from '@msdyn365-commerce/components';\r\nimport { ICoreContext } from '@msdyn365-commerce/core';\r\nimport { IHistogramItemViewProps,\r\n IRatingsHistogramData,\r\n IRatingsHistogramViewProps } from '@msdyn365-commerce-modules/ratings-reviews';\r\nimport { format, Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { IRatingsHistogramProps, IRatingsHistogramResources } from '../definition-extensions/ratings-histogram.ext.props.autogenerated';\r\n\r\n/**\r\n * Histogram item.\r\n * @param props - Histogram Item ViewProps.\r\n * @returns Histogram Item node.\r\n */\r\nconst histogramItem = (props: IHistogramItemViewProps) => {\r\n return (\r\n \r\n {props.starLabel}\r\n {props.bar}\r\n \r\n );\r\n};\r\n\r\n/**\r\n * Average ratings.\r\n * @param data - Props data.\r\n * @param context - Histogram Item ViewProps.\r\n * @param typeName - Histogram Item ViewProps.\r\n * @param componentId - Histogram Item ViewProps.\r\n * @param resources - Module resource strings.\r\n * @returns Average ratings.\r\n */\r\nconst averageRating = (data: IRatingsHistogramData, context: ICoreContext, typeName: string, componentId: string, resources: IRatingsHistogramResources) => {\r\n const defaultAverageRating: number = 0;\r\n const reviewsCount = data.ratingsSummary.result?.reviewsCount ?? defaultAverageRating;\r\n const reviewsCountString = resources.numberOfReviewsString ? format(resources.numberOfReviewsString, reviewsCount) : `${reviewsCount} reviews`;\r\n\r\n return (\r\n
\r\n
\r\n {data.ratingsSummary.result?.averageRating}\r\n
\r\n
\r\n \r\n
\r\n
\r\n {reviewsCountString}\r\n
\r\n
\r\n );\r\n};\r\n\r\n/**\r\n * Histogram view.\r\n * @param props - Ratings HistogramV iewProps.\r\n * @returns Histogram view module.\r\n */\r\nconst RatingsHistogramView: React.FC> = props => {\r\n const { heading, histogramItems, histogramProps, moduleProps, data, resources } = props;\r\n const context = props.context;\r\n const typeName = props.typeName;\r\n const moduleId = props.id;\r\n\r\n return (\r\n \r\n {heading}\r\n
\r\n {averageRating(data, context, typeName, moduleId, resources)}\r\n \r\n {histogramItems.map(item => {\r\n return histogramItem(item);\r\n })}\r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default RatingsHistogramView;\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 { IProductDimensionsWithAvailabilitiesFull } from '@msdyn365-commerce/commerce-entities';\nimport { ProductDimensionsMatrix } from '@msdyn365-commerce/components';\nimport { RichTextComponent } from '@msdyn365-commerce/core';\nimport { ICoreContext, getCatalogId } from '@msdyn365-commerce/core-internal';\nimport { ArrayExtensions, IDimensionsApp, validateCatalogId } from '@msdyn365-commerce-modules/retail-actions';\nimport { Alert, Button, Collapse, IModuleProps, isMobile, VariantType } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { FeatureState } from '@msdyn365-commerce/retail-proxy';\nimport { IBulkPurchaseData } from './bulk-purchase.data';\nimport { IBulkPurchaseProps } from './bulk-purchase.props.autogenerated';\n\n/**\n * Additional optional props for the bulk purchase.\n */\nexport interface IBulkPurchaseExtendedProps extends IBulkPurchaseProps {\n productDimensions?: IProductDimensionsWithAvailabilitiesFull[];\n}\n\n/**\n * View for the bulk purchase module.\n */\nexport interface IBulkPurchaseViewProps extends IBulkPurchaseProps {\n container: IModuleProps;\n content: React.ReactElement;\n}\n\n/**\n * BulkPurchase state message Interface.\n */\nexport interface IBulkPurchaseStateMessage {\n isOpen: boolean;\n messageGlyph: string;\n messageText: string;\n statusCssString: string;\n}\n\n/**\n * View for the bulk purchase module.\n */\nexport interface IBulkPurchaseState {\n isExpanded: boolean;\n stateMessage?: IBulkPurchaseStateMessage;\n}\n\n/**\n * Bulk-purchase module.\n */\nexport class BulkPurchase extends React.PureComponent {\n public static readonly className = 'ms-bulk-purchase';\n private readonly _errorCssClass: string = 'danger';\n private readonly _errorCssGlyphClass: string = 'fas fa-exclamation-triangle';\n private readonly collapseRef: React.RefObject = React.createRef();\n\n public constructor(props: IBulkPurchaseExtendedProps) {\n super(props);\n\n this.state = {\n isExpanded: false\n };\n }\n\n public render(): React.ReactElement | null {\n const hasDimensionsInProps = ArrayExtensions.hasElements(this.props.productDimensions);\n const hasDimensionsInData = ArrayExtensions.hasElements(this.props.data.productDimensions?.result);\n if (!hasDimensionsInProps && !hasDimensionsInData) {\n return null;\n }\n\n const viewProps: IBulkPurchaseViewProps = {\n ...this.props,\n container: {\n moduleProps: this.props,\n className: classnames(BulkPurchase.className, this.props.config.className)\n },\n content: this._renderCollapseContent(`${BulkPurchase.className}__content`)\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n private _renderCollapseContent(className: string): React.ReactElement {\n return (\n
\n {this._renderCollapseButton(`${className}__collapse-button`)}\n {this._renderCollapse(`${className}__collapse`)}\n
\n );\n }\n\n private _renderCollapseButton(className: string): React.ReactElement {\n return (\n \n {this.props.resources.bulkPurchaseHeaderTitle}\n \n );\n }\n\n /**\n *This function is being used to handel variant change dropdown.\n */\n private _dimensionDropDownChange = () => {\n this.collapseRef.current?.reEvaluateHeight();\n };\n\n private _renderCollapse(className: string): React.ReactElement {\n return (\n \n {this._renderMainContent(`${className}__main-content`)}\n \n );\n }\n\n private _renderMainContent(className: string): React.ReactElement {\n const isMobileDevice = isMobile({ variant: VariantType.Viewport, context: this.props.context.request }) === 'xs';\n\n const userMessageNode = this.state.stateMessage ? (\n \n \n {this.state.stateMessage.messageText}\n \n ) : (\n undefined\n );\n\n return (\n
\n {!isMobileDevice && (\n
\n \n
\n )}\n {userMessageNode}\n {this._renderMatrix(`${className}__matrix-container`)}\n
\n );\n }\n\n private _renderMatrix(className: string): React.ReactElement {\n const hasDimensionsInProps = ArrayExtensions.hasElements(this.props.productDimensions);\n const channelMultipleCatalogsFeature = 'Dynamics.AX.Application.ChannelMultipleCatalogsFeature';\n const { featureState } = this.props.data;\n const isMultipleCatalogsFeatureEnabled =\n featureState?.result?.find((item: FeatureState) => item.Name === channelMultipleCatalogsFeature)?.IsEnabled || false;\n const catalogId = getCatalogId(this.props.context.request);\n validateCatalogId(catalogId);\n return (\n }\n data={{\n dimensions: hasDimensionsInProps ? this.props.productDimensions! : this.props.data.productDimensions!.result!,\n orderTemplates: this.props.data.orderTemplates?.result,\n customerInformation: this.props.data.customerInformation?.result\n }}\n resources={this.props.resources}\n dimensionOnChange={this._dimensionDropDownChange}\n onErrorMessage={this._onErrorMessage}\n isMultipleCatalogFeatureEnabledInHq={isMultipleCatalogsFeatureEnabled}\n catalogId={catalogId}\n />\n );\n }\n\n private _onErrorMessage = (errorMessage: string) => {\n this.setState({\n stateMessage: {\n messageText: errorMessage,\n statusCssString: this._errorCssClass,\n messageGlyph: this._errorCssGlyphClass,\n isOpen: true\n }\n });\n };\n\n /**\n * Callback which toggles collapse mode.\n */\n private readonly _toggleCollapse = () => {\n this.setState(state => ({\n isExpanded: !state.isExpanded\n }));\n };\n}\n\nexport default BulkPurchase;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Module } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IBulkPurchaseViewProps } from './bulk-purchase';\n\n/**\n * Bulk purchase view.\n * @param props - Bulk purchase view props.\n * @returns React node with a module.\n */\nexport const BulkPurchaseViewComponent: React.FC = props => {\n return {props.content};\n};\n\nexport default BulkPurchaseViewComponent;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { 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 { buildHydratedMockActionContext, buildMockRequest, ICoreContext, IRequestContext } from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { AsyncResult, Customer, Employee } from '@msdyn365-commerce/retail-proxy';\nimport { IStoreSelectorStateManager } from '@msdyn365-commerce-modules/bopis-utilities';\n\nimport { IHeaderData } from '../header.data';\nimport { IHeaderConfig, IHeaderResources } from '../header.props.autogenerated';\n\nconst mockRequest: IRequestContext = buildMockRequest();\nconst mockRequestURL = {\n requestUrl: new URL('https://wwww.example.com'),\n staticCdnUrl: 'https://wwww.example.com'\n};\nmockRequest.gridSettings = {\n xs: { w: 767, h: 0 },\n sm: { w: 991, h: 0 },\n md: { w: 1199, h: 0 },\n lg: { w: 1599, h: 0 },\n xl: { w: 1600, h: 0 }\n};\nmockRequest.user.isAuthenticated = true;\nmockRequest.user.signInUrl = '/signin';\nmockRequest.user.signOutUrl = '/signout';\nmockRequest.user.signUpUrl = '/signup';\n\nconst mockAnonRequest = buildMockRequest();\nmockAnonRequest.user.isAuthenticated = false;\nmockAnonRequest.user.signInUrl = '/signin';\nmockAnonRequest.user.signOutUrl = '/signout';\nmockAnonRequest.user.signUpUrl = '/signup';\nmockAnonRequest.url = mockRequestURL;\n\nconst mockSigninErrorRequest = buildMockRequest();\nmockSigninErrorRequest.user.isAuthenticated = false;\nmockSigninErrorRequest.user.retailServerErrorCode = 'Microsoft_Dynamics_Commerce_Runtime_CustomerNotFound_WhenAutoLinking';\nmockSigninErrorRequest.user.signInUrl = '/signin';\nmockSigninErrorRequest.user.signOutUrl = '/signout';\nmockSigninErrorRequest.user.signUpUrl = '/signup';\nmockSigninErrorRequest.url = mockRequestURL;\n\nconst mockActionContext = buildHydratedMockActionContext();\nmockActionContext.requestContext.url = mockRequestURL;\n\n/**\n * Method to mock auth context.\n */\n// @ts-expect-error\nexport const mockAuthContext: ICoreContext = {\n actionContext: mockActionContext,\n request: mockRequest,\n app: {\n config: {\n disableTooltip: true\n },\n routes: {\n wishlist: '/wishlist'\n }\n }\n};\n\n// @ts-expect-error\nexport const mockAnonContext: ICoreContext = {\n actionContext: mockActionContext,\n request: mockAnonRequest,\n app: {\n config: {\n disableTooltip: true\n },\n routes: {\n wishlist: '/wishlist'\n }\n }\n};\n\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment -- Due to partial mock.\n// @ts-expect-error\nexport const mockSigninContext: ICoreContext = {\n actionContext: mockActionContext,\n request: mockSigninErrorRequest,\n app: {\n config: {\n disableTooltip: true\n },\n routes: {\n wishlist: '/wishlist'\n }\n }\n};\n\nexport const mockHeaderConfig: IHeaderConfig = {\n logoLink: {\n linkUrl: {\n destinationUrl: 'https://ppe.fabrikam.com/fe'\n },\n ariaLabel: 'fabrikam'\n },\n logoImage: {\n src: 'https://img-prod-cms-mr-microsoft-com.akamaized.net/cms/api/fabrikam/imageFileData/MA1G3L'\n }\n};\n\nexport const mockResources: IHeaderResources = {\n mobileHamburgerAriaLabel: 'Mobile view hamburger aria label',\n wishlistTooltipText: 'My wishlist',\n cartLabel: 'Shopping bag, ({0}) items',\n cartQtyLabel: '({0})',\n signInLinkText: 'Sign In',\n signInLinkAriaText: 'Sign In',\n signOutLinkText: 'Sign Out',\n signOutLinkAriaText: 'Sign Out',\n shoppingAsText: 'Shopping as {0}',\n switchCustomerLinkText: 'Switch customer',\n switchCustomerLinkAriaText: 'Switch customer',\n headerPreferredStoreText: 'Select store',\n headerPreferredStoreAriaLabel: 'select preferred store',\n signInCustomerNotAuthorizedTitle: 'Error message if customer not authorized',\n signUpCustomerNotFoundTitle: 'Error message if cutsomer not found',\n signUpMultipleCustomerFoundTitle: 'Multiple customer found error msg',\n closeNotificationLabel: 'Close',\n wishlistCountLabel: '({0})',\n headerAriaLabel: 'Header'\n};\n\nexport const getMockData = (totalItemsInCart: number = 0, accountNumber: string = '2', firstName: string = ''): IHeaderData => {\n return {\n cart: >{\n status: 'SUCCESS',\n result: {\n totalItemsInCart\n }\n },\n employee: >{\n status: 'SUCCESS',\n result: {\n Name: 'Worker'\n }\n },\n accountInformation: >{\n status: 'SUCCESS',\n result: {\n AccountNumber: accountNumber,\n FirstName: firstName\n }\n },\n storeSelectorStateManager: >{\n status: 'SUCCESS',\n result: {}\n }\n };\n};\n\nexport const getMockErrorData = (): IHeaderData => {\n return {\n cart: >{\n status: 'FAILED',\n result: undefined\n },\n employee: >{\n status: 'FAILED',\n result: undefined\n },\n accountInformation: >{\n status: 'FAILED',\n result: undefined\n },\n storeSelectorStateManager: >{\n status: 'FAILED',\n result: undefined\n }\n };\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { IHeaderData } from '../header.data';\nimport { IHeaderProps } from '../header.props.autogenerated';\n\n/**\n * The header preferred store component.\n */\n@observer\nexport class HeaderPreferredStore extends React.PureComponent> {\n private readonly modalCloseButtonRef: React.RefObject = React.createRef();\n\n /**\n * Handle click on the store selector.\n * @returns : Promise void.\n */\n public handleClick = () => {\n return this._findPreferredStoreOnClick(this.props);\n };\n\n public render(): JSX.Element | undefined {\n const {\n data: {\n storeSelectorStateManager: { result: storeSelectorStateManager }\n },\n slots,\n resources\n } = this.props;\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- slots can be undefined.\n if (ArrayExtensions.hasElements(slots?.storeSelector)) {\n const storeName =\n storeSelectorStateManager?.preferredStore && storeSelectorStateManager.preferredStore.StoreName\n ? storeSelectorStateManager.preferredStore.StoreName\n : resources.headerPreferredStoreText;\n\n return (\n
\n \n {storeName}\n \n {slots.storeSelector}\n
\n );\n }\n\n return undefined;\n }\n\n private async _findPreferredStoreOnClick(props: IHeaderProps): Promise {\n const {\n data: {\n storeSelectorStateManager: { result: storeSelectorStateManager }\n },\n modules\n } = props;\n if (!storeSelectorStateManager) {\n return;\n }\n let storeSelectorId: string = '';\n if (modules && Object.keys(modules).length > 0 && ArrayExtensions.hasElements(modules.storeSelector)) {\n storeSelectorId = modules.storeSelector[0].id;\n }\n await storeSelectorStateManager\n .openDialog({\n id: storeSelectorId,\n showMapViewLink: true,\n parentElementRef: this.modalCloseButtonRef,\n onLocationSelected: orgUnitLocation => {\n return Promise.resolve();\n }\n })\n .catch((error: Error) => {\n if (props.telemetry) {\n props.telemetry.error(error.message);\n props.telemetry.debug('Unable to set preferred store');\n }\n });\n }\n}\n\nexport default HeaderPreferredStore;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface ILogoProps {\n image: Msdyn365.IImageData;\n gridSettings?: Msdyn365.IGridSettings;\n link?: ILinkData;\n className?: string;\n telemetryContent?: ITelemetryContent;\n requestContext: Msdyn365.IRequestContext;\n typeName?: string;\n}\n\nexport interface ILinkData {\n linkUrl: Msdyn365.ILinkData;\n ariaLabel?: string;\n openInNewTab?: boolean;\n linkText?: string;\n}\n\n/**\n *\n * Logo component.\n * @extends {React.PureComponent}\n */\nexport class Logo extends React.PureComponent {\n private readonly attributes?: Msdyn365.IDictionary;\n\n constructor(props: ILogoProps) {\n super(props);\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.Logo);\n this.attributes = getTelemetryAttributes(props.telemetryContent!, payLoad);\n }\n\n public render(): JSX.Element {\n return
{this._renderLogo(this.props)}
;\n }\n\n private _renderLogo(config: ILogoProps): JSX.Element {\n if (config.link && config.link.linkUrl.destinationUrl) {\n return (\n \n {this._renderImage(config)}\n \n );\n }\n return this._renderImage(config);\n }\n\n private _renderImage(config: ILogoProps): JSX.Element {\n const defaultImageSettings: Msdyn365.IImageSettings = {\n viewports: {\n xs: { q: 'w=132&h=28&m=6', w: 0, h: 0 },\n lg: { q: 'w=160&h=48&m=6', w: 0, h: 0 }\n },\n lazyload: true\n };\n\n return (\n \n );\n }\n}\n\nexport default Logo;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport {\n Button,\n getPayloadObject,\n getTelemetryAttributes,\n ITelemetryContent,\n TelemetryConstant\n} from '@msdyn365-commerce-modules/utilities';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { IHeaderResources } from '../header.props.autogenerated';\n\nexport interface INavIconProps {\n resources: IHeaderResources;\n isExpanded: boolean;\n targetId: string;\n telemetryContent?: ITelemetryContent;\n toggleNavBar(): void;\n}\n\n/**\n *\n * NavIcon component.\n * @extends {React.PureComponent}\n */\n\n@observer\nexport class NavIcon extends React.PureComponent {\n private readonly attributes?: Msdyn365.IDictionary;\n\n constructor(props: INavIconProps) {\n super(props);\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.NavIcon);\n this.attributes = getTelemetryAttributes(props.telemetryContent!, payLoad);\n }\n\n public render(): JSX.Element {\n return (\n \n );\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { CartIconComponent, WishListIconComponent } from '@msdyn365-commerce/components';\nimport * as MsDyn365 from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { Customer } from '@msdyn365-commerce/retail-proxy';\nimport { ErrorNotification, NotificationsManager } from '@msdyn365-commerce-modules/notifications-core';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n Button,\n format,\n getPayloadObject,\n getTelemetryAttributes,\n getTelemetryObject,\n IModuleProps,\n INodeProps,\n ITelemetryContent,\n KeyCodes,\n Modal,\n ModalBody,\n ModalHeader,\n onTelemetryClick,\n Popover,\n TelemetryConstant\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { computed, reaction } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { isChannelTypeB2B } from '@msdyn365-commerce/core';\nimport { HeaderPreferredStore, Logo, NavIcon } from './components';\nimport { IHeaderData } from './header.data';\nimport { IHeaderProps, IHeaderResources, IMyAccountLinksData } from './header.props.autogenerated';\n\nexport interface IHeaderState {\n mobileMenuCollapsed: boolean;\n signinPopoverOpen: boolean;\n hasSigninerror?: boolean;\n}\n\nexport interface IHeaderViewProps extends IHeaderProps, IHeaderState {\n logo: React.ReactNode;\n wishListIconDesktop: React.ReactNode;\n wishListIconMobile: React.ReactNode;\n cartIcon: React.ReactNode;\n navIcon: React.ReactNode;\n className: string;\n menuBar: React.ReactNode[];\n search: React.ReactNode[];\n siteOptions: React.ReactNode[];\n HeaderTag: IModuleProps;\n HeaderContainer: INodeProps;\n MobileMenuContainer: INodeProps;\n MobileMenuHeader: React.ReactNode;\n MobileMenuBodyContainer: INodeProps;\n MobileMenuLinksContainer: INodeProps;\n HeaderTopBarContainer: INodeProps;\n Divider: INodeProps;\n\n AccountInfoDropdownParentContainer?: INodeProps;\n AccountInfoDropdownPopoverConentContainer?: INodeProps;\n accountInfoDropdownButton?: React.ReactNode;\n\n signOutLink?: React.ReactNode;\n signInLink?: React.ReactNode;\n switchCustomerLink?: React.ReactNode;\n isOBORequest?: boolean;\n accountLinks?: React.ReactNode[];\n preferredStore?: React.ReactNode;\n currentDistributor?: React.ReactNode;\n}\n\n/**\n *\n * Header component.\n * @extends {React.PureComponent>}\n */\n@observer\nclass Header extends React.PureComponent, IHeaderState> {\n private readonly popOverRef: React.RefObject;\n\n private readonly telemetryContent: ITelemetryContent;\n\n private cart: ICartState | undefined;\n\n private isB2BSite: boolean = false;\n\n /**\n * The signed-in user name displayed in the header bar\n */\n @computed public get displayName(): Readonly {\n return (\n (MsDyn365.isOboRequest(this.props.context.request) ? this.workerName : this.customerName) ||\n this.props.context.request?.user?.name\n );\n }\n\n /**\n * OBO scenario. The name of worker who shops on behalf of customer.\n */\n @computed public get workerName(): Readonly {\n const worker = this.props.data.employee?.result;\n return worker?.Name;\n }\n\n @computed public get customerName(): Readonly {\n const customer = this.props.data.accountInformation?.result;\n if (MsDyn365.isOboRequest(this.props.context.request)) {\n // For OBO scenario, display full customer name because multiple customers may have the same first name.\n return customer ? customer.Name : undefined;\n } else {\n return customer ? customer.FirstName || customer.Name : undefined;\n }\n }\n\n public constructor(props: IHeaderProps) {\n super(props);\n this.popOverRef = React.createRef();\n this._toggleNavbar = this._toggleNavbar.bind(this);\n this._togglePopover = this._togglePopover.bind(this);\n this._keydown = this._keydown.bind(this);\n this.state = {\n mobileMenuCollapsed: true,\n signinPopoverOpen: false,\n hasSigninerror: false\n };\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n this.isB2BSite = isChannelTypeB2B(this.props.context.request);\n }\n\n public componentDidMount(): void {\n if (MsDyn365.msdyn365Commerce.isBrowser) {\n window.addEventListener('keydown', this._keydown);\n }\n reaction(\n () => {\n this.props.data.cart.result;\n },\n () => {\n this.cart = this.props.data.cart.result;\n }\n );\n\n const {\n context: {\n request: { user }\n },\n resources: {\n signUpCustomerNotFoundTitle,\n signUpMultipleCustomerFoundTitle,\n signInCustomerNotAuthorizedTitle,\n closeNotificationLabel\n }\n } = this.props;\n\n const signinNotificationError = this._getSigninNotification(\n user,\n signUpMultipleCustomerFoundTitle,\n signUpCustomerNotFoundTitle,\n signInCustomerNotAuthorizedTitle\n );\n if (signinNotificationError !== undefined && this.state.hasSigninerror === false) {\n // For signup show simple error notification.\n NotificationsManager.instance().addNotification(new ErrorNotification(signinNotificationError, closeNotificationLabel));\n }\n }\n\n public componentWillUnmount(): void {\n if (MsDyn365.msdyn365Commerce.isBrowser) {\n window.removeEventListener('keydown', this._keydown, false);\n }\n }\n\n public render(): JSX.Element | null {\n const {\n id,\n typeName,\n data: { accountInformation, wishlists },\n context: {\n request: { user }\n },\n context,\n resources: { cartLabel, cartQtyLabel }\n } = this.props;\n const { logoLink, logoImage, shouldShowWishlistCount } = this.props.config;\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- app config is generic\n const disableTooltip = this.props.context.app.config.disableTooltip || false;\n const headerToggleClass = this.state.mobileMenuCollapsed ? '' : 'ms-header-open';\n const headerClassName = classnames('ms-header', this.props.config.className, headerToggleClass);\n const navbarKey = 'header-nav-mobile';\n const customer = accountInformation && accountInformation.result;\n const cartIconSlot = this._getSlot('cartIcon');\n const menuBarSlot = this._getSlot('menuBar');\n const searchSlot = this._getSlot('search');\n let wishlistCount = 0;\n const siteOptionsSlot = this._getSlot('siteOptions');\n const preferredStoreSlot = this._getSlot('storeSelector');\n const currentDistributorSlot = this._getSlot('distributorSelector');\n if (wishlists !== undefined) {\n if (\n !wishlists.result ||\n !ArrayExtensions.hasElements(wishlists.result) ||\n !wishlists.result[0].CommerceListLines ||\n !ArrayExtensions.hasElements(wishlists.result[0].CommerceListLines)\n ) {\n wishlistCount = 0;\n } else {\n wishlistCount = wishlists.result[0].CommerceListLines.length;\n }\n }\n const viewProps: IHeaderViewProps = {\n ...(this.props as IHeaderProps),\n ...this.state,\n logo: (\n \n ),\n wishListIconDesktop: (\n \n ),\n wishListIconMobile: (\n \n ),\n cartIcon: ArrayExtensions.hasElements(cartIconSlot) ? (\n cartIconSlot[0]\n ) : (\n \n ),\n navIcon: (\n \n ),\n menuBar: ArrayExtensions.hasElements(menuBarSlot) ? menuBarSlot : [],\n search: ArrayExtensions.hasElements(searchSlot) ? searchSlot : [],\n siteOptions: ArrayExtensions.hasElements(siteOptionsSlot) ? siteOptionsSlot : [],\n className: headerClassName,\n HeaderTag: {\n moduleProps: this.props,\n className: classnames(headerClassName),\n 'aria-label': this.props.resources.headerAriaLabel,\n tag: 'header'\n },\n HeaderContainer: {\n className: classnames('ms-header__container')\n },\n HeaderTopBarContainer: {\n className: classnames('ms-header__topbar')\n },\n Divider: {\n className: classnames('ms-header__divider')\n },\n MobileMenuContainer: {\n tag: Modal,\n id: navbarKey,\n className: 'ms-header__mobile-hamburger',\n isOpen: !this.state.mobileMenuCollapsed,\n wrapClassName: 'ms-header__modal',\n toggle: this._toggleNavbar\n },\n MobileMenuHeader: ,\n MobileMenuBodyContainer: {\n tag: ModalBody,\n className: 'ms-header__mobile-hamburger-menu-body'\n },\n MobileMenuLinksContainer: {\n className: 'ms-header__mobile-hamburger-menu-links'\n },\n AccountInfoDropdownParentContainer: {\n className: 'ms-header__account-info'\n },\n AccountInfoDropdownPopoverConentContainer: this.displayName\n ? {\n tag: Popover,\n id: 'myprofilePopover',\n className: 'ms-header__account-info-content',\n placement: 'bottom',\n isOpen: this.state.signinPopoverOpen,\n target: this.popOverRef,\n toggle: this._togglePopover\n }\n : undefined,\n signInLink: this._getSigninButton(user, this.props.resources),\n signOutLink: this._getSignOutButton(user, this.props.resources),\n isOBORequest: MsDyn365.isOboRequest(this.props.context.request),\n switchCustomerLink: this._getSwitchCustomerButton(user, this.props.resources),\n accountInfoDropdownButton: this._getAccountInfoDropdownButton(user, this.props.resources),\n accountLinks: this._getAccountLinks(customer),\n preferredStore: ArrayExtensions.hasElements(preferredStoreSlot) && ,\n currentDistributor: this.isB2BSite && ArrayExtensions.hasElements(currentDistributorSlot) ? currentDistributorSlot : undefined\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n /**\n * Handle link text change.\n * @param linkIndex - Link Index.\n * @returns : Void.\n */\n public handleLinkTextChange = (linkIndex: number) => (event: MsDyn365.ContentEditableEvent): void => {\n if (this.props.config.myAccountLinks?.[linkIndex]) {\n this.props.config.myAccountLinks[linkIndex].linkText = event.target.value;\n }\n };\n\n /**\n * Get the slot.\n * @param slotName - Name of the slot.\n * @returns The slot.\n */\n private _getSlot(slotName: string): React.ReactNode[] | null {\n const { slots } = this.props;\n return (slots && slots[slotName] && slots[slotName].length && slots[slotName]) || null;\n }\n\n /**\n * Renders the sign in button.\n * @param user - Request context user.\n * @param resources - Resources.\n * @returns React Node.\n */\n private _getSigninButton(user: MsDyn365.IRequestContextUser | undefined, resources: IHeaderResources): React.ReactNode | undefined {\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.SignIn);\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\n return (\n !this.displayName && (\n \n \n {resources.signInLinkText}\n \n \n )\n );\n }\n\n /**\n * Renders the sign out button.\n * @param user - Request context user.\n * @param resources - Resources.\n * @returns React Node.\n */\n private _getSignOutButton(user: MsDyn365.IRequestContextUser | undefined, resources: IHeaderResources): React.ReactNode | undefined {\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.SignOut);\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\n return (\n this.displayName && (\n \n \n {resources.signOutLinkText}\n \n \n )\n );\n }\n\n /**\n * Renders the sign out button.\n * @param user - Request context user.\n * @param resources - Resources.\n * @returns React Node.\n */\n private _getSwitchCustomerButton(\n user: MsDyn365.IRequestContextUser | undefined,\n resources: IHeaderResources\n ): React.ReactNode | undefined {\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.SwitchCustomer);\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\n const isOBOAccountSelected =\n MsDyn365.isOboRequest(this.props.context.request) && this.props.context.request.cookies.getAccountSelectionCookie();\n return (\n this.displayName &&\n isOBOAccountSelected && (\n this.props.context.request.cookies.removeAccountSelectionCookie()}\n {...attributes}\n >\n
\n
{format(resources.shoppingAsText, this.customerName)}
\n
{resources.switchCustomerLinkText}
\n
\n \n )\n );\n }\n\n private getBusinessPartnerSelectionUrl(): string | undefined {\n const route = MsDyn365.getUrlSync('businessPartnerSelection', this.props.context.actionContext);\n if (!route || !MsDyn365.msdyn365Commerce.isBrowser) {\n return undefined;\n }\n\n // MsDyn365.getUrlSync persists some params in the route and remove other params.\n // Among the persisted params, we need to remove catalogid.\n const persistedParamToRemove = ['catalogid'];\n const url = new URL(route, window.location.href);\n persistedParamToRemove.forEach(param => url.searchParams.delete(param));\n return url.href;\n }\n\n private _getSigninNotification(\n user: MsDyn365.IRequestContextUser | undefined,\n signUpMultipleCustomerFoundTitle: string,\n signUpCustomerNotFoundTitle: string,\n signInCustomerNotAuthorizedTitle: string\n ): string | undefined {\n if (!user?.retailServerErrorCode) {\n return undefined;\n }\n\n const { signUpCustomerNotFound, signUpMultipleCustomerFound, signInCustomerNotAuthorized } = this.props.config;\n const notFoundError = 'Microsoft_Dynamics_Commerce_Runtime_CustomerNotFound_WhenAutoLinking';\n const multipleAccountError = 'Microsoft_Dynamics_Commerce_Runtime_MultipleCustomerAccountsFoundWithSameEmailAddress';\n const accountAuthorizationError = 'Microsoft_Dynamics_Commerce_Runtime_AuthorizationFailed';\n\n if (user?.retailServerErrorCode === notFoundError) {\n return signUpCustomerNotFound !== undefined ? signUpCustomerNotFound : signUpCustomerNotFoundTitle;\n } else if (user?.retailServerErrorCode === multipleAccountError) {\n return signUpMultipleCustomerFound !== undefined ? signUpMultipleCustomerFound : signUpMultipleCustomerFoundTitle;\n } else if (user?.retailServerErrorCode === accountAuthorizationError) {\n return signInCustomerNotAuthorized !== undefined ? signInCustomerNotAuthorized : signInCustomerNotAuthorizedTitle;\n }\n return user?.retailServerErrorMessage;\n }\n\n private _getAccountInfoDropdownButton(\n user: MsDyn365.IRequestContextUser | undefined,\n resources: IHeaderResources\n ): React.ReactNode | undefined {\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.MyProfile);\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\n return (\n this.displayName && (\n \n
\n
{this.displayName}
\n {MsDyn365.isOboRequest(this.props.context.request) && this.customerName && (\n
{format(resources.shoppingAsText, this.customerName)}
\n )}\n
\n \n )\n );\n }\n\n private _getAccountLinks(customer: Customer | undefined): React.ReactNode[] | undefined {\n const { myAccountLinks } = this.props.config;\n const payLoad = getPayloadObject('click', this.telemetryContent, '');\n if (!this.displayName || !myAccountLinks || !ArrayExtensions.hasElements(myAccountLinks)) {\n return undefined;\n }\n return myAccountLinks.map((cta: IMyAccountLinksData, index: number) => {\n payLoad.contentAction.etext = cta.linkText;\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\n const editableLink: MsDyn365.ILinksData = {\n ariaLabel: cta.ariaLabel,\n className: 'ms-signin-info__account-link-button',\n linkText: cta.linkText,\n linkUrl: cta.linkUrl.destinationUrl,\n openInNewTab: cta.openInNewTab,\n role: 'link',\n additionalProperties: attributes\n };\n\n return (\n \n );\n });\n }\n\n private _toggleNavbar(): void {\n this.setState({\n mobileMenuCollapsed: !this.state.mobileMenuCollapsed\n });\n }\n\n private _togglePopover(): void {\n this.setState({\n signinPopoverOpen: !this.state.signinPopoverOpen\n });\n }\n\n private _keydown(event: KeyboardEvent): void {\n if (event.keyCode === KeyCodes.Escape) {\n this.setState({ mobileMenuCollapsed: true });\n }\n }\n}\n\nexport default Header;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IHeaderViewProps } from './header';\n\nconst headerView: React.FC = props => {\n const {\n HeaderTag,\n HeaderContainer,\n HeaderTopBarContainer,\n MobileMenuContainer,\n MobileMenuBodyContainer,\n MobileMenuLinksContainer,\n Divider\n } = props;\n return (\n \n \n \n {props.navIcon}\n {props.logo}\n {_renderReactFragment(props.search)}\n {props.preferredStore}\n {props.currentDistributor}\n {_renderDesktopAccountBlock(props)}\n {props.wishListIconDesktop}\n \n {props.cartIcon}\n {_renderReactFragment(props.siteOptions)}\n \n \n \n {props.MobileMenuHeader}\n {_renderReactFragment(props.menuBar)}\n \n {props.accountLinks ? props.accountLinks.map(link => link) : false}\n {props.siteOptions}\n {props.wishListIconMobile}\n {props.signInLink}\n {props.signOutLink}\n \n \n \n {_renderReactFragment(props.menuBar)}\n \n \n );\n};\n\nfunction _renderDesktopAccountBlock(props: IHeaderViewProps): JSX.Element | null {\n const {\n AccountInfoDropdownParentContainer,\n AccountInfoDropdownPopoverConentContainer,\n accountInfoDropdownButton,\n signOutLink,\n signInLink,\n accountLinks\n } = props;\n\n if (AccountInfoDropdownParentContainer) {\n if (AccountInfoDropdownPopoverConentContainer) {\n return (\n \n {accountInfoDropdownButton}\n \n {accountLinks ? accountLinks.map(link => link) : false}\n {signOutLink}\n \n \n );\n } else if (signInLink) {\n return {signInLink};\n }\n }\n props.context.telemetry.error('Header content is empty, module wont render.');\n return null;\n}\n\nfunction _renderReactFragment(items: React.ReactNode[]): JSX.Element | null {\n return (\n <>\n {items && items.length > 0\n ? items.map((slot: React.ReactNode, index: number) => {\n return {slot};\n })\n : null}\n \n );\n}\n\nexport default headerView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { 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 { Carousel, ICarouselProps, Player, IPlayerData, IPlayerOptions, IVideoMetadata } from '@msdyn365-commerce/components';\nimport { IImageData, IImageSettings, Image, Video } from '@msdyn365-commerce/core';\nimport { MediaLocation, MediaType, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions, getFallbackImageUrl, ObjectExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n defaultDataScale,\n IComponentNodeProps,\n ImagefullView,\n IModalViewProps,\n IModuleProps,\n inlineZoomImageOnHover,\n inlineZoomImageOnMouseMove,\n inlineZoomImageOnMouseOut,\n inlineZoomInitClick,\n INodeProps,\n ISingleSlideCarouselProps,\n isMobile,\n KeyCodes,\n NodeTag,\n onContainerZoomInit,\n onMouseMoveLensContainer,\n onMouseOutLensContainer,\n onMouseOverImageContainer,\n removeContainerZoomStyle,\n removeInlineZoomStyle,\n SingleSlideCarousel,\n VariantType\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { reaction } from 'mobx';\nimport * as React from 'react';\n\nimport { IMediaGalleryData } from './media-gallery.data';\nimport { imageSource, imageZoom, IMediaGalleryProps, thumbnailsOrientation } from './media-gallery.props.autogenerated';\nimport { getProductImages, getValidProductImages, getVideoMetadataFromApi, validateProductImages } from './utils';\nimport { getAltText, IMediaData } from './utils/helper';\n\n/**\n * IMediaGalleryState Interface.\n */\nexport interface IMediaGalleryState {\n animating: boolean;\n activeIndex: number;\n isImageZoomed: boolean;\n modalIsOpen: boolean;\n lastUpdate?: number;\n isMobileImageZoomed?: boolean;\n mediaGalleryItems?: IMediaData[];\n isInitialLoad?: boolean;\n shouldUseOptimizedImage?: boolean;\n}\n\n/**\n * IMediaGalleryThumbnailsViewProps Interface.\n */\nexport interface IMediaGalleryThumbnailsViewProps {\n ThumbnailsContainerProps: INodeProps;\n SingleSlideCarouselComponentProps: INodeProps;\n items?: IMediaGalleryThumbnailItemViewProps[];\n}\n\n/**\n * IMediaGalleryThumbnailItemViewProps Interface.\n */\nexport interface IMediaGalleryThumbnailItemViewProps {\n ThumbnailItemContainerProps: INodeProps;\n Picture: React.ReactElement;\n}\n\n/**\n * IMediaGalleryViewProps Interface.\n */\nexport interface IMediaGalleryViewProps extends IMediaGalleryProps {\n state: IMediaGalleryState;\n MediaGallery: IModuleProps;\n CarouselProps: INodeProps;\n Thumbnails: IMediaGalleryThumbnailsViewProps;\n Modal?: React.ReactElement | null;\n callbackToggle?(): void;\n callbackThumbnailClick?(index: number): void;\n callbackThumbnailKeyDown?(index: number): void;\n}\n\n/**\n * Props for carousel.\n */\ninterface IMediaGalleryCarouselItems {\n items: ItemType[];\n keys: (string | undefined)[];\n}\n\n/**\n * Media gallery component.\n */\nclass MediaGallery extends React.Component, IMediaGalleryState> {\n private readonly _inlineZoomDivRef: Map = new Map();\n\n private readonly fullScreenOverlayButtonRef: React.RefObject = React.createRef();\n private readonly player: React.RefObject = React.createRef();\n private fallbackImage?: string;\n\n private readonly defaultGalleryImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=767&h=767&m=8', w: 0, h: 0 },\n sm: { q: 'w=600&h=600&m=8', w: 0, h: 0 },\n md: { q: 'w=600&h=772&m=8', w: 0, h: 0 },\n lg: { q: 'h=772&m=8', w: 0, h: 0 }\n },\n lazyload: true,\n cropFocalRegion: true\n };\n\n private readonly defaultThumbnailImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=100&m=8', w: 100, h: 0 },\n lg: { q: 'w=100&m=8', w: 100, h: 0 }\n },\n lazyload: true,\n cropFocalRegion: true\n };\n\n private readonly _zoomedImageSettings: IImageSettings;\n\n public constructor(props: IMediaGalleryProps) {\n super(props);\n this._toggleModal = this._toggleModal.bind(this);\n const mediaGalleryImages = this.getImagesData();\n this.state = {\n activeIndex: 0,\n animating: false,\n isImageZoomed: false,\n modalIsOpen: false,\n isInitialLoad: true,\n shouldUseOptimizedImage: !!this.props.config.skipImageValidation,\n mediaGalleryItems: mediaGalleryImages\n };\n\n this._zoomedImageSettings =\n props.config.zoomedImageSettings ?? props.config.galleryImageSettings ?? this.defaultGalleryImageSettings;\n\n this._onImageMouseOut = this._onImageMouseOut.bind(this);\n this._inlineZoomImageOnHover = this._inlineZoomImageOnHover.bind(this);\n this._onInlineImageClick = this._onInlineImageClick.bind(this);\n this._onContainerZoomImageClick = this._onContainerZoomImageClick.bind(this);\n this._onMouseOutLensContainer = this._onMouseOutLensContainer.bind(this);\n }\n\n public isMobile(): boolean {\n const size = isMobile({ variant: VariantType.Viewport, context: this.props.context.request });\n return size === 'xs';\n }\n\n public async componentDidMount(): Promise {\n const source = this.props.config.imageSource ?? imageSource.pageContext;\n const shouldUpdateOnPartialDimensionSelection = this.props.config.shouldUpdateOnPartialDimensionSelection;\n this._setRenderType();\n if (!this.props.context.request.app?.config?.OmniChannelMedia) {\n if (source === imageSource.pageContext) {\n if (this.state.mediaGalleryItems === undefined && this.props.data.mediaLocationsForSelectedVariant.result) {\n const images = await validateProductImages(\n this.props.data.mediaLocationsForSelectedVariant.result,\n this.props.context.actionContext,\n this.props.config.thumbnailImageSettings ?? this.defaultThumbnailImageSettings\n );\n await this._setImages(images);\n } else if (this.state.mediaGalleryItems === undefined && this.props.data.product.result) {\n const product = this.props.data.product.result;\n const images = await getValidProductImages(\n product.RecordId,\n +this.props.context.request.apiSettings.channelId,\n this.props.context.actionContext,\n this.props.config.thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\n product.productVariant\n );\n\n await this._setImages(images);\n } else {\n await this._setImages([]);\n }\n }\n }\n\n reaction(\n () => {\n const product = this.props.data.product.result;\n if (!product) {\n return null;\n }\n\n if (!shouldUpdateOnPartialDimensionSelection || !product.productVariant?.RecordId) {\n return `${product.RecordId}`;\n }\n\n return `${product.RecordId}-${product.productVariant.RecordId}`;\n },\n async () => {\n const product = this.props.data.product.result;\n let images: IImageData[] = [];\n if (product) {\n if (this.props.context.app?.config?.OmniChannelMedia) {\n images = await getProductImages(\n product.RecordId,\n this.shouldUseCmsAltText(),\n +this.props.context.request.apiSettings.channelId,\n this.props.context.actionContext,\n product.Name,\n shouldUpdateOnPartialDimensionSelection ? product.productVariant : undefined\n );\n } else {\n images = await getValidProductImages(\n product.RecordId,\n +this.props.context.request.apiSettings.channelId,\n this.props.context.actionContext,\n this.props.config.thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\n shouldUpdateOnPartialDimensionSelection ? product.productVariant : undefined\n );\n }\n await this._setImages(images);\n } else {\n await this._setImages([]);\n }\n },\n { fireImmediately: true }\n );\n\n if (source === imageSource.productId && this.props.data.mediaLocations.result) {\n const images = await validateProductImages(\n this.props.data.mediaLocations.result,\n this.props.context.actionContext,\n this.props.config.thumbnailImageSettings ?? this.defaultThumbnailImageSettings\n );\n await this._setImages(images);\n }\n }\n\n public shouldComponentUpdate(nextProps: IMediaGalleryProps, nextState: IMediaGalleryState): boolean {\n if (this.state === nextState && this.props.data === nextProps.data) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element {\n const { id, config, resources } = this.props;\n\n const { className, showPaginationTooltip } = config;\n\n const isVertical: boolean = config.thumbnailsOrientation === thumbnailsOrientation.vertical;\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- || is required.\n const isFullscreenAllowed: boolean = this.isMobile() || config.allowFullScreen || false;\n const zoomViewMode: string =\n config.imageZoom === imageZoom.inline ? imageZoom.inline : config.imageZoom === imageZoom.container ? imageZoom.container : '';\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Site level config can be of any type.\n const emptyPlaceHolderImage = this.props.context.app.config?.placeholderImageName as string;\n if (this.props.data.product.result) {\n this.fallbackImage = getFallbackImageUrl(\n this.props.data.product.result.ItemId,\n this.props.context.request.apiSettings,\n this.props.context.request.app?.config?.OmniChannelMedia\n );\n }\n if (emptyPlaceHolderImage && this.fallbackImage) {\n this.fallbackImage = `${this.fallbackImage},${emptyPlaceHolderImage}`;\n }\n\n const mediaGalleryCarouselItems = this._getMediaGalleryItems(isFullscreenAllowed, zoomViewMode);\n const mediaGalleryThumbnailCarouselItems = this._getMediaGalleryThumbnailItems();\n const viewProps: IMediaGalleryViewProps = {\n ...(this.props as IMediaGalleryProps),\n state: this.state,\n MediaGallery: {\n moduleProps: this.props,\n className: classnames(`ms-media-gallery ${isVertical ? 'vertical' : ''}`, className)\n },\n Modal: isFullscreenAllowed ? this.imageModalSlider(zoomViewMode) : null,\n callbackToggle: this.openModalDialog,\n callbackThumbnailClick: this._generateOnThumbnailClick,\n callbackThumbnailKeyDown: this._generateOnThumbnailKeyDown,\n CarouselProps: {\n tag: Carousel,\n className: 'ms-media-gallery__carousel',\n items: mediaGalleryCarouselItems.items,\n activeIndex: this.state.activeIndex,\n next: this.next,\n previous: this.previous,\n interval: false,\n directionTextPrev: resources.previousScreenshotFlipperText,\n directionTextNext: resources.nextScreenshotFlipperText,\n onIndicatorsClickHandler: this.goToIndex,\n showPaginationTooltip: showPaginationTooltip === true,\n indicatorAriaText: resources.ariaLabelForSlide,\n handleOnExited: this.onExited,\n handleOnExiting: this.onExiting,\n key: mediaGalleryCarouselItems.keys\n } as IComponentNodeProps,\n Thumbnails: {\n ThumbnailsContainerProps: { className: 'ms-media-gallery__thumbnails-container' },\n SingleSlideCarouselComponentProps: {\n tag: SingleSlideCarousel,\n className: 'ms-media-gallery__thumbnails',\n vertical: isVertical,\n flipperPrevLabel: resources.previousScreenshotFlipperText,\n flipperNextLabel: resources.nextScreenshotFlipperText,\n parentId: id,\n useTabList: true,\n key: JSON.stringify(mediaGalleryThumbnailCarouselItems.keys)\n } as IComponentNodeProps,\n items: mediaGalleryThumbnailCarouselItems.items\n }\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n /**\n * Zoomed out image on previous/next click.\n */\n public updateZoomedInImage(): void {\n this.setState({ isImageZoomed: false });\n }\n\n private readonly onExiting = () => {\n this.setState({ animating: true });\n };\n\n private readonly onExited = () => {\n this.setState({ animating: false });\n };\n\n /**\n * On click next in carousel.\n */\n private readonly next = (): void => {\n removeInlineZoomStyle();\n if (this.isLastItem() === undefined) {\n return;\n }\n\n const nextIndex = this.isLastItem() ? 0 : this.state.activeIndex + 1;\n this.goToIndex(nextIndex);\n\n this.updateZoomedInImage();\n };\n\n /**\n * On click previous in carousel.\n */\n private readonly previous = (): void => {\n removeInlineZoomStyle();\n const images = this.state.mediaGalleryItems;\n const nextIndex = this.isFirstItem() ? (images ? images.length - 1 : 0) : this.state.activeIndex - 1;\n this.goToIndex(nextIndex);\n this.updateZoomedInImage();\n };\n\n private readonly goToIndex = (index: number): void => {\n const { autoplay } = this.props.config;\n const currentIndex = this.state.activeIndex;\n const mediaItems = this.state.mediaGalleryItems;\n if (autoplay && mediaItems) {\n if (mediaItems[`${index}`]?.mediaTypeValue === MediaType.Video) {\n this.player.current?.play();\n } else if (mediaItems[`${currentIndex}`].mediaTypeValue === MediaType.Video) {\n this.player.current?.pause();\n }\n }\n this.setState({ activeIndex: index });\n };\n\n private _getMediaGalleryThumbnailItems(): IMediaGalleryCarouselItems {\n const mediaGalleryItems = this.state.mediaGalleryItems;\n const thumbnailImageSettings = this.props.config.thumbnailImageSettings;\n if (thumbnailImageSettings) {\n thumbnailImageSettings.cropFocalRegion = true;\n }\n\n const hasMediaGalleryItems = ArrayExtensions.hasElements(mediaGalleryItems);\n\n if (!hasMediaGalleryItems) {\n if (this.state.lastUpdate) {\n const defaultKey = 0;\n return {\n items: [this._getEmptyThumbnailItem(thumbnailImageSettings, defaultKey, this.state.activeIndex)],\n keys: ['empty']\n };\n }\n return { items: [], keys: [] };\n }\n\n return {\n items: [\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n ...mediaGalleryItems!.map((item: IMediaData, index: number) => {\n if (item.mediaTypeValue === MediaType.Video) {\n return this.getVideoThumbNailItem(\n item,\n thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\n index,\n this.state.activeIndex\n );\n } else {\n return this._getThumbnailItem(\n item,\n thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\n index,\n this.state.activeIndex\n );\n }\n })\n ],\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n keys: [...mediaGalleryItems!.map(item => item.src)]\n };\n }\n\n private getImagesData = (): IImageData[] => {\n if (this.props.config.skipImageValidation || this.props.context.request.app?.config?.OmniChannelMedia) {\n const source = this.props.config.imageSource ?? imageSource.pageContext;\n let images: IImageData[] = [];\n let mediaLocations: MediaLocation[] = [];\n if (source === imageSource.pageContext && this.props.data.mediaLocationsForSelectedVariant.result) {\n mediaLocations = this.props.data.mediaLocationsForSelectedVariant.result;\n } else if (source === imageSource.productId && this.props.data.mediaLocations.result) {\n mediaLocations = this.props.data.mediaLocations.result;\n }\n images = mediaLocations.map(mediaLocation => {\n return {\n src: mediaLocation.Uri ?? '',\n altText: getAltText(\n this.props.context.actionContext.requestContext,\n this.shouldUseCmsAltText(),\n this.props.data.product.result?.Name,\n mediaLocation.AltText\n ),\n additionalProperties: mediaLocation.IsApplicableForChildEntities\n ? {\n isApplicableForChildEntities: 'true'\n }\n : undefined\n };\n });\n const curatedImages = this.props.config.images ?? [];\n\n return [...this._filterMasterImageFromVariant(images), ...curatedImages];\n }\n return [];\n };\n\n private _getMediaGalleryItems(isFullscreenAllowed: boolean, zoomViewMode: string): IMediaGalleryCarouselItems {\n const mediaGalleryItems = this.state.mediaGalleryItems;\n const galleryImageSettings = this.props.config.galleryImageSettings;\n if (galleryImageSettings) {\n galleryImageSettings.cropFocalRegion = true;\n }\n\n const zoomView = isFullscreenAllowed ? 'fullscreen' : zoomViewMode;\n\n const hasMediaGalleryItems = ArrayExtensions.hasElements(mediaGalleryItems);\n\n if (!hasMediaGalleryItems) {\n if (this.state.lastUpdate) {\n return { items: [this._renderEmptyImage(galleryImageSettings)], keys: ['empty'] };\n }\n return { items: [], keys: [] };\n }\n\n return {\n items: [\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n ...mediaGalleryItems!.map((item: IMediaData, index: number) => {\n return this._renderCarouselItemImageView(\n zoomView,\n item,\n galleryImageSettings ?? this.defaultGalleryImageSettings,\n index\n );\n })\n ],\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n keys: [...mediaGalleryItems!.map(item => item.src)]\n };\n }\n\n private async _setImages(images?: IMediaData[]): Promise {\n const curatedImage = this.props.config.images || [];\n const mediaToSet: IMediaData[] = this._filterMasterImageFromVariant(images);\n\n void Promise.all(\n mediaToSet.map(async mediaData => {\n if (mediaData.mediaTypeValue === MediaType.Video && mediaData.src) {\n try {\n const url = new URL(mediaData.src);\n const videoId = url.searchParams.get('CVID');\n if (videoId) {\n mediaData.videoData = await getVideoMetadataFromApi(videoId, this.props.context.actionContext);\n }\n } catch (error) {\n if (this.props.telemetry) {\n this.props.telemetry.debug('Error while fetching videoId');\n }\n }\n }\n return mediaData;\n })\n ).then(mediaData => {\n const mediaItems = mediaData.filter(element => {\n return (\n element.mediaTypeValue !== MediaType.Video ||\n (element.mediaTypeValue === MediaType.Video && element.videoData !== undefined)\n );\n });\n\n this.setState({\n mediaGalleryItems: [...mediaItems, ...curatedImage],\n activeIndex: 0,\n lastUpdate: Date.now(),\n shouldUseOptimizedImage: false\n });\n });\n\n this.setState({\n mediaGalleryItems: [...mediaToSet, ...curatedImage],\n activeIndex: 0,\n lastUpdate: Date.now(),\n shouldUseOptimizedImage: false\n });\n }\n\n private _setRenderType(): void {\n this.setState({\n isInitialLoad: false\n });\n }\n\n private _renderCarouselItemImageView(\n zoomView: string,\n media: IMediaData,\n imageSettings: IImageSettings,\n index: number,\n isInPopup: boolean = false\n ): React.ReactNode {\n if (media.mediaTypeValue === MediaType.Video) {\n if (isInPopup || zoomView !== 'fullscreen') {\n return <>{this._renderCarouselItemVideo(media, index, imageSettings)};\n }\n return <>{this._renderVideoThumbnail(media, index, imageSettings)};\n } else {\n if (this.isMobile()) {\n if (isInPopup) {\n return this._renderImageInContainerOnZoom(media, this._zoomedImageSettings, index);\n }\n return this._renderImageFullScreenOnZoom(media, imageSettings, index);\n }\n\n switch (zoomView) {\n case 'container': {\n return this._renderImageInContainerOnZoom(media, this._zoomedImageSettings, index);\n }\n case 'inline': {\n return this._renderImageInlineOnZoom(media, this._zoomedImageSettings, index);\n }\n case 'fullscreen': {\n return this._renderImageFullScreenOnZoom(media, imageSettings, index);\n }\n\n // No default\n }\n return <>{this._getCarouselItem(media, imageSettings, index, isInPopup)};\n }\n }\n\n private _filterMasterImageFromVariant(images?: IImageData[]): IImageData[] {\n const shouldHidePrimaryImages = this.props.config.shouldHideMasterProductImagesForVariant ?? true;\n let variantImages = images ?? [];\n const isVariantProduct =\n !ObjectExtensions.isNullOrUndefined(this.props.data.product.result?.MasterProductId) ||\n !ObjectExtensions.isNullOrUndefined(this.props.data.product.result?.productVariant);\n const itemId = this.props.data.product.result?.ItemId;\n if (shouldHidePrimaryImages && isVariantProduct && itemId) {\n variantImages = variantImages.filter(item => {\n const isApplicableForChildEntities = item.additionalProperties?.isApplicableForChildEntities;\n return !isApplicableForChildEntities;\n });\n if (!ArrayExtensions.hasElements(variantImages)) {\n variantImages = images ?? [];\n }\n }\n return variantImages;\n }\n\n private readonly _renderCarouselItemVideo = (mediaData: IMediaData, index: number, imageSettings: IImageSettings): React.ReactNode => {\n const videoData = mediaData.videoData;\n if (videoData) {\n const options: IPlayerOptions = this.props.config as IPlayerOptions;\n const playerResources = this.props.resources;\n const videoMetaData: IVideoMetadata = {};\n videoMetaData.videoId = videoData.id;\n videoMetaData.title = videoData.title;\n videoMetaData.duration = videoData.playTime;\n if (videoData.thumbnail) {\n videoMetaData.posterframeUrl = videoData.thumbnail.src;\n }\n if (videoData._links?.binaryReferences) {\n videoMetaData.videoBinaryReferences = videoData._links.binaryReferences;\n }\n const videoPlayerData: IPlayerData = { options, metaData: videoMetaData };\n const attributes = {\n id: `${this.props.id}__carousel-item__${index}`\n };\n return (\n \n );\n }\n return this._renderEmptyImage(imageSettings);\n };\n\n private readonly _getCarouselItem = (\n image: IImageData,\n imageSettings: IImageSettings,\n index: number,\n isInPopup: boolean = false\n ): React.ReactNode => (\n \n );\n\n private readonly _getThumbnailItem = (\n image: IImageData,\n imageSettings: IImageSettings,\n index: number,\n modifiedActiveIndex: number\n ): IMediaGalleryThumbnailItemViewProps => {\n const classes = classnames(\n 'ms-media-gallery__thumbnail-item',\n modifiedActiveIndex === index ? 'ms-media-gallery__thumbnail-item-active' : ''\n );\n\n return {\n ThumbnailItemContainerProps: {\n tag: 'li' as NodeTag,\n className: classes,\n role: 'tab',\n tabIndex: 0,\n key: index,\n 'aria-label': image.altText,\n 'aria-selected': modifiedActiveIndex === index,\n onClick: this._generateOnThumbnailClick(index),\n onKeyDown: this._generateOnThumbnailKeyDown(index)\n },\n Picture: (\n \n )\n };\n };\n\n /**\n * Gets the video thumbnail item to display media gallery.\n * @param props - The Media gallery view props from business layer.\n * @returns Return thumbnail view props which will be used to render video.\n */\n private readonly getVideoThumbNailItem = (\n mediaData: IMediaData,\n imageSettings: IImageSettings,\n index: number,\n modifiedActiveIndex: number\n ): IMediaGalleryThumbnailItemViewProps => {\n const classes = classnames(\n 'ms-media-gallery__thumbnail-item',\n modifiedActiveIndex === index ? 'ms-media-gallery__thumbnail-item-active' : ''\n );\n\n const videoData = mediaData.videoData;\n let image: IImageData;\n if (videoData?.thumbnail) {\n image = videoData.thumbnail;\n } else {\n image = {\n src: 'empty'\n };\n }\n\n return {\n ThumbnailItemContainerProps: {\n tag: 'li' as NodeTag,\n className: classes,\n role: 'tab',\n tabIndex: 0,\n key: index,\n 'aria-label': image.altText,\n 'aria-selected': modifiedActiveIndex === index,\n onClick: this._generateOnThumbnailClick(index),\n onKeyDown: this._generateOnThumbnailKeyDown(index)\n },\n Picture: (\n \n )\n };\n };\n\n /**\n * Ref Handler.\n * @param index -Remove item click function.\n * @returns Set inline zoom.\n */\n private readonly _refHandler = (index: number) => (divRef: HTMLDivElement) => {\n this._inlineZoomDivRef.set(index, divRef);\n };\n\n private readonly _generateOnThumbnailKeyDown = (index: number) => {\n return (event: React.KeyboardEvent) => {\n if (event.which === KeyCodes.Enter || event.which === KeyCodes.Space) {\n event.preventDefault();\n\n this.goToIndex(index);\n }\n };\n };\n\n private readonly _generateOnThumbnailClick = (index: number) => {\n return (event: React.MouseEvent) => {\n event.preventDefault();\n\n this.goToIndex(index);\n };\n };\n\n private _renderImageInlineOnZoom(image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode {\n return (\n \n \n \n
\n );\n }\n\n private _inlineZoomImageOnHover(event: React.MouseEvent): void {\n inlineZoomImageOnHover(event, this.props.config.dataScale ?? String(defaultDataScale));\n }\n\n private _handleMobileViewZoomedImageClick(event: React.MouseEvent) {\n const target = this.state.shouldUseOptimizedImage ? (event.target as HTMLImageElement) : event.currentTarget;\n const mobileZoomedInImageClassName = 'msc-mobile-zoomed-in';\n if (!this.state.isMobileImageZoomed) {\n const bounds = target.getBoundingClientRect();\n const dataScale = Number(this.props.config.dataScale ?? defaultDataScale);\n\n const positionX = event.clientX - bounds.left;\n const positionY = event.clientY - bounds.top;\n const scaledPositionX = positionX * dataScale;\n const scaledPositionY = positionY * dataScale;\n\n target.style.transform = `scale(${dataScale})`;\n target.classList.add(mobileZoomedInImageClassName);\n target.parentElement!.style.overflow = 'auto';\n target.parentElement!.scrollTo(scaledPositionX - positionX, scaledPositionY - positionY);\n this.setState({\n isMobileImageZoomed: true\n });\n } else {\n target.style.transform = '';\n target.classList.remove(mobileZoomedInImageClassName);\n target.parentElement!.style.overflow = '';\n this.setState({\n isMobileImageZoomed: false\n });\n }\n }\n\n private _onInlineImageClick(event: React.MouseEvent): void {\n if (window.innerWidth <= 768) {\n // $msv-breakpoint-m\n this._handleMobileViewZoomedImageClick(event);\n return;\n }\n inlineZoomInitClick(event, this.props.config.dataScale ?? String(defaultDataScale));\n this.setState({\n isImageZoomed: true\n });\n }\n\n private _onImageMouseOut(event: React.MouseEvent): void {\n inlineZoomImageOnMouseOut(event);\n this.setState({\n isImageZoomed: false\n });\n }\n\n private _onContainerZoomImageClick(event: React.MouseEvent): void {\n if (window.innerWidth <= 768) {\n // $msv-breakpoint-m\n this._handleMobileViewZoomedImageClick(event);\n return;\n }\n\n onContainerZoomInit(event);\n\n this.setState({\n isImageZoomed: true\n });\n }\n\n private _onMouseOutLensContainer(event: React.MouseEvent): void {\n onMouseOutLensContainer(event);\n\n this.setState({\n isImageZoomed: false\n });\n }\n\n private _renderImageInContainerOnZoom(image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode {\n return (\n
\n \n \n
\n );\n }\n\n private _renderImageFullScreenOnZoom(image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode {\n return (\n
\n \n
\n {}\n \n
\n
\n );\n }\n\n /**\n * Render the video thumbnail in full screen.\n * @param mediaData - Media Data.\n * @param index - Index\n * @param imageSettings - Image settings.\n * @returns - JSX.Element\n */\n private readonly _renderVideoThumbnail = (mediaData: IMediaData, index: number, imageSettings: IImageSettings): React.ReactNode => {\n const videoData = mediaData.videoData;\n let image: IImageData;\n if (videoData?.thumbnail) {\n image = videoData.thumbnail;\n } else {\n image = {\n src: 'empty'\n };\n }\n\n return (\n
\n \n
\n {}\n \n
\n
\n );\n };\n\n private _mapProductToImageData(product: SimpleProduct): IImageData {\n return {\n src: product.PrimaryImageUrl ?? ''\n };\n }\n\n private _renderEmptyImage(imageSettings: IImageSettings | undefined): React.ReactNode {\n return (\n
\n \n
\n );\n }\n\n private _getEmptyThumbnailItem(\n imageSettings: IImageSettings | undefined,\n index: number,\n modifiedActiveIndex: number\n ): IMediaGalleryThumbnailItemViewProps {\n const classes = classnames(\n 'ms-media-gallery__thumbnail-item',\n modifiedActiveIndex === index ? 'ms-media-gallery__thumbnail-item-active' : ''\n );\n return {\n ThumbnailItemContainerProps: {\n tag: 'li' as NodeTag,\n className: classes,\n role: 'tab',\n tabIndex: 0,\n key: 'empty',\n 'aria-label': '',\n 'aria-selected': modifiedActiveIndex === index,\n onClick: this._generateOnThumbnailClick(index),\n onKeyDown: this._generateOnThumbnailKeyDown(index)\n },\n Picture: (\n \n )\n };\n }\n\n private readonly isFirstItem = () => this.state.activeIndex === 0;\n\n private readonly isLastItem = () => {\n const images = this.state.mediaGalleryItems;\n return images && this.state.activeIndex === images.length - 1;\n };\n\n private readonly openModalDialog = (): void => {\n this._toggleModal();\n };\n\n private _toggleModal(): void {\n if (this.state.modalIsOpen) {\n this.fullScreenOverlayButtonRef.current?.focus();\n const parentDiv = this._inlineZoomDivRef.get(this.state.activeIndex);\n if (parentDiv && parentDiv.children && parentDiv.children.length >= 2) {\n const image = parentDiv.children[1].querySelector('img');\n if (image) {\n image.removeAttribute('style');\n }\n }\n this.setState({\n isImageZoomed: false\n });\n }\n this.setState({\n isImageZoomed: false,\n modalIsOpen: !this.state.modalIsOpen\n });\n removeInlineZoomStyle();\n removeContainerZoomStyle();\n }\n\n private readonly imageModalSlider = (ZoomView: string): React.ReactElement => {\n const {\n data: {\n product: { result: product }\n },\n resources\n } = this.props;\n let mediaGalleryItems = this.state.mediaGalleryItems;\n\n if (!mediaGalleryItems && product) {\n mediaGalleryItems = [this._mapProductToImageData(product)];\n }\n const carouselprops = {\n tag: Carousel,\n className: 'ms-media-gallery__carousel',\n items:\n mediaGalleryItems &&\n mediaGalleryItems.map((item: IImageData, index: number) =>\n this._renderCarouselItemImageView(ZoomView, item, this._zoomedImageSettings, index, true)\n ),\n activeIndex: this.state.activeIndex,\n next: this.next,\n previous: this.previous,\n interval: false,\n directionTextPrev: resources.previousScreenshotFlipperText,\n directionTextNext: resources.nextScreenshotFlipperText,\n onIndicatorsClickHandler: this.goToIndex,\n showPaginationTooltip: true,\n hideIndicator: false,\n keyboard: false,\n handleOnExited: this.onExited,\n handleOnExiting: this.onExiting,\n isDisabledFunctionality: this.state.isMobileImageZoomed\n } as IComponentNodeProps;\n const carousel = ;\n\n const imageModalSliderProps: IModalViewProps = {\n modalIsOpen: this.state.modalIsOpen,\n ontoggle: this._toggleModal,\n galleryCarousel: carousel,\n classNames: classnames('ms-media-gallery__modal', 'msc-modal-input-required')\n };\n return ImagefullView(imageModalSliderProps) as React.ReactElement;\n };\n\n private shouldUseCmsAltText = (): boolean => {\n if (this.props.config.altTextSource === 'product') {\n return false;\n } else {\n return true;\n }\n };\n}\n\nexport default MediaGallery;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IMediaGalleryThumbnailItemViewProps, IMediaGalleryThumbnailsViewProps, IMediaGalleryViewProps } from '../..';\n\nconst MediaGalleryView: React.FC = props => {\n const { CarouselProps, Thumbnails, MediaGallery, Modal } = props;\n\n return (\n \n \n {Modal}\n {_renderThumbnails(Thumbnails)}\n \n );\n};\n\nconst _renderThumbnails = (thumbnails: IMediaGalleryThumbnailsViewProps): JSX.Element => {\n const { ThumbnailsContainerProps, SingleSlideCarouselComponentProps, items } = thumbnails;\n\n return (\n \n {items && items.map(_renderThumbnailItem)}\n \n );\n};\n\nconst _renderThumbnailItem = (thumbnail: IMediaGalleryThumbnailItemViewProps): JSX.Element => {\n const { ThumbnailItemContainerProps, Picture } = thumbnail;\n\n return {Picture};\n};\n\nexport default MediaGalleryView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IImageData, IRequestContext, IVideoData } from '@msdyn365-commerce/core';\n\nexport enum MediaType {\n /**\n * The None.\n */\n None = 0,\n /**\n * The Image type.\n */\n Image = 1,\n /**\n * The video type.\n */\n Video = 2,\n /**\n * The file type.\n */\n File = 3\n}\n\nexport interface IMediaData extends IImageData {\n mediaTypeValue?: MediaType;\n displayOrder?: number;\n videoData?: IVideoData;\n}\n\n/**\n * Gets correct alt text for image based on configuration of site.\n * @param productName Product name.\n * @param context Current request context.\n * @param imageAltText Alt-text from CMS image.\n */\nexport function getAltText(\n context: IRequestContext,\n shouldUseCmsAltText: boolean,\n productName?: string,\n imageAltText?: string\n): string | undefined {\n if (!context?.app?.config?.OmniChannelMedia) {\n return productName;\n }\n if (shouldUseCmsAltText) {\n return imageAltText;\n }\n return productName;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n commerceApiRequest,\n commerceVideoMetadataRequest,\n getCatalogId,\n IActionContext,\n IImageData,\n IImageSettings,\n IVideoData\n} from '@msdyn365-commerce/core';\nimport { MediaLocation, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport {\n ArrayExtensions,\n getMediaLocationsForSelectedVariant,\n MediaLocationsForSelectedVariantInput\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { getAltText } from './helper';\n\nasync function validateMediaLocationAsync(mediaLocation: MediaLocation): Promise<[IImageData, boolean]> {\n const imageData: IImageData = {\n src: mediaLocation.Uri || '',\n altText: mediaLocation.AltText || ''\n };\n if (mediaLocation.IsApplicableForChildEntities) {\n imageData.additionalProperties = { isApplicableForChildEntities: 'true' };\n }\n\n if (imageData.src === '') {\n return [imageData, false];\n }\n\n return new Promise<[IImageData, boolean]>(resolve => {\n try {\n const http = new XMLHttpRequest();\n http.open('HEAD', imageData.src!, true);\n\n http.addEventListener('load', () => {\n resolve([imageData, http.status === 200 || http.status === 201]);\n });\n\n http.addEventListener('error', () => {\n resolve([imageData, false]);\n });\n\n http.send();\n } catch {\n resolve([imageData, false]);\n }\n });\n}\n\nexport async function getValidProductImages(\n productId: number,\n channelId: number,\n actionContext: IActionContext,\n imageSettings: IImageSettings,\n selectedProduct?: SimpleProduct\n): Promise {\n const catalogId = getCatalogId(actionContext.requestContext);\n const actionInput = new MediaLocationsForSelectedVariantInput(productId, channelId, selectedProduct, catalogId);\n\n return getMediaLocationsForSelectedVariant(actionInput, actionContext)\n .then(mediaLocations => {\n if (mediaLocations) {\n return Promise.all(mediaLocations.map(mediaLocation => validateMediaLocationAsync(mediaLocation))).then(pairs => {\n return pairs.filter(pair => pair[1]).map(pair => pair[0]);\n });\n }\n\n return [];\n })\n .catch(error => {\n actionContext.telemetry.exception(error);\n actionContext.telemetry.debug('Unable to get Media Locations for Selected Variant');\n return [];\n });\n}\n\n/**\n * Gets product variant images on dimension change of buy-box module for Omni scenario.\n * @param productId Product record id.\n * @param shouldUseCmsAltText Alt-text source to use.\n * @param channelId Current channel id.\n * @param actionContext Current action context.\n * @param productName Product name.\n * @param selectedProduct Currently selected variant product.\n * @returns List of images.\n */\n\nexport async function getProductImages(\n productId: number,\n shouldUseCmsAltText: boolean,\n channelId: number,\n actionContext: IActionContext,\n productName?: string,\n selectedProduct?: SimpleProduct\n): Promise {\n const catalogId = getCatalogId(actionContext.requestContext);\n if (actionContext.requestContext?.params?.isPreview) {\n const response = await commerceApiRequest(actionContext.requestContext, 'msdyn365-ochannel-product-info', 'post', {\n productId: productId,\n channelId: channelId,\n catalogId: catalogId\n });\n if (response.status !== 200) {\n actionContext.telemetry.debug('Unable to get Media Locations for Selected Variant for preview scenario');\n return [];\n }\n const previewImageData = response?.data as MediaLocation[];\n if (previewImageData) {\n return previewImageData.map(mediaLocation => {\n return {\n src: mediaLocation.Uri ?? '',\n altText: getAltText(actionContext.requestContext, shouldUseCmsAltText, productName, mediaLocation.AltText),\n displayOrder: mediaLocation.DisplayOrder,\n mediaTypeValue: mediaLocation.MediaTypeValue,\n additionalProperties: mediaLocation.IsApplicableForChildEntities\n ? {\n isApplicableForChildEntities: 'true'\n }\n : undefined\n };\n });\n }\n return [];\n }\n const actionInput = new MediaLocationsForSelectedVariantInput(productId, channelId, selectedProduct, catalogId);\n return getMediaLocationsForSelectedVariant(actionInput, actionContext)\n .then(mediaLocations => {\n if (mediaLocations) {\n return mediaLocations.map(mediaLocation => {\n return {\n src: mediaLocation.Uri ?? '',\n altText: getAltText(actionContext.requestContext, shouldUseCmsAltText, productName, mediaLocation.AltText),\n displayOrder: mediaLocation.DisplayOrder,\n mediaTypeValue: mediaLocation.MediaTypeValue,\n additionalProperties: mediaLocation.IsApplicableForChildEntities\n ? {\n isApplicableForChildEntities: 'true'\n }\n : undefined\n };\n });\n }\n return [];\n })\n .catch(error => {\n actionContext.telemetry.exception(error);\n actionContext.telemetry.debug('Unable to get Media Locations for Selected Variant');\n return [];\n });\n}\n\nexport async function validateProductImages(\n mediaLocations: MediaLocation[],\n actionContext: IActionContext,\n imageSettings: IImageSettings\n): Promise {\n return Promise.all(mediaLocations.map(mediaLocation => validateMediaLocationAsync(mediaLocation)))\n .then(pairs => {\n return pairs.filter(pair => pair[1]).map(pair => pair[0]);\n })\n .catch(error => {\n actionContext.telemetry.exception(error);\n actionContext.telemetry.debug('Unable to validate product images');\n return [];\n });\n}\n\n/**\n * GetVideoMetadataFromAPI - Makes API call to get video metadata.\n * @param videoId: Video Id\n * @param actionContext: Action context\n * @returns: Returns the meta data of the video.\n */\nexport async function getVideoMetadataFromApi(videoId: string, actionContext: IActionContext): Promise {\n let videoPlayerData: IVideoData | undefined;\n if (videoId) {\n const response = await commerceVideoMetadataRequest(actionContext.requestContext, [videoId]);\n\n if (response.status !== 200) {\n actionContext.telemetry.debug(`Unable to get video metadata for videoId: ${videoId}`);\n return;\n }\n\n const videoData = response.data as [];\n if (videoData && ArrayExtensions.hasElements(videoData)) {\n videoPlayerData = videoData[0];\n }\n }\n return videoPlayerData;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { 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 { 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 submitButton: (\n \n {props.resources.submitReviewButtonText}\n \n ),\n rating: ratingsInput(props),\n ratingLabel: ratingsLabel(props),\n titleInput: titleInput(props),\n titleLabel: titleLabel(props),\n textInput: textInput(props),\n textLabel: textLabel(props),\n privacyPolicyUrl: privacyPolicyLink(props),\n form: { tag: 'form', className: 'ms-review-modal-form', autoComplete: 'off' },\n inputRow: { tag: 'div', className: 'ms-review-modal-row', autoComplete: 'off' },\n error: (\n \n {props.resources.errorMessageText}\n \n )\n };\n};\n\nconst modalHeaderNode = (props: IReviewModalProps) => {\n return (\n \n {props.userReview && props.userReview.reviewId ? props.resources.editReviewModalTitle : props.resources.writeReviewModalTitle}\n \n );\n};\n\nconst submitDisabled = (props: IReviewModalProps) => {\n return !props.rating || !stripWhiteSpacesFromString(props.reviewText) || !stripWhiteSpacesFromString(props.reviewTitle);\n};\n\nconst ratingsInput = (props: IReviewModalProps) => {\n return (\n \n );\n};\n\nconst ratingsLabel = (props: IReviewModalProps) => {\n return (\n \n );\n};\n\nconst titleInput = (props: IReviewModalProps) => {\n const maxLength = props.context.app.config.reviewTitleMaxLength;\n\n return (\n \n );\n};\n\nconst titleLabel = (props: IReviewModalProps) => {\n return (\n \n );\n};\n\nconst reviewTextWidth: number = 50;\n\nconst textInput = (props: IReviewModalProps) => {\n const maxLength = props.context.app.config.reviewTextMaxLength;\n return (\n \n );\n};\n\nconst textLabel = (props: IReviewModalProps) => {\n return (\n \n );\n};\n\nconst privacyPolicyLink = (props: IReviewModalProps) => {\n const policyTextBlocks = props.resources.privacyPolicyTextFormat.split('{0}');\n const isSeparatorAtStart = props.resources.privacyPolicyTextFormat.startsWith('{0}');\n const isSeparatorAtEnd = props.resources.privacyPolicyTextFormat.endsWith('{0}');\n const privacyPolicyUrl = getUrlSync('rnrPrivacyPolicy', props.context.actionContext);\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.PrivacyPolicy);\n const privacyPolicyAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n\n return (\n

\n {isSeparatorAtStart ? '' : policyTextBlocks[0]}\n \n {props.resources.privacyPolicyTitle}\n \n {isSeparatorAtEnd ? '' : isSeparatorAtStart ? policyTextBlocks[0] : policyTextBlocks[1]}\n

\n );\n};\n\nconst onSubmit = (props: IReviewModalProps): void => {\n if (props.product) {\n submitReview(\n props.product,\n props.reviewTitle,\n props.reviewText,\n props.rating,\n props.context,\n props.userReview,\n props.onReviewComplete\n );\n }\n};\n\n/**\n * This method strips content of extra white spaces.\n * @param text The text to be stripped of extra white spaces.\n */\nconst stripWhiteSpacesFromString = (text: string): string => {\n return text\n .replace(new RegExp('\\\\r?\\\\n|\\\\r+', 'g'), ' ')\n .replace(new RegExp('\\\\s+', 'g'), ' ')\n .trim();\n};\n\nexport const submitReview = (\n product: SimpleProduct,\n title: string,\n text: string,\n rating: number,\n context: ICoreContext,\n userReview?: Review,\n onReviewSubmission?: (isSuccessful: boolean) => void\n) => {\n const { request } = context;\n const { user } = request;\n if (user && request) {\n const input = new SubmitUserReviewInput(\n product.RecordId.toString(),\n getRnrPartnerId(context.actionContext),\n request.apiSettings.channelId.toString(),\n request.locale,\n {\n productName: product && product.Name,\n rating,\n reviewText: stripWhiteSpacesFromString(text),\n title: stripWhiteSpacesFromString(title),\n userEmail: user.emailAddress,\n userName: user.name\n },\n request.user.token,\n getRnrAuthEndpointId(context.actionContext)\n );\n\n submitUserReview(input, context.actionContext)\n .then(reviewId => {\n const review = reviewId\n ? {\n rating,\n title: stripWhiteSpacesFromString(title),\n reviewText: stripWhiteSpacesFromString(text),\n submittedDateTime: new Date(),\n helpfulPositive: userReview ? userReview.helpfulPositive : 0,\n helpfulNegative: userReview ? userReview.helpfulNegative : 0,\n reviewId,\n userName: request.user.firstName || request.user.name\n }\n : userReview;\n\n const getReviewInput = new GetUserReviewInput(input.productId!, input.tenantId, input.authorization, input.serviceEndpoint);\n context.actionContext.update(getReviewInput, review);\n\n if (onReviewSubmission) {\n onReviewSubmission(!!reviewId);\n }\n })\n .catch(() => {\n const productId = product.RecordId;\n context.telemetry.error(`Failed to submit review for product with recordId: ${productId}`);\n context.telemetry.debug(`Failed to submit review for product with recordId: ${productId}`);\n if (onReviewSubmission) {\n onReviewSubmission(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 { OrderBy } from '../actions/inputs/get-product-reviews-input';\n\nexport interface IRnrKeyValuePair {\n key: string;\n value: string;\n}\n\nexport interface IRnrOrderByKeyValuePair {\n key: OrderBy;\n value: string;\n}\n\nexport function setFocusOnElement(id: string): void {\n const element = document.getElementById(id);\n if (element) {\n element.focus();\n }\n}\n\nexport const TOGGLE_REVIEW_MODAL_BUTTON_ID: string = 'reviewproductid';\nexport const TOGGLE_EDIT_MODAL_BUTTON_ID: string = 'ms-write-review__edit';\nexport const TOGGLE_EDIT_MODAL_BUTTON_CARD_ID: string = 'ms-reviews-list__edit';\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { RatingsSummary } from '@msdyn365-commerce/commerce-entities';\nimport { format, INodeProps, Progress } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nexport interface IHistogramItemsProps {\n ratingsSummary: RatingsSummary;\n resources: IHistogramItemsResources;\n locale: string;\n onClick(stars: number): void;\n}\n\nexport interface IHistogramItemsResources {\n barItemAriaLabel: string;\n}\n\nexport interface IHistogramItemViewProps {\n starLabel: React.ReactElement;\n bar: React.ReactElement;\n percentage: React.ReactElement;\n buttonProps: INodeProps;\n}\n\n/**\n * CartLineItems component.\n */\n\nexport const HistogramItems = (props: IHistogramItemsProps): IHistogramItemViewProps[] => {\n const { ratingsSummary } = props;\n const totalRatingsCount: number = ratingsSummary.totalRatingsCount || 0;\n if (totalRatingsCount === 0) {\n return [];\n }\n return [\n renderItem(props, 5, ratingsSummary.star5Count, totalRatingsCount),\n renderItem(props, 4, ratingsSummary.star4Count, totalRatingsCount),\n renderItem(props, 3, ratingsSummary.star3Count, totalRatingsCount),\n renderItem(props, 2, ratingsSummary.star2Count, totalRatingsCount),\n renderItem(props, 1, ratingsSummary.star1Count, totalRatingsCount)\n ];\n};\n\nconst renderItem = (props: IHistogramItemsProps, stars: number, count?: number, totalCount?: number): IHistogramItemViewProps => {\n count = count || 0;\n totalCount = totalCount || 0;\n const percentage = totalCount === 0 ? 0 : count / totalCount;\n const formattedPercent = new Intl.NumberFormat(props.locale, { style: 'percent' }).format(percentage);\n const ariaLabel = format(props.resources.barItemAriaLabel, stars, formattedPercent);\n\n return {\n starLabel: (\n \n ),\n percentage: (\n \n ),\n bar: ,\n buttonProps: {\n tag: 'button',\n className: 'ms-ratings-histogram__item',\n onClick: () => {\n props.onClick(stars);\n }\n }\n };\n};\n\nexport const AverageRatingNumber: React.FC<{ summary: RatingsSummary }> = (props: { summary: RatingsSummary }) => {\n return (\n

\n {props.summary.averageRating}\n {` `}/ 5\n

\n );\n};\n\nexport const TotalReviews: React.FC<{ summary: RatingsSummary }> = (props: { summary: RatingsSummary }) => {\n return

{props.summary.totalRatingsCount}

;\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { RatingComponent } from '@msdyn365-commerce/components';\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { format, IModuleProps, INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport classname from 'classnames';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { createRatingsReviewsStateInput } from '../../actions/ratings-reviews-state-data-action';\nimport { AverageRatingNumber, HistogramItems, IHistogramItemViewProps, TotalReviews } from './component/components';\nimport { IRatingsHistogramData } from './ratings-histogram.data';\nimport { IRatingsHistogramProps } from './ratings-histogram.props.autogenerated';\n\nexport interface IRatingsHistogramViewProps extends IRatingsHistogramProps {\n className: string;\n histogramItems: IHistogramItemViewProps[];\n moduleProps: IModuleProps;\n heading: React.ReactNode;\n averageRating: React.ReactNode;\n averageNumber: React.ReactNode;\n totalReviews: React.ReactNode;\n histogramProps: INodeProps;\n ratingsSummaryProps: INodeProps;\n callbacks: IRatingsHistogramCallbacks;\n}\n\nexport interface IRatingsHistogramCallbacks {\n selectFilterBy(stars: number): void;\n}\n\n/**\n * RatingsHistogram component.\n * @extends {React.Component>}\n */\n@observer\nclass RatingsHistogram extends React.PureComponent> {\n constructor(props: IRatingsHistogramProps) {\n super(props);\n this.selectFilterBy = this.selectFilterBy.bind(this);\n }\n\n public render(): JSX.Element | null {\n const { resources } = this.props;\n const { className, heading } = this.props.config;\n const {\n ratingsSummary: { result: ratingsSummary }\n } = this.props.data;\n const ratingCount = ratingsSummary && ratingsSummary.totalRatingsCount ? `${ratingsSummary.totalRatingsCount}` : '0';\n\n const completeClass = classname('ms-ratings-histogram', className);\n const viewProps: IRatingsHistogramViewProps = {\n ...this.props,\n className: completeClass,\n callbacks: {\n selectFilterBy: this.selectFilterBy\n },\n moduleProps: {\n moduleProps: this.props,\n className: completeClass\n },\n histogramItems: ratingsSummary\n ? HistogramItems({\n ratingsSummary,\n resources: { ...resources },\n locale: this.props.context.request.locale,\n onClick: this.selectFilterBy\n })\n : [],\n averageRating: ratingsSummary && (\n \n ),\n averageNumber: ratingsSummary && ,\n totalReviews: ratingsSummary && ,\n ratingsSummaryProps: { className: 'ms-ratings-histogram__summary' },\n heading: heading && (\n \n ),\n histogramProps: { className: 'ms-ratings-histogram__histogram' }\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n public handleHeadingChange = (event: Msdyn365.ContentEditableEvent) => (this.props.config.heading!.text = event.target.value);\n\n public selectFilterBy(stars: number): void {\n const filterKey = `${stars}`;\n this.props.context.actionContext.update(createRatingsReviewsStateInput({ filterKey }), { filterKey });\n }\n}\n\nexport default RatingsHistogram;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IHistogramItemViewProps } from './component/components';\nimport { IRatingsHistogramViewProps } from './ratings-histogram';\n\nconst RatingsHistogramView: React.FC = props => {\n const { heading, histogramItems, histogramProps, moduleProps } = props;\n\n return (\n \n {heading}\n \n {histogramItems.map(item => {\n return histogramItem(item);\n })}\n \n \n );\n};\n\nconst histogramItem = (props: IHistogramItemViewProps) => {\n return (\n \n {props.starLabel}\n {props.bar}\n {props.percentage}\n \n );\n};\n\nexport default RatingsHistogramView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { createObservableDataAction, IAction, IActionContext, sendRequest } from '@msdyn365-commerce/core';\n\nimport { ReportReviewConcernInput } from './inputs/report-review-concern-input';\n\nasync function reportReviewConcern(input: ReportReviewConcernInput, ctx: IActionContext): Promise {\n if (!inputIsValid(input)) {\n throw new Error(\n `[SubmitHelpfulnessVote] Invalid input. ReviewId=${input.reviewId},tenantId=${input.tenantId},locale= ${input.locale},`\n );\n }\n\n const requestUrl =\n `${input.serviceEndpoint}/v2.0/concerns/review/${input.reviewId}` + `?tenantId=${input.tenantId}` + `&locale=${input.locale}`;\n\n const requestBody = {\n concernCategory: input.concernCategory\n };\n\n const requestHeader = {\n headers: {\n Authorization: `id_token ${input.authToken}`\n }\n };\n\n return sendRequest(requestUrl, 'post', requestBody, requestHeader)\n .then(response => {\n return response.status === 200 || response.status === 201;\n })\n .catch(error => {\n ctx.trace('[ReportReviewConcernInput] Failed to report a concern');\n ctx.telemetry.exception(error);\n ctx.telemetry.debug('[ReportReviewConcernInput] Failed to report a concern');\n return false;\n });\n}\n\nfunction inputIsValid(input: ReportReviewConcernInput): boolean {\n return input && input.reviewId.length > 0 && input.tenantId.length > 0 && input.locale.length > 0 && input.authToken.length > 0;\n}\n\nexport const reportReviewConcernDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/ratings-reviews/report-review-concern',\n action: >reportReviewConcern\n});\n\nexport default reportReviewConcernDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { createObservableDataAction, IAction, IActionContext, sendRequest } from '@msdyn365-commerce/core';\n\nimport { SubmitHelpfulnessVoteInput } from './inputs/submit-helpfulness-vote-input';\n\nasync function submitHelpfulnessVote(input: SubmitHelpfulnessVoteInput, ctx: IActionContext): Promise {\n if (!inputIsValid(input)) {\n throw new Error(\n `[SubmitHelpfulnessVote] Invalid input. ReviewId=${input.reviewId},tenantId=${input.tenantId}, locale= ${input.locale},`\n );\n }\n\n const requestUrl =\n `${input.serviceEndpoint}/v2.0/votes/review/${input.reviewId}` + `?tenantId=${input.tenantId}` + `&locale=${input.locale}`;\n\n const requestBody = {\n isHelpful: !!input.isHelpful\n };\n\n const requestHeader = {\n headers: {\n Authorization: `id_token ${input.authToken}`\n }\n };\n\n return sendRequest(requestUrl, 'post', requestBody, requestHeader)\n .then(response => {\n return response.status === 200 || response.status === 201;\n })\n .catch(error => {\n ctx.trace('[SubmitHelpfulnessVote] Failed to vote on a review');\n ctx.telemetry.exception(error);\n ctx.telemetry.debug('[SubmitHelpfulnessVote] Failed to vote on a review');\n return false;\n });\n}\n\nfunction inputIsValid(input: SubmitHelpfulnessVoteInput): boolean {\n return input && input.reviewId.length > 0 && input.tenantId.length > 0 && input.locale.length > 0 && input.authToken.length > 0;\n}\n\nexport const submitHelpfulnessVoteDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/ratings-reviews/submit-helpfulness-vote',\n action: >submitHelpfulnessVote\n});\n\nexport default submitHelpfulnessVoteDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { CacheType, IActionInput } from '@msdyn365-commerce/core';\n\nexport enum ReviewConcernCategory {\n OffensiveContent = '1',\n ReviewResponse = '7',\n SpamAdvertising = '8',\n Profanity = '9'\n}\n\n/**\n * ReportReviewConcern Input Action.\n */\nexport class ReportReviewConcernInput implements IActionInput {\n public reviewId: string;\n\n public tenantId: string;\n\n public locale: string;\n\n public serviceEndpoint: string;\n\n public concernCategory: string;\n\n public authToken: string;\n\n constructor(reviewId: string, tenantId: string, locale: string, concernCategory: string, authToken: string, serviceEndpoint: string) {\n this.reviewId = reviewId;\n this.tenantId = tenantId;\n this.locale = locale;\n this.concernCategory = concernCategory;\n this.authToken = authToken;\n this.serviceEndpoint = serviceEndpoint;\n }\n\n public getCacheKey = () => 'ReportReviewConcern';\n\n public getCacheObjectType = () => 'ReportReviewConcern';\n\n public dataCacheType = (): CacheType => 'none';\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n format,\n getPayloadObject,\n getTelemetryAttributes,\n ILabeledDropdownOption,\n ITelemetryContent,\n TelemetryConstant\n} from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface IReviewCountResources {\n pageReviewCountText: string;\n}\n\nexport interface IReviewCountProps {\n resources: IReviewCountResources;\n currentPage: number;\n reviewsCount: number;\n reviewsShownOnEachPage: number;\n}\n\nexport const ReviewCount: React.FC = (props: IReviewCountProps) => {\n const { currentPage, resources, reviewsCount, reviewsShownOnEachPage } = props;\n\n return (\n \n {format(\n resources.pageReviewCountText,\n _getReviewStartNumber(currentPage, reviewsShownOnEachPage),\n _getReviewEndNumber(currentPage, reviewsCount, reviewsShownOnEachPage),\n reviewsCount\n )}\n \n );\n};\n\nexport interface IPageControlResources {\n previousButtonText: string;\n nextButtonText: string;\n pageReviewAriaLabel: string;\n}\n\nexport interface IPageControlsProps {\n resources: IPageControlResources;\n currentPage: number;\n reviewsCount: number;\n reviewsShownOnEachPage: number;\n selectedSortByOption: ILabeledDropdownOption;\n selectedFilterByOption: ILabeledDropdownOption;\n telemetryContent?: ITelemetryContent;\n updateReviews(\n skipItems: number,\n selectedSortByOption: ILabeledDropdownOption,\n selectedFilterByOption: ILabeledDropdownOption,\n currentPage: number,\n isFilterApplied: boolean\n ): Promise;\n}\n\nexport const PageControls: React.FC = (props: IPageControlsProps) => {\n const { currentPage, resources, reviewsCount, reviewsShownOnEachPage } = props;\n const previousPageClick = React.useCallback(() => {\n return _getPreviousPageData(props);\n }, [props]);\n const nextPageClick = React.useCallback(() => {\n return _getNextPageData(props);\n }, [props]);\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.Next);\n const nextAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n payLoad.contentAction.etext = TelemetryConstant.Previous;\n const previousAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n\n return (\n
\n {_hasPreviousPage(currentPage) && (\n \n {resources.previousButtonText}\n \n )}\n {_hasNextPage(currentPage, reviewsCount, reviewsShownOnEachPage) && (\n \n {resources.nextButtonText}\n \n )}\n
\n );\n};\n\nconst _hasPreviousPage = (currentPage: number): boolean => {\n return currentPage > 1;\n};\n\nconst _hasNextPage = (currentPage: number, reviewsCount: number, reviewsShownOnEachPage: number): boolean => {\n return _getPagesCount(reviewsCount, reviewsShownOnEachPage) > currentPage;\n};\n\nconst _getReviewsShown = (reviewsShownOnEachPage: number) => {\n return Math.min(25, reviewsShownOnEachPage);\n};\n\nconst _getPagesCount = (reviewsCount: number, reviewsShownOnEachPage: number): number => {\n return Math.ceil(reviewsCount / _getReviewsShown(reviewsShownOnEachPage));\n};\n\nconst _paginationAriaLabel = (\n pageReviewAriaLabel: string,\n currentPage: number,\n reviewsCount: number,\n reviewsShownOnEachPage: number,\n isNextPage: boolean,\n page?: number\n): string => {\n const pageModifier = isNextPage ? 1 : -1;\n return format(\n pageReviewAriaLabel,\n _getReviewStartNumber(currentPage, reviewsShownOnEachPage, currentPage + pageModifier),\n _getReviewEndNumber(currentPage, reviewsCount, reviewsShownOnEachPage, currentPage + pageModifier),\n reviewsCount\n );\n};\n\nconst _getReviewStartNumber = (currentPage: number, reviewsShownOnEachPage: number, page?: number): number => {\n return ((page || currentPage) - 1) * _getReviewsShown(reviewsShownOnEachPage) + 1;\n};\n\nconst _getReviewEndNumber = (currentPage: number, reviewsCount: number, reviewsShownOnEachPage: number, page?: number): number => {\n const pageUsed = page || currentPage;\n const pageReviewCount = pageUsed * _getReviewsShown(reviewsShownOnEachPage);\n return pageReviewCount < reviewsCount ? pageReviewCount : reviewsCount;\n};\n\nconst _getPreviousPageData = async (props: IPageControlsProps) => {\n await props.updateReviews(\n _getReviewStartNumber(props.currentPage, props.reviewsShownOnEachPage) - 1 - _getReviewsShown(props.reviewsShownOnEachPage),\n props.selectedSortByOption,\n props.selectedFilterByOption,\n props.currentPage - 1,\n false\n );\n};\n\nconst _getNextPageData = async (props: IPageControlsProps) => {\n await props.updateReviews(\n _getReviewEndNumber(props.currentPage, props.reviewsCount, props.reviewsShownOnEachPage),\n props.selectedSortByOption,\n props.selectedFilterByOption,\n props.currentPage + 1,\n 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 { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\nimport {\n Alert,\n getPayloadObject,\n getTelemetryAttributes,\n INodeProps,\n ITelemetryContent,\n Modal,\n ModalBody,\n ModalFooter,\n ModalHeader,\n TelemetryConstant\n} from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nimport { ReviewConcernCategory } from '../../../actions/inputs/report-review-concern-input';\nimport { IRnrKeyValuePair } from '../../../common/rnrInterface';\n\nexport interface IReportReviewModalProps {\n resources: IReportReviewModalResources;\n context: ICoreContext>;\n isOpen: boolean;\n returnRef: React.RefObject | undefined;\n reportedKey: string;\n hasError: boolean;\n telemetryContent?: ITelemetryContent;\n onModalToggle(): void;\n onRadioChange(event: React.ChangeEvent): void;\n reportReview(): void;\n}\n\nexport interface IReportReviewModalResources {\n reportConcernText: string;\n feedbackThankYouText: string;\n reportModalMessage: string;\n reportSubmittedMessage: string;\n reportSpamText: string;\n offensiveContentText: string;\n profanityContentText: string;\n okReportReviewText: string;\n cancelReportReviewText: string;\n reportReviewButtonText: string;\n errorMessageText: string;\n}\n\nexport interface IReportReviewModalViewProps {\n modal: INodeProps;\n modalHeader: INodeProps;\n modalFooter: INodeProps;\n modalBody: INodeProps;\n header: React.ReactElement;\n headerSubmitted: React.ReactElement;\n cancelButton: React.ReactElement;\n submitButton: React.ReactElement;\n succesfulButton: React.ReactElement;\n reportMessage: React.ReactElement;\n reportSubmittedMessage: React.ReactElement;\n radioButtons: React.ReactElement;\n error: React.ReactElement;\n}\n\nlet reportConcernDropdownOptions: IRnrKeyValuePair[];\n\n/**\n * CartLineItems component.\n */\n\nexport const ReportReviewModal = (props: IReportReviewModalProps): IReportReviewModalViewProps => {\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.SubmitReview);\n const submitReviewAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n payLoad.contentAction.etext = TelemetryConstant.SuccessButton;\n const successAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n payLoad.contentAction.etext = TelemetryConstant.Cancel;\n const cancelAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n\n reportConcernDropdownOptions = [\n { key: ReviewConcernCategory.SpamAdvertising, value: props.resources.reportSpamText },\n { key: ReviewConcernCategory.OffensiveContent, value: props.resources.offensiveContentText },\n { key: ReviewConcernCategory.Profanity, value: props.resources.profanityContentText }\n ];\n\n return {\n modal: {\n tag: Modal,\n className: 'ms-report-review-modal msc-modal-input-required',\n toggle: props.onModalToggle,\n applicationNode: 'renderPage',\n isOpen: props.isOpen,\n returnFocusRef: props.returnRef\n },\n modalHeader: { tag: ModalHeader, toggle: props.onModalToggle, className: 'ms-report-review-modal-header' },\n modalFooter: { tag: ModalFooter, className: 'ms-report-review-modal-footer' },\n modalBody: { tag: ModalBody, className: 'ms-report-review-modal-body' },\n header:

{props.resources.reportConcernText}

,\n headerSubmitted:

{props.resources.feedbackThankYouText}

,\n cancelButton: (\n \n ),\n submitButton: (\n \n ),\n succesfulButton: (\n \n ),\n reportMessage:

{props.resources.reportModalMessage}

,\n reportSubmittedMessage:

{props.resources.reportSubmittedMessage}

,\n radioButtons: radioPairs(props),\n error: (\n \n {props.resources.errorMessageText}\n \n )\n };\n};\n\nconst radioPairs = (props: IReportReviewModalProps) => {\n const pairs = [];\n for (const option of reportConcernDropdownOptions) {\n const inputId = `report-review-${option.key}`;\n const checked = option.key === props.reportedKey;\n pairs.push(\n
\n \n \n
\n );\n }\n\n return
{pairs}
;\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Review } from '@msdyn365-commerce/commerce-entities';\nimport { RatingComponent } from '@msdyn365-commerce/components';\nimport { IAny, ICoreContext, IGeneric, isOboRequest } from '@msdyn365-commerce/core';\nimport { Button, format, INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nimport { TOGGLE_EDIT_MODAL_BUTTON_CARD_ID } from '../../../common/rnrInterface';\n\nexport interface IReviewCardResources {\n wasReviewHelpfulText: string;\n yesButtonText: string;\n noButtonText: string;\n editReviewCardText: string;\n reportedText: string;\n reportConcernText: string;\n reviewRatingNarratorText: string;\n}\n\nexport interface IReviewCardProps {\n review: Review;\n resources: IReviewCardResources;\n context: ICoreContext>;\n isUserReview?: boolean;\n parentId: string;\n parentType: string;\n reportedReviews: string[];\n returnRef: React.RefObject | undefined;\n reportedReviewId: string;\n votedReviews: { reviewId: string; approved: boolean }[];\n toggleWriteReviewModal?(): void;\n toggleReportReviewModal(reviewId: string): void;\n updateReviewHelpfulness(reviewId: string, isHelpful: boolean): void;\n}\n\nexport interface IReviewCardViewProps {\n cardProps: INodeProps;\n name: React.ReactElement;\n rating: React.ReactElement;\n date: React.ReactElement;\n reviewTitle: React.ReactElement;\n reviewText: React.ReactElement;\n ratingHelpfulLabel?: React.ReactElement;\n like?: React.ReactElement;\n dislike?: React.ReactElement;\n edit: React.ReactNode;\n report: React.ReactNode;\n responseName: React.ReactNode;\n responseDate: React.ReactNode;\n responseText: React.ReactNode;\n cardBodyProps: INodeProps;\n responseProps: INodeProps;\n reviewProps: INodeProps;\n controlsProps: INodeProps;\n headerProps: INodeProps;\n}\n\n/**\n * Review card component.\n */\n\nexport const ReviewCard = (props: IReviewCardProps): IReviewCardViewProps => {\n const className = props.isUserReview ? 'ms-reviews-list__card ms-reviews-list__user-review' : 'ms-reviews-list__card';\n return {\n cardProps: { className, key: props.review.reviewId },\n name:

{props.review.userName}

,\n rating: rating(props),\n date:

{renderDate(props, props.review.submittedDateTime)}

,\n reviewTitle:

{props.review.title}

,\n reviewText:

{props.review.reviewText}

,\n ratingHelpfulLabel: props.isUserReview ? (\n undefined\n ) : (\n

{props.resources.wasReviewHelpfulText}

\n ),\n like: props.isUserReview ? undefined : voteHelpfulButton(props, true),\n dislike: props.isUserReview ? undefined : voteHelpfulButton(props, false),\n edit: editButton(props),\n report: reportToggle(props),\n responseName: props.review.userResponse ? (\n

{props.review.userResponse.responderName}

\n ) : (\n undefined\n ),\n responseText: props.review.userResponse ? (\n

{props.review.userResponse.responseText}

\n ) : (\n undefined\n ),\n responseDate: props.review.userResponse ? (\n

{renderDate(props, props.review.userResponse.submittedDateTime)}

\n ) : (\n undefined\n ),\n cardBodyProps: { className: 'ms-reviews-list__card-body' },\n responseProps: { className: 'ms-reviews-list__response' },\n reviewProps: { className: 'ms-reviews-list__review' },\n controlsProps: { className: 'ms-reviews-list__card-controls' },\n headerProps: { className: 'ms-reviews-list__card-header' }\n };\n};\n\nconst rating = (props: IReviewCardProps) => {\n return (\n \n );\n};\n\nconst isVotedFor = (props: IReviewCardProps, isHelpful: boolean): boolean => {\n for (let i = 0; i < props.votedReviews.length; i++) {\n if (props.votedReviews[i].reviewId === props.review.reviewId) {\n return props.votedReviews[i].approved === isHelpful;\n }\n }\n\n return false;\n};\n\nconst voteHelpfulButton = (props: IReviewCardProps, isHelpful: boolean) => {\n const isVoted = isVotedFor(props, isHelpful);\n const isDisabled = props.isUserReview || isVoted || isOboRequest(props.context.request) ? 'disabled' : '';\n let className = isHelpful ? 'ms-reviews-list__like' : 'ms-reviews-list__dislike';\n className = `${className} ${isDisabled}`;\n const label = isHelpful ? props.resources.yesButtonText : props.resources.noButtonText;\n let voteCount = (isHelpful ? props.review.helpfulPositive : props.review.helpfulNegative) || 0;\n voteCount = isVoted ? voteCount + 1 : voteCount;\n const title = `(${voteCount})`;\n const user = props.context.request.user;\n const onClickMethod = () => {\n props.updateReviewHelpfulness(props.review.reviewId!, isHelpful);\n };\n const onClick = isDisabled ? undefined : onClickMethod;\n\n if (user.isAuthenticated) {\n return (\n \n );\n }\n return (\n \n );\n};\n\nconst editButton = (props: IReviewCardProps) => {\n if (props.isUserReview && !isOboRequest(props.context.request)) {\n return (\n \n );\n }\n\n return undefined;\n};\n\nconst renderDate = (props: IReviewCardProps, date?: Date): string | Date => {\n if (!date) {\n return '';\n }\n\n try {\n return new Intl.DateTimeFormat(props.context.request.locale, { month: 'long', day: 'numeric', year: 'numeric' }).format(\n new Date(date)\n );\n } catch {\n return date;\n }\n};\n\n/**\n * On Click Handler.\n * @param props -Review card props.\n * @returns Report review modal.\n */\nconst onClick = (props: IReviewCardProps) => () => {\n props.toggleReportReviewModal(props.review.reviewId!);\n};\n\nconst reportToggle = (props: IReviewCardProps) => {\n const user = props.context.request.user;\n if (props.isUserReview || isOboRequest(props.context.request)) {\n return undefined;\n } else if (!user.isAuthenticated) {\n return (\n \n );\n }\n\n if (props.reportedReviews.includes(props.review.reviewId!)) {\n return

{props.resources.reportedText}

;\n }\n\n const ref = props.review.reviewId === props.reportedReviewId ? props.returnRef : undefined;\n\n return (\n \n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { CacheType, IActionInput } from '@msdyn365-commerce/core';\n\n/**\n * SubmitHelpfulnessVote Input Action.\n */\nexport class SubmitHelpfulnessVoteInput implements IActionInput {\n public reviewId: string;\n\n public tenantId: string;\n\n public locale: string;\n\n public serviceEndpoint: string;\n\n public isHelpful: boolean;\n\n public authToken: string;\n\n constructor(reviewId: string, tenantId: string, locale: string, isHelpful: boolean, authToken: string, serviceEndpoint: string) {\n this.reviewId = reviewId;\n this.tenantId = tenantId;\n this.locale = locale;\n this.isHelpful = isHelpful;\n this.authToken = authToken;\n this.serviceEndpoint = serviceEndpoint;\n }\n\n public getCacheKey = () => 'SubmitHelpfulnessVote';\n\n public getCacheObjectType = () => 'SubmitHelpfulnessVote';\n\n public dataCacheType = (): CacheType => 'none';\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Review } from '@msdyn365-commerce/commerce-entities';\nimport { RatingComponent } from '@msdyn365-commerce/components';\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport {\n getRnrAuthEndpointId,\n getRnrEndpointId,\n getRnrPartnerId,\n getSelectedProductIdFromActionInput\n} from '@msdyn365-commerce-modules/retail-actions';\nimport {\n format,\n getTelemetryObject,\n ILabeledDropdownOnChangeNotification,\n ILabeledDropdownOption,\n IModuleProps,\n INodeProps,\n ITelemetryContent,\n LabeledDropdown\n} from '@msdyn365-commerce-modules/utilities';\nimport classname from 'classnames';\nimport { reaction } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { reportReviewConcern, submitHelpfulnessVote } from '../..';\nimport { getReviewsForGivenProduct } from '../../actions/get-product-reviews';\nimport { GetProductReviewsInput } from '../../actions/inputs/get-product-reviews-input';\nimport { ReportReviewConcernInput, ReviewConcernCategory } from '../../actions/inputs/report-review-concern-input';\nimport { SubmitHelpfulnessVoteInput } from '../../actions/inputs/submit-helpfulness-vote-input';\nimport { IReviewModalViewProps, ReviewModal, submitReview } from '../../common/review-modal';\nimport { IRnrKeyValuePair, IRnrOrderByKeyValuePair } from '../../common/rnrInterface';\nimport { PageControls, ReviewCount } from './components/components';\nimport { IReportReviewModalViewProps, ReportReviewModal } from './components/report-review-modal';\nimport { IReviewCardViewProps, ReviewCard } from './components/review-card';\nimport { IReviewsListData } from './reviews-list.data';\nimport { IReviewsListProps } from './reviews-list.props.autogenerated';\n\nexport interface IReviewsListState {\n skipItems: number;\n listOfReviews: Review[];\n currentPage: number;\n reviewsCount: number;\n showSpinner: boolean;\n isFilterApplied: boolean;\n selectedSortByOption: ILabeledDropdownOption;\n selectedFilterByOption: ILabeledDropdownOption;\n userReviewRating: number;\n userReviewTitle: string;\n userReviewText: string;\n isReviewModalOpen: boolean;\n hasReviewError: boolean;\n isReportModalOpen: boolean;\n hasReportError: boolean;\n reportingReviewId: string;\n reportedKey: string;\n reported: boolean;\n reportedReviews: string[];\n votedReviews: { reviewId: string; approved: boolean }[];\n}\n\nexport interface IReviewsListCallbacks {\n toggleModal(): void;\n updateReviewTitle(title: string): void;\n updateReviewText(text: string): void;\n updateRating(rating: number): void;\n onReviewSubmitted(isSuccessful: boolean): void;\n submitReview(\n product: SimpleProduct,\n title: string,\n text: string,\n rating: number,\n context: Msdyn365.ICoreContext,\n userReview?: Review,\n onReviewSubmission?: (isSuccessful: boolean) => void\n ): void;\n updateReviewHelpfulnessVote(reviewId: string, isHelpful: boolean): void;\n toggleReportModal(reviewId: string): void;\n reportReview(reviewId: string, reportedKey: string): void;\n updateSortByDropdown(notification: ILabeledDropdownOnChangeNotification): void;\n updateFilterByDropdown(notification: ILabeledDropdownOnChangeNotification): void;\n updateReviews(\n skipItems: number,\n selectedSortByOption: ILabeledDropdownOption,\n selectedFilterByOption: ILabeledDropdownOption,\n currentPage: number,\n isFilterApplied: boolean\n ): void;\n}\n\nexport interface IReviewsListViewProps extends IReviewsListProps {\n state: IReviewsListState;\n className: string;\n callbacks: IReviewsListCallbacks;\n moduleProps: IModuleProps;\n reviewModal: IReviewModalViewProps;\n reportReviewModal: IReportReviewModalViewProps;\n sortByDropdown: React.ReactNode;\n filterByDropdown: React.ReactNode;\n averageRating: React.ReactNode;\n reviewCount: React.ReactElement;\n refineReviewsProps: INodeProps;\n reviewsListProps: INodeProps;\n reviewCards: IReviewCardViewProps[];\n userReview?: IReviewCardViewProps;\n pageControls: React.ReactNode;\n noReviewsMessage: React.ReactElement;\n noReviewsWithFilterMessage: React.ReactElement;\n heading: React.ReactNode;\n sortByOptions: IRnrOrderByKeyValuePair[];\n filterByOptions: IRnrOrderByKeyValuePair[];\n}\n\n/**\n *\n * ReviewsList component.\n * @extends {React.Component, IReviewsListState>}\n */\n@observer\nclass ReviewsList extends React.Component, IReviewsListState> {\n public sortByDropdownOptions: IRnrOrderByKeyValuePair[] = [\n { key: 'MostHelpful', value: this.props.resources.mostHelpfulSortOptionText },\n { key: 'MostRecent', value: this.props.resources.mostRecentSortOptionText },\n { key: 'HighestRating', value: this.props.resources.highestRatedSortOptionText },\n { key: 'LowestRating', value: this.props.resources.lowestRatedSortOptionText }\n ];\n\n public filterByDropdownOptions: IRnrKeyValuePair[] = [\n { key: '1;2;3;4;5', value: this.props.resources.allRatinsFilterByOptionText },\n { key: '5', value: this.props.resources.fiveStarFilterByOptionText },\n { key: '4', value: this.props.resources.fourStarFilterByOptionText },\n { key: '3', value: this.props.resources.threeStarFilterByOptionText },\n { key: '2', value: this.props.resources.twoStarFilterByOptionText },\n { key: '1', value: this.props.resources.oneStarFilterByOptionText }\n ];\n\n private readonly _userReviewModalToggle: React.RefObject;\n\n private readonly _userReportModalToggle: React.RefObject;\n\n private readonly telemetryContent?: ITelemetryContent;\n private readonly reviewsListCallbacks: IReviewsListCallbacks = {\n updateReviewTitle: (title: string): void => {\n this.setState({ userReviewTitle: title });\n },\n updateReviewText: (text: string): void => {\n this.setState({ userReviewText: text });\n },\n updateRating: (rating: number): void => {\n this.setState({ userReviewRating: rating });\n },\n onReviewSubmitted: (isSuccessful: boolean): void => {\n if (isSuccessful) {\n this.setState({ isReviewModalOpen: false, hasReviewError: false });\n } else {\n this.setState({ hasReviewError: true });\n }\n },\n submitReview,\n // @ts-expect-error\n toggleModal: this._toggleReviewModal,\n // @ts-expect-error\n updateReviewHelpfulnessVote: this.updateReviewHelpfulnessVote,\n toggleReportModal: (reviewId: string): void => {\n this.state.isReportModalOpen ? this._onReportModalOpen(reviewId) : this._onReportModalClose();\n },\n // @ts-expect-error\n reportReview: this._reportReviewCallback,\n // @ts-expect-error\n updateFilterByDropdown: this.updateFilterByDropdown,\n // @ts-expect-error\n updateSortByDropdown: this.updateSortByDropdown,\n // @ts-expect-error\n updateReviews: this.updateReviews\n };\n constructor(props: IReviewsListProps) {\n super(props);\n const {\n userReview: { result: userReview }\n } = this.props.data;\n\n this.state = {\n skipItems: 0,\n reviewsCount: 0,\n listOfReviews: [],\n currentPage: 1,\n showSpinner: false,\n isFilterApplied: false,\n selectedSortByOption: this.sortByDropdownOptions[0],\n selectedFilterByOption: this.filterByDropdownOptions[0],\n userReviewRating: userReview ? userReview.rating : 0,\n userReviewText: userReview ? userReview.reviewText : '',\n userReviewTitle: userReview ? userReview.title : '',\n isReviewModalOpen: false,\n hasReviewError: false,\n isReportModalOpen: false,\n hasReportError: false,\n reported: false,\n reportedKey: ReviewConcernCategory.SpamAdvertising,\n reportingReviewId: '',\n reportedReviews: [],\n votedReviews: []\n };\n\n this._userReviewModalToggle = React.createRef();\n this._userReportModalToggle = React.createRef();\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n }\n\n public shouldComponentUpdate(nextProps: IReviewsListProps, nextState: IReviewsListState): boolean {\n if (this.state === nextState && this.props.data === nextProps.data) {\n return false;\n }\n return true;\n }\n public componentDidMount = async () => {\n this.props.data.reviewsList.then(reviewsList => {\n if (\n reviewsList &&\n reviewsList.pagingInfo &&\n reviewsList.pagingInfo.totalItems &&\n reviewsList.items &&\n reviewsList.items.length > 0\n ) {\n this.setState({\n listOfReviews: reviewsList.items,\n reviewsCount: reviewsList.pagingInfo.totalItems\n });\n }\n });\n await this.updateReviews(0, this.state.selectedSortByOption, this.state.selectedFilterByOption, 1, this.state.isFilterApplied);\n\n reaction(\n () => this.props.data.ratingsReviewsState.result && this.props.data.ratingsReviewsState.result.filterKey,\n async (filterKey: string | undefined) => {\n const filterKeyValue = Number(filterKey);\n const dropdownItemsCount = this.filterByDropdownOptions.length;\n if (filterKey && !isNaN(filterKeyValue) && filterKeyValue < dropdownItemsCount) {\n const filterByOption = this.filterByDropdownOptions.find((option: IRnrKeyValuePair) => option.key === filterKey);\n if (!filterByOption) {\n this.props.telemetry.warning(`[reviews-list] cannot find filter with key ${filterKey}`);\n } else {\n await this.updateReviews(0, this.state.selectedSortByOption, filterByOption, 1, true);\n const selectedIndex = dropdownItemsCount - filterKeyValue;\n this.setState({\n selectedFilterByOption: this.filterByDropdownOptions[selectedIndex]\n });\n }\n }\n }\n );\n };\n public render(): JSX.Element | null {\n const { className, heading, reviewsShownOnEachPage } = this.props.config;\n const { currentPage, reviewsCount, selectedFilterByOption, selectedSortByOption } = this.state;\n const {\n ratingsSummary: { result: ratingsSummary }\n } = this.props.data;\n const resources = this.props.resources;\n const completeClass = classname('ms-reviews-list', className);\n const viewProps: IReviewsListViewProps = {\n ...this.props,\n state: this.state,\n className: completeClass,\n moduleProps: {\n moduleProps: this.props,\n className: completeClass\n },\n callbacks: this.reviewsListCallbacks,\n reviewModal: this._userReviewModal(),\n reportReviewModal: this._reportReviewModal(),\n filterByDropdown: (\n \n ),\n sortByDropdown: (\n \n ),\n averageRating: ratingsSummary && (\n \n ),\n reviewCount: (\n \n ),\n refineReviewsProps: { className: 'ms-reviews-list__refiners' },\n reviewsListProps: { className: 'ms-reviews-list__reviews' },\n reviewCards: this._reviewCards(this.state.listOfReviews),\n userReview: this._userReview(),\n pageControls: (\n \n ),\n noReviewsMessage: (\n \n {resources.noReviewsMessage}\n \n ),\n noReviewsWithFilterMessage: (\n \n {resources.noReviewsWithSelectedFilterMessage}\n \n ),\n heading: heading && heading.text && (\n \n ),\n sortByOptions: this.sortByDropdownOptions,\n filterByOptions: this.filterByDropdownOptions\n } as IReviewsListViewProps;\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n public handleHeadingChange = (event: Msdyn365.ContentEditableEvent) => (this.props.config.heading!.text = event.target.value);\n private readonly _userReview = () => {\n const userReview = this.props.data.userReview.result;\n\n return userReview && this._reviewCard(userReview, true);\n };\n\n private readonly _reviewCards = (reviewList: Review[]) => {\n const userReview = this.props.data.userReview.result;\n const reviewElements: IReviewCardViewProps[] = [];\n\n for (const review of reviewList) {\n if (!review.isTakenDown && review.isPublished && userReview ? review.reviewId !== userReview.reviewId : true) {\n reviewElements.push(this._reviewCard(review, false));\n }\n }\n return reviewElements;\n };\n\n private readonly _reviewCard = (review: Review, userReview: boolean): IReviewCardViewProps => {\n return ReviewCard({\n review,\n resources: { ...this.props.resources },\n context: this.props.context,\n isUserReview: userReview,\n parentId: this.props.id,\n parentType: this.props.typeName,\n reportedReviews: this.state.reportedReviews,\n returnRef: this._userReportModalToggle,\n reportedReviewId: this.state.reportingReviewId,\n toggleWriteReviewModal: this._toggleReviewModal,\n toggleReportReviewModal: this._onReportModalOpen,\n updateReviewHelpfulness: this.updateReviewHelpfulnessVote,\n votedReviews: this.state.votedReviews\n });\n };\n\n private readonly _userReviewModal = (): IReviewModalViewProps => {\n return ReviewModal({\n userReview: this.props.data.userReview.result,\n product: this.props.data.product.result,\n resources: { ...this.props.resources },\n context: this.props.context,\n parentId: this.props.id,\n parentType: this.props.typeName,\n isOpen: this.state.isReviewModalOpen,\n rating: this.state.userReviewRating,\n reviewTitle: this.state.userReviewTitle,\n reviewText: this.state.userReviewText,\n onModalToggle: this._toggleReviewModal,\n onTitleChange: this._onTitleChange,\n onTextChange: this._onTextChange,\n onRatingChange: this._onRatingChange,\n onReviewComplete: this._onReviewComplete,\n renderContextId: 'writeReview-list',\n returnRef: this._userReviewModalToggle,\n hasError: this.state.hasReviewError,\n modalCSS: 'ms-reviews-list'\n });\n };\n\n private readonly _onTitleChange = (event: React.ChangeEvent): void => {\n this.reviewsListCallbacks.updateReviewTitle(event.target.value);\n };\n\n private readonly _onTextChange = (event: React.ChangeEvent): void => {\n this.reviewsListCallbacks.updateReviewText(event.target.value);\n };\n\n private readonly _onRatingChange = (value: number): void => {\n this.reviewsListCallbacks.updateRating(value);\n };\n\n private readonly _toggleReviewModal = (): void => {\n const userReview = this.props.data.userReview.result;\n if (this.state.isReviewModalOpen) {\n this.setState({ isReviewModalOpen: false, hasReviewError: false });\n } else {\n this.setState({\n isReviewModalOpen: true,\n userReviewText: userReview!.reviewText,\n userReviewTitle: userReview!.title,\n userReviewRating: userReview!.rating\n });\n }\n };\n\n private readonly _onReviewComplete = (isSuccess: boolean): void => {\n if (isSuccess) {\n this.setState({ isReviewModalOpen: false, hasReviewError: false });\n } else {\n this.setState({ hasReviewError: true });\n }\n };\n\n private readonly _reportReviewModal = () => {\n return ReportReviewModal({\n resources: { ...this.props.resources },\n context: this.props.context,\n isOpen: this.state.isReportModalOpen,\n returnRef: this._userReportModalToggle,\n reportedKey: this.state.reportedKey,\n onModalToggle: this._onReportModalClose,\n onRadioChange: this._onRadioChange,\n reportReview: this._reportReview,\n hasError: this.state.hasReportError,\n telemetryContent: this.telemetryContent\n });\n };\n\n private readonly _onReportModalOpen = (reviewId: string) => {\n this.setState({\n isReportModalOpen: true,\n reportingReviewId: reviewId,\n reported: false,\n reportedKey: ReviewConcernCategory.SpamAdvertising\n });\n };\n\n private readonly _onReportModalClose = () => {\n this.setState({ isReportModalOpen: false, hasReportError: false });\n };\n\n private readonly _onRadioChange = (event: React.ChangeEvent) => {\n this.setState({ reportedKey: event.currentTarget.getAttribute('data-key') || '' });\n };\n\n private readonly _reportReviewCallback = (reviewId: string, reportedKey: string) => {\n reportReviewConcern(\n new ReportReviewConcernInput(\n reviewId,\n getRnrPartnerId(this.props.context.actionContext),\n this.props.context.request.locale,\n reportedKey,\n this.getUserToken(this.props.context.request),\n getRnrAuthEndpointId(this.props.context.actionContext)\n ),\n this.props.context.actionContext\n )\n .then((_value: boolean) => {\n const reportedReview = this.state.reportedReviews;\n reportedReview.push(reviewId);\n this.setState({ reported: true, reportedReviews: reportedReview, hasReportError: false });\n })\n .catch((error: boolean) => {\n this.setState({ hasReportError: true });\n });\n };\n\n private readonly _reportReview = () => {\n this._reportReviewCallback(this.state.reportingReviewId, this.state.reportedKey);\n };\n\n private readonly updateSortByDropdown = async (notification: ILabeledDropdownOnChangeNotification) => {\n await this.updateReviews(0, notification.selectedOption, this.state.selectedFilterByOption, 1, this.state.isFilterApplied);\n };\n\n private readonly updateFilterByDropdown = async (notification: ILabeledDropdownOnChangeNotification) => {\n await this.updateReviews(0, this.state.selectedSortByOption, notification.selectedOption, 1, true);\n };\n\n private readonly updateReviews = async (\n skipItems: number | 0,\n selectedSortByOption: ILabeledDropdownOption,\n selectedFilterByOption: ILabeledDropdownOption,\n currentPage: number,\n isFilterApplied: boolean\n ) => {\n const productId = getSelectedProductIdFromActionInput(this.props.context.actionContext);\n if (productId === undefined) {\n return;\n }\n const result = await getReviewsForGivenProduct(\n // Task #211227597 Remove this hardcoded values.\n new GetProductReviewsInput(\n productId,\n getRnrPartnerId(this.props.context.actionContext),\n this.props.context.request.locale,\n getRnrEndpointId(this.props.context.actionContext),\n selectedSortByOption.key,\n selectedFilterByOption.key,\n skipItems < 0 ? 0 : skipItems,\n this.props.config.reviewsShownOnEachPage\n ),\n this.props.context.actionContext\n );\n if (result && result.items && result.pagingInfo && result.pagingInfo.totalItems !== undefined) {\n this.setState({\n currentPage,\n listOfReviews: result.items,\n selectedSortByOption,\n selectedFilterByOption,\n reviewsCount: result.pagingInfo.totalItems,\n isFilterApplied\n });\n }\n };\n\n private readonly _updateVoteUi = (reviewId: string, isHelpful: boolean): void => {\n let alreadyExists = false;\n let list = this.state.votedReviews.map(review => {\n if (review.reviewId === reviewId) {\n review.approved = isHelpful;\n alreadyExists = true;\n }\n return review;\n });\n\n if (!alreadyExists) {\n list = list.concat({ reviewId, approved: isHelpful });\n }\n\n this.setState({ votedReviews: list });\n };\n\n private readonly updateReviewHelpfulnessVote = (reviewId: string, isHelpful: boolean): void => {\n submitHelpfulnessVote(\n new SubmitHelpfulnessVoteInput(\n reviewId,\n getRnrPartnerId(this.props.context.actionContext),\n this.props.context.request.locale,\n isHelpful,\n this.getUserToken(this.props.context.request),\n getRnrAuthEndpointId(this.props.context.actionContext)\n ),\n this.props.context.actionContext\n )\n .then(() => {\n this._updateVoteUi(reviewId, isHelpful);\n })\n .catch((error: Error) => {\n throw new Error('[submitHelpfulnessVote]Error executing action');\n });\n };\n\n private readonly getUserToken = (context: Msdyn365.IRequestContext): string => {\n return context && context.user && context.user.token;\n };\n}\n\nexport default ReviewsList;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IModuleProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IReviewModalViewProps } from '../../common/review-modal';\nimport { IReportReviewModalViewProps } from './components/report-review-modal';\nimport { IReviewCardViewProps } from './components/review-card';\nimport { IReviewsListState, IReviewsListViewProps } from './reviews-list';\n\nconst ReviewsListview: React.FC = props => {\n const {\n averageRating,\n filterByDropdown,\n heading,\n moduleProps,\n noReviewsMessage,\n noReviewsWithFilterMessage,\n pageControls,\n refineReviewsProps,\n reportReviewModal,\n reviewsListProps,\n reviewCards,\n reviewCount,\n reviewModal,\n sortByDropdown,\n state,\n userReview\n } = props;\n\n if (!userReview && reviewCards.length === 0 && !state.isFilterApplied) {\n return {noReviewsMessage};\n }\n\n return (\n \n {heading}\n {averageRating}\n {reviewCount}\n \n {sortByDropdown}\n {filterByDropdown}\n \n \n {userReview && buildReviewCard(userReview)}\n {reviewCards.map(review => {\n return buildReviewCard(review);\n })}\n \n {reviewCards.length === 0 && state.isFilterApplied && noReviewsWithFilterMessage}\n {pageControls}\n {createReviewModal(reviewModal, moduleProps)}\n {createReportModal(reportReviewModal, state)}\n \n );\n};\n\nconst buildReviewCard = (props: IReviewCardViewProps) => {\n return (\n \n \n {props.rating}\n {props.name}\n \n \n \n {props.reviewTitle}\n {props.date}\n {props.reviewText}\n \n \n {props.responseName}\n {props.responseDate}\n {props.responseText}\n \n \n {props.ratingHelpfulLabel}\n {props.like}\n {props.dislike}\n {props.edit}\n {props.report}\n \n \n \n );\n};\n\nconst createReviewModal = (props: IReviewModalViewProps, moduleProps: IModuleProps): JSX.Element => {\n return (\n \n {props.modalHeader}\n \n \n \n {props.rating}\n {props.ratingLabel}\n \n \n {props.titleLabel}\n {props.titleInput}\n \n \n {props.textLabel}\n {props.textInput}\n \n {props.privacyPolicyUrl}\n {props.error}\n \n \n \n {props.submitButton}\n {props.cancelButton}\n \n \n );\n};\n\nconst createReportModal = (props: IReportReviewModalViewProps, state: IReviewsListState): JSX.Element => {\n return (\n \n {state.reported ? props.headerSubmitted : props.header}\n \n {state.reported ? props.reportSubmittedMessage : [props.reportMessage, props.radioButtons, props.error]}\n \n {state.reported ? props.succesfulButton : [props.submitButton, props.cancelButton]}\n \n );\n};\n\nexport default ReviewsListview;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nexport const SignInMessage: React.FC<{ text: string }> = (props: { text: string }) => {\n return

{props.text}

;\n};\n\nexport const SignInButton: React.FC<{ text: string; href: string; ariaLabel: string; telemetryContent?: ITelemetryContent }> = (props: {\n text: string;\n href: string;\n ariaLabel: string;\n telemetryContent?: ITelemetryContent;\n}) => {\n const { text, href, ariaLabel, telemetryContent } = props;\n const payLoad = getPayloadObject('click', telemetryContent!, TelemetryConstant.SignIn);\n const attributes = getTelemetryAttributes(telemetryContent!, payLoad);\n return (\n \n {text}\n \n );\n};\n\ninterface IModalToggleProps {\n innerRef: React.RefObject | undefined;\n id: string;\n text: string;\n ariaLabel: string;\n telemetryContent?: ITelemetryContent;\n onClick(): void;\n}\n\nexport const ModalToggle: React.FC = (props: IModalToggleProps) => {\n const { text, onClick, ariaLabel, innerRef, telemetryContent, id } = props;\n const payLoad = getPayloadObject('click', telemetryContent!, TelemetryConstant.WriteReview);\n const attributes = getTelemetryAttributes(telemetryContent!, payLoad);\n return (\n \n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Review } from '@msdyn365-commerce/commerce-entities';\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { getTelemetryObject, IModuleProps, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport React from 'react';\n\nimport { IReviewModalViewProps, ReviewModal, submitReview } from '../../common/review-modal';\nimport { TOGGLE_REVIEW_MODAL_BUTTON_ID } from '../../common/rnrInterface';\nimport { ModalToggle, SignInButton, SignInMessage } from './components/components';\nimport { IWriteReviewData } from './write-review.data';\nimport { IWriteReviewProps } from './write-review.props.autogenerated';\n\nexport interface IWriteReviewCallbacks {\n toggleModal(): void;\n updateReviewTitle(title: string): void;\n updateReviewText(text: string): void;\n updateRating(rating: number): void;\n onReviewSubmitted(isSuccessful: boolean): void;\n submitReview(\n product: SimpleProduct,\n title: string,\n text: string,\n rating: number,\n context: Msdyn365.ICoreContext,\n userReview?: Review,\n onReviewSubmission?: (isSuccessful: boolean) => void\n ): void;\n}\n\nexport interface IWriteReviewState {\n rating: number;\n reviewTitle: string;\n reviewText: string;\n isReviewModalOpen: boolean;\n hasReviewError: boolean;\n}\n\nexport interface IWriteReviewViewProps extends IWriteReviewProps {\n state: IWriteReviewState;\n className: string;\n callbacks: IWriteReviewCallbacks;\n signInMessage: React.ReactNode;\n signInButton: React.ReactNode;\n modalToggle: React.ReactNode;\n reviewModal: IReviewModalViewProps;\n moduleProps: IModuleProps;\n heading: React.ReactNode;\n}\n\n/**\n * This module is enables user's to leave ratings and reviews on a specific product\n * WriteReview module.\n * @extends {React.PureComponent>}\n */\nclass WriteReview extends React.PureComponent, IWriteReviewState> {\n private readonly _modalToggleRef: React.RefObject | undefined;\n\n private readonly telemetryContent: ITelemetryContent;\n private readonly writeReviewCallbacks: IWriteReviewCallbacks = {\n // @ts-expect-error\n toggleModal: this._toggleReviewModal,\n updateReviewTitle: (title: string): void => {\n this.setState({ reviewTitle: title });\n },\n updateReviewText: (text: string): void => {\n this.setState({ reviewText: text });\n },\n updateRating: (rating: number): void => {\n this.setState({ rating });\n },\n onReviewSubmitted: (isSuccessful: boolean): void => {\n if (isSuccessful) {\n this.setState({ isReviewModalOpen: false, hasReviewError: false });\n } else {\n this.setState({ hasReviewError: true });\n }\n },\n submitReview\n };\n public constructor(props: IWriteReviewProps) {\n super(props);\n const {\n userReview: { result: userReview }\n } = this.props.data;\n this._toggleReviewModal = this._toggleReviewModal.bind(this);\n this._modalToggleRef = React.createRef();\n const rating = userReview ? userReview.rating : 0;\n const reviewTitle = userReview ? userReview.title : '';\n const reviewText = userReview ? userReview.reviewText : '';\n\n this.state = {\n isReviewModalOpen: false,\n rating,\n reviewTitle,\n reviewText,\n hasReviewError: false\n };\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n }\n\n public render(): JSX.Element {\n const { resources } = this.props;\n const { className, heading } = this.props.config;\n const {\n product: { result: product },\n userReview: { result: userReview }\n } = this.props.data;\n\n const userInfo = this.props.context && this.props.context.request && this.props.context.request.user;\n const completeClass = classnames('ms-write-review', 'msc-modal-input-required', className);\n const viewProps = {\n ...this.props,\n state: this.state,\n className: completeClass,\n moduleProps: {\n moduleProps: this.props,\n className: completeClass,\n id: null\n },\n callbacks: this.writeReviewCallbacks,\n signInMessage: ,\n signInButton: (\n \n ),\n modalToggle: !Msdyn365.isOboRequest(this.props.context.request) && product && (\n \n ),\n reviewModal: this._buildUserReviewModal(),\n heading: heading && heading.text && (\n \n )\n } as IWriteReviewViewProps;\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n public handleHeadingChange = (event: Msdyn365.ContentEditableEvent) => (this.props.config.heading!.text = event.target.value);\n private readonly _onTitleChange = (event: React.ChangeEvent): void => {\n this.writeReviewCallbacks.updateReviewTitle(event.target.value);\n };\n\n private readonly _onTextChange = (event: React.ChangeEvent): void => {\n this.writeReviewCallbacks.updateReviewText(event.target.value);\n };\n\n private readonly _onRatingChange = (value: number): void => {\n this.writeReviewCallbacks.updateRating(value);\n };\n\n private readonly _toggleReviewModal = (): void => {\n const userReview = this.props.data.userReview.result;\n if (this.state.isReviewModalOpen) {\n this.setState({ isReviewModalOpen: false, hasReviewError: false });\n } else if (userReview) {\n this.setState({\n isReviewModalOpen: true,\n reviewText: userReview.reviewText,\n reviewTitle: userReview.title,\n rating: userReview.rating\n });\n } else {\n this.setState({\n isReviewModalOpen: true,\n reviewText: '',\n reviewTitle: '',\n rating: 0\n });\n }\n };\n\n /**\n * This method builds the user review modal.\n * @param config The module config.\n */\n private _buildUserReviewModal(): IReviewModalViewProps {\n return ReviewModal({\n userReview: this.props.data.userReview.result,\n product: this.props.data.product.result,\n resources: { ...this.props.resources },\n context: this.props.context,\n parentId: this.props.id,\n parentType: this.props.typeName,\n isOpen: this.state.isReviewModalOpen,\n rating: this.state.rating,\n reviewTitle: this.state.reviewTitle,\n reviewText: this.state.reviewText,\n onModalToggle: this._toggleReviewModal,\n onTitleChange: this._onTitleChange,\n onTextChange: this._onTextChange,\n onRatingChange: this._onRatingChange,\n onReviewComplete: this.writeReviewCallbacks.onReviewSubmitted,\n renderContextId: 'writeReview',\n returnRef: this._modalToggleRef,\n hasError: this.state.hasReviewError,\n telemetryContent: this.telemetryContent\n });\n }\n}\n\nexport default WriteReview;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IModuleProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IReviewModalViewProps } from '../../common/review-modal';\nimport { IWriteReviewViewProps } from './write-review';\n\nconst WriteReviewView: React.FC = props => {\n const { heading, signInMessage, signInButton, modalToggle, reviewModal, moduleProps } = props;\n const isAuthenticated = props.context.request.user.isAuthenticated;\n return (\n \n {heading}\n {!isAuthenticated ? (\n <>\n {signInMessage}\n {signInButton}\n \n ) : (\n <>\n {modalToggle}\n {createReviewModal(reviewModal, moduleProps)}\n \n )}\n \n );\n};\n\nconst createReviewModal = (props: IReviewModalViewProps, moduleProps: IModuleProps): JSX.Element => {\n return (\n \n {props.modalHeader}\n \n \n \n {props.rating}\n {props.ratingLabel}\n \n \n {props.titleLabel}\n {props.titleInput}\n \n \n {props.textLabel}\n {props.textInput}\n \n {props.privacyPolicyUrl}\n {props.error}\n \n \n \n {props.submitButton}\n {props.cancelButton}\n \n \n );\n};\n\nexport default WriteReviewView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ITelemetry } from '@msdyn365-commerce/core';\nimport { AttributeDataType, DisplayTemplate, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\n\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport { DimensionTypes } from '@msdyn365-commerce-modules/retail-actions';\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\n\n/**\n * Types of product refiner values.\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\nexport enum ProductRefinerValueDataTypeValue {\n /**\n * Range slider is used for selections like price.\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Range = 1,\n\n /**\n * Range input is a different way to specify ranges and can be expressed with input boxes\n * as well as a set of discrete single-select type values.\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n RangeInput = 4,\n\n /**\n * This is a discrete list item, either multi-select or single-select.\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n List = 5,\n\n /**\n * Boolean types allows only single-select.\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Boolean = 6\n}\n\n/**\n * Types of product refiners.\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\nexport enum ProductRefinerTypeValue {\n /**\n * Refiner values are single-select.\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Single = 0,\n\n /**\n * Refiner values are multi-select.\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Multi = 1\n}\n\n/**\n * ProductRefinerSource enum type.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\nexport enum ProductRefinerSource {\n /**\n * The None member.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n None = 0,\n\n /**\n * The Attribute member.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Attribute = 1,\n\n /**\n * The Category member.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Category = 2,\n\n /**\n * The Price member.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Price = 3,\n\n /**\n * The Rating member.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Rating = 4\n}\n\nexport interface IRefineItemData {\n sourceValue?: number;\n swatchImageUrl?: string;\n swatchColorHexCode?: string;\n refinerItemId: number;\n dataTypeValue?: number;\n name: string;\n label: string;\n count?: number;\n isChecked: boolean;\n refineItemUrl?: string;\n minValue?: string;\n maxValue?: string;\n dimensionType?: DimensionTypes;\n rowNumber?: number;\n unitText?: string;\n updatedSliderMaxValue?: string;\n updatedSliderMinValue?: string;\n}\n/**\n * Checks if the data type value corresponds to a slider.\n * @param dataTypeValue\n */\nexport function isRangeType(dataTypeValue: number | undefined): boolean {\n return dataTypeValue === AttributeDataType.Currency || dataTypeValue === AttributeDataType.Decimal;\n}\n\n/**\n * Checks if the data type value corresponds to a range type integer.\n * @param dataTypeValue\n */\nexport function isRangeTypeForInteger(dataTypeValue: number | undefined): boolean {\n return (\n dataTypeValue === AttributeDataType.Currency ||\n dataTypeValue === AttributeDataType.Decimal ||\n dataTypeValue === AttributeDataType.Integer\n );\n}\n\n/**\n * Checks if the data type value corresponds to a custom input box Range.\n * @param dataTypeValue\n */\nexport function isCustomRangeTypeIntegerSelected(\n selectedRefinementCriterion: ProductRefinerValue,\n parentProductRefinerHierarchy: IProductRefinerHierarchy\n): boolean {\n return (\n selectedRefinementCriterion?.RowNumber !== undefined &&\n selectedRefinementCriterion?.RowNumber !== null &&\n selectedRefinementCriterion?.DataTypeValue === AttributeDataType.Integer &&\n parentProductRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Range\n );\n}\n\n/**\n * Checks if the selectedRefinementCriterion is siingle type with API va;ues or custom type.\n * If custom type then RowNumber is null\n * @param dataTypeValue\n */\nexport function isSingleSelectRangeTypeIntegerSelected(\n selectedRefinementCriterion: ProductRefinerValue,\n productRefinerValue: ProductRefinerValue\n): boolean {\n return (\n productRefinerValue.LeftValueBoundString === selectedRefinementCriterion?.LeftValueBoundString &&\n productRefinerValue.RightValueBoundString === selectedRefinementCriterion?.RightValueBoundString &&\n selectedRefinementCriterion?.RowNumber !== undefined &&\n selectedRefinementCriterion?.RowNumber !== null &&\n selectedRefinementCriterion !== undefined\n );\n}\n\n/**\n * Find the refinement criterion associated with this product refiner value.\n * @param productRefinerValue Product refiner value to match.\n * @param refinementCriteria Selected refinement criteria.\n */\nexport function findMatchingRefinementCriterion(\n productRefinerValue: ProductRefinerValue,\n refinementCriteria: ProductRefinerValue[]\n): ProductRefinerValue | undefined {\n // If the value is a range, then match only on data type value; otherwise match on item string\n return refinementCriteria.find((refinementCriterion: ProductRefinerValue) =>\n isMatchingRefinementCriterion(productRefinerValue, refinementCriterion)\n );\n}\n\n/**\n * Find the refinement criterion associated with this product refiner value.\n * @param productRefinerValue Product refiner value to match.\n * @param refinementCriteria Selected refinement criteria.\n * @param refinementCriterion\n */\nexport function isMatchingRefinementCriterion(\n productRefinerValue: ProductRefinerValue,\n refinementCriterion: ProductRefinerValue,\n parent?: IProductRefinerHierarchy\n): boolean {\n // If the value is a range, then match only on data type value; otherwise match on item string\n // Distinguish by displaytype also\n return (\n refinementCriterion.RefinerRecordId === productRefinerValue.RefinerRecordId &&\n refinementCriterion.RefinerSourceValue === productRefinerValue.RefinerSourceValue &&\n refinementCriterion.DataTypeValue === productRefinerValue.DataTypeValue &&\n ((parent?.DisplayTemplateValue === DisplayTemplate.Range\n ? isRangeType(refinementCriterion.DataTypeValue)\n : isRangeTypeForInteger(refinementCriterion.DataTypeValue)) ||\n refinementCriterion.LeftValueBoundString === productRefinerValue.LeftValueBoundString)\n );\n}\n\nexport function getIntegerRangeName(productRefinerValue: ProductRefinerValue): string {\n let rangeValue = '';\n\n if (productRefinerValue.LeftValueBoundString === '' && productRefinerValue.RightValueBoundString !== '') {\n rangeValue = `< ${productRefinerValue.RightValueBoundLocalizedString || productRefinerValue.RightValueBoundString}`;\n } else if (productRefinerValue.RightValueBoundString === '' && productRefinerValue.LeftValueBoundString !== '') {\n rangeValue = `> ${productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString}`;\n } else if (productRefinerValue.RightValueBoundString !== '' && productRefinerValue.LeftValueBoundString !== '') {\n rangeValue = `${productRefinerValue.LeftValueBoundLocalizedString ||\n productRefinerValue.LeftValueBoundString} - ${productRefinerValue.RightValueBoundString ||\n productRefinerValue.RightValueBoundString}`;\n }\n return rangeValue;\n}\n\n/**\n * Get input without formatting.\n * @param input - Input string.\n * @returns - Returns number.\n */\nexport function getInputWithoutFormatting(input: string): string {\n // First try to cast raw input to a number\n const inputAsNumber = Number(input);\n if (!Number.isNaN(inputAsNumber)) {\n return input;\n }\n\n // Otherwise try a reverse lookup and fall back to the raw input if all else fails\n // const reverseLookupResult = formattedPriceReverseLookup.get(input);\n // return reverseLookupResult || input;\n return input;\n}\n\nexport function getUpdatedRefinementCriteria(\n itemToggleNotification: IRefineItemToggleNotification,\n currentRefinementCriteria: ProductRefinerValue[]\n): ProductRefinerValue[] {\n const updatedRefinementCriteria: ProductRefinerValue[] = [];\n let toggledItemFound = false;\n\n // Keeping only itemToggled value for integer-range type in currentRefinementCriteria\n if (\n itemToggleNotification.parentProductRefinerHierarchy.DataTypeValue === AttributeDataType.Integer &&\n itemToggleNotification.parentProductRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Range\n ) {\n currentRefinementCriteria = currentRefinementCriteria.filter(r => {\n return r.RefinerRecordId !== itemToggleNotification.productRefinerValue.RefinerRecordId;\n });\n }\n\n currentRefinementCriteria.forEach((selectedCriterion: ProductRefinerValue) => {\n if (\n isMatchingRefinementCriterion(\n itemToggleNotification.productRefinerValue,\n selectedCriterion,\n itemToggleNotification.parentProductRefinerHierarchy\n )\n ) {\n toggledItemFound = true;\n if (itemToggleNotification.isSelecting) {\n const next = {\n ...selectedCriterion,\n LeftValueBoundString:\n (itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}`) ||\n selectedCriterion.LeftValueBoundString,\n RightValueBoundString:\n (itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}`) ||\n selectedCriterion.RightValueBoundString\n };\n updatedRefinementCriteria.push(next);\n } // Else the item is being de-selected, so omit it from the refinement criteria\n } else {\n // Keep existing criterion because it is not in the item toggle notification\n updatedRefinementCriteria.push(selectedCriterion);\n }\n });\n\n if (!toggledItemFound) {\n const next = {\n ...itemToggleNotification.productRefinerValue,\n LeftValueBoundString:\n (itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}`) ||\n itemToggleNotification.productRefinerValue.LeftValueBoundString,\n RightValueBoundString:\n (itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}`) ||\n itemToggleNotification.productRefinerValue.RightValueBoundString\n };\n updatedRefinementCriteria.push(next);\n\n // If single select, then deselect any others in the parent refiner group\n if (\n (itemToggleNotification.productRefinerValue.DataTypeValue === AttributeDataType.Text ||\n itemToggleNotification.productRefinerValue.DataTypeValue === AttributeDataType.TrueFalse) &&\n itemToggleNotification.parentProductRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect\n ) {\n itemToggleNotification.parentProductRefinerHierarchy.Values.forEach((child: ProductRefinerValue) => {\n if (child.RefinerRecordId === next.RefinerRecordId && child.LeftValueBoundString === next.LeftValueBoundString) {\n // Do nothing\n } else {\n const matchingIndex = updatedRefinementCriteria.findIndex((criterion: ProductRefinerValue) =>\n isMatchingRefinementCriterion(child, criterion, itemToggleNotification.parentProductRefinerHierarchy)\n );\n if (matchingIndex > -1) {\n updatedRefinementCriteria.splice(matchingIndex, 1);\n }\n }\n });\n }\n }\n\n return updatedRefinementCriteria;\n}\n\nexport function formatPrice(\n amount: string | undefined,\n currency: string | undefined,\n locale: string | undefined,\n telemetry: ITelemetry\n): string {\n if (!amount || !currency) {\n telemetry.trace(`[refine-menu.utilities.formatPrice] could not format price for ${amount} ${currency}`);\n return amount || '';\n }\n const priceAmount = (amount && Number(amount)) || 0;\n let result: string;\n\n try {\n result = new Intl.NumberFormat(locale, {\n style: 'currency',\n currencyDisplay: 'symbol',\n currency,\n minimumFractionDigits: 0\n }).format(priceAmount);\n } catch (error) {\n result = `${priceAmount} ${currency}`;\n telemetry.warning(`[refine-menu.utilities.formatPrice] Failed to format price for ${result}: ${error}`);\n }\n\n return result;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport { AttributeDataType, DisplayTemplate, ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\nimport { getPayloadObject, getTelemetryAttributes, IPayLoad } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { computed } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { ProductListInventoryFilteringOptions } from '../actions';\nimport { IChoiceSummaryProps } from './choice-summary.props';\nimport { getIntegerRangeName, isMatchingRefinementCriterion, isRangeType } from './utilities';\n\ninterface IRefinerMap {\n key: string;\n value: ProductRefinerValue;\n rangeDisplayType?: number | undefined;\n}\n\n/**\n * ChoiceSummary component.\n */\n@observer\nexport default class ChoiceSummary extends React.PureComponent {\n private readonly closeButtonGlyph: string = 'msi-close-btn';\n\n private readonly payLoad: IPayLoad;\n\n @computed get selectedRefinersMap(): IRefinerMap[] {\n let { selectedChoices } = this.props;\n const { channelInventoryConfigurationId, refinerHierarchy } = this.props;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app configs are of generic type\n if (this.props.context?.app.config.productListInventoryDisplay === ProductListInventoryFilteringOptions.HideOOS) {\n selectedChoices = selectedChoices.filter(choice => {\n const parent = refinerHierarchy.find(\n (hierarchy: IProductRefinerHierarchy) =>\n !!hierarchy.Values.find((value: ProductRefinerValue) => isMatchingRefinementCriterion(value, choice))\n );\n return parent && parent.RecordId !== channelInventoryConfigurationId;\n });\n }\n return selectedChoices.map((selectedRefiner: ProductRefinerValue, index) => {\n const rangeParentDisplay = refinerHierarchy.filter(p => p.RecordId === selectedRefiner.RefinerRecordId);\n return {\n key: this._getKeyForRefinerValue(selectedRefiner, index.toString()),\n value: selectedRefiner,\n // parameter to store Display Template type\n rangeDisplayType: rangeParentDisplay[0]?.DisplayTemplateValue || undefined\n } as IRefinerMap;\n });\n }\n\n constructor(props: Readonly) {\n super(props);\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, '');\n }\n\n public render(): JSX.Element {\n const { clearAllText, label, classNames, choiceAriaLabel, closeAriaLabel } = this.props;\n const items = this.selectedRefinersMap;\n this.payLoad.contentAction.etext = clearAllText;\n const clearAllAttributes = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\n return (\n
\n {items.length > 0 && label && {label}}\n
    \n {items.map((item: IRefinerMap) => {\n this.payLoad.contentAction.etext = item.key;\n const attribute = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\n // Get range value for Range display and integer type only (not for Integer with TextBox(4) display)\n const rangeInteger =\n item.value.DataTypeValue === AttributeDataType.Integer &&\n item.rangeDisplayType &&\n item.rangeDisplayType === DisplayTemplate.Range &&\n item.value.RefinerRecordId !== 0;\n const newIntRange = rangeInteger\n ? item.key\n : item.value.LeftValueBoundString && item.value.LeftValueBoundLocalizedString === ''\n ? item.value.LeftValueBoundString\n : (item.value.LeftValueBoundLocalizedString || item.value.LeftValueBoundLocalizedString === undefined) &&\n item.value.RefinerRecordId === 0\n ? item.key\n : item.value.LeftValueBoundString;\n return (\n
  • \n \n {newIntRange}\n \n \n
  • \n );\n })}\n
\n {items.length > 0 && clearAllText && (\n \n {clearAllText}\n \n )}\n
\n );\n }\n\n private _getKeyForRefinerValue(productRefinerValue: ProductRefinerValue, index: string): string {\n const { choiceFormat, choiceRangeValueFormat, refinerHierarchy, telemetry, refinerValues } = this.props;\n const overallFormat = choiceFormat || '{1}';\n const rangeFormat = choiceRangeValueFormat;\n let refinerName = '';\n let parent: IProductRefinerHierarchy | undefined;\n if (refinerHierarchy && refinerHierarchy.find) {\n parent = refinerHierarchy.find(\n (hierarchy: IProductRefinerHierarchy) =>\n !!hierarchy.Values.find((value: ProductRefinerValue) => isMatchingRefinementCriterion(value, productRefinerValue))\n );\n\n if (!parent) {\n telemetry.warning('[choice-summary] could not find parent of selected refiner value');\n } else {\n refinerName = parent.KeyName || '';\n }\n }\n\n let refinerValueName: string;\n if (isRangeType(productRefinerValue.DataTypeValue)) {\n refinerValueName = rangeFormat\n .replace('{0}', this._formatPrice(productRefinerValue.LeftValueBoundString, productRefinerValue.UnitText))\n .replace('{1}', this._formatPrice(productRefinerValue.RightValueBoundString, productRefinerValue.UnitText));\n } else if (productRefinerValue.RefinerRecordId === 0) {\n const filterValue = refinerValues?.Values.find(\n refiner => refiner.LeftValueBoundString === productRefinerValue.LeftValueBoundString\n );\n refinerValueName = (filterValue ? filterValue.LeftValueBoundLocalizedString : productRefinerValue.LeftValueBoundString) || '';\n } else {\n refinerValueName = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\n }\n\n if (refinerName === 'Rating' || refinerName === 'Price') {\n return overallFormat.replace('{0}', refinerName).replace('{1}', `${refinerValueName}`);\n }\n // Adding integer range format\n if (\n productRefinerValue.DataTypeValue === AttributeDataType.Integer &&\n parent?.DisplayTemplateValue === DisplayTemplate.Range &&\n productRefinerValue.RefinerRecordId !== 0\n ) {\n refinerValueName = getIntegerRangeName(productRefinerValue);\n return refinerValueName;\n }\n return overallFormat.replace('{0}', refinerName).replace('{1}', `${refinerValueName}_${refinerName}_${index}`);\n }\n\n private _formatPrice(amount: string | undefined, currency: string | undefined): string {\n if (!amount || !currency) {\n this.props.telemetry.trace('[choice-summary] could not format price');\n return amount || '';\n }\n let result = amount;\n\n try {\n result = this.props.context!.cultureFormatter.formatCurrency(Number(amount), currency);\n } catch (error) {\n this.props.telemetry.warning(`Failed to format price for ${result}: ${error}`);\n }\n\n return result;\n }\n\n private readonly _onClick = (e: React.MouseEvent): void => {\n e.preventDefault();\n e.stopPropagation();\n\n const target = e.currentTarget as HTMLElement;\n const clearAll = target.getAttribute('class')!.includes('choice-summary__clear-all');\n const selectedRefiner = clearAll ? undefined : this._getSelectedRefinerChoice(target);\n\n if (this.props.onChoiceClicked) {\n this.props.onChoiceClicked({\n clearAll,\n itemClicked: target,\n choiceClicked: selectedRefiner,\n nextItemToFocus: target.nextSibling as HTMLElement\n });\n }\n };\n\n private _getSelectedRefinerChoice(itemClicked: HTMLElement): ProductRefinerValue | undefined {\n const result = this.selectedRefinersMap.find(selected => itemClicked.id === selected.key);\n return (result && result.value) || undefined;\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\ninterface IErrorMessage {\n text?: string;\n}\n\nexport const ErrorMessage: React.FC = ({ text }) => {\n return (\n \n
\n {` `}\n {text}\n {` `}\n
\n
\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ICoreContext, IGridSettings, IImageData, IImageSettings, Image, IRequestContext } from '@msdyn365-commerce/core';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { getFallbackImageUrl, getProductPageUrlSync } from '@msdyn365-commerce-modules/retail-actions';\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, onTelemetryClick } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISearchResultContainerResources } from '../search-result-container.props.autogenerated';\n\n// Import { IComponent, IComponentProps, ICoreContext, IGridSettings, IImageData, IImageSettings, Image, msdyn365Commerce } from '@msdyn365-commerce/core';\n\ninterface IFeatureSearchResultItem {\n product: SimpleProduct | null;\n context: ICoreContext;\n resources: ISearchResultContainerResources;\n imageSettings?: IImageSettings;\n moduleType: string;\n moduleId: string;\n telemetryContent?: ITelemetryContent;\n recommendation?: string;\n}\n\nexport const FeatureSearchResultItem: React.FC = ({\n product,\n context,\n imageSettings,\n resources,\n telemetryContent,\n recommendation\n}) => {\n if (product === null) {\n return null;\n }\n\n const productName = product.Name;\n const productRecordId = product && product.RecordId ? product.RecordId : 0;\n const productUrl = getProductPageUrlSync(product.Name || '', productRecordId, context && context.actionContext, undefined);\n const fallbackImage = getFallbackImageUrl(\n product.ItemId,\n context.actionContext.requestContext.apiSettings,\n context.request.app?.config?.OmniChannelMedia\n );\n const heading =\n recommendation && recommendation === 'descriptions' ? resources.featureSimilarDescriptionTitle : resources.featureSimilarLooksTitle;\n\n // Construct telemetry attribute to render\n const payLoad = getPayloadObject('click', telemetryContent!, productName!, productRecordId.toString());\n\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\n return (\n
\n \n
\n {renderProductPlacementImage(\n imageSettings,\n context.request.gridSettings,\n product.PrimaryImageUrl,\n product.Name,\n fallbackImage,\n context.actionContext.requestContext\n )}\n
\n \n
\n

{heading}

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

{title}

;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\ninterface ILink {\n className?: string;\n text?: string;\n href?: string;\n ariaLabel?: string;\n}\n\nexport const Link: React.FC = ({ text, className, href, ariaLabel }) => (\n \n {' '}\n {text}{' '}\n \n);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Button, Modal, ModalBody, ModalFooter, ModalHeader } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nexport interface ISearchResultModalViewProps {\n modal: React.ReactElement;\n modalHeader: React.ReactElement;\n modalFooter: React.ReactElement;\n modalBody: React.ReactElement;\n}\n\ninterface IModalToggleProps {\n innerRef: React.RefObject | undefined;\n id: string;\n text: string;\n ariaLabel: string;\n onClick(): void;\n}\n\nexport interface ISearchResultModalResources {\n modalTitle: string;\n modalCloseButtonText: string;\n}\n\nexport interface ISearchResultModalProps {\n resources: ISearchResultModalResources;\n isOpen: boolean;\n returnRef: React.RefObject | undefined;\n onModalToggle(): void;\n}\n\nexport const ModalToggle: React.FC = (props: IModalToggleProps) => {\n const { text, onClick, ariaLabel, innerRef, id } = props;\n return (\n \n );\n};\n\nexport const SearchResultModal = (props: ISearchResultModalProps): ISearchResultModalViewProps => {\n return {\n modal: modalNode(props),\n modalHeader: modalHeaderNode(props),\n modalFooter: modalFooterNode(props),\n modalBody: \n };\n};\n\nconst modalNode = (props: ISearchResultModalProps) => {\n return (\n \n );\n};\n\nconst modalHeaderNode = (props: ISearchResultModalProps) => {\n return {props.resources.modalTitle};\n};\n\nconst modalFooterNode = (props: ISearchResultModalProps) => {\n return (\n \n \n \n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\nimport { IPriceComponentResources, ProductComponent } from '@msdyn365-commerce/components';\nimport { ICoreContext, IImageSettings } from '@msdyn365-commerce/core';\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISearchResultContainerResources } from '../search-result-container.props.autogenerated';\n\ninterface IProductSearchResultItems {\n products: ProductSearchResult[];\n context: ICoreContext;\n resources: ISearchResultContainerResources;\n imageSettings?: IImageSettings;\n moduleType: string;\n moduleId: string;\n allowBackNavigation?: boolean;\n telemetryContent: ITelemetryContent;\n quickviewSlot?: {} | null | undefined;\n productComparisonButton?: {} | null | undefined;\n channelInventoryConfigurationId?: number;\n isPriceMinMaxEnabled?: boolean;\n productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\n}\n\n/**\n * Returns the product inventory label.\n * @param channelInventoryConfigurationId - The channel configuration Id.\n * @param product - The product.\n * @returns The inventory label.\n */\nexport function getInventoryLabel(channelInventoryConfigurationId: number | undefined, product: ProductSearchResult): string | undefined {\n if (!channelInventoryConfigurationId || !ArrayExtensions.hasElements(product.AttributeValues)) {\n return undefined;\n }\n const inventoryAttribute = product.AttributeValues.find(attribute => attribute.RecordId === channelInventoryConfigurationId);\n if (inventoryAttribute) {\n return inventoryAttribute.TextValue;\n }\n return undefined;\n}\n\nexport const ProductSearchResultItems: React.FC = ({\n products,\n context,\n imageSettings,\n resources,\n moduleType,\n moduleId,\n allowBackNavigation,\n telemetryContent,\n quickviewSlot,\n productComparisonButton,\n channelInventoryConfigurationId,\n isPriceMinMaxEnabled,\n productsDimensionAvailabilities\n}) => {\n const priceResources: IPriceComponentResources = {\n priceRangeSeparator: resources.priceRangeSeparator\n };\n return (\n
    \n {products.map((product: ProductSearchResult, index: number) => (\n
  • \n \n ArrayExtensions.hasElements(dimensionAvailability) &&\n dimensionAvailability[0].masterProductId === product.MasterProductId\n )}\n />\n
  • \n ))}\n
\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ISliderLabel, ISliderThumbProps, Slider } from '@msdyn365-commerce-modules/utilities';\nimport debounce from 'lodash/debounce';\nimport { computed } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { IRefineItemProps, IRefineItemState } from './refine-item';\n\ntype InputType = 'Min' | 'Max';\n\nexport type RangeRefineItemType = 'slider' | 'input';\n\n/**\n * Range refine item properties.\n */\nexport interface IRangeRefineItemProps extends IRefineItemProps {\n rangeType: RangeRefineItemType;\n minValueSliderThumbAriaLabel?: string;\n maxValueSliderThumbAriaLabel?: string;\n sliderKey?: string;\n}\n\n/**\n * Range refine item state.\n */\nexport interface IRangeRefineItemState extends IRefineItemState {\n validationErrorMin: string | undefined;\n validationErrorMax: string | undefined;\n selectedMin: string | undefined;\n selectedMax: string | undefined;\n touchedMin: boolean;\n touchedMax: boolean;\n sliderId: string;\n minValue: string | undefined;\n maxValue: string | undefined;\n labels: ISliderLabel[];\n sliderThumbs: ISliderThumbProps[];\n}\n\n/**\n * RangeRefineItem component (controlled by RefineSubmenu).\n */\n@observer\nexport default class RangeRefineItem extends React.Component {\n private readonly _formattedPriceReverseLookup: Map = new Map();\n\n private readonly minInput: React.RefObject;\n\n private readonly maxInput: React.RefObject;\n\n @computed get currencyCode(): string {\n return this.props.productRefinerValue.UnitText || '';\n }\n\n public constructor(props: IRangeRefineItemProps) {\n super(props);\n this._onRangeUpdate = this._onRangeUpdate.bind(this);\n this._onRangeUpdateEnd = this._onRangeUpdateEnd.bind(this);\n this._handleRangeTooltipText = this._handleRangeTooltipText.bind(this);\n this._changeMin = this._changeMin.bind(this);\n this._changeMax = this._changeMax.bind(this);\n this._finishChangeMin = this._finishChangeMin.bind(this);\n this._finishChangeMax = this._finishChangeMax.bind(this);\n\n this.minInput = React.createRef();\n this.maxInput = React.createRef();\n\n const { selectedRefinementCriterion } = this.props;\n const initialMin = selectedRefinementCriterion?.LeftValueBoundString ?? '0';\n const initialMax = selectedRefinementCriterion?.RightValueBoundString;\n const sliderId = `slider_${String(this.props.parentProductRefinerHierarchy.RecordId)}_${String(\n this.props.productRefinerValue.RefinerRecordId\n )}`;\n const minValue = this.props.productRefinerValue.LeftValueBoundString;\n const maxValue = this.props.productRefinerValue.RightValueBoundString;\n const minPrice = this._formatPrice(minValue);\n const maxPrice = this._formatPrice(maxValue);\n const labels: ISliderLabel[] = this.getLabels(sliderId, minPrice, maxPrice);\n const selectedMin =\n this.props.selectedRefinementCriterion?.LeftValueBoundString ?? this.props.productRefinerValue.LeftValueBoundString ?? '0';\n const selectedMax =\n this.props.selectedRefinementCriterion?.RightValueBoundString ??\n this.props.productRefinerValue.RightValueBoundString ??\n maxValue;\n const selectedMinPrice = this._formatPrice(selectedMin);\n const selectedMaxPrice = this._formatPrice(selectedMax);\n const sliderKeyString = this.props.sliderKey ? `_${String(this.props.sliderKey)}` : '';\n const sliderThumbs: ISliderThumbProps[] = this.getSliderThumbs(\n sliderId,\n sliderKeyString,\n selectedMin,\n selectedMinPrice,\n selectedMax,\n selectedMaxPrice,\n maxPrice\n );\n this.state = {\n isChecked: false,\n validationErrorMin: undefined,\n validationErrorMax: undefined,\n selectedMin: initialMin,\n selectedMax: initialMax,\n touchedMin: false,\n touchedMax: false,\n sliderId,\n minValue,\n maxValue,\n labels,\n sliderThumbs\n };\n }\n\n public shouldComponentUpdate(nextProps: IRangeRefineItemProps, nextState: IRangeRefineItemState): boolean {\n if (this.state === nextState && this.props === nextProps) {\n return false;\n }\n return true;\n }\n\n public componentDidUpdate(previousProps: IRangeRefineItemProps): void {\n if (previousProps !== this.props) {\n this.updateSliderProps();\n }\n }\n\n public render(): JSX.Element | undefined {\n const { productRefinerValue, parentProductRefinerHierarchy, refineItemCommonProps } = this.props;\n\n if (!productRefinerValue || !parentProductRefinerHierarchy) {\n refineItemCommonProps.telemetry.error(\n 'Cannot render refine value range without productRefinerValue and parentProductRefinerHierarchy'\n );\n return undefined;\n }\n\n if (this.props.rangeType === 'input') {\n return this._renderInputFields();\n }\n\n return this._renderSlider();\n }\n\n /**\n * Function to update slider props.\n */\n private updateSliderProps(): void {\n const sliderId = `slider_${String(this.props.parentProductRefinerHierarchy.RecordId)}_${String(\n this.props.productRefinerValue.RefinerRecordId\n )}`;\n const minValue = this.props.productRefinerValue.LeftValueBoundString;\n const maxValue = this.props.productRefinerValue.RightValueBoundString;\n const minPrice = this._formatPrice(minValue);\n const maxPrice = this._formatPrice(maxValue);\n const labels: ISliderLabel[] = this.getLabels(sliderId, minPrice, maxPrice);\n const selectedMin =\n this.props.selectedRefinementCriterion?.LeftValueBoundString ?? this.props.productRefinerValue.LeftValueBoundString ?? '0';\n const selectedMax =\n this.props.selectedRefinementCriterion?.RightValueBoundString ??\n this.props.productRefinerValue.RightValueBoundString ??\n maxValue;\n const selectedMinPrice = this._formatPrice(selectedMin);\n const selectedMaxPrice = this._formatPrice(selectedMax);\n const sliderKeyString = this.props.sliderKey ? `_${String(this.props.sliderKey)}` : '';\n const sliderThumbs: ISliderThumbProps[] = this.getSliderThumbs(\n sliderId,\n sliderKeyString,\n selectedMin,\n selectedMinPrice,\n selectedMax,\n selectedMaxPrice,\n maxPrice\n );\n this.setState({ sliderId, minValue, maxValue, labels, sliderThumbs });\n }\n\n /**\n * Function to create the labels for slider.\n * @param sliderId - Slider element id for the DOM.\n * @param minPrice - Slider min value.\n * @param maxPrice - Slider max value.\n * @returns Array labels.\n */\n private readonly getLabels = (sliderId: string, minPrice: string, maxPrice: string): ISliderLabel[] => {\n return [\n {\n labelId: `${sliderId}_start`,\n labelString: `${minPrice}`,\n labelPositioning: 'start'\n },\n {\n labelId: `${sliderId}_end`,\n labelString: `${maxPrice}`,\n labelPositioning: 'end'\n }\n ];\n };\n\n /**\n * Function to create the slider thumbs for slider.\n * @param sliderId - Slider element id for the DOM.\n * @param sliderKey - Unique key for slider.\n * @param selectedMin - Slider selected min value.\n * @param selectedMinPrice - Slider selected min price.\n * @param selectedMax - Slider selected max value.\n * @param selectedMaxPrice - Slider selected max price..\n * @param maxPrice - Slider max price..\n * @returns Slider Thumb Props.\n */\n private readonly getSliderThumbs = (\n sliderId: string,\n sliderKey: string,\n selectedMin: string,\n selectedMinPrice: string,\n selectedMax: string | undefined,\n selectedMaxPrice: string,\n maxPrice: string\n ): ISliderThumbProps[] => {\n const sliderThumbDefaultValue = 0;\n return [\n {\n id: `${sliderId}${sliderKey}_slider_thumb_start`,\n value: (selectedMin && Number(selectedMin)) || sliderThumbDefaultValue,\n ariaLabel: `${this.props.minValueSliderThumbAriaLabel ?? ''} ${this.currencyCode}`,\n ariaValueText: `${selectedMinPrice}`\n },\n {\n id: `${sliderId}${sliderKey}_slider_thumb_end`,\n value: Number(selectedMax) || Number(maxPrice),\n ariaLabel: `${this.props.maxValueSliderThumbAriaLabel ?? ''} ${this.currencyCode}`,\n ariaValueText: `${selectedMaxPrice}`\n }\n ];\n };\n\n private _renderInputFields(): JSX.Element | undefined {\n const { isDisabled, parentProductRefinerHierarchy, refineItemCommonProps } = this.props;\n const { selectedMin, selectedMax, touchedMin, touchedMax, validationErrorMin, validationErrorMax } = this.state;\n\n const rangeAriaLabel = (refineItemCommonProps.rangeNameFormat || '{0}').replace('{0}', parentProductRefinerHierarchy.KeyName || '');\n const formAttrs = {\n 'aria-label': rangeAriaLabel,\n 'aria-disabled': isDisabled\n };\n\n // To enable price formatting of selected fields, this is the approach:\n // initial value: min=0 formatted as price, max=undefined\n // onFocus/onChange: convert to number (unformat) and mark as touched to indicate value is being edited\n // onBlur: validate and format entered value as price\n const minInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-min ${\n validationErrorMin ? 'refine-submenu__input-range--error' : ''\n }`;\n const maxInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-max ${\n validationErrorMax ? 'refine-submenu__input-range--error' : ''\n }`;\n const minLabelClassName = 'ms-refine-submenu__input-range-label refine-submenu__input-range-label-min';\n const maxLabelClassName = 'ms-refine-submenu__input-range-label refine-submenu__input-range-label-max';\n const formattedSelectedMin = this._getFormattedSelectedValue(selectedMin, touchedMin, validationErrorMin);\n const formattedSelectedMax = this._getFormattedSelectedValue(selectedMax, touchedMax, validationErrorMax);\n return (\n
\n \n \n {validationErrorMin && (\n \n {validationErrorMin}\n \n )}\n {validationErrorMax && validationErrorMin !== validationErrorMax && (\n \n {validationErrorMax}\n \n )}\n
\n );\n }\n\n private _renderSlider(): JSX.Element | undefined {\n const { isDisabled, sliderKey } = this.props;\n const ariaAttributes = {\n 'aria-disabled': isDisabled\n };\n\n return (\n \n );\n }\n\n private _changeMin(event: React.FocusEvent): void {\n this._changeValue(event, 'Min');\n }\n\n private _changeMax(event: React.FocusEvent): void {\n this._changeValue(event, 'Max');\n }\n\n private _changeValue(event: React.FocusEvent, inputType: InputType): void {\n const selectedKey = `selected${inputType}`;\n const touchedKey = `touched${inputType}`;\n this.setState({\n [selectedKey]: this._getInputWithoutFormatting(event.currentTarget.value),\n [touchedKey]: true\n });\n }\n\n private _finishChangeMin(event: React.FocusEvent): boolean {\n const selectedMinValue = this._getInputWithoutFormatting(event.currentTarget.value);\n this.setState({\n selectedMin: selectedMinValue,\n minTouched: false\n });\n const minInput = Number(selectedMinValue);\n const {\n onToggle,\n parentProductRefinerHierarchy,\n productRefinerValue,\n refineItemCommonProps,\n selectedRefinementCriterion\n } = this.props;\n const max = (selectedRefinementCriterion && selectedRefinementCriterion.RightValueBoundString) || undefined;\n\n const maxNum = max ? Number(max) : undefined;\n\n if (isNaN(minInput)) {\n this.setState({ validationErrorMin: refineItemCommonProps.validationErrorNaN });\n this._focus('Min');\n return false;\n }\n\n if (this._validateRange(minInput, maxNum)) {\n onToggle({\n parentProductRefinerHierarchy,\n productRefinerValue,\n isSelecting: true,\n rangeStart: minInput,\n rangeEnd: maxNum\n });\n return true;\n }\n this._focus('Min');\n\n return false;\n }\n\n private _finishChangeMax(event: React.FocusEvent): boolean {\n const selectedMaxValue = this._getInputWithoutFormatting(event.currentTarget.value);\n this.setState({\n selectedMax: selectedMaxValue,\n maxTouched: false\n });\n const maxInput = Number(selectedMaxValue);\n const {\n onToggle,\n parentProductRefinerHierarchy,\n productRefinerValue,\n refineItemCommonProps,\n selectedRefinementCriterion\n } = this.props;\n const min = (selectedRefinementCriterion && selectedRefinementCriterion.LeftValueBoundString) || '0';\n\n const minNum = Number(min);\n\n if (isNaN(maxInput)) {\n this.setState({ validationErrorMax: refineItemCommonProps.validationErrorNaN });\n this._focus('Max');\n return false;\n }\n\n if (this._validateRange(minNum, maxInput)) {\n if (productRefinerValue) {\n onToggle({\n parentProductRefinerHierarchy,\n productRefinerValue,\n isSelecting: true,\n rangeStart: minNum,\n rangeEnd: maxInput\n });\n } else {\n this._focus('Max');\n }\n return true;\n }\n\n return false;\n }\n\n private _focus(inputType: InputType): void {\n const ref = inputType === 'Max' ? this.maxInput : this.minInput;\n\n setTimeout(() => {\n if (ref && ref.current) {\n ref.current.focus();\n }\n }, 50);\n }\n\n private _getFormattedSelectedValue(\n selected: string | undefined,\n touched: boolean,\n validationError: string | undefined\n ): string | undefined {\n if (touched || validationError || selected === undefined) {\n return selected;\n }\n return this._formatPrice(selected);\n }\n\n private _validateRange(min: number, max: number | undefined): boolean {\n const { refineItemCommonProps } = this.props;\n if (max === undefined) {\n return true;\n }\n\n if (min > max) {\n this.setState({\n validationErrorMin: refineItemCommonProps.validationErrorRange,\n validationErrorMax: refineItemCommonProps.validationErrorRange\n });\n return false;\n }\n\n return true;\n }\n\n private _formatPrice(amount: string | undefined): string {\n if (this.props.productRefinerValue.RefinerRecordId === 0) {\n const result = this.props.context.cultureFormatter.formatCurrency(Number(amount), this.currencyCode);\n return result;\n }\n return amount || '';\n }\n\n private _getInputWithoutFormatting(input: string): string {\n // First try to cast raw input to a number\n const inputAsNum = Number(input);\n if (!isNaN(inputAsNum)) {\n return input;\n }\n\n // Otherwise try a reverse lookup and fall back to the raw input if all else fails\n const reverseLookupResult = this._formattedPriceReverseLookup.get(input);\n return reverseLookupResult || input;\n }\n\n // NOTE: Fix types once Shared Components build pipeline bug fixed\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private _onRangeUpdate(sliderChangeNotification: any): void {\n // Need to filter out mousemove events as these cause errors after the menu updates and slider re-renders\n if (sliderChangeNotification.eventType !== 'mousemove') {\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\n if (productRefinerValue && sliderChangeNotification) {\n onToggle({\n parentProductRefinerHierarchy,\n productRefinerValue,\n isSelecting: true,\n rangeStart: sliderChangeNotification.firstThumbValue,\n rangeEnd: sliderChangeNotification.secondThumbValue\n });\n\n this._focusOnSliderThumb(sliderChangeNotification);\n }\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private _onRangeUpdateEnd(sliderChangeNotification: any): void {\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\n if (productRefinerValue && sliderChangeNotification) {\n onToggle({\n parentProductRefinerHierarchy,\n productRefinerValue,\n isSelecting: true,\n rangeStart: sliderChangeNotification.firstThumbValue,\n rangeEnd: sliderChangeNotification.secondThumbValue\n });\n\n this._focusOnSliderThumb(sliderChangeNotification);\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private _focusOnSliderThumb(sliderChangeNotification: any): void {\n if (sliderChangeNotification.id) {\n const element = document.getElementById(`${sliderChangeNotification.id}range`);\n if (element) {\n setTimeout(() => {\n element.focus();\n }, 0);\n }\n }\n }\n\n private _handleRangeTooltipText(tooltip: number): string {\n return this._formatPrice(`${tooltip}`);\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport { RatingComponent, SwatchComponent } from '@msdyn365-commerce/components';\nimport { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\nimport {\n AttributeDataType,\n DisplayTemplate,\n ProductRefinerSource,\n ProductRefinerValue,\n RefinerType\n} from '@msdyn365-commerce/retail-proxy';\nimport { checkIfShouldDisplayAsSwatch, DimensionTypes, IDimensionsApp, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { format, getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { IRefineItemCommonProps } from './refine-item.props.common';\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\nimport { getIntegerRangeName, isSingleSelectRangeTypeIntegerSelected } from './utilities';\n\n/**\n * RefineItem properties.\n */\nexport interface IRefineItemProps {\n parentProductRefinerHierarchy: IProductRefinerHierarchy;\n productRefinerValue: ProductRefinerValue;\n selectedRefinementCriterion: ProductRefinerValue | undefined;\n selectedRefinerValues?: ProductRefinerValue[];\n refineItemCommonProps: IRefineItemCommonProps;\n isDisabled: boolean;\n context: ICoreContext>;\n moduleId: string;\n moduleTypeName: string;\n index?: number;\n productCountAriaLabel?: string;\n singleProductCountAriaLabel?: string;\n refineItemAriaLabel?: string;\n refineItemsAriaLabel?: string;\n isMobileView?: boolean;\n\n /**\n * The telemetry content\n */\n telemetryContent?: ITelemetryContent;\n onToggle(notfication: Readonly): void;\n urlBuilder(refiner: IRefineItemToggleNotification): string;\n}\n\n/**\n * Refine item state.\n */\nexport interface IRefineItemState extends React.ComponentState {\n isChecked: boolean;\n renderingError?: object;\n}\n\n/**\n * Single-select and multi-select refine item component (controlled by RefineSubmenu).\n */\nexport default class RefineItem extends React.Component {\n private readonly anchorType: React.RefObject;\n\n private readonly payLoad: IPayLoad;\n\n public constructor(props: IRefineItemProps) {\n super(props);\n this._onClick = this._onClick.bind(this);\n this.state = {\n isChecked: !!this.props.selectedRefinementCriterion\n };\n this.anchorType = React.createRef();\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, '');\n }\n\n public shouldComponentUpdate(nextProps: IRefineItemProps, nextState: IRefineItemState): boolean {\n if (this.state === nextState && this.props === nextProps) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element | undefined {\n const {\n isDisabled,\n refineItemCommonProps,\n parentProductRefinerHierarchy,\n productRefinerValue,\n selectedRefinementCriterion,\n productCountAriaLabel,\n singleProductCountAriaLabel,\n index,\n children,\n onToggle,\n context,\n telemetryContent,\n refineItemAriaLabel,\n refineItemsAriaLabel,\n ...attrs\n } = this.props;\n if (!productRefinerValue) {\n refineItemCommonProps.telemetry.error('[refine-item] Cannot render refineItem without productRefinerValue');\n return undefined;\n }\n if (!productRefinerValue.LeftValueBoundString) {\n refineItemCommonProps.telemetry.warning(\n `[refine-item] RefineItem without LeftValueBoundString: ${JSON.stringify(productRefinerValue)}`\n );\n }\n const isSingleSelect = parentProductRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect;\n let itemTypeClassName = isSingleSelect ? 'single-select' : 'multi-select';\n itemTypeClassName = `ms-refine-submenu-item ${itemTypeClassName}`;\n const inputType = isSingleSelect ? 'radio' : 'checkbox';\n const isChecked = !!selectedRefinementCriterion;\n itemTypeClassName = isChecked ? `${itemTypeClassName}-checked` : itemTypeClassName;\n if (parentProductRefinerHierarchy.SourceValue === ProductRefinerSource.Rating) {\n return this._renderRating(\n productRefinerValue,\n parentProductRefinerHierarchy,\n isChecked,\n context,\n index,\n telemetryContent,\n productCountAriaLabel,\n singleProductCountAriaLabel\n );\n }\n this.payLoad.contentAction.etext = productRefinerValue.LeftValueBoundLocalizedString ?? productRefinerValue.LeftValueBoundString;\n const attribute = getTelemetryAttributes(telemetryContent!, this.payLoad);\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\n const productText = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\n const productCount = productRefinerValue.Count || 0;\n let refineMenuItemAriaLabel;\n if (productCount === 1) {\n refineMenuItemAriaLabel = refineItemAriaLabel\n ? format(refineItemAriaLabel, parentProductRefinerHierarchy.KeyName, productText)\n : '';\n } else {\n refineMenuItemAriaLabel = refineItemsAriaLabel\n ? format(refineItemsAriaLabel, parentProductRefinerHierarchy.KeyName, productText, productCount)\n : '';\n }\n\n const dimensionType = (this.props.parentProductRefinerHierarchy.KeyName?.toLocaleLowerCase() ?? '') as DimensionTypes;\n const shouldDisplayAsSwatch = this._getShouldDisplayAsSwatch(dimensionType);\n\n let className = 'ms-refine-submenu-item';\n if (shouldDisplayAsSwatch) {\n className = classnames(className, `ms-refine-submenu-item__dimension__${dimensionType}`);\n }\n\n // If the swatch has no color or image specified, it should be displayed as text.\n // We don't use swatch logic to display the number of the results found together with the text.\n const hasColor = !StringExtensions.isNullOrWhitespace(productRefinerValue.SwatchColorHexCode);\n const hasImage = !StringExtensions.isNullOrWhitespace(productRefinerValue.SwatchImageUrl);\n const hasContentSwatch = hasColor || hasImage;\n if (\n parentProductRefinerHierarchy.DataTypeValue === AttributeDataType.Integer &&\n parentProductRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Range\n ) {\n const rangeValue = getIntegerRangeName(productRefinerValue);\n return (\n
  • \n \n \n \n
  • \n );\n } else {\n return (\n
  • \n \n {hasContentSwatch && shouldDisplayAsSwatch && this._renderSwatch(dimensionType)}\n \n \n
  • \n );\n }\n }\n\n private _getShouldDisplayAsSwatch(dimensionType: DimensionTypes) {\n const shouldDisplayAsSwatch = checkIfShouldDisplayAsSwatch(dimensionType, this.props.context as ICoreContext);\n return shouldDisplayAsSwatch;\n }\n\n private _renderSwatch(dimensionType: DimensionTypes): JSX.Element | null {\n const productRefinerValue = this.props.productRefinerValue;\n\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\n const text = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\n const swatchItems = [\n {\n itemId: `${productRefinerValue.RefinerRecordId ?? ''}-${dimensionType}-${text}`,\n value: text,\n dimensionType,\n colorHexCode: productRefinerValue.SwatchColorHexCode,\n imageUrl: productRefinerValue.SwatchImageUrl\n }\n ];\n\n return (\n \n );\n }\n\n private _getRefinerUrl(): string {\n const { urlBuilder, parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\n\n if (productRefinerValue) {\n return urlBuilder({\n parentProductRefinerHierarchy,\n productRefinerValue,\n isSelecting: !selectedRefinementCriterion\n });\n }\n\n return '';\n }\n\n private readonly _onClick = (e: React.MouseEvent): void => {\n e.preventDefault();\n\n const { parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\n if (productRefinerValue) {\n this.props.onToggle({\n parentProductRefinerHierarchy,\n productRefinerValue,\n isSelecting: !selectedRefinementCriterion\n });\n\n setTimeout(() => {\n this.anchorType.current && this.anchorType.current.focus();\n }, 0);\n }\n };\n\n private _renderRating(\n productRefinerValue: ProductRefinerValue,\n parentProductRefinerHierarchy: IProductRefinerHierarchy,\n isChecked: boolean,\n context: ICoreContext,\n index?: number,\n telemetryContent?: ITelemetryContent,\n ratingUserCountAriaLabel?: string,\n ratingSingleUserCountAriaLabel?: string\n ): JSX.Element | undefined {\n if (productRefinerValue.LeftValueBoundString) {\n this.payLoad.contentAction.etext = productRefinerValue.LeftValueBoundLocalizedString;\n const attribute = getTelemetryAttributes(telemetryContent!, this.payLoad);\n const refinerRating = Number.parseInt(productRefinerValue.LeftValueBoundString, 10);\n const ratingRefiner = this.props.selectedRefinerValues?.find(\n value => value.DataTypeValue === productRefinerValue.DataTypeValue\n );\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\n const selectedRating = Number.parseInt(ratingRefiner?.LeftValueBoundString || '0', 10);\n const defaultChkProductCount = 1;\n let ratingComponentClass: string = 'ms-rating-component';\n if (refinerRating > selectedRating) {\n ratingComponentClass = `${ratingComponentClass}__up`;\n } else if (refinerRating < selectedRating) {\n ratingComponentClass = `${ratingComponentClass}__down`;\n } else {\n ratingComponentClass = `${ratingComponentClass}__current`;\n }\n const productCountAriaLabelValue =\n productRefinerValue.Count !== undefined && productRefinerValue.Count === defaultChkProductCount\n ? ratingSingleUserCountAriaLabel && format(ratingSingleUserCountAriaLabel, productRefinerValue.Count)\n : ratingUserCountAriaLabel && format(ratingUserCountAriaLabel, productRefinerValue.Count);\n return (\n \n \n \n \n {productRefinerValue.Count !== undefined && `(${productRefinerValue.Count})`}\n \n \n \n );\n }\n return undefined;\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { isUndefined } from 'lodash';\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\nimport { Button } from '@msdyn365-commerce-modules/utilities';\nimport { IRefineItemState } from './refine-item';\nimport { isCustomRangeTypeIntegerSelected } from './utilities';\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport { IRefineItemCommonProps } from './refine-item.props.common';\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\n\nexport type RangeRefineItemInputType = 'slider' | 'input';\n\n/**\n * Range refine item properties.\n */\nexport interface IRangeRefineItemInputProps {\n parentProductRefinerHierarchy: IProductRefinerHierarchy;\n selectedRefinementCriterion: ProductRefinerValue | undefined;\n refineItemCommonProps: IRefineItemCommonProps;\n isDisabled: boolean;\n rangeType: RangeRefineItemInputType;\n\n /**\n * The telemetry content\n */\n onToggle(notfication: Readonly): void;\n}\n\n/**\n * Range refine item state.\n */\nexport interface IRangeRefineItemInputState extends IRefineItemState {\n validationErrorMin: string | undefined;\n validationErrorMax: string | undefined;\n selectedMin: string | undefined;\n selectedMax: string | undefined;\n invalidData: boolean | undefined;\n}\n\n/**\n * RangeRefineItem component (controlled by RefineSubmenu).\n */\n@observer\nexport default class RangeRefineItemInput extends React.Component {\n private readonly _formattedPriceReverseLookup: Map = new Map();\n\n private readonly minInput: React.RefObject;\n\n private readonly maxInput: React.RefObject;\n\n public constructor(props: IRangeRefineItemInputProps) {\n super(props);\n this._changeMinInputRange = this._changeMinInputRange.bind(this);\n this._changeMaxInputRange = this._changeMaxInputRange.bind(this);\n this._applyCustom = this._applyCustom.bind(this);\n\n this.minInput = React.createRef();\n this.maxInput = React.createRef();\n let initialMin = '';\n let initialMax = '';\n const { selectedRefinementCriterion, parentProductRefinerHierarchy } = this.props;\n if (selectedRefinementCriterion) {\n initialMin = isCustomRangeTypeIntegerSelected(selectedRefinementCriterion, parentProductRefinerHierarchy)\n ? ''\n : selectedRefinementCriterion?.LeftValueBoundString || '';\n initialMax = isCustomRangeTypeIntegerSelected(selectedRefinementCriterion, parentProductRefinerHierarchy)\n ? ''\n : selectedRefinementCriterion?.RightValueBoundString || '';\n }\n\n this.state = {\n validationErrorMin: undefined,\n validationErrorMax: undefined,\n selectedMin: initialMin,\n selectedMax: initialMax,\n invalidData: !(initialMin && initialMax),\n isChecked: false\n };\n }\n\n public shouldComponentUpdate(nextProps: IRangeRefineItemInputProps, nextState: IRangeRefineItemInputState): boolean {\n if (this.state === nextState && this.props === nextProps) {\n return false;\n }\n nextState.invalidData = !(nextState.selectedMin && nextState.selectedMax);\n return true;\n }\n\n public componentDidUpdate(previousProps: IRangeRefineItemInputProps): void {\n if (previousProps !== this.props) {\n this.updateInputRangerProps();\n }\n }\n\n public render(): JSX.Element | undefined {\n if (this.props.rangeType === 'input') {\n return this._renderInputFields();\n }\n return undefined;\n }\n\n // /**\n // * Function to update slider props.\n // */\n private updateInputRangerProps(): void {\n const selectedMin = !isUndefined(this.props.selectedRefinementCriterion?.RowNumber)\n ? ''\n : this.props.selectedRefinementCriterion?.LeftValueBoundString;\n const selectedMax = !isUndefined(this.props.selectedRefinementCriterion?.RowNumber)\n ? ''\n : this.props.selectedRefinementCriterion?.RightValueBoundString;\n this.setState({ selectedMin, selectedMax });\n }\n\n private _renderInputFields(): JSX.Element | undefined {\n const { isDisabled, parentProductRefinerHierarchy, refineItemCommonProps } = this.props;\n const { validationErrorMin, validationErrorMax } = this.state;\n\n const rangeAriaLabel = (refineItemCommonProps.rangeNameFormat || '{0}').replace('{0}', parentProductRefinerHierarchy.KeyName || '');\n const formAttrs = {\n 'aria-label': rangeAriaLabel,\n 'aria-disabled': isDisabled\n };\n\n const minInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-min ${\n validationErrorMin ? 'refine-submenu__input-range--error' : ''\n }`;\n const maxInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-max ${\n validationErrorMax ? 'refine-submenu__input-range--error' : ''\n }`;\n return (\n
  • \n
    \n
    \n \n {' - '}\n \n {validationErrorMin && (\n \n {validationErrorMin}\n \n )}\n {validationErrorMax && validationErrorMin !== validationErrorMax && (\n \n {validationErrorMax}\n \n )}\n
    \n
    \n \n
    \n
    \n
  • \n );\n }\n\n private _applyCustom(event: React.MouseEvent): void {\n const selectedMinValue = this._getInputWithoutFormatting(this.state.selectedMin || '');\n this.setState({\n selectedMin: selectedMinValue,\n minTouched: false\n });\n const minInput = Number(selectedMinValue);\n const { onToggle, parentProductRefinerHierarchy } = this.props;\n const max = this.state.selectedMax;\n\n const maxNum = max ? Number(max) : undefined;\n const productRefinerValue: ProductRefinerValue = {\n RefinerRecordId: parentProductRefinerHierarchy.Values[0].RefinerRecordId,\n LeftValueBoundString: this.state.selectedMin,\n RightValueBoundString: this.state.selectedMax,\n DataTypeValue: parentProductRefinerHierarchy.DataTypeValue,\n RefinerSourceValue: parentProductRefinerHierarchy.Values[0].RefinerSourceValue\n };\n\n if (this._validateRange(minInput, maxNum)) {\n onToggle({\n parentProductRefinerHierarchy,\n productRefinerValue,\n isSelecting: true\n });\n }\n }\n\n private _changeMinInputRange(event: React.ChangeEvent): void {\n this.setState({\n selectedMin: event.target.value.trim()\n });\n }\n\n private _changeMaxInputRange(event: React.ChangeEvent): void {\n this.setState({\n selectedMax: event.target.value.trim()\n });\n }\n\n private _validateRange(min: number, max: number | undefined): boolean {\n const { refineItemCommonProps } = this.props;\n if (max === undefined) {\n return true;\n }\n\n if (min > max) {\n this.setState({\n validationErrorMin: refineItemCommonProps.validationErrorRange,\n validationErrorMax: refineItemCommonProps.validationErrorRange\n });\n return false;\n }\n\n return true;\n }\n\n private _getInputWithoutFormatting(input: string): string {\n // First try to cast raw input to a number\n const inputAsNum = Number(input);\n if (!isNaN(inputAsNum)) {\n return input;\n }\n\n // Otherwise try a reverse lookup and fall back to the raw input if all else fails\n const reverseLookupResult = this._formattedPriceReverseLookup.get(input);\n return reverseLookupResult || input;\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\nimport {\n AttributeDataType,\n DisplayTemplate,\n ProductRefinerSource,\n ProductRefinerValue,\n RefinerType\n} from '@msdyn365-commerce/retail-proxy';\nimport { Button, Collapse, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport RangeRefineItem, { RangeRefineItemType } from './range-refine-item';\nimport RefineItem from './refine-item';\nimport { IRefineItemCommonProps } from './refine-item.props.common';\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\nimport { findMatchingRefinementCriterion, isRangeTypeForInteger } from './utilities';\nimport RangeRefineItemInput from './range-refine-item-input';\n\n/**\n * Properties associated with the RefineSubmenu component.\n */\nexport interface IRefineSubmenuProps {\n tempRangeTypeTODO: RangeRefineItemType;\n minValueSliderThumbAriaLabel?: string;\n maxValueSliderThumbAriaLabel?: string;\n productRefinerHierarchy: IProductRefinerHierarchy;\n selectedRefinerValues: ProductRefinerValue[];\n refineItemCommonProps: IRefineItemCommonProps;\n isDisabled: boolean;\n isExpandedOnInitialLoad: boolean;\n context: ICoreContext>;\n moduleId: string;\n moduleTypeName: string;\n productCountAriaLabel?: string;\n singleProductCountAriaLabel?: string;\n refineItemAriaLabel?: string;\n refineItemsAriaLabel?: string;\n isMobile?: boolean;\n\n /**\n * The telemetry content\n */\n telemetryContent?: ITelemetryContent;\n onUpdateRefiners(notfication: Readonly): void;\n urlBuilder(refiner: IRefineItemToggleNotification): string;\n}\n\n/**\n * Refine submenu state.\n */\nexport interface IRefineSubmenuState extends React.ComponentState {\n expanded: boolean;\n}\n\n/**\n *\n * The RefineSubmenu component renders the submenu category and child items.\n * This computed observes the stateful category hierarchy object.\n * @extends {React.PureComponent}\n */\nclass RefineSubmenu extends React.Component {\n constructor(props: IRefineSubmenuProps) {\n super(props);\n\n this._onToggleItem = this._onToggleItem.bind(this);\n this._onToggleSubmenu = this._onToggleSubmenu.bind(this);\n\n const isExpanded = this.props.isExpandedOnInitialLoad;\n\n this.state = {\n expanded: isExpanded\n };\n }\n\n public shouldComponentUpdate(nextProps: IRefineSubmenuProps, nextState: IRefineSubmenuState): boolean {\n if (this.state === nextState && this.props === nextProps) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element | null {\n const { productRefinerHierarchy, refineItemCommonProps } = this.props;\n\n if (!productRefinerHierarchy) {\n refineItemCommonProps.telemetry.error('Cannot render submenu without refiner hierarchy data');\n }\n\n if (productRefinerHierarchy.SourceValue === ProductRefinerSource.Rating && this.props.context.app.config.hideRating) {\n return null;\n }\n\n const className = classnames(\n 'ms-refine-submenu',\n 'list-group',\n productRefinerHierarchy.KeyName // Deprecated because of the localization issues. Leaving for backward compatibility reasons.\n );\n\n return (\n
    \n \n {productRefinerHierarchy.KeyName}\n \n \n {this._renderChildItems(productRefinerHierarchy)}\n \n
    \n );\n }\n\n private _renderChildItems(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\n if (\n productRefinerHierarchy.DataTypeValue === AttributeDataType.Integer &&\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Range\n ) {\n return this._renderSingleMultiSelect(productRefinerHierarchy);\n }\n // Check if is of integer range type\n if (isRangeTypeForInteger(productRefinerHierarchy.DataTypeValue)) {\n return this._renderRange(productRefinerHierarchy);\n }\n return this._renderSingleMultiSelect(productRefinerHierarchy);\n }\n\n private _renderSingleMultiSelect(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\n const {\n isDisabled,\n refineItemCommonProps,\n selectedRefinerValues,\n context,\n productCountAriaLabel,\n singleProductCountAriaLabel,\n refineItemAriaLabel,\n refineItemsAriaLabel,\n isMobile\n } = this.props;\n const isSingleSelect =\n productRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect &&\n productRefinerHierarchy.SourceValue === ProductRefinerSource.Rating;\n const role = isSingleSelect ? { role: 'listbox' } : undefined;\n let selectedRefinementCriterion: ProductRefinerValue | undefined = {};\n const refinerValuesList = productRefinerHierarchy.Values || [];\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\n if (!child) {\n refineItemCommonProps.telemetry.error(\n `[refine-submenu] Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\n );\n return null;\n }\n\n selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\n return (\n \n refinerValuesList.find(value => value.RefinerRecordId === selectedValue.RefinerRecordId)\n )}\n refineItemCommonProps={refineItemCommonProps}\n onToggle={this._onToggleItem}\n urlBuilder={this.props.urlBuilder}\n isDisabled={isDisabled}\n key={index}\n index={index}\n context={context}\n moduleId={this.props.moduleId}\n moduleTypeName={this.props.moduleTypeName}\n telemetryContent={this.props.telemetryContent}\n productCountAriaLabel={productCountAriaLabel}\n refineItemAriaLabel={refineItemAriaLabel}\n refineItemsAriaLabel={refineItemsAriaLabel}\n singleProductCountAriaLabel={singleProductCountAriaLabel}\n isMobileView={isMobile}\n />\n );\n });\n return (\n \n {listItems}\n {productRefinerHierarchy.DataTypeValue === AttributeDataType.Integer &&\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Range && (\n \n )}\n \n );\n }\n\n private _getRangeType(productRefinerHierarchy: IProductRefinerHierarchy): 'input' | 'slider' {\n if (\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Range ||\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Slider ||\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.SliderWithBars\n ) {\n return 'slider';\n }\n return 'input';\n }\n\n private _renderRange(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\n const {\n isDisabled,\n refineItemCommonProps,\n selectedRefinerValues,\n context,\n minValueSliderThumbAriaLabel,\n maxValueSliderThumbAriaLabel\n } = this.props;\n const submenuClassNamePrefix = 'ms-refine-submenu__item list-group-item refine-submenu__item';\n const refinerValuesList = productRefinerHierarchy.Values || [];\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\n if (!child) {\n refineItemCommonProps.telemetry.error(\n `Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\n );\n return null;\n }\n\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\n\n const rangeType = this._getRangeType(productRefinerHierarchy);\n const key = selectedRefinementCriterion\n ? `${selectedRefinementCriterion.LeftValueBoundString}-${selectedRefinementCriterion.RightValueBoundString}`\n : `not-selected-${index}`;\n return (\n
  • \n \n
  • \n );\n });\n return
      {listItems}
    ;\n }\n\n private _onToggleItem(itemToggleNotification: IRefineItemToggleNotification): void {\n this.props.onUpdateRefiners(itemToggleNotification);\n }\n\n private _onToggleSubmenu(): void {\n this.setState(prevState => ({\n expanded: !prevState.expanded\n }));\n }\n}\n\nexport default RefineSubmenu;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\ninterface ISeparator {\n separator: string;\n}\n\nexport const Separator: React.FC = ({ separator }) => (\n \n {` `}\n {separator}\n {` `}\n \n);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\ninterface ITitle {\n className: string;\n text: string;\n}\n\nexport const Title: React.FC = ({ text, className }) => (\n \n {` `}\n {text}\n {` `}\n \n);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CategoryHierarchy as CategoryHierarchyData,\n IProductRefinerHierarchy,\n IProductsDimensionsAvailabilities\n} from '@msdyn365-commerce/commerce-entities';\nimport MsDyn365, { getCatalogId, ICoreContext } from '@msdyn365-commerce/core';\nimport {\n ChannelInventoryConfiguration,\n format,\n ProductPrice,\n ProductRefinerValue,\n SortColumn,\n StoreOperationsDataActions,\n TextValueTranslation\n} from '@msdyn365-commerce/retail-proxy';\nimport {\n ArrayExtensions,\n DimensionAvailabilitiesForProductSearchResultInput,\n DimensionTypes,\n DimensionSwatchDisplayTypes,\n getDimensionAvailabilitiesForProductSearchResultAction,\n getPriceForProductSearchResult,\n IDimensionsApp,\n PriceForProductSearchResultInput,\n ObjectExtensions\n} from '@msdyn365-commerce-modules/retail-actions';\nimport {\n getTelemetryObject,\n ILabeledDropdownOnChangeNotification,\n ILabeledDropdownOption,\n IModuleProps,\n INodeProps,\n isMobile,\n ITelemetryContent,\n LabeledDropdown,\n UncontrolledPagination,\n VariantType\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { action, computed, observable, reaction, transaction } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport {\n buildListPageUrl,\n getCollectionProducts,\n getCollectionRefinersAction,\n getCurrentUrl,\n GetFullProductsByCollectionInput,\n IFullProductsSearchResultsWithCount,\n parseQueryParam,\n ProductListInventoryFilteringOptions,\n RefinersByCollectionInput,\n sortOptions\n} from './actions';\nimport { hydrateRefinersFromUrl } from './actions/url-utils';\nimport {\n ErrorMessage,\n FeatureSearchResultItem,\n getUpdatedRefinementCriteria,\n IChoiceSummaryClickNotification,\n IRefineItemCommonProps,\n IRefineItemToggleNotification,\n ISearchResultModalViewProps,\n isMatchingRefinementCriterion,\n Link,\n ModalToggle,\n ProductSearchResultItems,\n SearchResultModal,\n Separator,\n Title\n} from './components';\nimport ChoiceSummary from './components/choice-summary';\nimport RefineSubmenu from './components/refine-submenu';\nimport { ListPageState } from './list-page-state';\nimport { ISearchResultContainerData } from './search-result-container.data';\nimport { expandRefinersCount, ISearchResultContainerProps } from './search-result-container.props.autogenerated';\n\nexport interface ISearchResultContainerViewProps extends ISearchResultContainerProps {\n products?: React.ReactNode;\n className?: string;\n SearchResultContainer: IModuleProps;\n TitleViewProps: ITitleViewProps;\n categoryHierarchy: ICategoryHierarchyViewProps;\n pagination?: React.ReactNode;\n ProductsContainer: INodeProps;\n ProductSectionContainer: INodeProps;\n refineMenu: IRefineMenuViewProps;\n sortByOptions: ISortByViewProps;\n choiceSummary?: React.ReactNode;\n modalToggle: React.ReactNode;\n searchResultModal: ISearchResultModalViewProps;\n isMobile: boolean;\n CategoryNavContainer: INodeProps;\n RefineAndProductSectionContainer: INodeProps;\n errorMessage: React.ReactNode;\n FeatureSearchContainer: INodeProps;\n similarLookProduct?: React.ReactNode;\n productPrices?: ProductPrice[];\n productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\n}\n\nexport interface ITitleViewProps {\n TitleContainer: INodeProps;\n title: ISearchResultTitle;\n}\n\nexport interface IRefineMenuViewProps {\n RefineMenuContainer: INodeProps;\n RefinerSectionContainer: INodeProps;\n refiners?: React.ReactNode[];\n}\n\nexport interface ICategoryHierarchyViewProps {\n categoryHierarchyList?: React.ReactNode[];\n categoryHierarchySeparator?: React.ReactNode;\n CategoryHierarchyContainer: INodeProps;\n}\n\nexport interface ISortByViewProps {\n SortingContainer: INodeProps;\n sortByDropDown?: React.ReactNode;\n}\n\nexport type GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\n/**\n * Title component for search result container.\n */\nexport interface ISearchResultTitle {\n titlePrefix?: React.ReactNode;\n titleText?: React.ReactNode;\n titleCount?: React.ReactNode;\n}\n\nexport interface ISearchResultContainerState {\n sortingState: ISortByCollectionState;\n modalIsOpen: boolean;\n refiners: IProductRefinerHierarchy[];\n productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\n channelInventoryConfiguration?: ChannelInventoryConfiguration;\n}\n\ninterface ISortByCollectionState {\n selectedSortByOption: ILabeledDropdownOption;\n pending: boolean;\n}\n\n/**\n *\n * SearchResultContainer component.\n * @extends {React.PureComponent>}\n */\n@observer\nexport default class SearchResultContainer extends React.PureComponent<\n ISearchResultContainerProps,\n ISearchResultContainerState\n> {\n @computed get isMobile(): boolean {\n return this._viewport === 'xs' || this._viewport === 'sm';\n }\n\n private readonly sortByDropdownOptions: ILabeledDropdownOption[] = [\n { key: sortOptions.sortByOptionRelevanceDesc, value: this.props.resources.sortByOptionRelevanceDesc },\n { key: sortOptions.sortByOptionNameAsc, value: this.props.resources.sortByOptionNameAsc },\n { key: sortOptions.sortByOptionNameDesc, value: this.props.resources.sortByOptionNameDesc },\n { key: sortOptions.sortByOptionPriceAsc, value: this.props.resources.sortByOptionPriceAsc },\n { key: sortOptions.sortByOptionPriceDesc, value: this.props.resources.sortByOptionPriceDesc },\n { key: sortOptions.sortByOptionRatingDesc, value: this.props.resources.sortByOptionRatingDesc },\n { key: sortOptions.sortByOptionBestSelling, value: this.props.resources.sortByOptionBestSelling },\n { key: sortOptions.sortByOptionNewScore, value: this.props.resources.sortByOptionNewScore },\n { key: sortOptions.sortByOptionTrendingScore, value: this.props.resources.sortByOptionTrendingScore }\n ];\n\n private readonly _refineItemCommonProps: IRefineItemCommonProps;\n\n private readonly _pageType: string | undefined = this.props.context.request.urlTokens.pageType;\n\n @observable\n private _viewport: GridSize = 'lg';\n\n private readonly _modalToggleRef: React.RefObject;\n\n private readonly _sortAndFilterContainerRef: React.RefObject;\n\n private expandrefinerCount: number | undefined = 0;\n\n private readonly telemetryContent: ITelemetryContent;\n\n private readonly productPrices: ProductPrice[];\n\n private readonly defaultPageNumber = 0;\n\n private readonly catalogId = getCatalogId(this.props.context.request);\n\n private isListPageStateUpdated: boolean = false;\n\n private _isMounted: boolean = false;\n\n public static getFriendlyName(locale: string, nameTranslations?: TextValueTranslation[]): string | undefined {\n let nameTranslation: TextValueTranslation | undefined;\n if (locale && nameTranslations && ArrayExtensions.hasElements(nameTranslations)) {\n nameTranslation = nameTranslations.find(item => item.Language!.toLowerCase() === locale.toLowerCase());\n }\n\n return nameTranslation?.Text;\n }\n\n public constructor(props: ISearchResultContainerProps, state: ISearchResultContainerState) {\n super(props);\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Check required.\n this._viewport = props.context.request?.device?.Type === 'Mobile' ? 'xs' : 'lg';\n this._modalToggleRef = React.createRef();\n this._sortAndFilterContainerRef = React.createRef();\n this._toggleModal = this._toggleModal.bind(this);\n this._updateViewport = this._updateViewport.bind(this);\n this.productPrices = [];\n this.state = {\n sortingState: {\n pending: false,\n selectedSortByOption: this.sortByDropdownOptions[0]\n },\n modalIsOpen: false,\n refiners: [],\n channelInventoryConfiguration: undefined\n };\n const { placeholderTextMax, minLabel, maxLabel, rangeNameFormat } = this.props.resources;\n\n const locale = this.props.context.request.locale;\n const telemetry = this.props.telemetry;\n const validationErrorNaN = this.props.resources.validationErrorNotNumber;\n const validationErrorRange = this.props.resources.validationErrorNotRange;\n this._refineItemCommonProps = {\n telemetry,\n locale,\n placeholderTextMax,\n minLabel,\n maxLabel,\n rangeNameFormat,\n validationErrorNaN,\n validationErrorRange\n };\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n this._updateViewport();\n }\n public async componentDidMount(): Promise {\n this._isMounted = true;\n if (MsDyn365.isBrowser && window.addEventListener) {\n window.addEventListener('resize', this._updateViewport);\n this._updateViewport();\n }\n\n const listPageState = await this.props.data.listPageState;\n const products = await this.props.data.products;\n const channelInventoryConfiguration = await StoreOperationsDataActions.getInventoryConfigurationAsync({\n callerContext: this.props.context.actionContext\n });\n if (this._isMounted) {\n this.setState({ channelInventoryConfiguration });\n }\n\n this._updateListPageState(listPageState, products);\n\n // Initialize reaction based on listPageState properties\n reaction(\n () => {\n return [\n listPageState.activeFilters?.length,\n listPageState.currentPageNumber,\n ArrayExtensions.hasElements(listPageState.sortingCritera?.Columns)\n ];\n },\n async () => {\n const newListPageState = await this.props.data.listPageState;\n const input = new GetFullProductsByCollectionInput(\n newListPageState.pageType,\n this.props.context.request.apiSettings,\n {\n Paging: {\n Top: this.props.config.itemsPerPage,\n Skip: Math.max(newListPageState.pageSize * (newListPageState.currentPageNumber ?? 0), 0)\n },\n count: true,\n Sorting: newListPageState.sortingCritera ?? {}\n },\n newListPageState.activeFilters ?? [],\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- RecordId is string. Check required.\n +(this.props.context.request.urlTokens.recordId || 0),\n\n // eslint-disable-next-line max-len -- existing code\n this.props.context.request.query?.q\n ? this.props.context.request.query.q\n : JSON.stringify({\n ProductId: this.props.context.request.query?.productId,\n Recommendation: this.props.context.request.query?.recommendation\n }),\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Required check.\n !!this.props?.config?.includeAttributes,\n this.props.config.updateRefinerPanel,\n this.props.context.request.locale,\n this.catalogId,\n channelInventoryConfiguration\n );\n\n const productResults = await getCollectionProducts(input, this.props.context.actionContext);\n newListPageState.totalProductCount = productResults.count;\n newListPageState.activeProducts = productResults.products;\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- check is required.\n if (\n this.props.config.enableAffiliationBasedPricing &&\n this.props.context.actionContext.requestContext?.user?.isAuthenticated\n ) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Call api to retrieve the availabilities data without blocking the UI.\n this._getActivePrice();\n }\n\n await this._updateVariantAvailability();\n\n if (this.props.config.updateRefinerPanel) {\n const refinerInput = new RefinersByCollectionInput(\n newListPageState.pageType,\n this.props.context.request.apiSettings,\n {\n Paging: {\n Top: this.props.config.itemsPerPage,\n Skip: Math.max(\n newListPageState.pageSize * (newListPageState.currentPageNumber ?? this.defaultPageNumber),\n this.defaultPageNumber\n )\n },\n count: true,\n Sorting: newListPageState.sortingCritera ?? {}\n },\n newListPageState.activeFilters ?? [],\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- RecordId is string. Check required.\n +(this.props.context.request.urlTokens.recordId || 0),\n this.props.context.request.query?.q\n ? this.props.context.request.query.q\n : this.props.context.request.query?.productId,\n false,\n this.props.config.updateRefinerPanel,\n undefined,\n this.catalogId,\n channelInventoryConfiguration\n );\n\n const refiners = await getCollectionRefinersAction(refinerInput, this.props.context.actionContext);\n this.setState({ refiners });\n }\n }\n );\n\n if (\n this.props.config.enableAffiliationBasedPricing &&\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Condition required.\n this.props.context.actionContext.requestContext?.user?.isAuthenticated\n ) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Call api to retrieve the availabilities data without blocking the UI.\n this._getActivePrice();\n }\n await this._updateVariantAvailability();\n }\n\n public componentWillUnmount(): void {\n this._isMounted = false;\n if (MsDyn365.isBrowser && window.removeEventListener) {\n window.removeEventListener('resize', this._updateViewport);\n }\n }\n\n public render(): JSX.Element {\n const {\n config: { imageSettings, className },\n resources,\n data: { listPageState, products: productCollection, featureProduct }\n } = this.props;\n\n if (!this.isListPageStateUpdated && listPageState.result && productCollection.result) {\n this._updateListPageState(listPageState.result, productCollection.result);\n this.isListPageStateUpdated = true;\n }\n\n const products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\n const searchProduct = listPageState.result?.featureProduct ?? featureProduct.result ?? null;\n let errorText = '';\n if (!ArrayExtensions.hasElements(products)) {\n errorText = this._pageType === 'Category' ? resources.resultCategoryNotFoundText : resources.resultSearchNotFoundText;\n }\n const productsComponent = this._getProducts();\n const featureComponent = (\n \n );\n\n const searchResultContainerViewProps = {\n ...this.props,\n products: productsComponent,\n TitleViewProps: this._getCollectionTitle(),\n categoryHierarchy: !this.props.config.disableHierarchy && this._getCategoryHierarchy(),\n refineMenu: this._getRefineMenu(),\n className: classnames('ms-search-result-container', className),\n SearchResultContainer: {\n moduleProps: this.props,\n className: classnames('ms-search-result-container', className)\n },\n sortByOptions: this.props.data.listPageState.result?.totalProductCount !== 0 ? this._getSortingDropDown() : null,\n pagination: this._getPagination(),\n ProductsContainer: { className: 'ms-search-result-container__Products' },\n ProductSectionContainer: { className: 'ms-search-result-container__product-section' },\n CategoryNavContainer: { className: 'ms-search-result-container__category-nav-section' },\n RefineAndProductSectionContainer: { className: 'ms-search-result-container__refine-product-section' },\n choiceSummary: this._getChoiceSummary(),\n modalToggle:\n this.props.data.listPageState.result?.totalProductCount !== 0 ? (\n \n ) : null,\n searchResultModal: this._getSearchResultModal(),\n isMobile: this.isMobile,\n errorMessage: errorText && ,\n FeatureSearchContainer: { className: 'ms-feature-search-result' },\n similarLookProduct: searchProduct ? featureComponent : null,\n productPrices: this.productPrices,\n productsDimensionAvailabilities: this.state.productsDimensionAvailabilities\n };\n return this.props.renderView(searchResultContainerViewProps) as React.ReactElement;\n }\n\n /**\n * Get products variants dimension availabilities.\n * @returns Void.\n */\n private readonly _updateVariantAvailability = async (): Promise => {\n const context = this.props.context as ICoreContext;\n const dimensionsToDisplayOnProductCard = context.app.config.dimensionsInProductCard;\n const dimensionsToDisplayAsSwatch = context.app.config.dimensionsAsSwatchType;\n if (\n ArrayExtensions.hasElements(dimensionsToDisplayOnProductCard) &&\n !dimensionsToDisplayOnProductCard.includes(DimensionTypes.none) &&\n ArrayExtensions.hasElements(dimensionsToDisplayAsSwatch) &&\n !dimensionsToDisplayAsSwatch.includes(DimensionTypes.none) &&\n this.props.config.includeAttributes\n ) {\n await this._getProductsDimensionsAvailabilities();\n }\n };\n\n /**\n * Update the list page state with initial data.\n * @param listPageState -- List page State.\n * @param products -- Products.\n */\n @action\n private readonly _updateListPageState = (listPageState: ListPageState, products: IFullProductsSearchResultsWithCount): void => {\n let querySorting: SortColumn[] = [];\n const defaultPageNumber: number = 10;\n\n if (this._pageType === 'Category') {\n listPageState.pageType = 'Category';\n } else {\n listPageState.pageType = 'Search';\n }\n\n if (this.props.context.request.query?.sorting) {\n querySorting = JSON.parse(decodeURIComponent(this.props.context.request.query.sorting)) as SortColumn[];\n }\n\n listPageState.currentPageNumber =\n (this.props.context.request.query?.skip &&\n +this.props.context.request.query.skip / (this.props.config.itemsPerPage ?? defaultPageNumber)) ||\n 0;\n listPageState.sortingCritera = { Columns: querySorting };\n listPageState.pageSize = this.props.config.itemsPerPage ?? defaultPageNumber;\n listPageState.activeProducts = products.products;\n listPageState.totalProductCount = products.count;\n listPageState.activeFilters = hydrateRefinersFromUrl(this.props.context.request) || [];\n if (this.props.context.request.query?.productId) {\n const featureProduct = this.props.data.featureProduct.result;\n if (featureProduct) {\n listPageState.featureProduct = featureProduct;\n }\n }\n };\n\n /**\n * Get products dimension availabilities.\n * @returns Void.\n */\n private readonly _getProductsDimensionsAvailabilities = async (): Promise => {\n const productsList = this.props.data.listPageState.result?.activeProducts ?? [];\n\n const productsDimensionAvailabilities = await getDimensionAvailabilitiesForProductSearchResultAction(\n new DimensionAvailabilitiesForProductSearchResultInput(\n productsList,\n this.props.context as ICoreContext,\n DimensionSwatchDisplayTypes.productCard\n ),\n this.props.context.actionContext\n );\n\n if (ArrayExtensions.hasElements(productsDimensionAvailabilities)) {\n this.setState({ productsDimensionAvailabilities });\n }\n };\n\n /**\n * Get the active price for the products.\n */\n private readonly _getActivePrice = async (): Promise => {\n const productsList = this.props.data.listPageState.result?.activeProducts ?? [];\n const products = await getPriceForProductSearchResult(\n new PriceForProductSearchResultInput(productsList),\n this.props.context.actionContext\n );\n\n const listPageState = await this.props.data.listPageState;\n listPageState.activeProducts = products;\n };\n\n private readonly _getSearchResultModal = (): ISearchResultModalViewProps => {\n const { resources } = this.props;\n return SearchResultModal({\n resources: {\n modalCloseButtonText: resources.modalCloseButtonText,\n modalTitle: resources.modalTitle\n },\n isOpen: this.state.modalIsOpen,\n returnRef: this._modalToggleRef,\n onModalToggle: this._toggleModal\n });\n };\n\n private readonly _getCollectionTitle = (): ITitleViewProps => {\n const { data, context, resources } = this.props;\n\n let collectionTitle: string | undefined = '';\n if (context && context.request && context.request.query && context.request.query.q) {\n collectionTitle = `\"${context.request.query.q}\"`;\n } else {\n collectionTitle =\n (data.category.result &&\n SearchResultContainer.getFriendlyName(context.request.locale, data.category.result.NameTranslations)) ||\n (data.category.result && data.category.result.Name) ||\n this.props.context.request.query?.title ||\n '';\n }\n let productCountText = '';\n let productCountNumber: number | undefined;\n if (data.listPageState && data.listPageState.result && data.listPageState.result.totalProductCount !== undefined) {\n productCountNumber = data.listPageState.result.totalProductCount;\n } else if (data.products && data.products.result) {\n productCountNumber = data.products.result.count;\n }\n\n if (productCountNumber && productCountNumber !== 0) {\n productCountText =\n productCountNumber !== 1\n ? format(this.props.resources.numberOfProducts, productCountNumber)\n : this.props.resources.oneProduct;\n } else {\n productCountText = format(this.props.resources.numberOfProducts, 0);\n }\n const pageName = context.request.telemetryPageName ? `result-count-${context.request.telemetryPageName.toLowerCase()}` : '';\n const titlePrefix = ;\n const titleText = collectionTitle && <Title className='ms-search-result__collection-title-text' text={collectionTitle} />;\n const titleCount = <Title className='ms-search-result__collection-title-count' text={productCountText} />;\n\n return {\n TitleContainer: { className: `ms-search-result-container__title ${pageName}` },\n title: {\n titlePrefix,\n titleText,\n titleCount\n }\n };\n };\n\n private readonly _getCategoryHierarchy = (): ICategoryHierarchyViewProps => {\n const { data } = this.props;\n const categoryHierarchy = data.categoryHierarchy.result;\n const categoryLinks =\n categoryHierarchy &&\n categoryHierarchy.map((value: CategoryHierarchyData, index: number) => {\n return (\n <Link\n key={index}\n text={value.Name}\n ariaLabel={`${this.props.resources.categoryLinkAriaLabel} ${value.Name}`}\n href={value.Url}\n />\n );\n });\n const categoryLinkSeparator = <Separator separator='/' />;\n\n return {\n CategoryHierarchyContainer: { tag: 'nav', className: 'ms-search-result-container__category-hierarchy' },\n categoryHierarchyList: categoryLinks,\n categoryHierarchySeparator: categoryLinkSeparator\n };\n };\n\n private readonly _getSortingDropDown = (): ISortByViewProps => {\n const { resources } = this.props;\n const activeDropdown = this._getCurrentlySelectedOption() || this.state.sortingState.selectedSortByOption;\n let dropdownOptions = this._getAllSortByOptions();\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- App config settings are of \"any\" value.\n if (this.props.context.app.config.hideRating) {\n dropdownOptions = dropdownOptions.filter(dropdownOption => dropdownOption.key !== sortOptions.sortByOptionRatingDesc);\n }\n\n const dropdown = (\n <LabeledDropdown\n labelClassname='reviews-list-sort-by'\n labelText={resources.sortByDropdownLabel}\n dropdownId='categorySortByDropdown'\n dropdownClassname='reviews-list-dropdown'\n toggleColor='link'\n dropdownOptions={dropdownOptions}\n selectedOption={activeDropdown}\n onSelectOption={this._updateSortByDropdown}\n ref={this._sortAndFilterContainerRef}\n />\n );\n return {\n SortingContainer: { className: 'ms-search-result-container__Sort-by-category' },\n sortByDropDown: dropdown\n };\n };\n\n private readonly _getPagination = (): React.ReactNode => {\n const { config, context, data, resources } = this.props;\n const listPageState = data.listPageState.result;\n const fullUrl = getCurrentUrl(context.request);\n const itemsPerPage = config.itemsPerPage || 10;\n // eslint-disable-next-line max-len -- existing code\n const skipCount = !ObjectExtensions.isNullOrUndefined(listPageState?.currentPageNumber)\n ? listPageState!.currentPageNumber * (this.props.config.itemsPerPage || 10)\n : (this.props.context.request.query && +this.props.context.request.query.skip) || 0;\n const totalItems = listPageState?.totalProductCount || 0;\n const previousText = resources.flipperPrevious;\n const nextText = resources.flipperNext;\n\n if (totalItems <= itemsPerPage) {\n return null;\n }\n return (\n <UncontrolledPagination\n className='ms-search-result-container__pagination'\n role='navigation'\n aria-label={resources.paginationAriaLabel}\n url={fullUrl.href}\n qsp='skip'\n items={totalItems}\n itemsPerPage={itemsPerPage}\n startingItem={skipCount}\n previousText={this._renderPrev(previousText)}\n nextText={this._renderNext(nextText)}\n previousAriaLabel={previousText}\n nextAriaLabel={nextText}\n telemetryContent={this.telemetryContent}\n />\n );\n };\n\n private readonly _getRefineMenu = (): IRefineMenuViewProps => {\n const { data, context, config } = this.props;\n const tempRangeTypeTODO = context.request.query && context.request.query.inputRange ? 'input' : 'slider';\n const validRefiners =\n this.props.config.updateRefinerPanel && ArrayExtensions.hasElements(this.state.refiners)\n ? this.state.refiners.filter(refiner => {\n return ArrayExtensions.hasElements(refiner.Values) && !this._shouldHideFromRefiners(refiner);\n })\n : data.refiners.result &&\n data.refiners.result.filter(refiner => {\n return ArrayExtensions.hasElements(refiner.Values) && !this._shouldHideFromRefiners(refiner);\n });\n\n const activeRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\n\n this._getexpandRefinerCount(validRefiners && validRefiners.length, config.expandRefinersCount);\n const expandedRefiners = this.expandrefinerCount;\n const subMenus =\n validRefiners &&\n validRefiners.map((productRefinerHierarchy: IProductRefinerHierarchy, index: number) => {\n return (\n <RefineSubmenu\n productRefinerHierarchy={productRefinerHierarchy}\n selectedRefinerValues={activeRefiners}\n refineItemCommonProps={this._refineItemCommonProps}\n minValueSliderThumbAriaLabel={this.props.resources.minValueSliderThumbAriaLabel}\n maxValueSliderThumbAriaLabel={this.props.resources.maxValueSliderThumbAriaLabel}\n key={index}\n onUpdateRefiners={this._onUpdateRefiners}\n urlBuilder={this._buildRefinerUrl}\n isDisabled={false}\n isExpandedOnInitialLoad={!!(expandedRefiners && expandedRefiners > index)}\n tempRangeTypeTODO={tempRangeTypeTODO}\n context={context}\n moduleId={this.props.id}\n moduleTypeName={this.props.typeName}\n telemetryContent={this.telemetryContent}\n productCountAriaLabel={this.props.resources.productCountAriaLabel}\n refineItemAriaLabel={this.props.resources.refineItemAriaLabel}\n refineItemsAriaLabel={this.props.resources.refineItemsAriaLabel}\n singleProductCountAriaLabel={this.props.resources.singleProductCountAriaLabel}\n isMobile={this.isMobile}\n />\n );\n });\n\n return {\n RefineMenuContainer: { className: 'ms-search-result-container__refine-menu' },\n RefinerSectionContainer: { className: 'ms-search-result-container__refiner-section' },\n refiners: subMenus\n };\n };\n\n /**\n * Should hide from refiners.\n * @param refiner - The refiner.\n * @returns ShouldHideFromRefiners.\n */\n private readonly _shouldHideFromRefiners = (refiner: IProductRefinerHierarchy): boolean => {\n const { channelInventoryConfiguration } = this.state;\n const isInventorySortableAttribute =\n (this.props.data.products.result?.inventoryAwareSortableAttributeId !== 0 &&\n refiner.RecordId === this.props.data.products.result?.inventoryAwareSortableAttributeId) ||\n (channelInventoryConfiguration?.ProductAvailabilitySortableAttributeRecordId !== 0 &&\n refiner.RecordId === channelInventoryConfiguration?.ProductAvailabilitySortableAttributeRecordId);\n\n const isInventoryProductAttribute =\n (this.props.data.products.result?.channelInventoryConfigurationId !== 0 &&\n refiner.RecordId === this.props.data.products.result?.channelInventoryConfigurationId) ||\n (channelInventoryConfiguration?.InventoryProductAttributeRecordId !== 0 &&\n refiner.RecordId === channelInventoryConfiguration?.InventoryProductAttributeRecordId);\n\n // Always hide sortable attribute since it's just for sorting products in Azure search, not for customers\n return (\n isInventorySortableAttribute ||\n (this.props.context.app.config.productListInventoryDisplay === ProductListInventoryFilteringOptions.HideOOS &&\n isInventoryProductAttribute)\n );\n };\n\n private readonly _getChoiceSummary = (): React.ReactNode => {\n const { resources, data, telemetry } = this.props;\n const { channelInventoryConfiguration } = this.state;\n const selectedRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\n const refinerValueName = this.props.data.refiners.result?.find(rating => rating.KeyName === 'Rating');\n return (\n <ChoiceSummary\n classNames='ms-choice-summary-by-category'\n clearAllText={resources.clearAllText}\n label={resources.choiceSummaryLabel}\n closeAriaLabel={resources.closeAriaLabel}\n selectedChoices={selectedRefiners}\n // @ts-expect-error: NOTE Type-unsafe line below, null refinersByCategoryHierarchy case not handled\n refinerHierarchy={data.refiners.result}\n choiceFormat={resources.choiceFormat}\n choiceRangeValueFormat={resources.choiceRangeValueFormat}\n telemetry={telemetry}\n onChoiceClicked={this._onChoiceClicked}\n urlBuilder={this._buildRefinerUrlForChoiceSummary}\n choiceAriaLabel={resources.choiceAriaLabel}\n telemetryContent={this.telemetryContent}\n context={this.props.context}\n channelInventoryConfigurationId={channelInventoryConfiguration?.InventoryProductAttributeRecordId}\n refinerValues={refinerValueName}\n />\n );\n };\n\n /**\n * Get Active products.\n * @returns - JSX Elements.\n */\n private readonly _getProducts = (): JSX.Element => {\n const {\n config: { imageSettings, allowBackNavigation: shouldAllowBackNavigation }\n } = this.props;\n const { resources } = this.props;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- Reading config value.\n const breadCrumbType: string = this.props.context.app.config.breadcrumbType;\n const shouldAllowBack = shouldAllowBackNavigation && (breadCrumbType === 'back' || breadCrumbType === 'categoryAndBack');\n\n const products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\n const quickviewSlot = this.props.slots?.quickview?.[0];\n const productComparisonButton = ArrayExtensions.hasElements(this.props.slots.productComparisonButton)\n ? this.props.slots.productComparisonButton[0]\n : null;\n\n const isPriceMinMaxFeatureState = this.props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailSearchPriceRangeFeature'\n );\n return (\n <ProductSearchResultItems\n products={products}\n context={this.props.context}\n imageSettings={imageSettings}\n resources={resources}\n moduleType={this.props.typeName}\n moduleId={this.props.id}\n allowBackNavigation={shouldAllowBack}\n telemetryContent={this.telemetryContent}\n quickviewSlot={quickviewSlot}\n productComparisonButton={productComparisonButton}\n channelInventoryConfigurationId={this.props.data.products.result?.channelInventoryConfigurationId}\n isPriceMinMaxEnabled={isPriceMinMaxFeatureState?.IsEnabled}\n productsDimensionAvailabilities={this.state.productsDimensionAvailabilities}\n />\n );\n };\n\n private readonly _updateSortByDropdown = (notification: ILabeledDropdownOnChangeNotification): void => {\n const {\n context: { request: requestContext, actionContext }\n } = this.props;\n\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\n // eslint-disable-next-line max-len -- existing code\n const error = `[sort-by-category] cannot sort without context: ${!requestContext ? 'requestContext ' : ''} ${\n !actionContext ? 'actionContext ' : ''\n } could not be found`;\n this.props.telemetry.warning(error);\n return;\n }\n\n window.history.pushState(\n {},\n '',\n buildListPageUrl(\n getCurrentUrl(this.props.context.request),\n undefined,\n [this._getSortColumnFromSelectedOption(notification.selectedOption)],\n undefined\n )\n );\n transaction(() => {\n this.props.data.listPageState.result!.currentPageNumber = 0;\n this.props.data.listPageState.result!.sortingCritera = {\n Columns: [this._getSortColumnFromSelectedOption(notification.selectedOption)]\n };\n });\n };\n\n private readonly _getSortColumnFromSelectedOption = (option: ILabeledDropdownOption): SortColumn => {\n const { data } = this.props;\n\n if (!data.searchConfiguration.result) {\n return {};\n }\n\n const mappedConfiguration = data.searchConfiguration.result.find(searchConfiguration => {\n return searchConfiguration.key === option.key;\n });\n\n if (mappedConfiguration) {\n return mappedConfiguration.sortColumn;\n }\n\n return {};\n };\n\n /**\n * Retrieves current sort criteria.\n * @returns Sort criteria column which is currently active or undefined if it's not specified.\n */\n private readonly _getSortCriteriaColumn = (): SortColumn | undefined => {\n const sortCriteria = this.props.data.listPageState.result?.sortingCritera;\n if (ArrayExtensions.hasElements(sortCriteria?.Columns)) {\n return sortCriteria!.Columns[0];\n }\n\n const queryColumns = parseQueryParam<SortColumn[]>('sorting', this.props.context.request);\n if (ArrayExtensions.hasElements(queryColumns)) {\n return queryColumns[0];\n }\n\n return undefined;\n };\n\n /**\n * Retrieves dropdown options.\n * @returns All dropdown options.\n */\n private readonly _getAllSortByOptions = (): ILabeledDropdownOption[] => {\n const searchConfiguration = this.props.data.searchConfiguration.result;\n\n if (!searchConfiguration) {\n return [];\n }\n\n const mappedSearchConfiguration = this.sortByDropdownOptions.filter(mappedSearchConfig =>\n searchConfiguration.find(item => mappedSearchConfig.key === item.key)\n );\n\n return ArrayExtensions.validValues(mappedSearchConfiguration);\n };\n\n /**\n * Retrieves current selected dropdown option based on the sort criteria.\n * @returns Current dropdown option.\n */\n private readonly _getCurrentlySelectedOption = (): ILabeledDropdownOption | undefined => {\n const activeSortColumn = this._getSortCriteriaColumn();\n\n const searchConfiguration = this.props.data.searchConfiguration.result;\n\n if (!activeSortColumn || !searchConfiguration) {\n return undefined;\n }\n\n const activeMappedConfig = searchConfiguration.find(\n mappedSearchConfig =>\n mappedSearchConfig.sortColumn.ColumnName === activeSortColumn.ColumnName &&\n mappedSearchConfig.sortColumn.IsDescending === activeSortColumn.IsDescending\n );\n if (!activeMappedConfig) {\n return undefined;\n }\n\n return this.sortByDropdownOptions.find(dropdownOption => dropdownOption.key === activeMappedConfig.key);\n };\n\n private readonly _onUpdateRefiners = (itemToggleNotification: IRefineItemToggleNotification): void => {\n const {\n context: { request: requestContext, actionContext }\n } = this.props;\n\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\n const error = `Refine menu cannot refine search criteria: \n ${!requestContext ? 'requestContext ' : ''} ${!actionContext ? 'actionContext ' : ''} could not be found`;\n this.props.telemetry.warning(error);\n return;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Server side the list PageState will not be called.\n const updatedRefinementCriteria = getUpdatedRefinementCriteria(\n itemToggleNotification,\n this.props.data.listPageState.result?.activeFilters || []\n );\n\n window.history.pushState({}, '', buildListPageUrl(getCurrentUrl(this.props.context.request), updatedRefinementCriteria));\n transaction(() => {\n this.props.data.listPageState.result!.currentPageNumber = 0;\n this.props.data.listPageState.result!.activeFilters = updatedRefinementCriteria;\n });\n };\n\n private readonly _buildRefinerUrl = (itemToggleNotification: IRefineItemToggleNotification): string => {\n if (this.props.data.listPageState.result) {\n const newRefinementCriteria = getUpdatedRefinementCriteria(\n itemToggleNotification,\n this.props.data.listPageState.result.activeFilters || []\n );\n\n return buildListPageUrl(getCurrentUrl(this.props.context.request), newRefinementCriteria);\n }\n this.props.telemetry.warning('[buildRefinerQueryString]List Page State Not available, unable to build refiner URL');\n return '';\n };\n\n private readonly _onChoiceClicked = (notification: IChoiceSummaryClickNotification): void => {\n const { data, telemetry } = this.props;\n\n if (!data.listPageState.result) {\n telemetry.warning('[choice-summary-by-category._onChoiceClicked]ListPageState unavailable, unable to update refiners.');\n return;\n }\n\n let currentRefinementCriteria = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\n\n if (!notification.clearAll) {\n const selectedChoice = notification.choiceClicked;\n if (!selectedChoice) {\n telemetry.warning('[choice-summary-by-category._onChoiceClicked] Choice could not be determined');\n return;\n }\n currentRefinementCriteria = currentRefinementCriteria.filter(\n (selectedCriterion: ProductRefinerValue) => !isMatchingRefinementCriterion(selectedChoice, selectedCriterion)\n );\n } else {\n currentRefinementCriteria = [];\n\n // Set focus to sort and filter\n const dropdownElementId = this._sortAndFilterContainerRef.current && this._sortAndFilterContainerRef.current.props.dropdownId;\n const dropdownElement = dropdownElementId && document.getElementById(dropdownElementId);\n setTimeout(() => {\n dropdownElement && dropdownElement.focus();\n }, 50);\n }\n\n const fullUrl = getCurrentUrl(this.props.context.request);\n window.history.pushState({}, '', buildListPageUrl(fullUrl, currentRefinementCriteria));\n data.listPageState.result.currentPageNumber = 0;\n data.listPageState.result.activeFilters = currentRefinementCriteria;\n };\n\n private readonly _buildRefinerUrlForChoiceSummary = (selectedRefiner: ProductRefinerValue, isClearAll: boolean): string => {\n const { data, telemetry } = this.props;\n const fullUrl = getCurrentUrl(this.props.context.request);\n\n if (!data.listPageState.result) {\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl]ListPageState unavailable, unable to create refiner URL.');\n return fullUrl.href;\n }\n\n let currentRefinementCriteria = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\n\n if (!isClearAll) {\n if (!selectedRefiner) {\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl] URL for Choice could not be determined');\n return fullUrl.href;\n }\n currentRefinementCriteria = currentRefinementCriteria.filter(\n (selectedCriterion: ProductRefinerValue) => !isMatchingRefinementCriterion(selectedRefiner, selectedCriterion)\n );\n } else {\n currentRefinementCriteria = [];\n }\n\n return buildListPageUrl(fullUrl, currentRefinementCriteria);\n };\n\n private _getViewport(): GridSize {\n if (MsDyn365.isBrowser) {\n return isMobile({ variant: VariantType.Browser, context: this.props.context.request });\n }\n return isMobile({ variant: VariantType.Viewport, context: this.props.context.request });\n }\n\n private _toggleModal(): void {\n this.setState({\n modalIsOpen: !this.state.modalIsOpen\n });\n }\n\n private _updateViewport(): void {\n this._viewport = this._getViewport();\n\n if (this.state.modalIsOpen && !this.isMobile) {\n this._toggleModal();\n }\n }\n\n private readonly _getexpandRefinerCount = (validRefiners?: number, refinerCount?: expandRefinersCount): void => {\n switch (refinerCount) {\n case expandRefinersCount.all:\n this.expandrefinerCount = validRefiners;\n break;\n case expandRefinersCount.one:\n this.expandrefinerCount = 1;\n break;\n case expandRefinersCount.two:\n this.expandrefinerCount = 2;\n break;\n case expandRefinersCount.three:\n this.expandrefinerCount = 3;\n break;\n case expandRefinersCount.four:\n this.expandrefinerCount = 4;\n break;\n default:\n this.expandrefinerCount = 0;\n }\n };\n\n /**\n * Renders a Pagination previous text.\n * @param paginationPreviousText - Pagination previous text from resources.\n * @returns Previous text and flipper icon.\n */\n private readonly _renderPrev = (paginationPreviousText: string) => {\n return (\n <div className='msc-pagination__prev'>\n <span className='ms-search-result__pagination-left' aria-hidden='true' />\n <span className='prev-text'>{paginationPreviousText}</span>\n </div>\n );\n };\n\n /**\n * Renders a Pagination next text.\n * @param paginationNextText - Pagination next text from resources.\n * @returns Next text and flipper icon.\n */\n private readonly _renderNext = (paginationNextText: string) => {\n return (\n <div className='msc-pagination__next'>\n <span className='next-text'>{paginationNextText}</span>\n <span className='ms-search-result__pagination-right' aria-hidden='true' />\n </div>\n );\n };\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { 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 { SocialMedia, SocialMediaComponent } from '@msdyn365-commerce/components';\nimport MsDyn365 from '@msdyn365-commerce/core';\nimport { IModuleProps } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISocialShareItemConfig, ISocialShareItemProps, socialMedia } from './social-share-item.props.autogenerated';\n\nexport interface ISocialShareItemViewProps extends ISocialShareItemProps<ISocialShareItemConfig> {\n SocialShareItemElement: React.ReactNode | null;\n SocialShareItem: IModuleProps;\n}\n\n/**\n *\n * SocialShareItem component.\n * @extends {React.PureComponent<ISocialShareItemProps<ISocialShareItemConfig>>}\n */\nclass SocialShareItem extends React.PureComponent<ISocialShareItemProps<ISocialShareItemConfig>> {\n constructor(props: ISocialShareItemProps<ISocialShareItemConfig>) {\n super(props);\n\n this._getSocialShareItem = this._getSocialShareItem.bind(this);\n }\n\n public render(): JSX.Element | null {\n const viewprops = {\n ...this.props,\n SocialShareItem: {\n moduleProps: this.props,\n className: 'ms-social-share-item'\n },\n SocialShareItemElement: this._getSocialShareItem()\n };\n\n return this.props.renderView(viewprops) as React.ReactElement;\n }\n\n private _getSocialShareItem(): React.ReactNode | null {\n const src = this.props.config.icon;\n if (MsDyn365.isBrowser) {\n switch (this.props.config.socialMedia) {\n case socialMedia.facebook:\n return (\n <SocialMediaComponent\n socialMedia={SocialMedia.Facebook}\n postUrl={document.URL}\n context={this.context}\n id={`${this.props.id}_facebook`}\n typeName={this.props.typeName}\n data={{}}\n src={src}\n />\n );\n case socialMedia.twitter:\n return (\n <SocialMediaComponent\n socialMedia={SocialMedia.Twitter}\n postUrl={document.URL}\n context={this.context}\n id={`${this.props.id}_twitter`}\n typeName={this.props.typeName}\n data={{}}\n src={src}\n />\n );\n case socialMedia.pinterest:\n return (\n <SocialMediaComponent\n socialMedia={SocialMedia.Pinterest}\n postUrl={document.URL}\n context={this.context}\n id={`${this.props.id}_pinterest`}\n typeName={this.props.typeName}\n data={{}}\n src={src}\n />\n );\n case socialMedia.linkedin:\n return (\n <SocialMediaComponent\n socialMedia={SocialMedia.Linkedin}\n postUrl={document.URL}\n context={this.context}\n id={`${this.props.id}_linkedin`}\n typeName={this.props.typeName}\n data={{}}\n src={src}\n />\n );\n case socialMedia.mail:\n return (\n <SocialMediaComponent\n socialMedia={SocialMedia.Mail}\n postUrl={document.URL}\n context={this.context}\n id={`${this.props.id}_mail`}\n typeName={this.props.typeName}\n data={{}}\n src={src}\n />\n );\n default:\n return null;\n }\n }\n return null;\n }\n}\n\nexport default SocialShareItem;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Module } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nimport { ISocialShareItemViewProps } from './social-share-item';\n\nexport const SocialShareItemView: React.FC<ISocialShareItemViewProps> = props => {\n const { SocialShareItem, SocialShareItemElement } = props;\n\n if (!SocialShareItemElement) {\n props.context.telemetry.error('Social media is not valid, module wont render');\n return null;\n }\n return <Module {...SocialShareItem}>{SocialShareItemElement}</Module>;\n};\n\nexport default SocialShareItemView;\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 * as React from 'react';\n\nexport interface IWishlistItemDimension {\n key: string;\n className?: string;\n dimensionType: string;\n dimensionValue: string;\n}\n\nexport const WishlistItemDimension: React.FC<IWishlistItemDimension> = ({ key, className, dimensionType, dimensionValue }) => (\n <div key={key} className={className}>\n <span className='msc-wishlist-dimension__label'>{dimensionType}:</span>\n <span className='msc-wishlist-dimension__value'>{dimensionValue}</span>\n </div>\n);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { PriceComponent } from '@msdyn365-commerce/components';\nimport { IAny, ICoreContext, IGeneric, IImageSettings, Image, ITelemetry, msdyn365Commerce } from '@msdyn365-commerce/core';\nimport {\n CommerceListLine,\n ProductPrice,\n ReleasedProductType,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport {\n convertProductDimensionTypeToDimensionTypes,\n getFallbackImageUrl,\n StringExtensions\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { Alert, Button, getPayloadObject, getTelemetryAttributes, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IWishlistItemActionMessageState } from '../wishlist-items';\nimport { WishlistItemDimension } from './wishlist-items-dimensions';\n\nexport interface IWishlistItemProps extends CommerceListLine {\n product: SimpleProduct;\n wishlistState: IWishlistItemActionMessageState;\n price?: ProductPrice;\n context: ICoreContext<IGeneric<IAny>>;\n productUrl: string;\n imageSettings?: IImageSettings;\n removeFromWishlistText: string;\n isInStock: boolean;\n addToCartText: string;\n outOfStockText: string;\n index: number;\n itemKey: string;\n telemetry: ITelemetry;\n moduleId: string;\n moduleTypeName: string;\n enableImageProductLink?: boolean;\n inventoryInformationLabel?: string;\n inventoryLabelClassName?: string;\n telemetryContent?: ITelemetryContent;\n handlers: {\n onAddToCart(product: SimpleProduct, itemKey: string): void;\n onRemoveItem(productId: number): void | undefined;\n onDismiss(): void;\n };\n resources: {\n productDimensionTypeColor: string;\n productDimensionTypeSize: string;\n productDimensionTypeStyle: string;\n originalPriceText: string;\n currentPriceText: string;\n freePriceText: string;\n };\n}\n\nexport interface IWishlistItemViewProps {\n key: string;\n productImage: React.ReactNode;\n productLink: React.ReactNode;\n productDimensions?: React.ReactNode[];\n productPrice?: React.ReactNode;\n addToCartButton?: React.ReactNode;\n removeButton?: React.ReactNode;\n productStatusMessage?: React.ReactNode;\n productName?: React.ReactNode;\n productAriaLabel?: string;\n entireProductLink?: string;\n inventoryInformation?: React.ReactNode;\n productUnitOfMeasure?: React.ReactNode;\n}\n\nconst _addItemToCart = (props: IWishlistItemProps): void => {\n const { product, itemKey, handlers } = props;\n const { onAddToCart } = handlers;\n\n onAddToCart && product && itemKey && onAddToCart(product, itemKey);\n};\n\nconst _removeItemFromWishlist = (props: IWishlistItemProps): void => {\n const { onRemoveItem } = props.handlers;\n const { RecordId } = props.product;\n\n onRemoveItem && RecordId && onRemoveItem(RecordId);\n};\n\nconst WishListItemActions = {\n addToCart: _addItemToCart,\n removeItem: _removeItemFromWishlist\n};\n\nconst _getFullProductLink = (props: IWishlistItemProps): string => {\n if (!msdyn365Commerce.isBrowser) {\n return '';\n }\n\n const fullUrl = new URL(props.productUrl, window.location.href);\n for (const dimension of props.product.Dimensions ?? []) {\n const dimensionValue = dimension.DimensionValue?.Value;\n if (!StringExtensions.isNullOrWhitespace(dimensionValue)) {\n const dimensionName = convertProductDimensionTypeToDimensionTypes(dimension.DimensionTypeValue);\n fullUrl.searchParams.set(dimensionName, dimensionValue!);\n }\n }\n return fullUrl.href;\n // return updateProductUrl(productUrl, context, swatch);\n};\n\nconst _renderAriaLabel = (props: IWishlistItemProps): string => {\n const { product, price, context, resources } = props;\n\n const { Name, Dimensions } = product;\n const { productDimensionTypeColor, productDimensionTypeSize, productDimensionTypeStyle } = resources;\n\n let formattedPrice = 'Free';\n let dimensions = null;\n\n if (price) {\n formattedPrice =\n price.BasePrice === 0 ? resources.freePriceText : context.cultureFormatter.formatCurrency(price.BasePrice!, price.CurrencyCode);\n }\n\n if (Dimensions) {\n dimensions = Dimensions.map(productDimension => {\n switch (productDimension.DimensionTypeValue) {\n case 1:\n return `${productDimensionTypeColor}${productDimension.DimensionValue && productDimension.DimensionValue.Value}`;\n case 3:\n return `${productDimensionTypeSize}${productDimension.DimensionValue && productDimension.DimensionValue.Value}`;\n case 4:\n return `${productDimensionTypeStyle}${productDimension.DimensionValue && productDimension.DimensionValue.Value}`;\n default:\n return '';\n }\n });\n }\n\n return `${Name} ${formattedPrice} ${(dimensions && dimensions.join('')) || ''}`;\n};\n\n/**\n * Renders a link to a product based on the given props.\n * @param input - Wishlist item props with the info about the product.\n * @param productUrl - The url to the product.\n * @returns React component with a link to a product.\n */\nconst renderProductLink = (input: IWishlistItemProps, productUrl: string) => {\n const { telemetryContent } = input;\n const { RecordId: recordId, Name: productName } = input.product;\n const payLoad = getPayloadObject('click', telemetryContent!, '', recordId.toString());\n const productAttributes = getTelemetryAttributes(telemetryContent!, payLoad);\n const productPageUrlWithSwatch = productUrl;\n return (\n !StringExtensions.isNullOrWhitespace(productPageUrlWithSwatch) && (\n <a\n href={productPageUrlWithSwatch}\n className='ms-wishlist-items__product-link'\n {...productAttributes}\n aria-label={_renderAriaLabel(input)}\n >\n {productName}\n </a>\n )\n );\n};\n\n/**\n * Renders a product name box.\n * @param productName - The text to display.\n * @returns React component with a name of a product.\n */\nconst renderProductName = (productName: string) => {\n return <div className='ms-wishlist-items__product-title'>{productName}</div>;\n};\n\n/**\n * Renders inventory information.\n * @param inventoryInformationLabel - The text to display.\n * @param inventoryLabelClassName - The component class name.\n * @returns React component.\n */\nconst renderInventoryInformationLabel = (inventoryInformationLabel: string | undefined, inventoryLabelClassName: string | undefined) => {\n const inventoryCssName = inventoryLabelClassName\n ? `ms-wishlist-items__inventory-label ${inventoryLabelClassName}`\n : 'ms-wishlist-items__inventory-label';\n return (\n !StringExtensions.isNullOrWhitespace(inventoryInformationLabel) && (\n <span className={inventoryCssName}>{inventoryInformationLabel}</span>\n )\n );\n};\n\n/**\n * Renders add to cart button.\n * @param input - Wishlist item props with the configuration.\n * @returns React component.\n */\nconst WishlistItemAddToCartButtonComponent = (input: IWishlistItemProps) => {\n const { isInStock, addToCartText, outOfStockText } = input;\n\n // Check if the product is service or not by product type.\n const isServiceItem = input.product.ItemTypeValue === ReleasedProductType.Service;\n\n const addItemAction = React.useCallback(() => {\n WishListItemActions.addToCart(input);\n }, [input]);\n\n return (\n <Button\n className='ms-wishlist-items__product-add-button'\n title={((isServiceItem || isInStock) && addToCartText) || outOfStockText}\n onClick={addItemAction}\n disabled={!(isServiceItem || isInStock)}\n >\n {((isServiceItem || isInStock) && addToCartText) || outOfStockText}\n </Button>\n );\n};\n\n/**\n * Renders remove from wishlist button.\n * @param input - Wishlist item props with the configuration.\n * @returns React component.\n */\nconst WishlistItemRemoveFromWishlistButtonComponent = (input: IWishlistItemProps) => {\n const { removeFromWishlistText } = input;\n\n const removeItemAction = React.useCallback(() => {\n WishListItemActions.removeItem(input);\n }, [input]);\n\n return <button className='ms-wishlist-items__product-remove-button' aria-label={removeFromWishlistText} onClick={removeItemAction} />;\n};\n\n/**\n * Gets the react node for product unit of measure display.\n * @param context - Module context.\n * @param unitOfMeasure - Product unit of measure.\n * @returns The node representing markup for unit of measure component.\n */\nconst renderUnitOfMeasure = (context: ICoreContext<IGeneric<IAny>>, unitOfMeasure?: string) => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Do not need type check for appsettings\n if (context.app.config && (!context.app.config.unitOfMeasureDisplayType || context.app.config.unitOfMeasureDisplayType === 'none')) {\n return undefined;\n }\n\n if (!unitOfMeasure) {\n return undefined;\n }\n\n return (\n <div className='msc-wishlistitems__product-unit-of-measure'>\n <span>{unitOfMeasure}</span>\n </div>\n );\n};\n\nexport const WishlistItem = (input: IWishlistItemProps): IWishlistItemViewProps | null => {\n const {\n product,\n price,\n context,\n imageSettings,\n wishlistState,\n itemKey,\n handlers,\n inventoryInformationLabel,\n enableImageProductLink,\n inventoryLabelClassName\n } = input;\n\n if (!product) {\n return null;\n }\n\n const { RecordId, Name, PrimaryImageUrl, Dimensions } = product;\n if (product.RecordId) {\n const fallbackImage = getFallbackImageUrl(\n product.ItemId,\n context.actionContext.requestContext.apiSettings,\n context.request.app?.config?.OmniChannelMedia\n );\n const productUrl = _getFullProductLink(input);\n const productImage =\n Name &&\n _renderProductImage(\n context,\n product.Name!,\n PrimaryImageUrl === undefined ? fallbackImage : PrimaryImageUrl,\n fallbackImage,\n imageSettings\n );\n return {\n key: `${RecordId}-item`,\n productImage,\n productLink: renderProductLink(input, productUrl),\n productDimensions: Dimensions && _renderProductDimensions(input),\n productPrice: price && _renderPrice(input),\n productUnitOfMeasure: product.DefaultUnitOfMeasure && renderUnitOfMeasure(context, product.DefaultUnitOfMeasure),\n entireProductLink: enableImageProductLink ? productUrl : undefined,\n productAriaLabel: enableImageProductLink ? _renderAriaLabel(input) : undefined,\n productName: enableImageProductLink && Name && renderProductName(Name),\n\n addToCartButton: <WishlistItemAddToCartButtonComponent {...input} />,\n inventoryInformation: renderInventoryInformationLabel(inventoryInformationLabel, inventoryLabelClassName),\n removeButton: <WishlistItemRemoveFromWishlistButtonComponent {...input} />,\n productStatusMessage: wishlistState &&\n wishlistState.isOpen &&\n wishlistState.productId === RecordId &&\n wishlistState.itemKey === itemKey && (\n <div className='ms-wishlist-items__product-status'>\n <Alert color={wishlistState.statusCssString} isOpen={wishlistState.isOpen} toggle={handlers.onDismiss}>\n <span>{wishlistState.userMessage}</span>\n </Alert>\n </div>\n )\n };\n }\n return null;\n};\n\nconst _renderProductImage = (\n context: ICoreContext,\n heading: string,\n image?: string,\n fallbackImage?: string,\n imageSettings?: IImageSettings\n): JSX.Element | null => {\n const defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=315&h=315&m=6', w: 0, h: 0 },\n lg: { q: 'w=315&h=315&m=6', w: 0, h: 0 },\n xl: { q: 'w=315&h=315&m=6', w: 0, h: 0 }\n },\n lazyload: true,\n cropFocalRegion: true\n };\n\n if (imageSettings) {\n imageSettings.cropFocalRegion = true;\n }\n\n if (image) {\n return (\n <Image\n requestContext={context.actionContext.requestContext}\n className='ms-wishlist-items__product-image'\n altText={heading}\n title={heading}\n src={image}\n fallBackSrc={fallbackImage}\n gridSettings={context.request.gridSettings!}\n imageSettings={imageSettings || defaultImageSettings}\n loadFailureBehavior='empty'\n />\n );\n }\n return null;\n};\n\nconst _renderPrice = (props: IWishlistItemProps): JSX.Element | null => {\n const { price, context, moduleId, moduleTypeName, resources } = props;\n\n if (price) {\n return (\n <PriceComponent\n id={moduleId}\n typeName={moduleTypeName}\n data={{ price }}\n className='ms-wishlist-items__product-price'\n freePriceText={resources.freePriceText}\n originalPriceText={resources.originalPriceText}\n currentPriceText={resources.currentPriceText}\n context={context}\n />\n );\n }\n return null;\n};\n\nconst _renderProductDimensions = (props: IWishlistItemProps): (React.ReactNode | undefined)[] => {\n const { product, resources } = props;\n\n if (!product || !product.Dimensions) {\n return [];\n }\n\n return product.Dimensions.map((dimension, index) => {\n if (!dimension.DimensionValue || !dimension.DimensionValue.Value) {\n return undefined;\n }\n\n let type = '';\n\n switch (dimension.DimensionTypeValue) {\n case 1: {\n type = resources.productDimensionTypeColor;\n break;\n }\n case 3: {\n type = resources.productDimensionTypeSize;\n break;\n }\n case 4: {\n type = resources.productDimensionTypeStyle;\n break;\n }\n default:\n return undefined;\n }\n\n return (\n <WishlistItemDimension\n key={`${product.RecordId}-dimensions-${index}`}\n className='msc-price ms-wishlist-items__product-dimension'\n dimensionType={type}\n dimensionValue={dimension.DimensionValue.Value}\n />\n );\n });\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { wishlistStatus } from '../wishlist-items';\n\nexport interface IWishlistItemsStatusMessageProps {\n className?: string;\n errorType: wishlistStatus;\n text?: string;\n}\n\nexport const WishlistItemsStatusMessage: React.FC<IWishlistItemsStatusMessageProps> = ({ className, errorType, text }) => {\n switch (errorType) {\n case 'EMPTY':\n return <p className={classnames('ms-wishlist-items__message-empty', className)}>{text}</p>;\n case 'FAILED':\n return <p className={classnames('ms-wishlist-items__message-failed', className)}>{text}</p>;\n case 'LOADING':\n default:\n return <p className={className ? 'ms-wishlist-items__message-exists-product' : 'ms-wishlist-items__message-waiting'}>{text}</p>;\n }\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { FullProduct } from '@msdyn365-commerce/commerce-entities';\nimport * as MsDyn365 from '@msdyn365-commerce/core';\nimport { AsyncResult, CommerceList, CommerceListLine, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { createGetByCustomerInput, removeLinesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CommerceListsDataActions.g';\nimport { getDeliveryOptionsAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\nimport {\n ArrayExtensions,\n getProductUrlSync,\n IProductInventoryInformation,\n QueryResultSettingsProxy\n} from '@msdyn365-commerce-modules/retail-actions';\nimport {\n getTelemetryObject,\n IModuleProps,\n INodeProps,\n ITelemetryContent,\n updateMaxQuantityForCartLineItem\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport getItemsInWishlists, { ActiveWishlistInput } from './actions/get-items-in-wishlists';\nimport { IWishlistItemViewProps, WishlistItem, WishlistItemsStatusMessage } from './components';\nimport { IWishlistItemsData } from './wishlist-items.data';\nimport { IHeadingData, IWishlistItemsProps } from './wishlist-items.props.autogenerated';\n\nexport interface IWishlistItemActionMessageState {\n productId: number;\n itemKey: string;\n userMessage: string;\n statusCssString: string;\n messageGlyph: string;\n isOpen: boolean;\n isError: boolean;\n}\n\nexport type wishlistStatus = 'LOADING' | 'SUCCESS' | 'FAILED' | 'EMPTY';\n\nexport interface IWishlistItemsViewProps extends IWishlistItemsProps<IWishlistItemsData> {\n WishlistItems: IModuleProps;\n status?: wishlistStatus;\n statusMessage?: React.ReactNode;\n heading?: React.ReactNode;\n Products?: INodeProps;\n Product?: INodeProps;\n ProductDetails?: INodeProps;\n ProductDimensions?: INodeProps;\n products?: IWishlistItemViewProps[];\n telemetryContent?: ITelemetryContent;\n statusNotExistsMessage?: React.ReactNode;\n}\n\n/**\n *\n * WishlistItems component.\n * @extends {React.PureComponent<IWishlistItemsProps<IWishlistItemsData>, IWishlistItemActionMessageState>}\n */\n@observer\nclass WishlistItems extends React.Component<IWishlistItemsProps<IWishlistItemsData>, IWishlistItemActionMessageState> {\n private readonly telemetryContent: ITelemetryContent;\n constructor(props: IWishlistItemsProps<IWishlistItemsData>) {\n super(props);\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n }\n\n public async componentDidMount(): Promise<void> {\n this.setState({ isError: false });\n }\n\n public shouldComponentUpdate(nextProps: IWishlistItemsProps<IWishlistItemsData>, nextState: IWishlistItemActionMessageState): boolean {\n if (this.state === nextState && this.props.data === nextProps.data) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element | null {\n const { heading, className } = this.props.config;\n const { emptyWishlistText, wishlistErrorGettingWishlist, noLongerExitsWishlistItemText } = this.props.resources;\n const { cart, productAvailability, wishlists, products } = this.props.data;\n\n if (cart.status === 'LOADING' || productAvailability.status === 'LOADING' || wishlists.status === 'LOADING') {\n const errorProps: IWishlistItemsViewProps = {\n ...(this.props as IWishlistItemsProps<IWishlistItemsData>),\n WishlistItems: {\n moduleProps: this.props,\n className: classnames('ms-wishlist-items', className)\n },\n status: 'LOADING',\n\n statusMessage: <WishlistItemsStatusMessage errorType='LOADING' text='Loading...' />,\n heading: this._renderHeading(heading)\n };\n return this.props.renderView(errorProps);\n }\n\n if (cart.status === 'FAILED' || productAvailability.status === 'FAILED' || wishlists.status === 'FAILED') {\n const errorProps: IWishlistItemsViewProps = {\n ...(this.props as IWishlistItemsProps<IWishlistItemsData>),\n WishlistItems: {\n moduleProps: this.props,\n className: classnames('ms-wishlist-items', className)\n },\n status: 'FAILED',\n statusMessage: <WishlistItemsStatusMessage errorType='FAILED' text={wishlistErrorGettingWishlist} />,\n heading: this._renderHeading(heading)\n };\n\n return this.props.renderView(errorProps);\n }\n\n const productsList = products && (products as AsyncResult<FullProduct[]>).result;\n\n if (productsList && productsList.length === 0) {\n const emptyViewProps: IWishlistItemsViewProps = {\n ...(this.props as IWishlistItemsProps<IWishlistItemsData>),\n WishlistItems: {\n moduleProps: this.props,\n className: classnames('ms-wishlist-items', className)\n },\n status: 'EMPTY',\n statusMessage: <WishlistItemsStatusMessage errorType='EMPTY' text={emptyWishlistText} />,\n heading: this._renderHeading(heading)\n };\n\n return this.props.renderView(emptyViewProps);\n }\n\n const viewProps: IWishlistItemsViewProps = {\n ...(this.props as IWishlistItemsProps<IWishlistItemsData>),\n WishlistItems: {\n moduleProps: this.props,\n className: classnames('ms-wishlist-items', className)\n },\n status: 'SUCCESS',\n heading: this._renderHeading(heading),\n Products: {\n className: 'ms-wishlist-items__products',\n tag: 'ul'\n },\n Product: {\n className: 'ms-wishlist-items__product',\n tag: 'li'\n },\n ProductDetails: {\n className: 'ms-wishlist-items__product-link',\n tag: 'a'\n },\n telemetryContent: this.telemetryContent,\n ProductDimensions: {\n className: 'ms-wishlist-items__product-dimensions'\n },\n products: productsList && this._renderProductList(productsList),\n statusNotExistsMessage:\n productsList && this._getProductNotExists(productsList, emptyWishlistText, noLongerExitsWishlistItemText)\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n public handleHeadingChange = (event: MsDyn365.ContentEditableEvent) => (this.props.config.heading!.text = event.target.value);\n\n private _getProductNotExists(products: FullProduct[], emptytext: string, noLongerExisttext: string): JSX.Element | null {\n if (this.state && this.state.isError) {\n if (products.length === 0) {\n return <WishlistItemsStatusMessage errorType='SUCCESS' text={emptytext} />;\n }\n return (\n <WishlistItemsStatusMessage\n className={'ms-wishlist-items__message-exists-product'}\n errorType='SUCCESS'\n text={noLongerExisttext}\n />\n );\n }\n return null;\n }\n private _renderProductList(products: FullProduct[]): IWishlistItemViewProps[] {\n const {\n priceFree,\n originalPriceText,\n currentPriceText,\n addToCartButtonText,\n outOfStockText,\n removeButtonText,\n productDimensionTypeColor,\n productDimensionTypeSize,\n productDimensionTypeStyle,\n productDimensionTypeAmount\n } = this.props.resources;\n const { context, telemetry } = this.props;\n const { imageSettings, enableImageProductLink } = this.props.config;\n\n return products.map((product: FullProduct, index) => {\n const currentProductProps = {\n product: product.ProductDetails,\n price: product.ProductPrice,\n context,\n wishlistState: this.state,\n productUrl: getProductUrlSync(product.ProductDetails, context.actionContext, undefined),\n imageSettings,\n removeFromWishlistText: removeButtonText,\n isInStock: this._isProductInStock(product),\n addToCartText: addToCartButtonText,\n outOfStockText,\n index,\n itemKey: `${product.ProductDetails.RecordId}-${product.ProductDetails.ItemId}-${index}`,\n telemetry,\n moduleId: this.props.id,\n moduleTypeName: this.props.typeName,\n enableImageProductLink,\n inventoryInformationLabel: this._inventoryLabel(product),\n inventoryLabelClassName: this._inventoryClassName(product),\n telemetryContent: this.telemetryContent,\n handlers: {\n onAddToCart: this._addItemToCart,\n onRemoveItem: this._removeItemFromWishlist,\n onDismiss: this._onDismiss\n },\n resources: {\n productDimensionTypeColor,\n productDimensionTypeSize,\n productDimensionTypeStyle: product.ProductDetails.IsGiftCard ? productDimensionTypeAmount : productDimensionTypeStyle,\n freePriceText: priceFree,\n originalPriceText,\n currentPriceText\n }\n };\n return WishlistItem(currentProductProps)!;\n });\n }\n\n // Dismiss alert when addingToCart/removeItem\n private readonly _onDismiss = () => {\n this.setState({\n isOpen: false\n });\n };\n\n private readonly _renderHeading = (heading?: IHeadingData): JSX.Element | undefined => {\n if (!heading) {\n return undefined;\n }\n return (\n <MsDyn365.Text\n className='ms-wishlist-items__heading'\n tag={heading.tag || 'h2'}\n text={heading.text}\n editProps={{ onEdit: this.handleHeadingChange, requestContext: this.props.context.request }}\n />\n );\n };\n\n private readonly _addItemToCart = async (product: SimpleProduct, itemKey: string): Promise<void> => {\n const { context, data, resources, telemetry } = this.props;\n const { cart, productAvailability } = data;\n const { addedToCartSuccessMessage, addedToCartFailureMessage, invoiceInCartErrorMessage } = resources;\n\n const productInventoryInformation = this._getProductInventory({ ProductDetails: product }, productAvailability.result);\n\n if (context) {\n if (cart.result) {\n // Check if the product delivery mode is electronic\n const emailDeliveryModeCode = this.props.context.actionContext.requestContext.channel?.EmailDeliveryModeCode;\n\n const deliveryOptions = await getDeliveryOptionsAsync(\n {\n callerContext: this.props.context.actionContext,\n queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(this.props.context.actionContext)\n },\n [product.RecordId]\n );\n const validateQuantity = this.isQuantityValidationRequired();\n const quantity = this.respectQuantityLimits() ? product?.Behavior?.MinimumQuantity ?? 1 : 1;\n\n const addProductToCartInput = {\n product,\n count: quantity,\n enableStockCheck: context.app.config.enableStockCheck,\n availableQuantity: productInventoryInformation\n ? productInventoryInformation.ProductAvailableQuantity.AvailableQuantity\n : 0,\n additionalProperties: { validateQuantity: validateQuantity },\n isAddEmailDeliveryItemToCart:\n ArrayExtensions.hasElements(deliveryOptions) &&\n ArrayExtensions.hasElements(deliveryOptions[0].DeliveryOptions) &&\n deliveryOptions[0].DeliveryOptions[0].Code === emailDeliveryModeCode\n };\n\n cart.result\n .addProductToCart(addProductToCartInput)\n .then(async result => {\n if (result.status === 'SUCCESS') {\n this.setState({\n productId: product.RecordId,\n itemKey,\n userMessage: addedToCartSuccessMessage,\n statusCssString: 'success',\n messageGlyph: 'fas fa-check',\n isOpen: true\n });\n } else if (result.substatus === 'MAXQUANTITY') {\n const curQuantity =\n (await cart).cart?.CartLines?.find(item => item.ProductId === product.RecordId)?.Quantity || 0;\n const maxQtyLimitReachedMessage = this._getInventoryValueMessage(productInventoryInformation, curQuantity);\n\n this.setState({\n productId: product.RecordId,\n itemKey,\n userMessage: maxQtyLimitReachedMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n } else if (result.substatus === 'QUANTITYLIMITS' && validateQuantity) {\n const maxQtyLimitReachedMessage = result.errorDetails?.LocalizedMessage!;\n\n this.setState({\n productId: product.RecordId,\n itemKey,\n userMessage: maxQtyLimitReachedMessage || addedToCartFailureMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n } else if (result.substatus === 'INVOICEINCART') {\n this.setState({\n productId: product.RecordId,\n itemKey,\n userMessage: result.errorDetails?.LocalizedMessage || invoiceInCartErrorMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n } else {\n this.props.telemetry.debug('[wishlist-items] Unable to Update Cart Line from the wishlist');\n this.setState({\n productId: product.RecordId,\n itemKey,\n userMessage: addedToCartFailureMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n }\n })\n .catch(error => {\n telemetry.warning(error);\n telemetry.debug('[wishlist-items] Error trying to Update Cart Line from the wishlist');\n this.setState({\n productId: product.RecordId,\n itemKey,\n userMessage: addedToCartFailureMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n });\n }\n }\n };\n\n private isQuantityValidationRequired = (): boolean => {\n const isChannelQuantityLimitsFeatureEnabledInHq =\n this.props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.EcommerceQuantityLimitConfigurationsFeature'\n )?.IsEnabled || false;\n\n const isOrderQuantityLimitsFeatureEnabled = this.isOrderQuantityLimitsFeatureEnabled();\n return isOrderQuantityLimitsFeatureEnabled || isChannelQuantityLimitsFeatureEnabledInHq;\n };\n\n private respectQuantityLimits = (): boolean => {\n const isOrderQuantityLimitsFeatureEnabled = this.isOrderQuantityLimitsFeatureEnabled();\n const validateLimitsPerLine = this.props.data.cartConfiguration?.result?.ValidateDefaultOrderSettingsPerLine ?? false;\n return isOrderQuantityLimitsFeatureEnabled && validateLimitsPerLine;\n };\n\n private isOrderQuantityLimitsFeatureEnabled = (): boolean => {\n const isOrderQuantityLimitsFeatureEnabledInHq =\n this.props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature'\n )?.IsEnabled || false;\n\n if (!isOrderQuantityLimitsFeatureEnabledInHq) {\n return false;\n }\n\n const useSiteBuilderSettings = this.props.data.featureState.result?.find(\n featureState => featureState.Name === 'RevertToSiteBuilderOrderQuantityLimitsSettings'\n )?.IsEnabled;\n\n if (useSiteBuilderSettings) {\n const defaultOrderQuantityLimitsFeatureConfig = this.props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits;\n\n const customerInfo = this.props.data.customerInformation.result;\n\n const isOrderQuantityLimitsFeatureEnabledInSiteSettings =\n defaultOrderQuantityLimitsFeatureConfig === 'all' ||\n ((customerInfo &&\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b))) ??\n false);\n\n return isOrderQuantityLimitsFeatureEnabledInSiteSettings;\n } else {\n const cartConfiguration = this.props.data.cartConfiguration?.result;\n return !(cartConfiguration?.IgnoreOrderSettings ?? false);\n }\n };\n\n private readonly _removeItemFromWishlist = (productId: number): void => {\n const { context, data, telemetry } = this.props;\n const { wishlists } = data;\n let noLongerLineExist: CommerceListLine[] | undefined = [];\n if (context && context.actionContext) {\n const userToken = context.request.user.isAuthenticated && context.request.user.token;\n const wishlistLineId = this._getWishlistLineIdFromProductId(productId);\n if (userToken && wishlists.result && wishlists.result[0] && wishlistLineId) {\n removeLinesAsync({ callerContext: context.actionContext }, wishlists.result[0].Id, [{ LineId: wishlistLineId }])\n .then(commerceList => {\n const castCommerceList: CommerceList | null = commerceList as CommerceList | null;\n\n if (castCommerceList && castCommerceList.Id && context.request.user.isAuthenticated) {\n noLongerLineExist = this._getProductsNoLongerExists(castCommerceList);\n if (noLongerLineExist && noLongerLineExist.length > 0) {\n this._removeNoLongerExistsLines(noLongerLineExist);\n } else {\n context.actionContext.update(createGetByCustomerInput({}, null), [castCommerceList]);\n getItemsInWishlists(new ActiveWishlistInput(), context.actionContext)\n .then(products => {\n const castSimpleProducts: FullProduct[] | null = products as FullProduct[] | null;\n if (castSimpleProducts && castSimpleProducts.length > 0) {\n this.setState({ isError: false });\n context.actionContext.update(new ActiveWishlistInput(), castSimpleProducts);\n }\n })\n .catch(error => {\n telemetry.warning('[wishlist-items] Unable to hyderate the wishlist with product information');\n telemetry.error(error);\n });\n }\n }\n })\n .catch(error => {\n telemetry.warning('[wishlist-items] Unable remove items from the wishlist');\n telemetry.error(error);\n });\n } else {\n telemetry.warning(\"[wishlist-items] Unable remove items from the wishlist user token or lineItemID wasn't found\");\n }\n }\n };\n\n private _getInventoryValueMessage(product: IProductInventoryInformation | undefined, curQuantity: number): string {\n const { context, resources } = this.props;\n const { maxQuantityLimitText } = resources;\n\n const maxQuantityForLineItem = updateMaxQuantityForCartLineItem(context.app.config.maxQuantityForCartLineItem);\n\n if (!product || !product.ProductAvailableQuantity.AvailableQuantity || !context.app.config.enableStockCheck) {\n return maxQuantityLimitText\n .replace('{maxQuantity}', maxQuantityForLineItem.toString())\n .replace('{curQuantity}', curQuantity.toString());\n }\n\n const minInventory = Math.min(maxQuantityForLineItem, product.ProductAvailableQuantity.AvailableQuantity);\n\n return maxQuantityLimitText.replace('{maxQuantity}', minInventory.toString()).replace('{curQuantity}', curQuantity.toString());\n }\n\n private _getProductInventory(\n product: FullProduct,\n productInventoryCollection: IProductInventoryInformation[] | undefined\n ): IProductInventoryInformation | undefined {\n if (productInventoryCollection && productInventoryCollection.length > 0) {\n for (const productResult of productInventoryCollection) {\n if (product.ProductDetails.RecordId === productResult.ProductAvailableQuantity.ProductId) {\n return productResult;\n }\n }\n }\n return undefined;\n }\n\n private readonly _inventoryLabel = (product: FullProduct): string | undefined => {\n const { productAvailability } = this.props.data;\n if (productAvailability && productAvailability.result) {\n const productInventoryInformation = this._getProductInventory(product, productAvailability.result);\n if (productInventoryInformation) {\n return productInventoryInformation.StockLevelLabel;\n }\n }\n\n return undefined;\n };\n\n private readonly _inventoryClassName = (product: FullProduct): string | undefined => {\n const { productAvailability } = this.props.data;\n if (productAvailability && productAvailability.result) {\n const productInventoryInformation = this._getProductInventory(product, productAvailability.result);\n if (productInventoryInformation && productInventoryInformation.StockLevelCode) {\n return `ms-wishlist-items__${productInventoryInformation.StockLevelCode.toLowerCase()}`;\n }\n }\n\n return undefined;\n };\n\n private readonly _isProductInStock = (product: FullProduct): boolean => {\n const { data, context } = this.props;\n const { productAvailability } = data;\n\n if (!context.app.config.enableStockCheck) {\n return true;\n }\n\n if (!productAvailability.result || !product.ProductDetails) {\n return false;\n }\n\n for (const productResult of productAvailability.result) {\n if (\n productResult.ProductAvailableQuantity &&\n productResult.ProductAvailableQuantity.ProductId &&\n productResult.ProductAvailableQuantity.ProductId === product.ProductDetails.RecordId\n ) {\n return productResult.IsProductAvailable;\n }\n }\n\n return false;\n };\n\n private readonly _getWishlistLineIdFromProductId = (productId: number): number | null => {\n const { wishlists } = this.props.data;\n\n if (\n !wishlists.result ||\n wishlists.result.length === 0 ||\n !wishlists.result[0].CommerceListLines ||\n wishlists.result[0].CommerceListLines.length === 0\n ) {\n this.props.telemetry.error('Wishlist content is empty, module wont render.');\n return null;\n }\n\n const foundWishlistItem = wishlists.result[0].CommerceListLines.filter(commerceListLine => {\n return commerceListLine.ProductId === productId;\n });\n\n if (foundWishlistItem && foundWishlistItem[0].LineId) {\n return foundWishlistItem[0].LineId;\n }\n return null;\n };\n\n private readonly _getProductsNoLongerExists = (castCommerceList: CommerceList): CommerceListLine[] | undefined => {\n const noLongerExist: CommerceListLine[] | undefined = [];\n castCommerceList.CommerceListLines?.map(line => {\n const { products } = this.props.data;\n const productsList = products && (products as AsyncResult<FullProduct[]>).result!;\n\n const skipRemove = productsList.filter(product => product.ProductDetails.RecordId === line.ProductId);\n if (skipRemove.length === 0) {\n noLongerExist?.push({ LineId: line.LineId });\n }\n });\n return noLongerExist;\n };\n\n private readonly _removeNoLongerExistsLines = (noLongerLineExist: CommerceListLine[]) => {\n const { context, data, telemetry } = this.props;\n const { wishlists } = data;\n if (context && context.actionContext) {\n const userToken = context.request.user.isAuthenticated && context.request.user.token;\n if (userToken && wishlists.result && wishlists.result[0]) {\n removeLinesAsync({ callerContext: context.actionContext }, wishlists.result[0].Id, noLongerLineExist)\n .then(commerceList => {\n const castCommerceList: CommerceList | null = commerceList as CommerceList | null;\n if (castCommerceList && castCommerceList.Id && context.request.user.isAuthenticated) {\n context.actionContext.update(createGetByCustomerInput({}, null), [castCommerceList]);\n getItemsInWishlists(new ActiveWishlistInput(), context.actionContext)\n .then(products => {\n const castSimpleProducts: FullProduct[] | null = products as FullProduct[] | null;\n if (castSimpleProducts && castSimpleProducts.length > 0) {\n this.setState({ isError: true });\n context.actionContext.update(new ActiveWishlistInput(), castSimpleProducts);\n }\n })\n .catch(error => {\n telemetry.warning('[wishlist-items] Unable to hyderate the wishlist with product information');\n telemetry.error(error);\n });\n }\n })\n .catch(error => {\n telemetry.warning('[wishlist-items] Unable remove items from the wishlist');\n telemetry.error(error);\n });\n } else {\n telemetry.warning(\"[wishlist-items] Unable remove items from the wishlist user token or lineItemID wasn't found\");\n }\n }\n };\n}\n\nexport default WishlistItems;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n getPayloadObject,\n getTelemetryAttributes,\n INodeProps,\n ITelemetryContent,\n Module,\n Node\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { IWishlistItemViewProps } from '../..';\nimport { IWishlistItemsViewProps } from './wishlist-items';\n\nconst WishlistItemsView: React.FC<IWishlistItemsViewProps> = props => {\n const {\n WishlistItems,\n status,\n statusMessage,\n heading,\n Products,\n products,\n Product,\n ProductDetails,\n ProductDimensions,\n telemetryContent,\n statusNotExistsMessage\n } = props;\n\n return (\n <Module {...WishlistItems}>\n {heading}\n {statusNotExistsMessage}\n {status !== 'SUCCESS' && statusMessage}\n {Products && products && products.length > 0 && (\n <Node {...Products}>\n {products &&\n products.map(product => {\n return product && _renderItem(product, Product, ProductDimensions, ProductDetails, telemetryContent);\n })}\n </Node>\n )}\n </Module>\n );\n};\n\nconst _renderItem = (\n product: IWishlistItemViewProps,\n Product?: INodeProps,\n ProductDimensions?: INodeProps,\n ProductDetails?: INodeProps,\n telemetryContent?: ITelemetryContent\n): JSX.Element | null => {\n const {\n key,\n productImage,\n productLink,\n productPrice,\n productDimensions,\n addToCartButton,\n removeButton,\n productStatusMessage,\n entireProductLink,\n productName,\n productAriaLabel,\n inventoryInformation,\n productUnitOfMeasure\n } = product;\n const payLoad = getPayloadObject('click', telemetryContent!, '', key);\n const productAttributes = getTelemetryAttributes(telemetryContent!, payLoad);\n if (entireProductLink) {\n return (\n <Node key={key} className={Product!.className} {...Product}>\n <Node\n href={entireProductLink}\n className={classnames('entire-product-link ', ProductDetails!.className)}\n {...productAttributes}\n aria-label={productAriaLabel}\n tag={ProductDetails!.tag}\n >\n {productImage}\n {productName}\n {productDimensions && ProductDimensions && (\n <Node {...ProductDimensions}>\n {productDimensions.map(dimension => {\n return dimension;\n })}\n </Node>\n )}\n {productPrice}\n {productUnitOfMeasure}\n </Node>\n {inventoryInformation}\n {addToCartButton}\n {removeButton}\n {productStatusMessage}\n </Node>\n );\n }\n return (\n <Node key={key} className={Product!.className} {...Product}>\n {productImage}\n {productLink}\n {productDimensions && ProductDimensions && (\n <Node {...ProductDimensions}>\n {productDimensions.map(dimension => {\n return dimension;\n })}\n </Node>\n )}\n {productPrice}\n {addToCartButton}\n {removeButton}\n {productStatusMessage}\n </Node>\n );\n};\n\nexport default WishlistItemsView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { AddToCartBehavior } from '@msdyn365-commerce/components';\nimport MsDyn365, { getUrlSync } from '@msdyn365-commerce/core';\nimport { ICartIconViewProps, ICartViewProps, IFlyoutCartLineItemViewProps } from '@msdyn365-commerce-modules/cart';\nimport { Button, getPayloadObject, INodeProps, KeyCodes, Modal, Node, onTelemetryClick } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport React from 'react';\n\nimport { ICartIconProps as ICartIconExtensionProps } from '../definition-extensions/cart-icon.ext.props.autogenerated';\n\n/**\n * ICartIconViewState: Interface for Cart Icon View State.\n */\ninterface ICartIconViewState {\n isModalOpen: boolean;\n}\n\n/**\n * Render Cart lines.\n * @param cartLines - Flyout cart line view props.\n * @param props - Cart icon view props.-\n * @returns JSX Element.\n */\nconst renderCartlines = (cartLines: IFlyoutCartLineItemViewProps[] | undefined, props: ICartIconViewProps): JSX.Element[] | null => {\n if (!cartLines) {\n props.context.telemetry.error('Cartlines content is empty, module wont render');\n return null;\n }\n\n return cartLines.map((cartLine, index) => {\n const cartLineIndex = index;\n return (\n <Node {...props.miniCartItemWrapper} key={cartLineIndex}>\n <Node className={classnames(cartLine.storeLocation ? 'msc-cart-line__set-net-price' : '')}>{cartLine.cartline}</Node>\n {cartLine.storeLocation}\n {cartLine.remove}\n </Node>\n );\n });\n};\n\n/**\n * Initiate total price.\n * @param props - Cart icon view props.\n * @returns JSX Element.\n */\nconst renderTotalPrice = (props: ICartIconViewProps & ICartIconExtensionProps<{}>): JSX.Element | null => {\n const cart = props.data.cart.result ?? undefined;\n const price = cart && !cart.hasInvoiceLine && (cart.cart.TotalAmount || undefined);\n const totalPrice = price\n ? props.context.cultureFormatter.formatCurrency(price)\n : props.context.cultureFormatter.formatCurrency(props.resources.emptyPrice);\n return cart && !cart.hasInvoiceLine ? (\n <div className='ms-cart-icon__subTotalText'>\n <span className='ms-cart-icon__subTotalPriceText'>\n {props.resources.totalPriceFormatString}\n <span className='ms-cart-icon__subTotalPrice'>{totalPrice}</span>\n </span>\n </div>\n ) : (\n <></>\n );\n};\n\n/**\n * Initiate subtotal message.\n * @param props - Cart icon view props.\n * @returns JSX Element.\n */\nconst renderSubtotalMessage = (props: ICartIconViewProps & ICartIconExtensionProps<{}>): JSX.Element | null => {\n const cart = props.data.cart.result ?? undefined;\n return cart && !cart.hasInvoiceLine ? <p className='ms-cart-icon__subtotal-message'>{props.resources.subTotalMessage}</p> : null;\n};\n\n/**\n *\n * CartIconView component.\n * @extends {React.PureComponent<ICartIconViewProps>}\n */\nexport class CartIconView extends React.PureComponent<\n ICartViewProps & ICartIconViewProps & ICartIconExtensionProps<{}>,\n ICartIconViewState\n> {\n private isAutoDisplayTriggered: boolean;\n\n private readonly cartIconRef: React.RefObject<HTMLButtonElement> = React.createRef();\n\n public constructor(props: ICartViewProps & ICartIconViewState & ICartIconViewProps & ICartIconExtensionProps<{}>) {\n super(props);\n this.isAutoDisplayTriggered = false;\n this.state = {\n isModalOpen: false\n };\n }\n\n public componentDidMount(): void {\n if (MsDyn365.isBrowser) {\n window.addEventListener('keydown', this._escFunction, false);\n }\n }\n\n public componentWillUnmount(): void {\n if (MsDyn365.isBrowser) {\n window.removeEventListener('keydown', this._escFunction, false);\n }\n }\n\n /**\n * Render Cart Item count.\n * @returns JSX Element.\n */\n public render(): JSX.Element | null {\n const cart = this.props.data.cart.result ?? undefined;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- check config.\n const shouldShowMiniCart =\n cart?.isProductAddedToCart && this.props.context.app.config.addToCartBehavior === AddToCartBehavior.showMiniCart;\n if (shouldShowMiniCart) {\n if (!this.isAutoDisplayTriggered) {\n // First time trigger auto mini cart.\n this.setState({ isModalOpen: true });\n this.isAutoDisplayTriggered = true;\n } else if (!this.state.isModalOpen) {\n // If modal is closed, reset the flag.\n this.isAutoDisplayTriggered = false;\n }\n }\n return (\n <Node {...this.props.miniCartWrapper} {...this.props.renderModuleAttributes(this.props)}>\n <button onClick={this._openModal} className='ms-cart-icon-wrapper msc-btn' ref={this.cartIconRef}>\n {this.props.cartIcon}\n </button>\n <Node {...this._modalContainer()}>\n <Node className='ms-cart-icon__header msc-modal__header'>\n {this.props.flyoutTitle}\n {this._renderCartItemCount(this.props)}\n {this._renderCartCloseIcon()}\n </Node>\n <Node className='ms-cart-icon__body msc-modal__body'>\n {this.props.data.cart.result?.isEmpty ? this.props.slots.emptyCart : null}\n {this.props.checkoutBlockedDueToUnavailableFunds}\n <Node {...this.props.CartlinesWrapper}>{renderCartlines(this.props.cartlines, this.props)}</Node>\n </Node>\n <Node className='ms-cart-icon__footer msc-modal__footer'>\n {this.props.slots.promoContentItem}\n {renderTotalPrice(this.props)}\n {renderSubtotalMessage(this.props)}\n {this.props.checkoutAsSignInUserButton}\n {this.props.checkoutAsGuestButton}\n {this.props.data.cart.result?.isEmpty ? null : this.props.goToCartButton}\n <Node className='ms-cart-icon__btn-section'>\n {this.props.data.cart.result?.isEmpty ? (\n <Button\n className='ms-cart-icon__btn-backtoshopping'\n href={getUrlSync('home', this.props.context.actionContext)}\n >\n {this.props.resources.continueShoppingButtonTitle}\n </Button>\n ) : null}\n </Node>\n </Node>\n </Node>\n </Node>\n );\n }\n\n /**\n * Initiate modal container.\n * @returns Inode props.\n */\n private readonly _modalContainer = (): INodeProps => {\n return {\n tag: Modal,\n placement: 'bottom-end',\n hideArrow: true,\n className: 'ms-cart-icon__minicartmodal-container',\n wrapClassName: 'ms-cart-icon__minicartmodal',\n isOpen: this.state.isModalOpen,\n toggle: this.closeModal\n };\n };\n\n /**\n * Initiate open modal.\n */\n private readonly _openModal = (): void => {\n const payLoad = getPayloadObject('click', this.props.telemetryContent!, 'cart-icon', '');\n onTelemetryClick(this.props.telemetryContent!, payLoad, 'cart-icon');\n this.setState({\n isModalOpen: true\n });\n };\n\n /**\n * Initiate close modal.\n */\n private readonly closeModal = (): void => {\n this.cartIconRef.current?.focus();\n this.setState({\n isModalOpen: false\n });\n };\n\n /**\n * Initiate cart close Icon.\n * @returns JSX Element.\n */\n private readonly _renderCartCloseIcon = (): JSX.Element | null => {\n return <Button className='ms-cart-icon__btn-close' aria-label='Close' onClick={this.closeModal} />;\n };\n\n /**\n * Render Cart Item count.\n * @param props - Cart icon view props.\n * @returns JSX Element.\n */\n private readonly _renderCartItemCount = (props: ICartIconViewProps & ICartIconExtensionProps<{}>): JSX.Element | null => {\n const defaultCartItemCount: number = 0;\n\n const cartItemlength = props.data.cart.result ? props.data.cart.result.totalItemsInCart : defaultCartItemCount;\n const cartItemCount = `${cartItemlength} ${props.resources.items}`;\n\n return <Node className='ms-cart-icon__count'>{cartItemCount}</Node>;\n };\n\n /**\n * Handle escape click to close modal.\n * @param event - On press of any key.\n */\n private readonly _escFunction = (event: KeyboardEvent) => {\n if (event.keyCode === KeyCodes.Escape && this.state.isModalOpen) {\n this.closeModal();\n }\n };\n}\n\nexport default CartIconView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { CartLinePriceEditor, ICartLinePriceEditorResources, PriceComponent } from '@msdyn365-commerce/components';\nimport MsDyn365, {\n IComponentProps,\n IGridSettings,\n IImageSettings,\n Image,\n isChannelTypeB2B,\n msdyn365Commerce\n} from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport {\n CartLine,\n ChannelDeliveryOptionConfiguration,\n DiscountLine,\n DiscountLineType,\n ProductCatalog,\n ProductDimensionType,\n SalesLine,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions, StringExtensions, 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 /**\n * Price Editor Charges Text.\n */\n priceEditorResources?: ICartLinePriceEditorResources;\n\n /**\n * Sales agreement price prompt text.\n */\n salesAgreementPricePrompt?: string;\n\n /**\n * Shipping text.\n */\n shippingText?: string;\n\n /**\n * Confirmed Ship Date Label.\n */\n confirmedShipDateLabel?: string;\n\n /**\n * Request Delivery Date Label.\n */\n requestDeliveryDateLabel?: string;\n}\n\n/**\n * Represents cart line data interface.\n */\ninterface ICartLineData {\n cartLine: CartLine | SalesLine;\n cartState?: ICartState;\n product?: SimpleProduct;\n catalogs?: ProductCatalog[];\n}\n\n/**\n * ICartLineProps: The props required to render cartLineitem.\n */\nexport interface ICartLineProps extends IComponentProps<ICartLineData> {\n /**\n * The flag to change the quantity component from interactible 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 delivery location.\n */\n deliveryLocation?: string;\n\n /**\n * Quantity onChange callback.\n */\n quantityOnChange?(cartLine: CartLine, newQuantity: number): boolean;\n priceCurrency?: string;\n\n /**\n * Sales line confirmed ship date.\n */\n confirmedShipDate?: string;\n\n /**\n * Sales line request delivery date.\n */\n requestDeliveryDate?: string;\n}\n\n/**\n * Represents dimensions strings.\n */\ninterface IDimensionStrings {\n /**\n * String for size key.\n */\n sizeString: string;\n\n /**\n * String for color key.\n */\n colorString: string;\n\n /**\n * String associated with the configuration product dimension.\n */\n configString: string;\n\n /**\n * String for style key.\n */\n styleString: string;\n\n /**\n * String for amount key.\n */\n amountString?: string;\n}\n\n/**\n * Renders catalog label for the cart line.\n * @param props - Cart line props.\n * @returns Catalog label.\n */\nconst CatalogLabelComponent: React.FC<ICartLineProps> = (props: ICartLineProps) => {\n const catalogId = props.data.cartLine.CatalogId;\n validateCatalogId(catalogId);\n\n if (!isChannelTypeB2B(props.context.actionContext.requestContext) || !catalogId || !ArrayExtensions.hasElements(props.data.catalogs)) {\n return null;\n }\n\n const catalog = props.data.catalogs.find(item => item.RecordId === catalogId);\n\n if (!catalog || !catalog.Name) {\n return null;\n }\n\n return <div className='msc-cart-line__catalog-label'>{catalog.Name}</div>;\n};\n\nconst cartLineItemFunctions = {\n /**\n * Render product dimensions.\n * @param product - Product data.\n * @param dimensionStrings - Dimension strings interface.\n * @returns JSX Element.\n */\n renderProductDimensions: (product: SimpleProduct, dimensionStrings: IDimensionStrings) => {\n if (!product.Dimensions) {\n return [];\n }\n\n return product.Dimensions.map(productDimension => {\n if (productDimension.DimensionTypeValue === ProductDimensionType.Color) {\n return (\n <div key={`${product.RecordId}ProductDimensions1`} className='msc-cart-line__product-variant-item'>\n <span className='msc-cart-line__product-variant-color'>\n {dimensionStrings.colorString}\n {': '}\n <span className='name'>{productDimension.DimensionValue?.Value}</span>\n </span>\n </div>\n );\n }\n\n if (productDimension.DimensionTypeValue === ProductDimensionType.Configuration) {\n return (\n <div key={`${product.RecordId}ProductDimensions2`} className='msc-cart-line__product-variant-item'>\n <span className='msc-cart-line__product-configuration'>\n {dimensionStrings.configString}\n {': '}\n <span className='name'>{productDimension.DimensionValue?.Value}</span>\n </span>\n </div>\n );\n }\n\n if (productDimension.DimensionTypeValue === ProductDimensionType.Size) {\n return (\n <div key={`${product.RecordId}ProductDimensions3`} className='msc-cart-line__product-variant-item'>\n <span className='msc-cart-line__product-variant-size'>\n {dimensionStrings.sizeString}\n {': '}\n <span className='name'>{productDimension.DimensionValue?.Value}</span>\n </span>\n </div>\n );\n }\n\n if (productDimension.DimensionTypeValue === ProductDimensionType.Style) {\n return (\n <div key={`${product.RecordId}ProductDimensions4`} className='msc-cart-line__product-variant-item'>\n <span className='msc-cart-line__product-variant-style'>\n {product.IsGiftCard ? dimensionStrings.amountString : dimensionStrings.styleString}\n {': '}\n <span className='name'>{productDimension.DimensionValue?.Value}</span>\n </span>\n </div>\n );\n }\n return null;\n });\n },\n\n /**\n * Gets the react node for product unit of price display.\n * @param props - The cart line props.\n * @returns The node representing markup for unit of measure component.\n */\n renderProductUnitPrice: (props: ICartLineProps) => {\n if (!props.data.cartLine.Price) {\n return null;\n }\n const zeroQuantity: number = 0;\n return (\n <div className='msc-cart-line__product-unit-price'>\n <span>\n <PriceComponent\n data={\n props.data.cartLine.Quantity && props.data.cartLine.Quantity > zeroQuantity\n ? {\n price: {\n CustomerContextualPrice: props.data.cartLine.Price\n }\n }\n : {\n price: {\n CustomerContextualPrice: props.data.cartLine.Price\n }\n }\n }\n context={props.context}\n id={props.id}\n typeName={props.typeName}\n currencyCode={props.priceCurrency}\n />\n </span>\n </div>\n );\n },\n\n /**\n * Render discount lines.\n * @param props - The cart line props.\n * @returns JSX element.\n */\n renderDiscountLines: (props: ICartLineProps) => {\n if (!props.data.cartLine.DiscountLines || !ArrayExtensions.hasElements(props.data.cartLine.DiscountLines)) {\n return null;\n }\n\n /**\n * Get the updated discount percentage.\n * @param discountLine - The discount line.\n * @param cartLine - The cart line.\n * @returns The updated discount percentage.\n */\n const discountPercent = (discountLine: DiscountLine, cartLine: CartLine): number => {\n const numberZero = 0;\n const decimalPrecision = 2;\n const fullPercentage = 100;\n let updatedPercent: number = discountLine.Percentage ?? numberZero;\n\n if (\n (discountLine.Percentage === numberZero ||\n (discountLine.DiscountLineTypeValue && discountLine.DiscountLineTypeValue === DiscountLineType.TenderTypeDiscount)) &&\n cartLine.Price &&\n cartLine.Price > numberZero &&\n cartLine.Quantity &&\n cartLine.Quantity !== numberZero\n ) {\n const effectiveAmount = discountLine.EffectiveAmount ?? numberZero;\n updatedPercent = Number(\n ((effectiveAmount / (cartLine.Price * cartLine.Quantity)) * fullPercentage).toFixed(decimalPrecision)\n );\n }\n\n return updatedPercent;\n };\n\n return props.data.cartLine.DiscountLines.map((discountLine, index) => {\n return (\n <div key={discountLine.OfferId ?? index} className='msc-cart-line__product-discount'>\n <span>{discountLine.OfferName ? discountLine.OfferName : ''}</span>\n <span className='msc-cart-line-item-product-discount-price'>\n <PriceComponent\n data={\n props.isSalesLine\n ? {\n price: {\n // @ts-expect-error -- Auto suppressed.\n CustomerContextualPrice: props.data.cartLine.PeriodicDiscount\n }\n }\n : {\n price: {\n CustomerContextualPrice: discountLine.EffectiveAmount,\n BasePrice: discountLine.EffectiveAmount\n }\n }\n }\n context={props.context}\n id={props.id}\n typeName={props.typeName}\n currencyCode={props.priceCurrency}\n />\n </span>\n <span className='msc-cart-line__product-discount-percentage'>\n {` (${discountLine.Percentage !== undefined ? discountPercent(discountLine, props.data.cartLine) : ''}%)`}\n </span>\n </div>\n );\n });\n },\n\n /**\n * Render inventory label.\n * @param props - The cart line props.\n * @returns JSX element.\n */\n renderInventoryLabel: (props: ICartLineProps) => {\n const inventoryCssName = props.inventoryLabelClassName\n ? `msc-cart-line__product-inventory-label ${props.inventoryLabelClassName}`\n : 'msc-cart-line__product-inventory-label';\n\n return <p className={inventoryCssName}>{props.inventoryInformationLabel}</p>;\n },\n\n /**\n * Render shipping label.\n * @param props - The cart line props.\n * @returns JSX element.\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 (!ArrayExtensions.hasElements(shippingChargeLines)) {\n return undefined;\n }\n\n const defaultCharge: number = 0;\n const freightFee = shippingChargeLines.reduce((chargeTotal, chargeLine) => {\n return chargeTotal + (chargeLine.CalculatedAmount ?? defaultCharge);\n }, defaultCharge);\n\n const priceComponent = (\n <PriceComponent\n data={{\n price: {\n CustomerContextualPrice: freightFee\n }\n }}\n freePriceText='Free'\n context={props.context}\n id={props.id}\n typeName={props.typeName}\n className='msc-cart-line__freight-actual'\n currencyCode={props.priceCurrency}\n />\n );\n return (\n <>\n <label className='msc-cart-line__freight-label'>{`${props.resources.shippingChargesText}:`}</label>\n <span className='shipping-value'>{priceComponent}</span>\n </>\n );\n },\n\n /**\n * Render other charges.\n * @param props - The cart line props.\n * @returns JSX element.\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?.map((otherCharge, index) => {\n const itemIndex = index;\n return otherCharge.CalculatedAmount ? (\n <div className='msc-cart-line__other-charges' key={itemIndex}>\n <label className='msc-cart-line__other-charges-label'>{`${String(otherCharge.Description)}:`}</label>\n <span className='other-charge-value'>\n <PriceComponent\n data={{\n price: {\n CustomerContextualPrice: otherCharge.CalculatedAmount\n }\n }}\n context={props.context}\n id={props.id}\n typeName={props.typeName}\n className='msc-cart-line__other-charges-actual'\n currencyCode={props.priceCurrency}\n />\n </span>\n </div>\n ) : (\n ''\n );\n }) ?? 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 // eslint-disable-next-line @typescript-eslint/no-magic-numbers -- We use 0 to indicate no sales agreement applied on the cart line.\n if (props.data.cartLine.SalesAgreementLineRecordId === 0) {\n return null;\n }\n return <div className='msc-cart-line__sales-agreement-prompt'>{props.resources.salesAgreementPricePrompt}</div>;\n },\n\n renderConfirmedShipDate: (props: ICartLineProps) => {\n if (!props.isSalesLine || props.confirmedShipDate === undefined || StringExtensions.isNullOrEmpty(props.confirmedShipDate)) {\n return null;\n }\n return (\n <div className='msc-cart-line__confirmed-ship-date'>\n <span className='msc-cart-line__confirmed-ship-date-label'>{props.resources.confirmedShipDateLabel}</span>\n <span className='msc-cart-line__confirmed-ship-date-value'>{props.confirmedShipDate}</span>\n </div>\n );\n },\n\n renderRequestDeliveryDate: (props: ICartLineProps) => {\n if (!props.isSalesLine || props.requestDeliveryDate === undefined || StringExtensions.isNullOrEmpty(props.requestDeliveryDate)) {\n return null;\n }\n return (\n <div className='msc-cart-line__request-delivery-date'>\n <span className='msc-cart-line__request-delivery-date-label'>{props.resources.requestDeliveryDateLabel}</span>\n <span className='msc-cart-line__request-delivery-date-value'>{props.requestDeliveryDate}</span>\n </div>\n );\n }\n};\n\n/**\n * Render cartline component.\n * @param props - The cart line props.\n * @returns JSX element.\n */\n// eslint-disable-next-line no-redeclare\nconst CartLine: React.FC<ICartLineProps> = (props: ICartLineProps) => {\n const { isSalesLine, productUrl, resources } = props;\n const { product, cartLine } = props.data;\n\n const destructDimensionStrings = {\n sizeString: resources.sizeString,\n colorString: resources.colorString,\n styleString: resources.styleString,\n configString: resources.configString,\n amountString: resources.amountString\n };\n\n const fallbackImageUrl =\n product &&\n getFallbackImageUrl(\n product.ItemId,\n props.context.actionContext.requestContext.apiSettings,\n props.context.request.app?.config?.OmniChannelMedia\n );\n const productDimensions = product && cartLineItemFunctions.renderProductDimensions(product, destructDimensionStrings);\n const renderProductUnitPrice = cartLineItemFunctions.renderProductUnitPrice(props);\n const imageSettings = props.imageSettings;\n if (imageSettings) {\n imageSettings.cropFocalRegion = true;\n }\n const renderDiscountLines = cartLineItemFunctions.renderDiscountLines(props);\n const renderInventoryLabel = cartLineItemFunctions.renderInventoryLabel(props);\n const renderShippingLabel = cartLineItemFunctions.renderShippingLabel(props);\n const renderOtherCharges = cartLineItemFunctions.renderOtherCharges(props);\n const renderConfirmedShipDate = cartLineItemFunctions.renderConfirmedShipDate(props);\n const renderRequestDeliveryDate = cartLineItemFunctions.renderRequestDeliveryDate(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 const cartLineContentClassName = props.data.cartLine.IsInvoiceLine ? 'msc-cart-line__invoice-content' : 'msc-cart-line__content';\n\n /**\n * Render other charges.\n * @param newValue - The cart line props.\n * @returns Boolean.\n */\n const onChange = (newValue: number): boolean => {\n if (props.quantityOnChange) {\n return props.quantityOnChange(props.data.cartLine, newValue);\n }\n return true;\n };\n\n /**\n * Generate error message.\n * @returns JSX element.\n */\n const generateErrorMessage = (): JSX.Element | null => {\n if (props.errorMessage) {\n return (\n <div className='msc-alert__header'>\n <span className='msi-exclamation-triangle' />\n <span>{props.errorMessage}</span>\n </div>\n );\n }\n\n return null;\n };\n\n /**\n * Render Saving component.\n * @returns JSX element.\n */\n const renderSaving = (): JSX.Element | null => {\n if (!props.data.cartLine.DiscountAmount) {\n return null;\n }\n const discountAmountZero: number = 0;\n\n if (props.data.cartLine.DiscountAmount > discountAmountZero) {\n return (\n <>\n <span className='msc-cart-line__product-savings-label'>{`${props.resources.discountStringText || 'Discount'}`}</span>\n <PriceComponent\n data={\n props.isSalesLine\n ? {\n price: {\n // @ts-expect-error -- Auto suppressed.\n CustomerContextualPrice: props.data.cartLine.PeriodicDiscount\n }\n }\n : {\n price: {\n CustomerContextualPrice: props.data.cartLine.DiscountAmount,\n BasePrice: props.data.cartLine.DiscountAmount\n }\n }\n }\n context={props.context}\n id={props.id}\n typeName={props.typeName}\n className='msc-cart-line__product-savings-text'\n currencyCode={props.priceCurrency}\n />\n </>\n );\n }\n return null;\n };\n\n /**\n * Gets the react node for product unit of measure display.\n * @returns The node representing markup for unit of measure component.\n */\n const renderUnitOfMeasure = () => {\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 if (!product || !product.DefaultUnitOfMeasure) {\n return undefined;\n }\n\n return (\n <div className='msc-cart-line__product-unit-of-measure'>\n <span>{product.DefaultUnitOfMeasure}</span>\n </div>\n );\n };\n\n /**\n * Generate quantity and price component.\n * @returns JSX element.\n */\n const generateQuantityAndPrice = (): JSX.Element[] | null => {\n const nodes = [];\n const defaultMaxQuantity: number = 10;\n const singleQuantity: number = 1;\n const unitOfMeasure = renderUnitOfMeasure();\n\n // No quantity selector for invoice line\n if (!props.data.cartLine.IsInvoiceLine) {\n if (props.data.product && props.isQuantityEditable) {\n nodes.push(\n <div className='msc-cart-line__product-quantity'>\n <div className='msc-cart-line__product-quantity-label'>{resources.quantityDisplayString}</div>\n\n {generateErrorMessage()}\n\n <IncrementalQuantity\n id={`msc-cart-line__quantity_${props.data.product.RecordId}-\n ${String(props.data.cartLine.DeliveryMode)}-${String(props.data.cartLine.LineId)}`}\n max={props.maxQuantity ?? defaultMaxQuantity}\n currentCount={props.currentQuantity}\n onChange={onChange}\n inputQuantityAriaLabel={resources.inputQuantityAriaLabel}\n decrementButtonAriaLabel={resources.decrementButtonAriaLabel}\n incrementButtonAriaLabel={resources.incrementButtonAriaLabel}\n key={props.data.cartLine.LineId}\n disabled={!props.isCartStateReady}\n isGiftCard={props.data.product.IsGiftCard ?? props.isOutOfStock}\n telemetryContent={props.telemetryContent}\n />\n {unitOfMeasure}\n </div>\n );\n } else {\n nodes.push(\n <div\n className={classNames('msc-cart-line__quantity', {\n 'single-quantity': props.data.cartLine.Quantity === singleQuantity\n })}\n >\n {unitOfMeasure}\n <label className='quantity-label' htmlFor='quantity'>\n {resources.quantityDisplayString}\n {': '}\n </label>\n\n {generateErrorMessage()}\n\n <span className='quantity-value'>{props.data.cartLine.Quantity}</span>\n </div>\n );\n }\n }\n\n nodes.push(\n <div className='msc-cart-line__product-savings'>\n <PriceComponent\n data={\n isSalesLine\n ? {\n price: {\n CustomerContextualPrice: (props.data.cartLine as SalesLine).NetAmountWithAllInclusiveTax,\n BasePrice: (props.data.cartLine as SalesLine).GrossAmount\n }\n }\n : {\n price: {\n CustomerContextualPrice: (props.data.cartLine as CartLine).ExtendedPrice,\n BasePrice: props.data.cartLine.NetPrice\n }\n }\n }\n context={props.context}\n id={props.id}\n typeName={props.typeName}\n className='msc-cart-line__product-savings-actual'\n originalPriceText={resources.originalPriceText}\n currentPriceText={resources.currentPriceText}\n currencyCode={props.priceCurrency}\n />\n {renderSaving()}\n {props.isOutOfStock ? renderInventoryLabel : null}\n </div>\n );\n\n return nodes;\n };\n\n const _renderStoreLocation = (): JSX.Element | null => {\n if (cartLine && cartLine.FulfillmentStoreId) {\n return (\n <div className='msc-cart-line__content__bopis-method'>\n <span className='pick-up'>{props.deliveryLocation}</span>\n </div>\n );\n } else {\n return (\n <div className='msc-cart-line__content__bopis-method'>\n <span className='shipping'>{props.deliveryLocation}</span>\n </div>\n );\n }\n };\n\n return (\n <div className='msc-cart-line'>\n {MsDyn365.isBrowser ? (\n <a className={imgeClassName} href={productUrl} aria-label={productName} role='link'>\n <Image\n requestContext={props.context.actionContext.requestContext}\n aria-hidden='true'\n src={props.primaryImageUrl ?? 'empty'}\n fallBackSrc={fallbackImageUrl}\n altText={productName}\n gridSettings={props.gridSettings}\n imageSettings={imageSettings}\n loadFailureBehavior='empty'\n />\n </a>\n ) : null}\n <div className={cartLineContentClassName}>\n <div className='msc-cart-line__product'>\n <CatalogLabelComponent {...props} />\n {MsDyn365.isBrowser ? (\n <a className='msc-cart-line__product-title' href={productUrl} {...productAttribute}>\n {productName}\n </a>\n ) : null}\n {ArrayExtensions.hasElements(productDimensions) ? (\n <div className='msc-cart-line__product-variants'>{productDimensions}</div>\n ) : (\n ''\n )}\n <div className='msc-cart-line__product-price'>\n <PriceComponent\n data={\n isSalesLine\n ? {\n price: {\n CustomerContextualPrice: (props.data.cartLine as SalesLine).NetAmountWithAllInclusiveTax,\n BasePrice: (props.data.cartLine as SalesLine).GrossAmount\n }\n }\n : {\n price: {\n CustomerContextualPrice: (props.data.cartLine as CartLine).ExtendedPrice,\n BasePrice: props.data.cartLine.NetPrice\n }\n }\n }\n context={props.context}\n id={props.id}\n typeName={props.typeName}\n className='msc-cart-line__product-discount-value'\n currencyCode={props.priceCurrency}\n />\n {renderConfirmedShipDate}\n {renderRequestDeliveryDate}\n {renderUnitOfMeasure()}\n </div>\n {renderProductUnitPrice}\n {renderInventoryLabel}\n {renderDiscountLines}\n {props.showShippingChargesForLineItems && <div className='msc-cart-line__freight'>{renderShippingLabel}</div>}\n {renderOtherCharges}\n {renderSalesAgreementPrompt}\n </div>\n {generateQuantityAndPrice()}\n {renderSalesAgreementPrompt}\n {props.data.cartLine.IsInvoiceLine && props.data.cartState && props.resources.priceEditorResources && (\n <CartLinePriceEditor\n className='msc-cart-line__price-editor-container'\n context={props.context}\n resources={props.resources.priceEditorResources}\n cartState={props.data.cartState}\n cartLine={props.data.cartLine}\n />\n )}\n {_renderStoreLocation()}\n </div>\n </div>\n );\n};\n\n// @ts-expect-error\nexport const CartLineItemComponent: React.FunctionComponent<ICartLineProps> = msdyn365Commerce.createComponentOverride<ICartline>(\n 'CartLineItem',\n {\n component: CartLine,\n ...cartLineItemFunctions\n }\n);\n\nexport default CartLineItemComponent;\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 MsDyn365 from '@msdyn365-commerce/core';\nimport { IHeaderViewProps, Logo } from '@msdyn365-commerce-modules/header';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { IHeaderProps } from '../definition-extensions/header.ext.props.autogenerated';\n\n/**\n * GridSizes.\n */\nexport type GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\n/**\n *\n * HeaderView component.\n * @extends {React.PureComponent<IHeaderViewProps>}\n */\nexport class HeaderView extends React.PureComponent<IHeaderViewProps & IHeaderProps<{}>> {\n private readonly menuNode: React.RefObject<HTMLDivElement>;\n\n public constructor(props: IHeaderViewProps & IHeaderProps<{}>) {\n super(props);\n this.menuNode = React.createRef();\n }\n\n public componentDidMount(): void {\n if (this.props.config.useStickyHeader) {\n // Set header update methods to trigger on scroll\n if (MsDyn365.isBrowser) {\n window.addEventListener('scroll', () => {\n this._configureStickyHeader();\n });\n }\n this._configureStickyHeader();\n }\n }\n\n public render(): JSX.Element | null {\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Cannot change the prop names as props are from business logic.\n const {\n HeaderTag,\n HeaderContainer,\n HeaderTopBarContainer,\n Divider,\n MobileMenuContainer,\n MobileMenuBodyContainer,\n MobileMenuLinksContainer\n } = this.props;\n\n return (\n <Module {...HeaderTag}>\n <Node {...HeaderContainer}>\n <Node {...HeaderTopBarContainer}>\n <div className='desktop-navicon-container' ref={this.menuNode}>\n {this._renderReactFragment(this.props.menuBar)}\n </div>\n <div className='mobile-navicon-container'>{this.props.navIcon}</div>\n {this.props.logo}\n {this._renderMobileLogo()}\n {this._renderReactFragment(this.props.search)}\n {this.props.preferredStore}\n {this.props.currentDistributor}\n {this._renderAccountBlock(this.props)}\n <Node {...Divider} />\n {this.props.cartIcon}\n {this._renderReactFragment(this.props.siteOptions)}\n </Node>\n <Node {...MobileMenuContainer}>\n <Node {...MobileMenuBodyContainer}>\n {this.props.MobileMenuHeader}\n {this._renderReactFragment(this.props.menuBar)}\n <Node {...MobileMenuLinksContainer}>\n {this.props.accountLinks ? this.props.accountLinks.map(link => link) : false}\n {this.props.siteOptions}\n {this.props.wishListIconMobile}\n {this.props.signInLink}\n {this.props.signOutLink}\n </Node>\n </Node>\n </Node>\n </Node>\n </Module>\n );\n }\n\n /**\n * Function to update header.\n */\n private readonly _configureStickyHeader = (): void => {\n // Get heights of cookie and promotion banners\n const defaultValue = 0;\n const headerAlertsContainer: HTMLElement | null = document.querySelector('.ms-promo-banner');\n const bannerHeights = headerAlertsContainer ? headerAlertsContainer.offsetHeight : defaultValue;\n\n // Triggers opacity change of header\n const headerElement = document.querySelector('header .default-container');\n if (headerElement) {\n if (MsDyn365.isBrowser && document.documentElement.scrollTop > defaultValue) {\n headerElement.classList.add('lock-opaque');\n headerElement.classList.add('fixed');\n } else {\n headerElement.classList.remove('lock-opaque');\n headerElement.classList.remove('fixed');\n }\n }\n\n // Update sticky header position and opacity\n const stickyHeader: HTMLElement | null = document.querySelector('.desktop-navicon-container');\n const headerLogo: HTMLElement | null = document.querySelector('.ms-header__logo');\n\n if (stickyHeader && headerLogo) {\n // Fix center sticky header\n const navStickyPos = headerLogo.offsetHeight + bannerHeights;\n if (MsDyn365.isBrowser && document.documentElement.scrollTop > navStickyPos) {\n stickyHeader.classList.add('fixed');\n } else {\n stickyHeader.classList.remove('fixed');\n }\n }\n };\n\n private _renderMobileLogo(): JSX.Element | null {\n const { config, context, typeName } = this.props;\n return (\n <Logo\n {...{\n link: config.logoLink,\n image: config.mobileLogoImage ?? {},\n className: 'ms-header__mobile-logo',\n gridSettings: context.request.gridSettings,\n requestContext: context.request,\n typeName\n }}\n />\n );\n }\n\n /**\n * Function to render account block.\n * @param props - IHeaderViewProps.\n * @returns Returns JSX.Element | null.\n */\n private readonly _renderAccountBlock = (props: IHeaderViewProps): JSX.Element | null => {\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Cannot change the prop names as props are from business logic.\n const {\n AccountInfoDropdownParentContainer,\n AccountInfoDropdownPopoverConentContainer,\n accountInfoDropdownButton,\n signInLink\n } = props;\n if (AccountInfoDropdownParentContainer) {\n const accountClassName = classnames(AccountInfoDropdownParentContainer.className, 'account-desktop');\n if (AccountInfoDropdownPopoverConentContainer) {\n return (\n <Node {...AccountInfoDropdownParentContainer} className={accountClassName}>\n {accountInfoDropdownButton}\n <Node {...AccountInfoDropdownPopoverConentContainer}>{this._renderAccountDropdownLinks(props)}</Node>\n </Node>\n );\n } else if (signInLink) {\n return (\n <Node {...AccountInfoDropdownParentContainer} className={accountClassName}>\n {signInLink}\n </Node>\n );\n }\n }\n return null;\n };\n\n private readonly _renderAccountDropdownLinks = (props: IHeaderViewProps): JSX.Element | null => {\n const { isOBORequest, switchCustomerLink, accountLinks, signOutLink } = props;\n if (isOBORequest) {\n return (\n <>\n {switchCustomerLink}\n {signOutLink}\n {accountLinks ? <Node className='ms-profile-button-splitter' /> : false}\n {accountLinks ? accountLinks.map((link: React.ReactNode) => link) : false}\n </>\n );\n } else {\n return (\n <>\n {accountLinks ? accountLinks.map((link: React.ReactNode) => link) : false}\n {signOutLink}\n </>\n );\n }\n };\n\n /**\n * Function to render react fragment.\n * @param items - React nodes.\n * @returns Returns JSX.Element | null.\n */\n private readonly _renderReactFragment = (items: React.ReactNode[]): JSX.Element | null => {\n return (\n <>\n {ArrayExtensions.hasElements(items)\n ? items.map((slot: React.ReactNode) => {\n return <>{slot}</>;\n })\n : null}\n </>\n );\n };\n}\n\nexport default HeaderView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IImageData, IImageSettings, Image, Video } from '@msdyn365-commerce/core';\nimport {\n IMediaData,\n IMediaGalleryThumbnailItemViewProps,\n IMediaGalleryThumbnailsViewProps,\n IMediaGalleryViewProps,\n MediaType\n} from '@msdyn365-commerce-modules/media-gallery';\nimport { ArrayExtensions, getFallbackImageUrl } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, KeyCodes, Module, Node, NodeTag } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport React from 'react';\nimport { IPlayerData, IPlayerOptions, IVideoMetadata, Player } from '@msdyn365-commerce-modules/video-player-utilities';\n\ninterface IMediaGalleryItemsProps extends IMediaGalleryThumbnailItemViewProps {\n Video?: React.ReactElement;\n}\n\n/**\n * Render the thumbnail item images.\n * @param thumbnail - The carousel thumbnail line props.\n * @returns Return HTML having thumbnail container props with image.\n */\nconst renderThumbnailItem = (thumbnail: IMediaGalleryItemsProps): JSX.Element => {\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from media-gallery.tsx file\n const { ThumbnailItemContainerProps, Picture, Video } = thumbnail;\n\n return <Node {...ThumbnailItemContainerProps}>{Video ? Video : Picture}</Node>;\n};\n\n/**\n * Gets the thumbnail item to display media gallery images.\n * @param image - The media gallery images.\n * @param imageSettings - Image settings for the image gallery items.\n * @param imageId - Image id.\n * @param modifiedActiveIndex - Modified Index of the images when selection changes.\n * @param props - The Media gallery view props from business layer.\n * @returns Return thumbnail view props which will be used to render images.\n */\nconst GetThumbnailItemComponent = (\n image: IImageData,\n imageSettings: IImageSettings,\n imageId: number,\n modifiedActiveIndex: number,\n props: IMediaGalleryViewProps,\n mediaTypeValue?: MediaType\n): IMediaGalleryThumbnailItemViewProps => {\n let fallbackImage: string | undefined = '';\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Site level config can be of any type.\n const emptyPlaceHolderImage = props.context.app.config?.placeholderImageName as string;\n if (props.data.product.result) {\n fallbackImage = getFallbackImageUrl(\n props.data.product.result.ItemId,\n props.context.request.apiSettings,\n props.context.request.app?.config?.OmniChannelMedia\n );\n }\n if (emptyPlaceHolderImage && fallbackImage) {\n fallbackImage = `${fallbackImage},${emptyPlaceHolderImage}`;\n }\n\n /**\n * OnClick method of media gallery item.\n */\n const onClick = () => {\n props.callbackToggle?.();\n props.callbackThumbnailClick?.(imageId);\n props.state.activeIndex = imageId;\n };\n\n const classes = classnames(\n 'ms-media-gallery__thumbnail-item',\n modifiedActiveIndex === imageId ? 'ms-media-gallery__thumbnail-item-active' : ''\n );\n\n /**\n * Keydown event of media gallery item.\n * @param event - React.KeyboardEvent.\n */\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if (event.keyCode === KeyCodes.Enter) {\n event.preventDefault();\n onClick();\n }\n };\n const defaultIndex = 0;\n return {\n ThumbnailItemContainerProps: {\n tag: 'li' as NodeTag,\n className: classes,\n role: 'listitem',\n key: imageId\n },\n Picture: (\n <Node className='ms-fullscreen-section'>\n <Button\n aria-label={image.altText}\n className='msc-ss-carousel-vert-button-wrapper'\n onClick={onClick}\n onKeyDown={handleKeyDown}\n >\n <Image\n requestContext={props.context.actionContext.requestContext}\n className='ms-media-gallery__thumbnail'\n {...image}\n gridSettings={props.context.request.gridSettings!}\n imageSettings={props.config.thumbnailImageSettings ?? imageSettings}\n loadFailureBehavior='hide'\n imageFallbackOptimize={props.state.shouldUseOptimizedImage}\n fallBackSrc={\n props.context.request.app?.config?.OmniChannelMedia ? '' : imageId === defaultIndex ? fallbackImage : image.src\n }\n bypassHideOnFailure={imageId === defaultIndex}\n />\n </Button>\n <Node\n className={\n mediaTypeValue === MediaType.Video ? 'ms-fullscreen-section__video-overlay' : 'ms-fullscreen-section__overlay'\n }\n >\n <Button\n onKeyDown={handleKeyDown}\n title={\n mediaTypeValue === MediaType.Video ? props.resources.playVideoTitleText : props.resources.fullScreenTitleText\n }\n role='button'\n className={\n mediaTypeValue === MediaType.Video\n ? 'ms-fullscreen-section__video-play-icon'\n : 'ms-fullscreen-section__magnifying-glass-icon'\n }\n onClick={onClick}\n />\n </Node>\n </Node>\n )\n };\n};\n\n/**\n * Render the video player.\n * @param mediaData - Media Data\n * @param index - Index of the video\n * @param activeIndex - Active Index\n * @param imageSettings - Image settings\n * @param props - Media gallery view props\n * @returns - JSX.Element.\n */\nconst RenderVideo = (\n mediaData: IMediaData,\n index: number,\n activeIndex: number,\n imageSettings: IImageSettings,\n props: IMediaGalleryViewProps\n): IMediaGalleryItemsProps => {\n const videoData = mediaData.videoData;\n if (videoData) {\n const options: IPlayerOptions = props.config as IPlayerOptions;\n const playerResources = props.resources;\n const videoMetaData: IVideoMetadata = {};\n videoMetaData.videoId = videoData.id;\n videoMetaData.title = videoData.title;\n videoMetaData.duration = videoData.playTime;\n if (videoData.thumbnail) {\n videoMetaData.posterframeUrl = videoData.thumbnail.src;\n }\n if (videoData._links?.binaryReferences) {\n videoMetaData.videoBinaryReferences = videoData._links.binaryReferences;\n }\n const videoPlayerData: IPlayerData = { options, metaData: videoMetaData };\n\n const classes = classnames(\n 'ms-media-gallery__thumbnail-item',\n index === activeIndex ? 'ms-media-gallery__thumbnail-item-active' : ''\n );\n\n return {\n ThumbnailItemContainerProps: {\n tag: 'li' as NodeTag,\n className: classes,\n role: 'listitem',\n key: index\n },\n Picture: <></>,\n Video: (\n <Video className='ms-media-gallery__player' editProps={{ key: videoData, requestContext: props.context.request }}>\n <Player\n playerData={videoPlayerData}\n isEditor={props.context.request.params.isEditor}\n playerResources={playerResources}\n />\n </Video>\n )\n };\n }\n return GetEmptyThumbnailItemComponent(imageSettings, props);\n};\n\n/**\n * Gets the empty thumbnail item to display media gallery images.\n * @param imageSettings - Image settings for the image gallery items.\n * @param props - The Media gallery view props from business layer.\n * @returns Return thumbnail view props which will be used to render empty images.\n */\nconst GetEmptyThumbnailItemComponent = (\n imageSettings: IImageSettings,\n props: IMediaGalleryViewProps\n): IMediaGalleryThumbnailItemViewProps => {\n let fallbackImage: string | undefined = '';\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Site level config can be of any type.\n const emptyPlaceHolderImage = props.context.app.config?.placeholderImageName as string;\n\n if (props.data.product.result) {\n fallbackImage = getFallbackImageUrl(\n props.data.product.result.ItemId,\n props.context.request.apiSettings,\n props.context.request.app?.config?.OmniChannelMedia\n );\n }\n if (emptyPlaceHolderImage && fallbackImage) {\n fallbackImage = `${fallbackImage},${emptyPlaceHolderImage}`;\n }\n\n return {\n ThumbnailItemContainerProps: {\n tag: 'li' as NodeTag,\n className: 'ms-media-gallery__thumbnail-item',\n role: 'listitem',\n tabIndex: 0,\n key: 0,\n 'aria-label': ''\n },\n Picture: (\n <Image\n requestContext={props.context.actionContext.requestContext}\n className='ms-media-gallery__thumbnail-item__image'\n src='empty'\n gridSettings={props.context.request.gridSettings!}\n imageSettings={props.config.thumbnailImageSettings ?? imageSettings}\n loadFailureBehavior='empty'\n imageFallbackOptimize={!!props.config.skipImageValidation}\n fallBackSrc={fallbackImage}\n />\n )\n };\n};\n\n/**\n * Update media gallery items method.\n * @param items - The media gallery thumbnail item view props.\n * @returns The IImageData array.\n */\nconst getMediaGalleryItems = (items?: IMediaData[]): IMediaData[] | undefined => {\n return items?.map(item => {\n return {\n displayOrder: item.displayOrder,\n mediaTypeValue: item.mediaTypeValue,\n altText: item.altText,\n src: item.src,\n videoData: item.videoData\n };\n });\n};\n\nconst defaultThumbnailImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=295&h=295&q=80&m=6&f=jpg', w: 295, h: 295 },\n xl: { q: 'w=295&h=295&q=80&m=6&f=jpg', w: 295, h: 295 }\n },\n lazyload: true,\n cropFocalRegion: true\n};\n\n/**\n * Render the Media gallery thumbnails to represent images in grid view.\n * @param thumbnails - The thumbnail view props.\n * @param props - The media gallery view props.\n * @returns - The single slide carousel component to render as media gallery image.\n */\nconst renderThumbnails = (thumbnails: IMediaGalleryThumbnailsViewProps, props: IMediaGalleryViewProps): JSX.Element => {\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from media-gallery.tsx file\n const { ThumbnailsContainerProps, SingleSlideCarouselComponentProps } = thumbnails;\n const { state } = props;\n const mediaGalleryItems = getMediaGalleryItems(state.mediaGalleryItems);\n\n const items: IMediaGalleryItemsProps[] | undefined =\n // eslint-disable-next-line multiline-ternary -- need multiline for easy code reading\n state.lastUpdate && ArrayExtensions.hasElements(mediaGalleryItems) && mediaGalleryItems[0].src === 'empty'\n ? [GetEmptyThumbnailItemComponent(defaultThumbnailImageSettings, props)]\n : // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from media-gallery\n mediaGalleryItems?.map((item: IMediaData, id: number) => {\n if (item.mediaTypeValue === MediaType.Video) {\n if (props.config.allowFullScreen) {\n const videoThumbnail = item.videoData?.thumbnail;\n if (videoThumbnail) {\n return GetThumbnailItemComponent(\n videoThumbnail,\n defaultThumbnailImageSettings,\n id,\n state.activeIndex,\n props,\n item.mediaTypeValue\n );\n } else {\n return GetEmptyThumbnailItemComponent(defaultThumbnailImageSettings, props);\n }\n } else {\n return RenderVideo(item, id, state.activeIndex, defaultThumbnailImageSettings, props);\n }\n } else {\n return GetThumbnailItemComponent(item, defaultThumbnailImageSettings, id, state.activeIndex, props);\n }\n });\n\n return (\n <Node {...ThumbnailsContainerProps}>\n <Node {...SingleSlideCarouselComponentProps}>{items?.map(renderThumbnailItem)}</Node>\n </Node>\n );\n};\n\n/**\n * Render the Media gallery items using viewprops.\n * @param props - The media gallery view props.\n * @returns The media gallery module wrapping up images node.\n */\nconst mediaGalleryView: React.FC<IMediaGalleryViewProps> = props => {\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from media-gallery.tsx file\n const { CarouselProps, Thumbnails, MediaGallery, Modal } = props;\n\n // The thumbnails in AW theme aren't used as tabs\n const NewSingleSlideCarouselComponentProps = { ...Thumbnails.SingleSlideCarouselComponentProps, useTabList: false };\n const NewThumbnails = { ...Thumbnails, SingleSlideCarouselComponentProps: NewSingleSlideCarouselComponentProps };\n\n return (\n <Module {...MediaGallery}>\n <Node {...CarouselProps} />\n {Modal}\n {renderThumbnails(NewThumbnails, props)}\n </Module>\n );\n};\n\nexport default mediaGalleryView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { RatingComponent } from '@msdyn365-commerce/components';\nimport { ICoreContext } from '@msdyn365-commerce/core';\nimport { IHistogramItemViewProps, IRatingsHistogramData, IRatingsHistogramViewProps } from '@msdyn365-commerce-modules/ratings-reviews';\nimport { format, Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IRatingsHistogramProps, IRatingsHistogramResources } from '../definition-extensions/ratings-histogram.ext.props.autogenerated';\n\n/**\n * Histogram item.\n * @param props - Histogram Item ViewProps.\n * @returns Histogram Item node.\n */\nconst histogramItem = (props: IHistogramItemViewProps) => {\n return (\n <Node {...props.buttonProps}>\n {props.starLabel}\n {props.bar}\n </Node>\n );\n};\n\n/**\n * Average ratings.\n * @param data - Props data.\n * @param context - Histogram Item ViewProps.\n * @param typeName - Histogram Item ViewProps.\n * @param componentId - Histogram Item ViewProps.\n * @param resources - Module resource strings.\n * @returns Average ratings.\n */\nconst averageRating = (\n data: IRatingsHistogramData,\n context: ICoreContext,\n typeName: string,\n componentId: string,\n resources: IRatingsHistogramResources\n) => {\n const defaultAverageRating: number = 0;\n const reviewsCount = data.ratingsSummary.result?.reviewsCount ?? defaultAverageRating;\n const reviewsCountString = resources.numberOfReviewsString\n ? format(resources.numberOfReviewsString, reviewsCount)\n : `${reviewsCount} reviews`;\n\n return (\n <div className='ms-ratings-histogram__ratings'>\n <div className='ms-ratings-histogram__ratings__heading'>{data.ratingsSummary.result?.averageRating}</div>\n <div>\n <RatingComponent\n context={context}\n id={componentId}\n typeName={typeName}\n avgRating={data.ratingsSummary.result?.averageRating ?? defaultAverageRating}\n readOnly\n ariaLabel={format(resources.averageRatingAriaLabel, data.ratingsSummary.result?.averageRating, '5')}\n data={{}}\n />\n </div>\n <div className='ms-ratings-histogram__ratings__reviews'>{reviewsCountString}</div>\n </div>\n );\n};\n\n/**\n * Histogram view.\n * @param props - Ratings HistogramV iewProps.\n * @returns Histogram view module.\n */\nconst RatingsHistogramView: React.FC<IRatingsHistogramViewProps & IRatingsHistogramProps<{}>> = props => {\n const { heading, histogramItems, histogramProps, moduleProps, data, resources } = props;\n const context = props.context;\n const typeName = props.typeName;\n const moduleId = props.id;\n\n return (\n <Module {...moduleProps}>\n {heading}\n <div className='ms-ratings-histogram__container'>\n {averageRating(data, context, typeName, moduleId, resources)}\n <Node {...histogramProps}>\n {histogramItems.map(item => {\n return histogramItem(item);\n })}\n </Node>\n </div>\n </Module>\n );\n};\n\nexport default RatingsHistogramView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\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"],"names":["cartLineItemFunctions","renderProductDimensions","product","dimensionStrings","Dimensions","map","productDimension","_productDimension$Dim","_productDimension$Dim2","_productDimension$Dim3","_productDimension$Dim4","DimensionTypeValue","ProductDimensionType","Color","React","key","RecordId","className","colorString","DimensionValue","Value","Configuration","configString","Size","sizeString","Style","IsGiftCard","amountString","styleString","props","data","cartLine","Price","PriceComponent","Quantity","price","CustomerContextualPrice","context","id","typeName","DiscountLines","ArrayExtensions","hasElements","discountLine","index","_discountLine$OfferId","OfferId","OfferName","isSalesLine","PeriodicDiscount","EffectiveAmount","BasePrice","undefined","Percentage","discountPercent","_discountLine$Percent","updatedPercent","DiscountLineTypeValue","DiscountLineType","TenderTypeDiscount","_discountLine$Effecti","effectiveAmount","Number","toFixed","inventoryCssName","inventoryLabelClassName","inventoryInformationLabel","_props$context$reques","_cartline$ChargeLines","pickupDeliveryModeCode","request","channel","PickupDeliveryModeCode","channelDeliveryOptionConfig","cartline","hasShippingMethod","_channelDeliveryOptio","DeliveryMode","PickupDeliveryModeCodes","some","deliveryMode","shippingChargeLines","ChargeLines","filter","chargeLine","IsShipping","freightFee","reduce","chargeTotal","_chargeLine$Calculate","CalculatedAmount","priceComponent","freePriceText","resources","shippingChargesText","_cartline$ChargeLines2","_otherCharges$map","otherCharges","chargeline","otherCharge","itemIndex","String","Description","_product$Name","_props$primaryImageUr","productUrl","destructDimensionStrings","fallbackImageUrl","getFallbackImageUrl","ItemId","actionContext","requestContext","apiSettings","productDimensions","renderProductUnitPrice","imageSettings","cropFocalRegion","renderDiscountLines","renderInventoryLabel","renderShippingLabel","renderOtherCharges","payLoad","getPayloadObject","telemetryContent","toString","productAttribute","getTelemetryAttributes","productName","Name","imgeClassName","IsInvoiceLine","cartLineContentClassName","onChange","newValue","quantityOnChange","generateErrorMessage","errorMessage","renderUnitOfMeasure","app","config","unitOfMeasureDisplayType","DefaultUnitOfMeasure","href","Image","src","primaryImageUrl","fallBackSrc","altText","gridSettings","loadFailureBehavior","Object","assign","NetAmount","NetAmountWithoutTax","NetPrice","showShippingChargesForLineItems","generateQuantityAndPrice","nodes","unitOfMeasure","_props$maxQuantity","_props$data$product$I","isQuantityEditable","push","quantityDisplayString","IncrementalQuantity","LineId","max","maxQuantity","currentCount","currentQuantity","inputQuantityAriaLabel","decrementButtonAriaLabel","incrementButtonAriaLabel","disabled","isCartStateReady","isGiftCard","isOutOfStock","classNames","originalPriceText","currentPriceText","cartState","priceEditorResources","CartLinePriceEditor","PromoCode","constructor","super","_onInputChangeHandler","event","error","target","value","this","state","setState","promoCodeInputValue","canApply","_applyPromotion","appliedPromo","addPromoCode","promoCode","then","result","status","substatus","duplicatePromoCodeErrorText","invalidPromoCodeErrorText","catch","failedToAddPromoCodeErrorText","_onSubmitHandler","preventDefault","applyPromotionHandler","_renderForm","promoPlaceholderText","promoCodeApplyButtonText","attributes","onSubmit","placeholder","Button","title","onClick","_removePromotion","_event$currentTarget$","code","currentTarget","getAttribute","removePromoCodes","promoCodes","failedToRemovePromoCodeErrorText","_renderAppliedPromoCode","cart","Coupons","removePromotionHandler","coupon","ariaLabel","removePromoAriaLabelFormat","format","removePromoText","Code","TelemetryConstant","ApplyPromoCode","render","promoCodeHeadingText","HeaderView","_renderQuickViewIcon","quickOrderLink","_configureStickyHeader","headerAlertsContainer","document","querySelector","bannerHeights","offsetHeight","headerElement","MsDyn365","isBrowser","documentElement","scrollTop","classList","add","remove","stickyHeader","headerLogo","navStickyPos","_renderAccountBlock","AccountInfoDropdownParentContainer","AccountInfoDropdownPopoverConentContainer","accountInfoDropdownButton","signOutLink","signInLink","accountLinks","accountClassName","classnames","Node","link","_renderReactFragment","items","slot","menuNode","componentDidMount","useStickyHeader","window","addEventListener","HeaderTag","HeaderContainer","HeaderTopBarContainer","Divider","MobileMenuContainer","MobileMenuBodyContainer","MobileMenuLinksContainer","showQuickOrderLink","showPhoneNumber","phoneNumber","quickOrderUrl","getUrlSync","Module","navIcon","logo","_renderPhoneNumber","ref","menuBar","_renderMobileLogo","search","preferredStore","cartIcon","siteOptions","MobileMenuHeader","wishListIconMobile","telephoneLink","_config$mobileLogoIma","Logo","logoLink","image","mobileLogoImage","heading","histogramItems","histogramProps","moduleProps","moduleId","averageRating","componentId","_data$ratingsSummary$","_data$ratingsSummary$2","_data$ratingsSummary$3","_data$ratingsSummary$4","_data$ratingsSummary$5","_data$ratingsSummary$6","reviewsCount","ratingsSummary","reviewsCountString","numberOfReviewsString","RatingComponent","avgRating","readOnly","averageRatingAriaLabel","item","buttonProps","starLabel","bar","histogramItem","courseId","getExtensionPropertyValueByKey","properties","valueType","_properties$find","property","find","p","Key","ExtensionProperties","CommercePropertyValueEnum","string","COUPON_ATTRIBUTE_KEY","getCouponCodeMap","enteredCode","foundCode","couponMapping","c","_c$fromCouponCode","fromCouponCode","toUpperCase","_foundCode$toCouponCo","mondaysDate","formatDate","getMondayOfCurrentWeek","toCouponCode","tcc","date","_onInputChange","e","_cart","addAttributeToCart","attrKey","attrValue","_objectSpread","attributeArray","AttributeValues","attributeObj","TextValue","TextValueTranslations","attrIdx","findIndex","a","_a$Name","updateCart","newCartObject","removeAttributeFromCart","_a$Name2","additionalProperties","_calculateDiscount","CartLines","length","discountAmount","line","DiscountCode","DiscountCost","totalCouponDiscountAmount","_coupon$Code","appliedPromoCodeHeadingText","isCollapseOpen","shouldComponentUpdate","nextProps","getFullYear","getMonth","padStart","getDate","today","Date","day","getDay","diff","setDate","PromoCodeComponent","msdyn365Commerce","createComponentOverride","component","user","isOBORequest","changeUserSlug","accountLinksFiltered","forEach","node","linkUrl","_get","handleLoginRedirect","_this$props$data$acco","isAuthenticated","isHomePage","url","requestUrl","pathname","customer","accountInformation","URL","location","searchParams","has","delete","accountUrl","logoAnchorTag","renderRating","ratingId","totalRatings","_totalRatings$toStrin","numberRatings","ratingAriaLabel","rating","roundedRating","getRatingAriaLabel","ratingCount","ActiveProductComponent","_ref","savingsText","imageUrl","imgData","imageProps","renderProductPlacementImage","PrimaryImageUrl","productId","basePrice","adjustedPrice","AdjustedPrice","renderPrice","description","hideRating","AverageRating","TotalRatings","assembleNode","_item$links","headingNode","renderHeading","additionalContentHeading","Msdyn365","text","tag","editProps","onEdit","handleAdditionalTextChange","paragraphNode","subtext","renderParagraph","additionalContentParagraphText","linksNode","links","ctaLink","renderLinks","linkIndex","editableLink","linkText","destinationUrl","openInNewTab","isOpenInNewTab","role","onTextChange","handleAdditionalLinkTextChange","additionalContentNode","additionalContentContainer","additionalContentItemLinks","activeImageAdditionalContent","additionalContent","CanvasCalculations","CanvasStyles","ImageMapper","_isDesktopViewPort","_context","getActiveImageWidth","activeImageReferenceValue","activeImageRefs","current","clientWidth","getActiveImageHeight","clientHeight","convertHexToRgb","hexColor","RegExp","exec","rValue","parseInt","gValue","bValue","applyFadingTransition","coords","rgbColor","alpha","_this$_canvas$current","_this$_canvas$current2","halfDivisor","_canvas","getContext","buttonPadding","paddingAdjustment","buttonWidth","measureText","width","fillStyle","body","parentElement","fillText","drawButton","_this$_canvas$current3","_this$_canvas$current4","color","buttonTextClor","buttonHeight","buttonPositionX","buttonPositionY","arcsize","beginPath","moveTo","lineTo","arcTo","stroke","closePath","fill","expandAnimation","_this$props$imageMapp","buttonText","imageMapperResources","animationStartWidth","expandAnimationStartWidth","pointPositionX","pointPositionY","animationEndWidth","expandAnimationEndWidth","radius","expandRadius","rotation","startAngle","endAngle","textFadeInValue","textFadeInStartValue","buttonTextClorInRgb","toLocaleLowerCase","animate","_this$_canvas$current5","_this$_canvas$current6","ellipse","requestAnimationFrame","textFadeInterval","collapseAnimation","_this$props$imageMapp2","collapseAnimationStartWidth","collapseAnimationEndWidth","clearMargin","clearHeight","clearWidth","collapseRadius","textFadeOutValue","textFadeOutStartValue","_this$_canvas$current7","_this$_canvas$current8","clearRect","drawCircle","_this$_canvas$current9","_this$_canvas$current10","viewPort","doubleMultiplier","strokeStyle","arc","Math","PI","scaleCoords","imgWidth","defaultWidth","defaultScale","scale","coord","renderPrefilledAreas","areaMap","areas","area","computeCenter","scaledCoords","handleHoverOn","center","handleHoverOff","_this$_canvas$current11","canvasPositionX","defaultPositionX","canvasPositionY","defaultPositionY","height","click","hoverOn","onMouseEnter","hoverOff","onMouseLeave","renderAreas","_this$props$imageMapp3","_this$props$imageMapp4","_area$productSearchRe","xsRadius","extendedArea","areaKey","altTextWithProductName","replace","productSearchResult","shape","join","onFocus","onBlur","tabIndex","alt","initCanvas","_this$getActiveImageW","_this$getActiveImageH","_this$_canvas$current12","_backgroundImage","_container","onLoad","defaultHeight","canvasWidth","canvasHeight","style","componentDidUpdate","shouldRender","_requestContext$gridS","imageData","useMap","name","ActiveImageConstants","ActiveImage","_defaultProductCardWidth","_defaultProdutCardHight","_activePoints","addActivePoints","_product$PrimaryImage","areaId","updateClientWidth","viewport","isMobile","variant","VariantType","Browser","renderImageMapper","_this$props$config$ac","productResults","products","activePoints","configProduct","itemId","_configProduct$xPosit","_configProduct$yPosit","_configProduct$radius","getProductPageUrlSync","xPosition","yPosition","activePoint","JSON","stringify","mappedArea","_activeImageClass","enterArea","leaveArea","activeImage","_activeImageRefs","altTextForSeeMoreButtonWithProductName","seeMoreButtonText","overlayClass","type","open","resetState","renderProductComponent","_this$state$area","_this$state$area$prim","_product$ItemId","baseImageUrl","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","q","xl","lazyload","keyDown","enterKey","nodeName","escKey","handleTextChange","handleParagraphChange","paragraph","renderActiveImageDetailsLinks","_telemetryContent","linkData","contentAction","etext","linkId","willOpenInNewTab","handleLinkTextChange","renderActiveImageDetailsHeading","_heading$tag","renderActiveImageDetailsParagraph","getActiveImageId","activeImageId","_activeImageIdPart$","activeImageSource","split","decrementOne","_handleOutsideClick","_this$_productCardDiv","contains","getTelemetryObject","telemetryPageName","friendlyName","telemetry","setTimeout","timeoutInterval","images","getElementsByClassName","Array","from","removeAttribute","componentWillUnmount","removeEventListener","viewProps","activePointContainer","activePointDetailsContainer","imageMapper","overlay","productCard","productCardleftPosition","productCardtopPosition","detailsContainer","detailsContainerCta","handleAdditionalParagraphChange","handleAdditionalText","handleAdditionalParagraph","handleAdditionalLinkText","renderView","_this$props$config$ad","activeImageView","top","left","BulkPurchase","_errorCssClass","_errorCssGlyphClass","collapseRef","_dimensionDropDownChange","_this$collapseRef$cur","reEvaluateHeight","_onErrorMessage","stateMessage","messageText","statusCssString","messageGlyph","isOpen","_toggleCollapse","isExpanded","_this$props$data$prod","hasDimensionsInProps","hasDimensionsInData","container","content","_renderCollapseContent","_renderCollapseButton","_renderCollapse","bulkPurchaseHeaderTitle","Collapse","_renderMainContent","isMobileDevice","Viewport","userMessageNode","Alert","RichTextComponent","bulkPurchaseDescriptionText","_renderMatrix","_featureState$result","_this$props$data$orde","_this$props$data$cust","featureState","isMultipleCatalogsFeatureEnabled","IsEnabled","catalogId","getCatalogId","validateCatalogId","ProductDimensionsMatrix","dimensions","orderTemplates","customerInformation","dimensionOnChange","onErrorMessage","isMultipleCatalogFeatureEnabledInHq","BulkPurchaseViewComponent","async","validateCartAsync","propsContext","cartResult","cartVersion","shouldRetry","arguments","Version","warning","debug","AsyncResult","resolve","_validationResult$Val","validationResult","CartsDataActions","callerContext","bypassCache","Id","ValidationResultsByLineId","refreshCart","refreshError","validateError","cartLineQuantityUpdatedAsync","isQuantityLimitsFeatureEnabled","cartLineToUpdate","quantity","isUsingDefaultOrderSettingsMax","_modifiedProduct$Beha2","modifiedProduct","ProductId","Behavior","MaximumQuantity","input","cartLineId","newQuantity","updateLineResult","updateCartLineQuantity","message","getProductByProductId","getProductByProductIdAndWarehouse","warehouseId","targetWarehouseValue","WarehouseId","_product$Behavior","InventoryLocationId","ProductPickUpOptionsForCartLineItems","getCacheKey","buildCacheKey","getCacheObjectType","dataCacheType","getPickUpOptionsForCartLineItems","channelId","Error","getCartState","getActiveCartProductsAction","ActiveCartProductsInput","response","Promise","ProductsDataActions","queryResultSettings","QueryResultSettingsProxy","getPagingFromInputDataOrDefaultValue","createObservableDataAction","action","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","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","_context$request$chan","removeButtonText","removeItemClickHandler","moveToWishlistSuccessHandler","addToOrderTemplateButtonText","addToOrderTemplateButtonTooltip","addToOrderTemplateDialogResources","createOrderTemplateDialogResources","itemAddedToOrderTemplateDialogResources","duplicateItemsWhenAddingToOrderTemplateDialogResources","addToWishlistButtonText","removeFromWishlistButtonText","wishlists","defaultWishlistName","nameOfWishlist","availableQuantityInStock","isStockCheckEnabled","productAvailability","ProductAvailableQuantity","IsProductAvailable","AvailableQuantity","_getCartItemAvailableQuantity","_getCartItemMaxQuantity","maxQuantityByConfig","maxByQuantityLimitsFeature","maxByQuantityLimitsFeatureResult","maxCartlineQuantity","shouldSkipStockCheck","ItemTypeValue","ReleasedProductType","Service","ObjectExtensions","isNullOrUndefined","_getErrorMessage","lineId","_props$productAvailab","finalErrorMessages","productAvailabilites","outOfStockText","includeErrors","outOfRangeOneText","outOfRangeFormatText","checkForErrors","cartlinesErrors","ValidationResultsPairs","errorsFoundByLineId","i","ValidationFailures","validation","ErrorContext","onRemoveClickHandler","onRemoveClickFunction","payload","TelemetryEvent","RemoveFromCart","inventoryLbl","StockLevelLabel","inventoryCode","StockLevelCode","toLowerCase","isCustomPriceSelected","dimension","getProductUrlSync","isChannelTypeB2B","_cartline$CatalogId","fullUrl","set","CatalogId","getInvoiceDetailsPageUrlSync","cartlineId","hasError","StringExtensions","isNullOrEmpty","CartLineItemComponent","catalogs","lineIndex","updateCartLinesQuantitySuccessHandler","priceCurrency","Currency","pickUpInStore","pickitUpText","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","keys","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","reaction","_this$props$data$cart2","_this$props$data$cart3","nextState","_this$props$context$r","_cart$cart$CartLines","_this$props$data$feat","signInUrl","guestCheckoutUrl","backToShoppingUrl","checkoutURL","getCheckoutURL","isCartEmpty","_getCartLines","emailDeliveryModeCode","EmailDeliveryModeCode","validInventoryAcrossCartLines","validateCartLinesInventory","isValid","RetailMultiplePickupFeatureState","multiplePickUpEnabled","currentCatalogId","getCartLinesGroup","Checkout","checkoutBySignInAttributes","GuestCheckout","checkoutByGuestAttributes","BackToShopping","backtoShoppingAttributes","cartLineGroup","_updateCartLineErrorForInvalidInventory","cartTitle","CartlinesWrapper","OrderSummaryWrapper","OrderSummaryItems","_getPromoCode","_getPromotions","orderSummaryHeading","invoiceSummaryTitle","orderSummaryTitle","orderSummaryLineitems","_getOrderSummaryLineItems","invoiceSummaryLineitems","_getInvoiceSummaryLineItems","checkoutAsSignInUserButton","checkoutButtonTitle","checkoutAsGuestButton","showGuestCheckoutButton","guestCheckoutButtonTitle","expressCheckoutButton","slots","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","Modal","toggle","ModalHeader","ModalBody","_promotion","_promotion$Promotion","Promotion","ModalFooter","cartPromotions","promotionCloseButtonAriaLabel","cartLineInventoryValidationResult","productIdWithErrors","productIdWithError","element","_element$data","outOfStockErrorMessage","allErrors","_cartline$data","_cartline$data$produc","fullError","Wrapper","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","priceFree","isTaxIncludedInPrice","IsTaxIncludedInPrice","isShowTaxBreakup","collapseTimeOut","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","enableStockCheck","updateMaxQuantityForCartLineItem","maxQuantityForCartLineItem","warehouseAggregation","productDimensionTypeSize","productDimensionTypeColor","productDimensionTypeConfiguration","productDimensionTypeStyle","productDimensionTypeAmount","quantityDisplayText","discountStringText","shippingCharges","salesAgreementPricePrompt","removeCartButtonText","shipInsteadDisplayText","pickItUpDisplayText","changeStoreDisplayText","errorMessageOutOfRangeOneLeft","errorMessageOutOfRangeFormat","showOutOfStockErrors","addToOrderTemplateMessage","addItemToOrderTemplateError","isAbsoluteUrl","urlCheck","returnURL","origin","includes","_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","renderModuleAttributes","_props$context$action","emailshippingText","emptyCartText","renderCartLinesGroup","_renderInvoiceSummarylines","invoiceSummaryLines","invoices","giftCard","loyalty","_renderOrderSummarylines","orderSummaryLines","subtotal","shipping","tax","totalDiscounts","CatalogLabelComponent","isB2b","catalog","CartLineItemFunctions","Product","DimensionStrings","currencyCode","EffectivePercentage","SalesAgreementLineRecordId","_props$context$reques2","OmniChannelMedia","renderDisountLines","renderSalesAgreementPrompt","NetAmountWithAllInclusiveTax","GrossAmount","ExtendedPrice","salesAgreementLineId","_generateQuantityandPrice","DiscountAmount","trim","_applyPromotionHandler","promoCodTotalDiscount","count","mockRequest","buildMockRequest","mockRequestURL","staticCdnUrl","md","signOutUrl","signUpUrl","mockAnonRequest","mockSigninErrorRequest","retailServerErrorCode","mockActionContext","buildHydratedMockActionContext","HeaderPreferredStore","modalCloseButtonRef","handleClick","_findPreferredStoreOnClick","storeName","StoreName","headerPreferredStoreText","headerPreferredStoreAriaLabel","showMapViewLink","parentElementRef","_renderLogo","rel","_renderImage","moduleType","imagePropertyName","shouldSkipToMainImage","NavIcon","toggleNavBar","mobileHamburgerAriaLabel","targetId","Header","isB2BSite","_this$props$config$my","myAccountLinks","popOverRef","_toggleNavbar","_togglePopover","_keydown","mobileMenuCollapsed","signinPopoverOpen","hasSigninerror","displayName","workerName","customerName","_this$props$data$empl","worker","employee","FirstName","signUpCustomerNotFoundTitle","signUpMultipleCustomerFoundTitle","signInCustomerNotAuthorizedTitle","closeNotificationLabel","signinNotificationError","_getSigninNotification","NotificationsManager","instance","addNotification","ErrorNotification","cartLabel","cartQtyLabel","logoImage","shouldShowWishlistCount","headerToggleClass","headerClassName","navbarKey","cartIconSlot","_getSlot","menuBarSlot","searchSlot","wishlistCount","siteOptionsSlot","preferredStoreSlot","currentDistributorSlot","CommerceListLines","wishListIconDesktop","WishListIconComponent","wishlistTooltipText","wishlistCountLabel","isDispayWishlistCount","CartIconComponent","headerAriaLabel","wrapClassName","Popover","placement","_getSigninButton","_getSignOutButton","switchCustomerLink","_getSwitchCustomerButton","_getAccountInfoDropdownButton","_getAccountLinks","currentDistributor","slotName","SignIn","signInLinkText","signInLinkAriaText","onTelemetryClick","_user$signOutUrl","SignOut","signOutLinkText","signOutLinkAriaText","SwitchCustomer","isOBOAccountSelected","cookies","getAccountSelectionCookie","switchCustomerLinkAriaText","switchCustomerLinkText","getBusinessPartnerSelectionUrl","removeAccountSelectionCookie","shoppingAsText","route","param","signUpCustomerNotFound","signUpMultipleCustomerFound","signInCustomerNotAuthorized","retailServerErrorMessage","MyProfile","innerRef","cta","keyCode","KeyCodes","Escape","computed","_renderDesktopAccountBlock","InvoiceSummaryLine","label","cssLabel","_buildPaymentSummarySection","_computedLoyaltyAmount","checkoutState","loyaltyAmount","TotalAmount","invoiceLines","invoiceLine","InvoiceAmount","InvoiceId","giftCardAmount","_computeGiftCardAmount","giftCardTotalValue","giftCardExtends","giftCardCounter","Balance","amount","min","totalAmountAfterGiftCard","loyaltyLabel","giftcardLabel","MediaGallery","_this","_props$config$zoomedI","_inlineZoomDivRef","Map","fullScreenOverlayButtonRef","player","defaultGalleryImageSettings","defaultThumbnailImageSettings","onExiting","animating","onExited","next","removeInlineZoomStyle","isLastItem","nextIndex","activeIndex","goToIndex","updateZoomedInImage","previous","mediaGalleryItems","isFirstItem","autoplay","currentIndex","mediaItems","_mediaItems","_this$player$current","mediaTypeValue","MediaType","Video","play","_this$player$current2","pause","getImagesData","skipImageValidation","_this$props$config$im","_this$props$config$im2","source","imageSource","mediaLocations","mediaLocationsForSelectedVariant","mediaLocation","_mediaLocation$Uri","Uri","getAltText","shouldUseCmsAltText","AltText","IsApplicableForChildEntities","isApplicableForChildEntities","curatedImages","_filterMasterImageFromVariant","_renderCarouselItemVideo","mediaData","videoData","_videoData$_links","options","playerResources","videoMetaData","videoId","duration","playTime","thumbnail","posterframeUrl","_links","binaryReferences","videoBinaryReferences","videoPlayerData","metaData","Player","playerData","isEditor","params","_renderEmptyImage","_getCarouselItem","isInPopup","fallbackImage","bypassHideOnFailure","_getThumbnailItem","modifiedActiveIndex","ThumbnailItemContainerProps","_generateOnThumbnailClick","onKeyDown","_generateOnThumbnailKeyDown","Picture","imageFallbackOptimize","shouldUseOptimizedImage","getVideoThumbNailItem","classes","_refHandler","divRef","which","Enter","Space","_renderVideoThumbnail","fullScreenTitleText","openModalDialog","_toggleModal","imageModalSlider","ZoomView","_mapProductToImageData","carouselprops","Carousel","_renderCarouselItemImageView","_zoomedImageSettings","interval","directionTextPrev","previousScreenshotFlipperText","directionTextNext","nextScreenshotFlipperText","onIndicatorsClickHandler","showPaginationTooltip","hideIndicator","keyboard","handleOnExited","handleOnExiting","isDisabledFunctionality","isMobileImageZoomed","carousel","imageModalSliderProps","modalIsOpen","ontoggle","galleryCarousel","ImagefullView","altTextSource","mediaGalleryImages","isImageZoomed","isInitialLoad","zoomedImageSettings","galleryImageSettings","_onImageMouseOut","_inlineZoomImageOnHover","_onInlineImageClick","_onContainerZoomImageClick","_onMouseOutLensContainer","_this$props$config$im3","_this$props$context$r3","shouldUpdateOnPartialDimensionSelection","_setRenderType","_this$props$config$th","validateProductImages","thumbnailImageSettings","_setImages","_this$props$config$th2","getValidProductImages","productVariant","_product$productVaria","_this$props$context$a","_this$props$config$th3","getProductImages","fireImmediately","_this$props$config$th4","_this$props$context$a2","isVertical","thumbnailsOrientation","isFullscreenAllowed","allowFullScreen","zoomViewMode","imageZoom","emptyPlaceHolderImage","placeholderImageName","_this$props$context$r4","mediaGalleryCarouselItems","_getMediaGalleryItems","mediaGalleryThumbnailCarouselItems","_getMediaGalleryThumbnailItems","callbackToggle","callbackThumbnailClick","callbackThumbnailKeyDown","CarouselProps","indicatorAriaText","ariaLabelForSlide","Thumbnails","ThumbnailsContainerProps","SingleSlideCarouselComponentProps","SingleSlideCarousel","vertical","flipperPrevLabel","flipperNextLabel","parentId","useTabList","lastUpdate","defaultKey","_getEmptyThumbnailItem","zoomView","curatedImage","mediaToSet","all","get","getVideoMetadataFromApi","now","media","_renderImageInContainerOnZoom","_renderImageFullScreenOnZoom","_renderImageInlineOnZoom","_this$props$config$sh","_this$props$data$prod2","_this$props$data$prod3","_this$props$data$prod4","shouldHidePrimaryImages","shouldHideMasterProductImagesForVariant","variantImages","isVariantProduct","MasterProductId","_item$additionalPrope","_this$props$config$da","dataScale","defaultDataScale","onMouseOver","onMouseMove","inlineZoomImageOnMouseMove","_this$props$config$da2","inlineZoomImageOnHover","_handleMobileViewZoomedImageClick","mobileZoomedInImageClassName","transform","overflow","_this$props$config$da3","bounds","getBoundingClientRect","positionX","clientX","positionY","clientY","scaledPositionX","scaledPositionY","scrollTo","_this$props$config$da4","innerWidth","inlineZoomInitClick","inlineZoomImageOnMouseOut","onContainerZoomInit","onMouseOutLensContainer","_this$props$config$da5","onMouseOut","onMouseMoveLensContainer","onMouseOverImageContainer","_this$fullScreenOverl","focus","parentDiv","children","removeContainerZoomStyle","_renderThumbnails","thumbnails","_renderThumbnailItem","imageAltText","_context$app","validateMediaLocationAsync","http","XMLHttpRequest","send","_unused","selectedProduct","actionInput","MediaLocationsForSelectedVariantInput","getMediaLocationsForSelectedVariant","pairs","pair","_actionContext$reques","isPreview","commerceApiRequest","previewImageData","displayOrder","DisplayOrder","MediaTypeValue","_mediaLocation$Uri2","commerceVideoMetadataRequest","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","moduleTypeName","addToCartText","addToBagText","dialogStrings","removeButton","orderTemplateStatusMessage","userMessage","onClickHandler","slice","_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","useState","onCreateButtonClick","createOrderTemplateText","OrderTemplateNameDialog","modalOpen","isUpdateDialog","setModalOpen","onCancel","onOrderTemplateCreated","OrderTemplateList","_isChannelMultipleCatalogsFeatureEnabled","feature","_onDismiss","_reloadPage","reload","_onRemoveFromOrderTemplateList","productListId","token","productList","deleteAsync","headerStatusMessage","deleteOrderTemplateFailedText","_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","ProductCollection","handleHeadingChange","_getProductsDimensionsAvailabilities","dimensionsToDisplayOnProductCard","dimensionsInProductCard","dimensionsToDisplayAsSwatch","dimensionsAsSwatchType","validProducts","validValues","DimensionTypes","none","productsDimensionAvailabilities","getDimensionAvailabilitiesForProductSearchResultAction","DimensionAvailabilitiesForProductSearchResultInput","DimensionSwatchDisplayTypes","initProductState","productPrices","productCollectionProducts","productCollection","equals","listType","getProductPriceForSelectedProducts","ProductPriceForSelectedProductsInput","IsMasterProduct","_getProduct","productPrice","_this$state$productsD","trace","allowBackNavigation","breaCrumbType","breadcrumbType","allowBack","quickviewSlot","quickview","productComparisonButtonSlot","productComparisonButton","reviewCountAriaLabelValue","ratingCountAriaLabel","ratingCountAriaLabelSingleUser","isPriceMinMaxEnabled","priceResources","priceRangeSeparator","ProductContainer","productComponent","ProductComponent","quickViewButton","dimensionAvailabilities","dimensionAvailability","_product$MasterProduc","masterProductId","_getActivePrice","productsList","getPriceForProductSearchResult","PriceForProductSearchResultInput","_getSeeAllButton","headingLabel","recommendation","discountIds","searchPageLink","seeAllButtonText","enableAffiliationBasedPricing","shouldDisplaySeeAllButton","recommendationListId","isCarousel","layout","headingComponent","updatedProducts","getProductData","productCollectionViewProps","flipperPrevious","flipperNext","ProductCollectionContainer","GridComponentProps","seeAllButton","_renderCarousel","carouselContainer","_renderProduct","_renderGrid","gridContainer","_renderNoProduct","noProductToRenderText","QuickOrderDrawer","_toggle","isManuallyToggled","collapseProps","drawerGlyphClass","toggleGlyphClassName","animateGlyph","drawerOpenGlyph","openGlyph","closeGlyph","drawerCloseGlyph","drawerClass","toggleButtonProps","block","_generateDrawerButtonInnerMarkup","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","pattern","maxLength","addToCartBtn","QuickOrderProduct","simpleProduct","isSelected","observable","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","_dimension$DimensionV","dimensionValue","quickOrderProductDimensionsSeparator","UnitOfMeasureSymbol","quickOrderInputQuantityAriaLabel","quickOrderDecrementButtonAriaLabel","quickOrderIncrementButtonAriaLabel","quickOrderRemoveItemButtonAriaLabel","QuickOrderMobileTableRowCellComponent","quickOrderQuantityMobileText","QuickOrderTableRowComponent","QuickOrderTableComponent","setIsMobile","isMobileView","quickOrderProducts","updateViewport","quickOrderProduct","QuickOrder","waitTime","dimensionUpdateQueue","FinitePromiseQueue","initializedDimensions","Set","cssClassNameConfigure","quickOrderCallbacks","initializeDimension","initializedDimension","dimensionSelectedAsync","selectedDimensionId","selectedDimensionValueId","_this$state$productDi","size","enqueue","_updateDimensions","FinitePromiseQueueError","ProcessWasDiscardedFromTheQueue","getDropdownName","dimensionType","_getDropdownName","changeUpdatingDimension","isUpdatingDimension","_handleInputChange","query","productText","productResponse","inputQuantityText","quantityInput","HTMLInputElement","cancellableDebounce","cancel","isQuickOrderFormExpanded","_debounce","getScanResult","GetScanResultInput","results","ProductDimensionFull","_addItemToCart","quickOrderAddedToCartSuccessMessage","quickOrderAddedToCartFailureMessage","_validateCart","getDeliveryOptionsAsync","defaultDeliveryOption","productAvailableQuantity","_updateAvailability","shouldValidateQuantityLimits","_shouldValidateQuantityLimits","addProductToCartInput","availableQuantity","orderQuantityLimitsFeatureIsEnabled","isAddEmailDeliveryItemToCart","addProductToCart","inputProductText","maxQtyLimitReachedMessage","_getMaxQtyMessage","_result$errorDetails","isOrderQuantityLimitsFeatureEnabledInSiteSettings","_getConcatenatedMaxQtyMessage","quickOrderMaxQuantityLimitText","quickOrderAlreadyItemQuantityText","_handleQuantityChange","currentValue","inputElement","isNaN","setAttribute","_updateDimensionValue","productDimensionFull","newValueId","DimensionValues","_this$state$productRe","dimensionsToUpdate","productDimensionErrorState","otherError","clearOtherErrorState","configureErrors","errorState","mappedDimensions","reject","newProduct","getSelectedVariant","SelectedVariantInput","getDimensionsForSelectedVariant","GetDimensionsForSelectedVariantInput","variantProduct","newAvailableQuantity","getProductAvailabilitiesForSelectedVariant","ProductAvailabilitiesForSelectedVariantInput","productAvailable","_getDimensionErrorString","dimensionTypeValue","quickOrderproductDimensionTypeColorErrorMessage","quickOrderproductDimensionTypeConfigurationErrorMessage","quickOrderproductDimensionTypeSizeErrorMessage","quickOrderproductDimensionTypeAmountErrorMessage","quickOrderproductDimensionTypeStyleErrorMessage","_updateProductAvailability","_productResponse$Dime","missingDimensions","_getConfigureErrors","quickOrderWrongQuantityErrorMsg","quickOrderOutofStockErrorMsg","device","Type","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","_cart$result","maxQuantityForLineItem","addedQuantity","_item$ItemId","_this$state$productRe2","minInventory","renderConfigure","containerProps","dropdowns","renderConfigureDropdown","dropdown","labelContainerProps","select","renderForm","quickOrderProductContent","quickOrderMsgContent","tenantId","inputIsValid","serviceEndpoint","locale","sendRequest","userReviewData","headers","Authorization","authorization","SubmitUserReviewInput","onClickSubmit","ReviewModal","SubmitReview","submitButtonAttribute","Cancel","cancelButtonAttribute","modal","modalCSS","onModalToggle","applicationNode","returnFocusRef","returnRef","modalHeader","modalHeaderNode","modalFooter","modalBody","cancelButton","discardReviewButtonText","submitButton","submitDisabled","submitReviewButtonText","ratingsInput","ratingLabel","ratingsLabel","titleInput","titleLabel","textInput","textLabel","privacyPolicyUrl","privacyPolicyLink","autoComplete","inputRow","errorMessageText","userReview","reviewId","editReviewModalTitle","writeReviewModalTitle","stripWhiteSpacesFromString","reviewText","reviewTitle","selectRatingAriaLabel","initialRating","parentType","onRatingChange","selectRatingLabel","reviewTitleMaxLength","renderContextId","onTitleChange","reviewTitleAriaLabel","htmlFor","reviewTitleLabel","reviewTextMaxLength","rows","reviewAriaLabel","reviewTextLabel","policyTextBlocks","privacyPolicyTextFormat","isSeparatorAtStart","startsWith","isSeparatorAtEnd","endsWith","PrivacyPolicy","privacyPolicyAttribute","privacyPolicyTitle","submitReview","onReviewComplete","onReviewSubmission","getRnrPartnerId","userEmail","emailAddress","userName","getRnrAuthEndpointId","submitUserReview","review","submittedDateTime","helpfulPositive","helpfulNegative","firstName","getReviewInput","GetUserReviewInput","update","TOGGLE_REVIEW_MODAL_BUTTON_ID","TOGGLE_EDIT_MODAL_BUTTON_CARD_ID","HistogramItems","totalRatingsCount","renderItem","star5Count","star4Count","star3Count","star2Count","star1Count","stars","totalCount","percentage","formattedPercent","Intl","NumberFormat","barItemAriaLabel","Progress","AverageRatingNumber","summary","TotalReviews","RatingsHistogram","selectFilterBy","completeClass","classname","hideCount","averageNumber","totalReviews","ratingsSummaryProps","filterKey","createRatingsReviewsStateInput","authToken","requestBody","concernCategory","requestHeader","isHelpful","ReviewConcernCategory","ReportReviewConcernInput","ReviewCount","currentPage","reviewsShownOnEachPage","pageReviewCountText","_getReviewStartNumber","_getReviewEndNumber","PageControls","previousPageClick","_getPreviousPageData","nextPageClick","_getNextPageData","Next","nextAttribute","Previous","previousAttribute","_hasPreviousPage","_paginationAriaLabel","pageReviewAriaLabel","previousButtonText","_hasNextPage","nextButtonText","_getPagesCount","_getReviewsShown","ceil","isNextPage","page","pageModifier","pageReviewCount","updateReviews","selectedSortByOption","selectedFilterByOption","reportConcernDropdownOptions","radioPairs","inputId","reportedKey","onRadioChange","reviewRatingNarratorText","voteHelpfulButton","isVoted","isVotedFor","votedReviews","approved","isDisabled","isUserReview","isOboRequest","yesButtonText","noButtonText","voteCount","onClickMethod","updateReviewHelpfulness","editButton","toggleWriteReviewModal","editReviewCardText","renderDate","DateTimeFormat","month","year","toggleReportReviewModal","reportToggle","reportConcernText","reportedReviews","reportedText","reportedReviewId","SubmitHelpfulnessVoteInput","ReviewsList","sortByDropdownOptions","mostHelpfulSortOptionText","mostRecentSortOptionText","highestRatedSortOptionText","lowestRatedSortOptionText","filterByDropdownOptions","allRatinsFilterByOptionText","fiveStarFilterByOptionText","fourStarFilterByOptionText","threeStarFilterByOptionText","twoStarFilterByOptionText","oneStarFilterByOptionText","reviewsListCallbacks","updateReviewTitle","userReviewTitle","updateReviewText","userReviewText","updateRating","userReviewRating","onReviewSubmitted","isSuccessful","isReviewModalOpen","hasReviewError","toggleModal","_toggleReviewModal","updateReviewHelpfulnessVote","toggleReportModal","isReportModalOpen","_onReportModalOpen","_onReportModalClose","reportReview","_reportReviewCallback","updateFilterByDropdown","updateSortByDropdown","reviewsList","pagingInfo","totalItems","listOfReviews","isFilterApplied","ratingsReviewsState","filterKeyValue","dropdownItemsCount","filterByOption","selectedIndex","_userReview","_reviewCard","_reviewCards","reviewList","reviewElements","isTakenDown","isPublished","cardProps","ratingHelpfulLabel","wasReviewHelpfulText","like","dislike","edit","report","responseName","userResponse","responderName","responseText","responseDate","cardBodyProps","responseProps","reviewProps","controlsProps","headerProps","ReviewCard","_userReportModalToggle","reportingReviewId","_userReviewModal","_onTitleChange","_onTextChange","_onRatingChange","_onReviewComplete","_userReviewModalToggle","isSuccess","_reportReviewModal","submitReviewAttribute","SuccessButton","successAttribute","cancelAttribute","SpamAdvertising","reportSpamText","OffensiveContent","offensiveContentText","Profanity","profanityContentText","headerSubmitted","feedbackThankYouText","cancelReportReviewText","reportReviewButtonText","succesfulButton","okReportReviewText","reportMessage","reportModalMessage","reportSubmittedMessage","radioButtons","ReportReviewModal","_onRadioChange","_reportReview","hasReportError","reported","reportReviewConcern","getUserToken","_value","reportedReview","notification","selectedOption","skipItems","getSelectedProductIdFromActionInput","getReviewsForGivenProduct","GetProductReviewsInput","getRnrEndpointId","_updateVoteUi","alreadyExists","list","concat","submitHelpfulnessVote","showSpinner","reviewModal","reportReviewModal","filterByDropdown","LabeledDropdown","labelText","filterByDropdownText","dropdownId","dropdownOptions","onSelectOption","controlledByParent","sortByDropdown","sortByDropdownText","reviewCount","refineReviewsProps","reviewsListProps","reviewCards","pageControls","noReviewsMessage","noReviewsWithFilterMessage","noReviewsWithSelectedFilterMessage","sortByOptions","filterByOptions","buildReviewCard","createReviewModal","createReportModal","SignInMessage","SignInButton","ModalToggle","WriteReview","writeReviewCallbacks","_modalToggleRef","userInfo","signInMessage","signInButton","signInLabel","signInAriaLabel","modalToggle","editReviewButtonText","reviewButtonLabel","_buildUserReviewModal","ProductRefinerValueDataTypeValue","ProductRefinerTypeValue","ProductRefinerSource","isRangeType","dataTypeValue","AttributeDataType","Decimal","isRangeTypeForInteger","Integer","isCustomRangeTypeIntegerSelected","selectedRefinementCriterion","parentProductRefinerHierarchy","RowNumber","DataTypeValue","DisplayTemplateValue","DisplayTemplate","Range","isSingleSelectRangeTypeIntegerSelected","productRefinerValue","LeftValueBoundString","RightValueBoundString","findMatchingRefinementCriterion","refinementCriteria","refinementCriterion","isMatchingRefinementCriterion","parent","RefinerRecordId","RefinerSourceValue","getIntegerRangeName","rangeValue","RightValueBoundLocalizedString","LeftValueBoundLocalizedString","getUpdatedRefinementCriteria","itemToggleNotification","currentRefinementCriteria","updatedRefinementCriteria","toggledItemFound","r","selectedCriterion","isSelecting","rangeStart","rangeEnd","Text","TrueFalse","RefinerTypeValue","RefinerType","SingleSelect","Values","child","matchingIndex","criterion","splice","ChoiceSummary","closeButtonGlyph","_onClick","stopPropagation","clearAll","selectedRefiner","_getSelectedRefinerChoice","onChoiceClicked","itemClicked","choiceClicked","nextItemToFocus","nextSibling","selectedRefinersMap","selectedChoices","channelInventoryConfigurationId","refinerHierarchy","productListInventoryDisplay","ProductListInventoryFilteringOptions","HideOOS","choice","hierarchy","_rangeParentDisplay$","rangeParentDisplay","_getKeyForRefinerValue","rangeDisplayType","clearAllText","choiceAriaLabel","closeAriaLabel","clearAllAttributes","attribute","newIntRange","urlBuilder","_parent","choiceFormat","choiceRangeValueFormat","refinerValues","overallFormat","rangeFormat","refinerValueName","refinerName","KeyName","_formatPrice","UnitText","filterValue","refiner","currency","cultureFormatter","formatCurrency","selected","ErrorMessage","FeatureSearchResultItem","productRecordId","featureSimilarDescriptionTitle","featureSimilarLooksTitle","img","Link","modalNode","autoFocus","zIndex","modalTitle","modalFooterNode","modalCloseButtonText","getInventoryLabel","inventoryAttribute","ProductSearchResultItems","inventoryLabel","swatchItemAriaLabel","RangeRefineItem","_selectedRefinementCr","_this$props$selectedR","_this$props$selectedR2","_ref2","_this$props$selectedR3","_this$props$selectedR4","_formattedPriceReverseLookup","getLabels","sliderId","minPrice","maxPrice","labelId","labelString","labelPositioning","getSliderThumbs","sliderKey","selectedMin","selectedMinPrice","selectedMax","selectedMaxPrice","_this$props$minValueS","_this$props$maxValueS","minValueSliderThumbAriaLabel","ariaValueText","maxValueSliderThumbAriaLabel","_onRangeUpdate","_onRangeUpdateEnd","_handleRangeTooltipText","_changeMin","_changeMax","_finishChangeMin","_finishChangeMax","minInput","maxInput","initialMin","initialMax","minValue","maxValue","labels","sliderKeyString","sliderThumbs","isChecked","validationErrorMin","validationErrorMax","touchedMin","touchedMax","previousProps","updateSliderProps","refineItemCommonProps","rangeType","_renderInputFields","_renderSlider","_ref3","_this$props$selectedR5","_this$props$selectedR6","_ref4","_this$props$selectedR7","_this$props$selectedR8","formAttrs","rangeNameFormat","minInputClassName","maxInputClassName","formattedSelectedMin","_getFormattedSelectedValue","formattedSelectedMax","minLabel","maxLabel","placeholderTextMax","ariaAttributes","Slider","inForm","step","orientation","showLabels","showTooltip","onChangeEnd","debounce","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","_objectWithoutProperties","_excluded","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","RangeRefineItemInput","_changeMinInputRange","_changeMaxInputRange","_applyCustom","invalidData","updateInputRangerProps","_isUndefined","RefineSubmenu","_onToggleItem","_onToggleSubmenu","isExpandedOnInitialLoad","expanded","productRefinerHierarchy","timeout","_renderChildItems","_renderSingleMultiSelect","_renderRange","refinerValuesList","listItems","selectedValue","_getRangeType","SliderWithBars","onUpdateRefiners","prevState","Separator","Title","SearchResultContainer","SearchResultContainer_1","sortOptions","sortByOptionRelevanceDesc","sortByOptionNameAsc","sortByOptionNameDesc","sortByOptionPriceAsc","sortByOptionPriceDesc","sortByOptionRatingDesc","sortByOptionBestSelling","sortByOptionNewScore","sortByOptionTrendingScore","_pageType","urlTokens","pageType","_viewport","expandrefinerCount","defaultPageNumber","isListPageStateUpdated","_updateVariantAvailability","includeAttributes","_updateListPageState","listPageState","_this$props$config$it","_this$props$config$it2","querySorting","sorting","parse","decodeURIComponent","currentPageNumber","skip","itemsPerPage","sortingCritera","Columns","pageSize","activeProducts","totalProductCount","activeFilters","hydrateRefinersFromUrl","featureProduct","_this$props$data$list","_this$props$data$list2","_this$props$data$list3","_this$props$data$list4","_getSearchResultModal","SearchResultModal","_getCollectionTitle","collectionTitle","category","getFriendlyName","NameTranslations","productCountNumber","productCountText","numberOfProducts","oneProduct","TitleContainer","titlePrefix","searchTextPrefix","titleText","titleCount","_getCategoryHierarchy","categoryHierarchy","CategoryHierarchyContainer","categoryHierarchyList","categoryLinkAriaLabel","Url","categoryHierarchySeparator","_getSortingDropDown","activeDropdown","_getCurrentlySelectedOption","sortingState","_getAllSortByOptions","dropdownOption","SortingContainer","sortByDropDown","labelClassname","sortByDropdownLabel","dropdownClassname","toggleColor","_updateSortByDropdown","_sortAndFilterContainerRef","_getPagination","getCurrentUrl","skipCount","previousText","nextText","UncontrolledPagination","paginationAriaLabel","qsp","startingItem","_renderPrev","_renderNext","previousAriaLabel","nextAriaLabel","_getRefineMenu","tempRangeTypeTODO","inputRange","validRefiners","updateRefinerPanel","refiners","_shouldHideFromRefiners","activeRefiners","_getexpandRefinerCount","expandRefinersCount","expandedRefiners","RefineMenuContainer","RefinerSectionContainer","_refineItemCommonProps","_onUpdateRefiners","_buildRefinerUrl","channelInventoryConfiguration","isInventorySortableAttribute","inventoryAwareSortableAttributeId","ProductAvailabilitySortableAttributeRecordId","isInventoryProductAttribute","InventoryProductAttributeRecordId","_getChoiceSummary","_this$props$data$refi","selectedRefiners","choiceSummaryLabel","_onChoiceClicked","_buildRefinerUrlForChoiceSummary","_getProducts","_this$props$slots","_this$props$data$prod5","shouldAllowBackNavigation","breadCrumbType","shouldAllowBack","isPriceMinMaxFeatureState","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","paginationPreviousText","paginationNextText","_updateViewport","pending","validationErrorNotNumber","validationErrorNotRange","static","nameTranslations","_nameTranslation","nameTranslation","Language","StoreOperationsDataActions","_listPageState$active","_listPageState$sortin","_newListPageState$cur","_newListPageState$sor","_newListPageState$act","_this$props$context$r5","_this$props$context$r6","_this$props$context$r7","newListPageState","GetFullProductsByCollectionInput","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","TitleViewProps","disableHierarchy","refineMenu","pagination","ProductsContainer","ProductSectionContainer","CategoryNavContainer","RefineAndProductSectionContainer","choiceSummary","searchResultModal","FeatureSearchContainer","similarLookProduct","_getViewport","createSearchResultModal","modalProps","isRecoSearchPage","createModalBody","renderSort","renderRefiner","submenu","renderCategoryHierarchy","renderTitle","renderTitleCount","SearchState","SuggestionType","AutoSuggestInput","searchText","suggestionType","hitPrefix","hitSuffix","searchQuery","topResultsCount","_getAutoSuggest","autosuggest","_ctx$requestContext$a","productSearchCriteria","SearchCondition","Context","ChannelId","inventoryRefinerValue","getInventorySortableRefinerValue","isInStock","Attribute","getInventoryConfigurationAsync","Refinement","searchCriteria","ProductSearchCriteria","HitPrefix","HitSuffix","searchSuggestions","getSearchSuggestionsAsync","ImageUrl","generateImageUrl","AllSearchResults","autoSuggestPromises","CategorySuggestionsComponent","suggestions","autoSuggestProps","categorySuggestionHeading","_renderTitle","categoryAutoSuggestionHeading","shouldShowFullPath","splitValue","pop","_generateLink","_getHighlightedText","suggestion","_getCategoryLink","_categoryRefiners$Val","searchPageURL","searchQsp","searchRefiners","queryUrl","categoryRefiners","Category","encodedRefiner","compressRefiners","formattedText","dangerouslySetInnerHTML","getRichTextHtml","compressedRefinerKeys","compressedRefiners","compressedRefiner","refinerKey","FormComponent","searchPlaceholder","hideSearchLabel","searchTextInput","disableSubmitSearch","handleCancelSearchChange","ariaLabelCancel","ariaLabelSearch","ariaLabelSubmit","inputNode","submitBtnNode","cancelBtn","submitBtn","KeywordSuggestionsComponent","formattedLink","LabelComponent","searchLabelClass","searchLabelArialLabel","isSearchFormExpanded","searchtext","searchCollapsedLabel","ProductSuggestionsComponent","productSuggestionHeading","productAutoSuggestionHeading","_item$Value","Value3","DecimalValue","_renderThumbnail","_renderPrice","LiProduct","_getLiWrapper","AProduct","_getAWrapper","recid","_props$resources","Search","_isLoadingNode","loadingText","autoSuggestResultLoadingMessage","SpinnerSize","medium","labelPosition","_focusOutTarget","closest","_clearAutoSuggestState","_keyup","formReference","autoSuggestResultDiv","searchState","defaultBasicSearchUrl","searchQueryStringParameter","createSearchStateInput","cancellabelDebounce","inputSuggestionType","_loadSuggestions","_handleSubmit","searchURL","_appendQueryParams","_handleCancelSearchChange","isInitialState","_handleCancelSearchFocused","_setAutoSuggestResultCount","autoSuggestResultScreenReaderDiv","ariaLiveRegion","suggestResultString","autoSuggestFoundMessage","emptyResultString","noAutoSuggestionMessage","innerText","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","Random","Guid","generateGuid","_getSearchSuggestions","_updateSearchRefiners","suggestionTypeItem","charAt","_renderKeywordSuggestions","_renderProductSuggestions","_renderCategorySuggestions","SocialShareItem","_getSocialShareItem","viewprops","SocialShareItemElement","icon","socialMedia","SocialMediaComponent","SocialMedia","Facebook","postUrl","Twitter","Pinterest","Linkedin","Mail","SocialShareItemView","getAdditionalContentItems","additionalContentItemContainer","videoPlayerAdditionalContent","additionalContentItems","VideoPlayer","video","playAriaLabel","playLabel","pauseAriaLabel","pauseLabel","playingAriaLabel","playingLabel","pausedAriaLabel","pausedLabel","muteAriaLabel","muteLabel","unMuteAriaLabel","unMuteLabel","fullScreenAriaLabel","fullScreenLabel","exitFullScreenAriaLabel","exitFullScreenLabel","seekBarLabel","videoTimeDurationLabel","closedCaptionLabel","_video$_links","_getVideoDetailsHeading","_getVideoDetailsParagraph","_getVideoDetailsLinks","detailsContainerCTA","handleText","handleParagraph","handleLink","handleAdditionalLink","WishlistItemDimension","WishListItemActions","onAddToCart","onRemoveItem","formattedPrice","CurrencyCode","renderProductLink","productAttributes","productPageUrlWithSwatch","renderInventoryInformationLabel","WishlistItemAddToCartButtonComponent","isServiceItem","addItemAction","WishlistItemRemoveFromWishlistButtonComponent","removeFromWishlistText","removeItemAction","WishlistItem","wishlistState","_props$product$Dimens","dimensionName","convertProductDimensionTypeToDimensionTypes","_getFullProductLink","productImage","_renderProductImage","productLink","_renderProductDimensions","productUnitOfMeasure","entireProductLink","productAriaLabel","inventoryInformation","productStatusMessage","WishlistItemsStatusMessage","WishlistItems","_renderHeading","addedToCartSuccessMessage","addedToCartFailureMessage","invoiceInCartErrorMessage","productInventoryInformation","_getProductInventory","_product$Behavior$Min","validateQuantity","isQuantityValidationRequired","respectQuantityLimits","MinimumQuantity","_await$cart$cart","curQuantity","_getInventoryValueMessage","_result$errorDetails2","isChannelQuantityLimitsFeatureEnabledInHq","isOrderQuantityLimitsFeatureEnabled","validateLimitsPerLine","ValidateDefaultOrderSettingsPerLine","_removeItemFromWishlist","noLongerLineExist","userToken","wishlistLineId","_getWishlistLineIdFromProductId","removeLinesAsync","commerceList","castCommerceList","_getProductsNoLongerExists","_removeNoLongerExistsLines","createGetByCustomerInput","getItemsInWishlists","ActiveWishlistInput","castSimpleProducts","isError","_inventoryLabel","_inventoryClassName","_isProductInStock","productResult","foundWishlistItem","commerceListLine","_castCommerceList$Com","noLongerExist","emptyWishlistText","wishlistErrorGettingWishlist","noLongerExitsWishlistItemText","Products","ProductDimensions","_renderProductList","statusNotExistsMessage","_getProductNotExists","emptytext","noLongerExisttext","addToCartButtonText","currentProductProps","ProductPrice","maxQuantityLimitText","productInventoryCollection","_renderItem","CartIconView","cartIconRef","_modalContainer","hideArrow","isModalOpen","closeModal","_openModal","_this$cartIconRef$cur","_renderCartCloseIcon","_renderCartItemCount","cartItemCount","totalItemsInCart","_escFunction","isAutoDisplayTriggered","isProductAddedToCart","addToCartBehavior","AddToCartBehavior","showMiniCart","miniCartWrapper","flyoutTitle","emptyCart","cartLineIndex","miniCartItemWrapper","storeLocation","promoContentItem","_props$data$cart$resu","totalPrice","emptyPrice","totalPriceFormatString","renderTotalPrice","_props$data$cart$resu2","subTotalMessage","renderSubtotalMessage","goToCartButton","continueShoppingButtonTitle","renderCartlines","renderConfirmedShipDate","confirmedShipDate","confirmedShipDateLabel","renderRequestDeliveryDate","requestDeliveryDate","requestDeliveryDateLabel","deliveryLocation","getDefaultColorSwatchSelected","productData","_colorAttribute$swatc","_colorAttribute$swatc2","_colorAttribute$swatc3","attributeValues","colorAttribute","attributeValue","_attributeValue$keyNa","keyName","defaultSwatch","swatches","isDefault","updateProductUrl","productDetailsPageUrl","coreContext","queryString","sourceUrl","baseUrl","renderProductUnitOfMeasure","renderLabel","ratingAriaLabelText","ratingCountAriaLabelText","reviewCountArialableText","getReviewAriaLabel","_context$app$config","contextConfig","fallbackImageSource","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","newUrl","swatchProductImageUrl","newImageUrl","isUnitOfMeasureEnabled","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","selectedDimensions","getValues","convertDimensionTypeToProductDimensionType","selectedProductId","renderQuickView","renderProductComparisonButton","_renderAccountDropdownLinks","renderThumbnailItem","GetThumbnailItemComponent","imageId","_props$context$app$co","_props$config$thumbna","_props$callbackToggle","_props$callbackThumbn","call","handleKeyDown","playVideoTitleText","GetEmptyThumbnailItemComponent","_props$context$app$co2","_props$config$thumbna2","_props$context$reques3","renderThumbnails","getMediaGalleryItems","_item$videoData","videoThumbnail","RenderVideo","NewSingleSlideCarouselComponentProps","NewThumbnails","DescriptionInterval","renderProductCards","productsContainer","textValue","renderProductCardsDescription","_props$data$products$","_props$data$featureSt","isAllowBack","quickviewslot","quickView","renderProducts","_data$products$result","_data$products$result2","productDescriptionInterval","productDescriptionIntervalRemainder0","productDescriptionIntervalRemainder9","titleContainer","configureStickyFilter","isStickyHeader","headerContainer","headerHeight","defaultContainer","refinerElement","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":""}