{"version":3,"file":"static/js/7.9ac31724306f1990b5bb.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/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/promo-banner/components/close-button.tsx?063b","webpack://Msdyn365.Commerce.Online/./src/modules/promo-banner/components/links.tsx?2587","webpack://Msdyn365.Commerce.Online/./src/modules/promo-banner/components/text.tsx?782b","webpack://Msdyn365.Commerce.Online/./src/modules/promo-banner/promo-banner.tsx?9ee9","webpack://Msdyn365.Commerce.Online/./src/modules/promo-banner/promo-banner.view.tsx?7f77","webpack://Msdyn365.Commerce.Online/./src/modules/quick-order/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 { 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 { getPayloadObject, getTelemetryAttributes, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface IPromoBannerCloseButton {\n closeButtonAriaLabel?: string;\n label?: string;\n telemetryContent?: ITelemetryContent;\n onClose(): void;\n}\n\nexport const PromoBannerCloseButton: React.FC = ({ closeButtonAriaLabel, label, telemetryContent, onClose }) => {\n const payLoad = getPayloadObject('click', telemetryContent!, TelemetryConstant.PromoBannerClose);\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 * as Msdyn365 from '@msdyn365-commerce/core';\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, onTelemetryClick } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ILinksData } from '../promo-banner.props.autogenerated';\n\nexport interface IPromoBannerLinks {\n links: ILinksData[];\n requestContext: Msdyn365.IRequestContext;\n telemetryContent: ITelemetryContent;\n onTextChange?(index: number): (event: Msdyn365.ContentEditableEvent) => void;\n}\n\nexport const PromoBannerLinks: React.FC = ({ links, requestContext, onTextChange, telemetryContent }) => {\n const editableLinks = _mapEditableLinks(links, telemetryContent);\n return (\n \n {editableLinks && editableLinks.length > 0 ? (\n \n ) : null}\n \n );\n};\n\nconst _mapEditableLinks = (linkdata: ILinksData[], telemetryContent: ITelemetryContent): Msdyn365.ILinksData[] | null => {\n if (!linkdata || linkdata.length === 0) {\n return null;\n }\n const editableLinks: Msdyn365.ILinksData[] = [];\n linkdata.forEach((link, index) => {\n // Construct telemetry attribute to render\n const payLoad = getPayloadObject('click', telemetryContent, '', '');\n const linkText = link.linkText ? link.linkText : '';\n payLoad.contentAction.etext = linkText;\n const attributes = getTelemetryAttributes(telemetryContent, payLoad);\n const editableLink: Msdyn365.ILinksData = {\n ariaLabel: link.ariaLabel,\n className: 'ms-promo-banner__link',\n linkText: link.linkText,\n linkUrl: link.linkUrl.destinationUrl,\n openInNewTab: link.openInNewTab,\n role: 'link',\n additionalProperties: attributes,\n onClick: onTelemetryClick(telemetryContent, payLoad, linkText)\n };\n editableLinks.push(editableLink);\n });\n\n return editableLinks;\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport * as React from 'react';\n\nexport interface IPromoBannerText {\n text: string;\n requestContext: Msdyn365.IRequestContext;\n onTextChange(event: Msdyn365.ContentEditableEvent): void;\n}\n\nexport const PromoBannerText: React.FC = ({ text, onTextChange, requestContext }) => {\n return ;\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Carousel } from '@msdyn365-commerce/components';\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { PromoBannerCloseButton, PromoBannerLinks, PromoBannerText } from './components';\nimport { IBannerMessagesData, IPromoBannerProps, IPromoBannerResources } from './promo-banner.props.autogenerated';\n\nexport interface IPromoBannerState {\n animating: boolean;\n isVisible: boolean;\n activeIndex: number;\n}\n\nexport interface IPromoBannerViewProps extends IPromoBannerProps<{}>, IPromoBannerState {\n promoBannerProps: IModuleProps;\n contentProps: INodeProps;\n bannerMessages: IBannerMessagesData[];\n promoBannerTextProps: INodeProps;\n promoBannerLinksProps: INodeProps;\n carouselProps: INodeProps;\n closeButton?: React.ReactNode;\n className: string;\n promoBannerText: string;\n resources: IPromoBannerResources;\n onDismiss(): void;\n handleText(): void;\n handleLinks(): void;\n}\n\n/**\n *\n * PromoBannerModule component.\n * @extends {React.PureComponent>}\n */\nclass PromoBanner extends React.PureComponent, IPromoBannerState> {\n public state: IPromoBannerState = {\n animating: false,\n isVisible: true,\n activeIndex: 0\n };\n\n private readonly telemetryContent: ITelemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n\n public render(): JSX.Element | null {\n const { bannerMessages, dismissEnabled, interval, hideFlipper, autoplay, className = '' } = this.props.config;\n const { closeButtonAriaLabel, closeButtonLabel, bannerText, bannerAriaLabel } = this.props.resources;\n const { isVisible, activeIndex } = this.state;\n\n if (!isVisible) {\n this.props.context.telemetry.error('Promo banner content is empty, module wont render.');\n return null;\n }\n\n const viewProps = {\n // Context for telemetry and raw data for C1 to do customization\n // Including computed data, state data and methods\n ...this.props,\n className: classnames('ms-promo-banner', className),\n isVisible, // State data\n onDismiss: this._onDismiss, // Methods\n handleLinks: this.handleLinkTextChange,\n handleText: this.handleTextChange,\n\n promoBannerProps: {\n className: classnames('ms-promo-banner', className),\n moduleProps: this.props,\n role: 'banner',\n 'aria-label': bannerAriaLabel\n },\n promoBannerTextProps: {\n tag: PromoBannerText\n },\n promoBannerLinksProps: {\n tag: PromoBannerLinks,\n telemetryContent: this.telemetryContent\n },\n contentProps: { className: 'ms-promo-banner__content' },\n promoBannerText: bannerText,\n bannerMessages,\n activeIndex,\n carouselProps: {\n tag: Carousel,\n className: 'ms-promo-banner__carousel',\n activeIndex,\n next: this._next,\n previous: this._previous,\n onIndicatorsClickHandler: this._goToIndex,\n hideIndicator: hideFlipper,\n interval,\n hideFlipper,\n autoplay\n },\n closeButton: dismissEnabled && (\n \n )\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n public handleTextChange = (event: Msdyn365.ContentEditableEvent) => {\n if (this.props.config.bannerMessages && this.props.config.bannerMessages[0]) {\n this.props.config.bannerMessages[0].text = event.target.value;\n }\n };\n\n public handleLinkTextChange = (linkIndex: number) => (event: Msdyn365.ContentEditableEvent) => {\n if (this.props.config.bannerMessages && this.props.config.bannerMessages[1]) {\n const links = this.props.config.bannerMessages[1].links;\n if (links) {\n links[linkIndex].linkText = event.target.value;\n }\n }\n };\n\n private readonly _next = (): void => {\n const nextIndex = this._isLastItem() ? 0 : this.state.activeIndex + 1;\n this._goToIndex(nextIndex);\n };\n\n private readonly _previous = (): void => {\n const nextIndex = this._isFirstItem()\n ? this.props.config.bannerMessages\n ? this.props.config.bannerMessages.length - 1\n : 0\n : this.state.activeIndex - 1;\n this._goToIndex(nextIndex);\n };\n\n private readonly _goToIndex = (index: number): void => {\n if (this.state.animating) {\n return;\n }\n this.setState({ activeIndex: index });\n };\n\n private readonly _isFirstItem = () => this.state.activeIndex === 0;\n\n private readonly _isLastItem = () =>\n this.props.config.bannerMessages && this.state.activeIndex === this.props.config.bannerMessages.length - 1;\n\n private readonly _onDismiss = (): void => {\n this.setState({ isVisible: false });\n };\n}\n\nexport default PromoBanner;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IPromoBannerViewProps } from './promo-banner';\n\nconst PromoBannerView: React.FC = props => {\n const {\n promoBannerProps,\n contentProps,\n closeButton,\n bannerMessages,\n promoBannerTextProps,\n promoBannerLinksProps,\n carouselProps,\n promoBannerText,\n handleLinks,\n handleText\n } = props;\n\n const slides =\n bannerMessages &&\n bannerMessages.map((message, index) => {\n return (\n \n {promoBannerText}\n {message.text && }\n {message.links && message.links.length > 0 && (\n \n )}\n \n );\n });\n\n return (\n \n \n {closeButton}\n \n );\n};\nexport default PromoBannerView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { 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","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","OmniChannelMedia","_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","currencyCode","_buildOrderSummarySection","getDeliveryMode","featureSate","pickupDeliveryMode","dM","SubtotalAmount","SubtotalAmountWithoutTax","TaxAmount","TaxOnNonShippingCharges","DiscountAmount","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","PromoBannerCloseButton","closeButtonAriaLabel","onClose","PromoBannerClose","PromoBannerLinks","editableLinks","_mapEditableLinks","linkdata","PromoBannerText","PromoBanner","isVisible","bannerMessages","_next","_isLastItem","_goToIndex","_previous","_isFirstItem","dismissEnabled","hideFlipper","closeButtonLabel","bannerText","bannerAriaLabel","handleLinks","handleText","promoBannerProps","promoBannerTextProps","promoBannerLinksProps","contentProps","promoBannerText","carouselProps","closeButton","slides","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","Product","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","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","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","CatalogLabelComponent","catalog","renderSalesAgreementPrompt","SalesAgreementLineRecordId","renderConfirmedShipDate","confirmedShipDate","confirmedShipDateLabel","renderRequestDeliveryDate","requestDeliveryDate","requestDeliveryDateLabel","_props$context$reques2","NetAmountWithAllInclusiveTax","GrossAmount","ExtendedPrice","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":""}