{"version":3,"file":"static/js/8.7d578c67e050023ae7ea.chunk.js","mappings":"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","sources":["webpack://Citta2.0/./src/components/price-component.tsx?ed26","webpack://Citta2.0/./src/modules/citta-b2b-wishlist-items/components/citta-b2b-wishlist-items-dimensions.tsx?a72f","webpack://Citta2.0/./src/modules/citta-b2b-wishlist-items/components/wishlist-item.tsx?51bb","webpack://Citta2.0/./src/modules/citta-b2b-wishlist-items/components/citta-b2b-wishlist-items-status-message.tsx?97d5","webpack://Citta2.0/./src/modules/citta-b2b-wishlist-items/citta-b2b-wishlist-items.tsx?7730","webpack://Citta2.0/./src/modules/citta-b2b-wishlist-items/citta-b2b-wishlist-items.view.tsx?88c1","webpack://Citta2.0/./src/modules/citta-search-result-container/citta-search-result-container.props.autogenerated.ts?7a73","webpack://Citta2.0/./src/modules/citta-search-result-container/components/link.tsx?c700","webpack://Citta2.0/./src/modules/citta-search-result-container/components/product-search-result-items.tsx?8c10","webpack://Citta2.0/./src/modules/citta-search-result-container/components/feature-search-result-item.tsx?568d","webpack://Citta2.0/./src/modules/citta-search-result-container/components/title.tsx?b899","webpack://Citta2.0/./src/modules/citta-search-result-container/components/separator.tsx?b8dd","webpack://Citta2.0/./src/modules/citta-search-result-container/components/utilities.ts?bb91","webpack://Citta2.0/./src/modules/citta-search-result-container/components/range-refine-item.tsx?e0d5","webpack://Citta2.0/./src/modules/citta-search-result-container/components/refine-item.tsx?a159","webpack://Citta2.0/./src/modules/citta-search-result-container/components/choice-summary.tsx?db37","webpack://Citta2.0/./src/modules/citta-search-result-container/components/modal.tsx?ec98","webpack://Citta2.0/./src/modules/citta-search-result-container/components/refine-submenu.tsx?a4fd","webpack://Citta2.0/./src/modules/citta-search-result-container/components/error-message.tsx?2d94","webpack://Citta2.0/./src/modules/citta-search-result-container/citta-search-result-container.tsx?b687","webpack://Citta2.0/./src/components/citta-search-result/utilities.ts?1d16","webpack://Citta2.0/./src/components/citta-search-result/range-refine-item.tsx?f68a","webpack://Citta2.0/./src/components/citta-search-result/refine-item.tsx?5a16","webpack://Citta2.0/./src/components/citta-search-result/refine-submenu.tsx?ad28","webpack://Citta2.0/./src/components/citta-search-result/url-utils.ts?88cb","webpack://Citta2.0/./src/components/citta-search-result/citta-refiners.tsx?b326","webpack://Citta2.0/./src/components/citta-picture.tsx?de55","webpack://Citta2.0/./src/modules/citta-search-result-container/components/product-component.tsx?8073","webpack://Citta2.0/./src/modules/citta-search-result-container/citta-search-result-container.view.tsx?15fd","webpack://Citta2.0/./src/modules/citta-search/actions/get-auto-suggest-suggestions.ts?357b","webpack://Citta2.0/./src/modules/citta-search/components/citta-search.keywordsuggest.tsx?fcba","webpack://Citta2.0/./src/modules/citta-search/components/citta-search.productsuggest.tsx?89f1","webpack://Citta2.0/./src/modules/citta-search/components/citta-search.categorysuggest.tsx?2fc6","webpack://Citta2.0/./src/modules/citta-search/components/citta-search.form.tsx?f887","webpack://Citta2.0/./src/modules/citta-search/components/citta-search.label.tsx?585c","webpack://Citta2.0/./src/modules/citta-search/citta-search.tsx?9717","webpack://Citta2.0/./src/modules/citta-search/citta-search.view.tsx?861d","webpack://Citta2.0/./src/modules/active-image-utilities/active-product.tsx?69b2","webpack://Citta2.0/./src/modules/active-image-utilities/additional-content.tsx?6946","webpack://Citta2.0/./src/modules/active-image-utilities/image-mapper.tsx?dd86","webpack://Citta2.0/./src/modules/active-image/active-image.tsx?00d3","webpack://Citta2.0/./src/modules/active-image/active-image.view.tsx?a935","webpack://Citta2.0/./src/modules/carousel/carousel.tsx?80d4","webpack://Citta2.0/./src/modules/carousel/carousel.view.tsx?d82f","webpack://Citta2.0/./src/modules/product-comparison-preview/product-comparison-preview.tsx?39f6","webpack://Citta2.0/./src/modules/product-comparison-preview/product-comparison-preview.view.tsx?28cb","webpack://Citta2.0/./src/modules/product-comparison/base/product-specification.tsx?75ed","webpack://Citta2.0/./src/modules/product-comparison/base/remove-from-comparison-button.tsx?1d8c","webpack://Citta2.0/./src/modules/product-comparison/product-comparison.tsx?4f74","webpack://Citta2.0/./src/modules/product-comparison/product-comparison.view.tsx?a0a9","webpack://Citta2.0/./src/modules/quick-order/components/quick-order-drawer.tsx?f8b4","webpack://Citta2.0/./src/modules/quick-order/components/quick-order-form.tsx?eb54","webpack://Citta2.0/./src/modules/quick-order/components/quick-order-product.ts?7702","webpack://Citta2.0/./src/modules/quick-order/components/quick-order-table/components/quick-order-table-header-component.tsx?49e7","webpack://Citta2.0/./src/modules/quick-order/components/quick-order-table/components/quick-order-table-row-component.tsx?e487","webpack://Citta2.0/./src/modules/quick-order/components/quick-order-table/quick-order-table-component.tsx?46c1","webpack://Citta2.0/./src/modules/quick-order/quick-order.tsx?ef21","webpack://Citta2.0/./src/modules/quick-order/quick-order.view.tsx?a96d","webpack://Citta2.0/./src/actions/submit-user-review.ts?ac78","webpack://Citta2.0/./src/actions/inputs/submit-user-review-input.ts?3afb","webpack://Citta2.0/./src/common/review-modal.tsx?54a9","webpack://Citta2.0/./src/common/rnrInterface.ts?f761","webpack://Citta2.0/./src/modules/ratings-histogram/component/components.tsx?f324","webpack://Citta2.0/./src/modules/ratings-histogram/ratings-histogram.tsx?f6bc","webpack://Citta2.0/./src/modules/ratings-histogram/ratings-histogram.view.tsx?5bff","webpack://Citta2.0/./src/actions/report-review-concern.ts?bf43","webpack://Citta2.0/./src/actions/submit-helpfulness-vote.ts?a8ab","webpack://Citta2.0/./src/actions/inputs/report-review-concern-input.ts?b071","webpack://Citta2.0/./src/modules/reviews-list/components/components.tsx?033b","webpack://Citta2.0/./src/modules/reviews-list/components/report-review-modal.tsx?53d3","webpack://Citta2.0/./src/modules/reviews-list/components/review-card.tsx?6bbd","webpack://Citta2.0/./src/actions/inputs/submit-helpfulness-vote-input.ts?07aa","webpack://Citta2.0/./src/modules/reviews-list/reviews-list.tsx?37e8","webpack://Citta2.0/./src/modules/reviews-list/reviews-list.view.tsx?0e4a","webpack://Citta2.0/./src/modules/write-review/components/components.tsx?3575","webpack://Citta2.0/./src/modules/write-review/write-review.tsx?9afc","webpack://Citta2.0/./src/modules/write-review/write-review.view.tsx?b867","webpack://Citta2.0/./src/modules/search-result-container/components/choice-summary.tsx?3f71","webpack://Citta2.0/./src/modules/search-result-container/components/error-message.tsx?6302","webpack://Citta2.0/./src/modules/search-result-container/components/feature-search-result-item.tsx?71fa","webpack://Citta2.0/./src/modules/search-result-container/components/link.tsx?52c2","webpack://Citta2.0/./src/modules/search-result-container/components/modal.tsx?d78e","webpack://Citta2.0/./src/modules/search-result-container/components/product-search-result-items.tsx?5174","webpack://Citta2.0/./src/modules/search-result-container/components/separator.tsx?4ea6","webpack://Citta2.0/./src/modules/search-result-container/components/title.tsx?c269","webpack://Citta2.0/./src/modules/search-result-container/components/range-refine-item-input.tsx?09aa","webpack://Citta2.0/./src/modules/search-result-container/components/range-refine-item.tsx?6288","webpack://Citta2.0/./src/modules/search-result-container/components/refine-item.tsx?a594","webpack://Citta2.0/./src/modules/search-result-container/components/refine-submenu.tsx?1292","webpack://Citta2.0/./src/modules/search-result-container/components/utilities.ts?8569","webpack://Citta2.0/./src/modules/search-result-container/search-result-container.tsx?7500","webpack://Citta2.0/./src/modules/search-result-container/search-result-container.view.tsx?b779","webpack://Citta2.0/./src/search-state.ts?dd10","webpack://Citta2.0/./src/modules/social-share-item/social-share-item.tsx?bbcb","webpack://Citta2.0/./src/modules/social-share-item/social-share-item.view.tsx?2d3e","webpack://Citta2.0/./src/modules/video-player/components/additional-content.tsx?b368","webpack://Citta2.0/./src/modules/video-player/video-player.tsx?53e5","webpack://Citta2.0/./src/modules/video-player/video-player.view.tsx?fedb"],"sourcesContent":["import { __assign } from \"tslib\";\r\nimport { msdyn365Commerce } from '@msdyn365-commerce/core';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\n\r\nvar PriceComponentActions = {};\r\nvar Price = function (props: any) {\r\n if (props.data.price.CustomerContextualPrice === undefined) {\r\n return null;\r\n }\r\n return (React.createElement(\"span\", { className: classnames('msc-price', props.className) }, showStrikethroughPricing(props) ? renderCurrentPriceWithOriginalPrice(props) : renderCurrentPrice(props)));\r\n};\r\nvar showStrikethroughPricing = function (props: any) {\r\n var originalPrice = getOriginalPrice(props);\r\n if (originalPrice && props.data.price.CustomerContextualPrice) {\r\n return originalPrice > props.data.price.CustomerContextualPrice;\r\n }\r\n return false;\r\n};\r\nvar getOriginalPrice = function (props: any) {\r\n return Math.max(props.data.price.BasePrice || 0, props.data.price.TradeAgreementPrice || 0, props.data.price.AdjustedPrice || 0);\r\n};\r\nvar renderCurrentPrice = function (props: any) {\r\n var initialPrice = formatCurrency(props, props.data.price.CustomerContextualPrice);\r\n return (React.createElement(\"span\", { className: 'msc-price__actual', itemProp: 'price' }, initialPrice));\r\n};\r\nvar formatCurrency = function (props: any, price: any) {\r\n if (price === undefined) {\r\n return undefined;\r\n }\r\n if (price === 0 && props.freePriceText) {\r\n return props.freePriceText;\r\n }\r\n let returnPrice = `$${price}`;\r\n try {\r\n var formatter = new Intl.NumberFormat(props.context.cultureFormatter.locale, {\r\n style: 'currency',\r\n currency: props.context.cultureFormatter.currencyCode,\r\n currencyDisplay: 'narrowSymbol'\r\n });\r\n returnPrice = formatter.format(price)\r\n\r\n } catch {}\r\n return returnPrice;\r\n};\r\nvar renderCurrentPriceWithOriginalPrice = function (props: any) {\r\n var originalPrice = getOriginalPrice(props);\r\n var initialPrice = formatCurrency(props, originalPrice);\r\n return (React.createElement(React.Fragment, null,\r\n React.createElement(\"span\", { className: 'sr-only' },\r\n ' ',\r\n props.originalPriceText,\r\n ' ',\r\n initialPrice,\r\n ' ',\r\n props.currentPriceText,\r\n ' ',\r\n renderCurrentPrice(props)),\r\n React.createElement(\"span\", { className: 'msc-price__strikethrough', \"aria-hidden\": 'true' }, initialPrice),\r\n React.createElement(\"span\", { \"aria-hidden\": 'true' }, renderCurrentPrice(props)),\r\n props.savingsText && React.createElement(\"span\", { className: 'msc-price__savings' }, props.savingsText)));\r\n};\r\n\r\nconst PriceComponent: React.FunctionComponent = msdyn365Commerce.createComponent(\r\n 'Product',\r\n { component: msdyn365Commerce.createComponent('Price', __assign({ component: Price }, PriceComponentActions)) }\r\n);\r\n\r\nexport default PriceComponent","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport * as React from 'react';\r\n\r\nexport interface IWishlistItemDimension {\r\n key: string;\r\n className?: string;\r\n dimensionType: string;\r\n dimensionValue: string;\r\n}\r\n\r\nexport const WishlistItemDimension: React.FC = ({ key, className, dimensionType, dimensionValue }) => (\r\n
\r\n {dimensionType}:\r\n {dimensionValue}\r\n
\r\n);\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { PriceComponent } from '@msdyn365-commerce/components';\r\nimport { IAny, ICoreContext, IGeneric, IImageSettings, Image, ITelemetry, msdyn365Commerce } from '@msdyn365-commerce/core';\r\nimport {\r\n CommerceListLine,\r\n ProductPrice,\r\n ReleasedProductType,\r\n SimpleProduct\r\n} from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport {\r\n convertProductDimensionTypeToDimensionTypes,\r\n getFallbackImageUrl,\r\n StringExtensions\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\nimport { Alert, Button, getPayloadObject, getTelemetryAttributes, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { IWishlistItemActionMessageState } from '../citta-b2b-wishlist-items';\r\nimport { WishlistItemDimension } from './citta-b2b-wishlist-items-dimensions';\r\n\r\nexport interface IWishlistItemProps extends CommerceListLine {\r\n product: SimpleProduct;\r\n wishlistState: IWishlistItemActionMessageState;\r\n price?: ProductPrice;\r\n context: ICoreContext>;\r\n productUrl: string;\r\n imageSettings?: IImageSettings;\r\n removeFromWishlistText: string;\r\n isInStock: boolean;\r\n addToCartText: string;\r\n outOfStockText: string;\r\n index: number;\r\n itemKey: string;\r\n telemetry: ITelemetry;\r\n moduleId: string;\r\n moduleTypeName: string;\r\n enableImageProductLink?: boolean;\r\n inventoryInformationLabel?: string;\r\n inventoryLabelClassName?: string;\r\n telemetryContent?: ITelemetryContent;\r\n handlers: {\r\n onAddToCart(product: SimpleProduct, itemKey: string): void;\r\n onRemoveItem(productId: number): void | undefined;\r\n onDismiss(): void;\r\n };\r\n resources: {\r\n productDimensionTypeColor: string;\r\n productDimensionTypeSize: string;\r\n productDimensionTypeStyle: string;\r\n originalPriceText: string;\r\n currentPriceText: string;\r\n freePriceText: string;\r\n };\r\n}\r\n\r\nexport interface IWishlistItemViewProps {\r\n key: string;\r\n productImage: React.ReactNode;\r\n productLink: React.ReactNode;\r\n productDimensions?: React.ReactNode[];\r\n productPrice?: React.ReactNode;\r\n addToCartButton?: React.ReactNode;\r\n removeButton?: React.ReactNode;\r\n productStatusMessage?: React.ReactNode;\r\n productName?: React.ReactNode;\r\n productAriaLabel?: string;\r\n entireProductLink?: string;\r\n inventoryInformation?: React.ReactNode;\r\n productUnitOfMeasure?: React.ReactNode;\r\n}\r\n\r\nconst _addItemToCart = (props: IWishlistItemProps): void => {\r\n const { product, itemKey, handlers } = props;\r\n const { onAddToCart } = handlers;\r\n\r\n onAddToCart && product && itemKey && onAddToCart(product, itemKey);\r\n};\r\n\r\nconst _removeItemFromWishlist = (props: IWishlistItemProps): void => {\r\n const { onRemoveItem } = props.handlers;\r\n const { RecordId } = props.product;\r\n\r\n onRemoveItem && RecordId && onRemoveItem(RecordId);\r\n};\r\n\r\nconst WishListItemActions = {\r\n addToCart: _addItemToCart,\r\n removeItem: _removeItemFromWishlist\r\n};\r\n\r\nconst _getFullProductLink = (props: IWishlistItemProps): string => {\r\n if (!msdyn365Commerce.isBrowser) {\r\n return '';\r\n }\r\n\r\n const fullUrl = new URL(props.productUrl, window.location.href);\r\n for (const dimension of props.product.Dimensions ?? []) {\r\n const dimensionValue = dimension.DimensionValue?.Value;\r\n if (!StringExtensions.isNullOrWhitespace(dimensionValue)) {\r\n const dimensionName = convertProductDimensionTypeToDimensionTypes(dimension.DimensionTypeValue);\r\n fullUrl.searchParams.set(dimensionName, dimensionValue!);\r\n }\r\n }\r\n return fullUrl.href;\r\n // return updateProductUrl(productUrl, context, swatch);\r\n};\r\n\r\nconst _renderAriaLabel = (props: IWishlistItemProps): string => {\r\n const { product, price, context, resources } = props;\r\n\r\n const { Name, Dimensions } = product;\r\n const { productDimensionTypeColor, productDimensionTypeSize, productDimensionTypeStyle } = resources;\r\n\r\n let formattedPrice = 'Free';\r\n let dimensions = null;\r\n\r\n if (price) {\r\n formattedPrice =\r\n price.BasePrice === 0 ? resources.freePriceText : context.cultureFormatter.formatCurrency(price.BasePrice!, price.CurrencyCode);\r\n }\r\n\r\n if (Dimensions) {\r\n dimensions = Dimensions.map(productDimension => {\r\n switch (productDimension.DimensionTypeValue) {\r\n case 1:\r\n return `${productDimensionTypeColor}${productDimension.DimensionValue && productDimension.DimensionValue.Value}`;\r\n case 3:\r\n return `${productDimensionTypeSize}${productDimension.DimensionValue && productDimension.DimensionValue.Value}`;\r\n case 4:\r\n return `${productDimensionTypeStyle}${productDimension.DimensionValue && productDimension.DimensionValue.Value}`;\r\n default:\r\n return '';\r\n }\r\n });\r\n }\r\n\r\n return `${Name} ${formattedPrice} ${(dimensions && dimensions.join('')) || ''}`;\r\n};\r\n\r\n/**\r\n * Renders a link to a product based on the given props.\r\n * @param input - Wishlist item props with the info about the product.\r\n * @param productUrl - The url to the product.\r\n * @returns React component with a link to a product.\r\n */\r\nconst renderProductLink = (input: IWishlistItemProps, productUrl: string) => {\r\n const { telemetryContent } = input;\r\n const { RecordId: recordId, Name: productName } = input.product;\r\n const payLoad = getPayloadObject('click', telemetryContent!, '', recordId.toString());\r\n const productAttributes = getTelemetryAttributes(telemetryContent!, payLoad);\r\n const productPageUrlWithSwatch = productUrl;\r\n return (\r\n !StringExtensions.isNullOrWhitespace(productPageUrlWithSwatch) && (\r\n \r\n {productName}\r\n \r\n )\r\n );\r\n};\r\n\r\n/**\r\n * Renders a product name box.\r\n * @param productName - The text to display.\r\n * @returns React component with a name of a product.\r\n */\r\nconst renderProductName = (productName: string) => {\r\n return
{productName}
;\r\n};\r\n\r\n/**\r\n * Renders inventory information.\r\n * @param inventoryInformationLabel - The text to display.\r\n * @param inventoryLabelClassName - The component class name.\r\n * @returns React component.\r\n */\r\nconst renderInventoryInformationLabel = (inventoryInformationLabel: string | undefined, inventoryLabelClassName: string | undefined) => {\r\n const inventoryCssName = inventoryLabelClassName\r\n ? `ms-wishlist-items__inventory-label ${inventoryLabelClassName}`\r\n : 'ms-wishlist-items__inventory-label';\r\n return (\r\n !StringExtensions.isNullOrWhitespace(inventoryInformationLabel) && (\r\n {inventoryInformationLabel}\r\n )\r\n );\r\n};\r\n\r\n/**\r\n * Renders add to cart button.\r\n * @param input - Wishlist item props with the configuration.\r\n * @returns React component.\r\n */\r\nconst WishlistItemAddToCartButtonComponent = (input: IWishlistItemProps) => {\r\n const { isInStock, addToCartText, outOfStockText } = input;\r\n\r\n // Check if the product is service or not by product type.\r\n const isServiceItem = input.product.ItemTypeValue === ReleasedProductType.Service;\r\n\r\n const addItemAction = React.useCallback(() => {\r\n WishListItemActions.addToCart(input);\r\n }, [input]);\r\n\r\n return (\r\n \r\n {((isServiceItem || isInStock) && addToCartText) || outOfStockText}\r\n \r\n );\r\n};\r\n\r\n/**\r\n * Renders remove from wishlist button.\r\n * @param input - Wishlist item props with the configuration.\r\n * @returns React component.\r\n */\r\nconst WishlistItemRemoveFromWishlistButtonComponent = (input: IWishlistItemProps) => {\r\n const { removeFromWishlistText } = input;\r\n\r\n const removeItemAction = React.useCallback(() => {\r\n WishListItemActions.removeItem(input);\r\n }, [input]);\r\n\r\n return ;\r\n};\r\n\r\nexport const SearchResultModal = (props: ISearchResultModalProps):ISearchResultModalViewProps => {\r\n return {\r\n modal: modalNode(props),\r\n modalHeader: modalHeaderNode(props),\r\n modalFooter: modalFooterNode(props),\r\n modalBody: \r\n };\r\n};\r\n\r\nconst modalNode = (props: ISearchResultModalProps) => {\r\n return (\r\n \r\n );\r\n};\r\n\r\nconst modalHeaderNode = (props: ISearchResultModalProps) => {\r\n return (\r\n \r\n {props.resources.modalTitle}\r\n \r\n );\r\n};\r\n\r\nconst modalFooterNode = (props: ISearchResultModalProps) => {\r\n return (\r\n \r\n \r\n \r\n );\r\n};","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport * as React from 'react';\r\n\r\nimport { Button, Collapse, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport {IAny, ICoreContext, IGeneric} from '@msdyn365-commerce/core';\r\nimport { DisplayTemplate, ProductRefinerSource, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\r\nimport RangeRefineItem, { RangeRefineItemType } from './range-refine-item';\r\nimport RefineItem from './refine-item';\r\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\r\nimport { IRefineItemCommonProps } from './refine-item.props.common';\r\nimport { findMatchingRefinementCriterion, isRangeType } from './utilities';\r\n\r\n/**\r\n * Properties associated with the RefineSubmenu component\r\n */\r\nexport interface IRefineSubmenuProps {\r\n tempRangeTypeTODO: RangeRefineItemType;\r\n minValueSliderThumbAriaLabel?: string;\r\n maxValueSliderThumbAriaLabel?: string;\r\n productRefinerHierarchy: IProductRefinerHierarchy;\r\n selectedRefinerValues: ProductRefinerValue[];\r\n refineItemCommonProps: IRefineItemCommonProps;\r\n isDisabled: boolean;\r\n isExpandedOnInitialLoad: boolean;\r\n context: ICoreContext>;\r\n moduleId: string;\r\n moduleTypeName: string;\r\n /** The telemetry content */\r\n telemetryContent?: ITelemetryContent;\r\n onUpdateRefiners(notfication: Readonly): void;\r\n urlBuilder(refiner: IRefineItemToggleNotification): string;\r\n}\r\n\r\n/**\r\n * Refine submenu state\r\n */\r\nexport interface IRefineSubmenuState extends React.ComponentState {\r\n expanded: boolean;\r\n}\r\n\r\n/**\r\n *\r\n * The RefineSubmenu component renders the submenu category and child items.\r\n * This computed observes the stateful category hierarchy object.\r\n * @extends {React.PureComponent}\r\n */\r\nclass RefineSubmenu extends React.Component {\r\n constructor(props: IRefineSubmenuProps) {\r\n super(props);\r\n\r\n this._onToggleItem = this._onToggleItem.bind(this);\r\n this._onToggleSubmenu = this._onToggleSubmenu.bind(this);\r\n\r\n const isExpanded = this.props.isExpandedOnInitialLoad;\r\n // if (this.props.productRefinerHierarchy.DataTypeValue === ProductRefinerValueDataTypeValue.Range) {\r\n // isExpanded = true;\r\n // }\r\n\r\n this.state = {\r\n expanded: isExpanded\r\n };\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { productRefinerHierarchy, refineItemCommonProps } = this.props;\r\n\r\n if (!productRefinerHierarchy) {\r\n refineItemCommonProps.telemetry.error('Cannot render submenu without refiner hierarchy data');\r\n }\r\n\r\n if((productRefinerHierarchy.SourceValue === ProductRefinerSource.Rating) && (this.props.context.app.config.hideRating)) {\r\n return null;\r\n }\r\n return (\r\n
\r\n \r\n {productRefinerHierarchy.KeyName}\r\n \r\n \r\n {this._renderChildItems(productRefinerHierarchy)}\r\n \r\n
\r\n );\r\n }\r\n\r\n private _renderChildItems(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n if (isRangeType(productRefinerHierarchy.DataTypeValue)) {\r\n return this._renderRange(productRefinerHierarchy);\r\n }\r\n return this._renderSingleMultiSelect(productRefinerHierarchy);\r\n }\r\n\r\n private _renderSingleMultiSelect(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n const { isDisabled, refineItemCommonProps, selectedRefinerValues, context } = this.props;\r\n const isSingleSelect = (productRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect) && (productRefinerHierarchy.SourceValue === ProductRefinerSource.Rating);\r\n const role = isSingleSelect ? { role: 'radiogroup' } : undefined;\r\n const refinerValuesList = (productRefinerHierarchy.Values || []);\r\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\r\n if (!child) {\r\n refineItemCommonProps.telemetry.error(\r\n `[refine-submenu] Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\r\n );\r\n return null;\r\n }\r\n\r\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\r\n\r\n return (\r\n refinerValuesList.find(value => value.RefinerRecordId === selectedValue.RefinerRecordId))}\r\n refineItemCommonProps={refineItemCommonProps}\r\n onToggle={this._onToggleItem}\r\n urlBuilder={this.props.urlBuilder}\r\n isDisabled={isDisabled}\r\n key={index}\r\n index= {index}\r\n context = {context}\r\n moduleId={this.props.moduleId}\r\n moduleTypeName={this.props.moduleTypeName}\r\n telemetryContent={this.props.telemetryContent}\r\n />\r\n );\r\n });\r\n return (\r\n
    \r\n {listItems}\r\n
\r\n );\r\n }\r\n\r\n private _getRangeType(productRefinerHierarchy: IProductRefinerHierarchy): 'input' | 'slider' {\r\n if (productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Range ||\r\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Slider ||\r\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.SliderWithBars) {\r\n return 'slider';\r\n }\r\n return 'input';\r\n }\r\n\r\n private _renderRange(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n const { isDisabled, refineItemCommonProps, selectedRefinerValues, context, minValueSliderThumbAriaLabel, maxValueSliderThumbAriaLabel } = this.props;\r\n const submenuClassNamePrefix = 'ms-refine-submenu__item list-group-item refine-submenu__item';\r\n const refinerValuesList = (productRefinerHierarchy.Values || []);\r\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\r\n if (!child) {\r\n refineItemCommonProps.telemetry.error(\r\n `Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\r\n );\r\n return null;\r\n }\r\n\r\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\r\n\r\n const rangeType = this._getRangeType(productRefinerHierarchy);\r\n const key = selectedRefinementCriterion ? `${selectedRefinementCriterion.LeftValueBoundString}-${selectedRefinementCriterion.RightValueBoundString}` : `not-selected-${index}`;\r\n return (\r\n
  • \r\n \r\n
  • \r\n );\r\n });\r\n return
      {listItems}
    ;\r\n }\r\n\r\n private _onToggleItem(itemToggleNotification: IRefineItemToggleNotification): void {\r\n this.props.onUpdateRefiners(itemToggleNotification);\r\n }\r\n\r\n private _onToggleSubmenu(): void {\r\n this.setState(prevState => ({\r\n expanded: !prevState.expanded\r\n }));\r\n }\r\n}\r\n\r\nexport default RefineSubmenu;","import * as React from 'react';\r\ninterface IErrorMessage {\r\n text?: string;\r\n}\r\n\r\nexport const ErrorMessage: React.FC = ({ text }) => {\r\n return (\r\n \r\n
    {text}
    \r\n
    \r\n );\r\n};"," /*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport {ArrayExtensions, getCustomer, GetCustomerInput } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { getTelemetryObject, ILabeledDropdownOnChangeNotification, ILabeledDropdownOption, IModuleProps, INodeProps, ITelemetryContent, LabeledDropdown, UncontrolledPagination } from '@msdyn365-commerce-modules/utilities';\r\nimport { CategoryHierarchy as CategoryHierarchyData, IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport MsDyn365 from '@msdyn365-commerce/core';\r\nimport { format, ProductPrice,ProductRefinerValue, ProjectionDomain, SortColumn, TextValueTranslation } from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n getActivePricesAsync\r\n} from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\nimport { AffiliationLoyaltyTier, CustomerAffiliation } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport classnames from 'classnames';\r\nimport { computed, observable, reaction, transaction } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport { buildListPageUrl, getCollectionProducts, getCurrentUrl, GetFullProductsByCollectionInput, parseQueryParam, sortOptions } from './actions';\r\nimport { ICittaSearchResultContainerData } from './citta-search-result-container.data';\r\nimport { expandRefinersCount, ICittaSearchResultContainerProps } from './citta-search-result-container.props.autogenerated';\r\nimport {\r\n ErrorMessage, FeatureSearchResultItem, getUpdatedRefinementCriteria, IChoiceSummaryClickNotification,\r\n IRefineItemCommonProps, IRefineItemToggleNotification, ISearchResultModalViewProps, isMatchingRefinementCriterion,Link, ModalToggle, ProductSearchResultItems, SearchResultModal, Separator, Title\r\n} from './components';\r\nimport ChoiceSummary from './components/choice-summary';\r\nimport RefineSubmenu from './components/refine-submenu';\r\n\r\nexport interface ISearchResultContainerViewProps extends ICittaSearchResultContainerProps {\r\n products?: React.ReactNode;\r\n className?: string;\r\n SearchResultContainer: IModuleProps;\r\n TitleViewProps: ITitleViewProps;\r\n categoryHierarchy: ICategoryHierarchyViewProps;\r\n pagination?: React.ReactNode;\r\n ProductsContainer: INodeProps;\r\n ProductSectionContainer: INodeProps;\r\n refineMenu: IRefineMenuViewProps;\r\n sortByOptions: ISortByViewProps;\r\n choiceSummary?: React.ReactNode;\r\n modalToggle: React.ReactNode;\r\n isMobile: boolean;\r\n CategoryNavContainer: INodeProps;\r\n RefineAndProductSectionContainer: INodeProps;\r\n errorMessage: React.ReactNode;\r\n FeatureSearchContainer: INodeProps;\r\n similarLookProduct?: React.ReactNode;\r\n productPrices?: ProductPrice[];\r\n toggleModal: Function;\r\n}\r\n\r\nexport interface ITitleViewProps {\r\n TitleContainer: INodeProps;\r\n title:ISearchResultTitle;\r\n}\r\n\r\nexport interface IRefineMenuViewProps {\r\n RefineMenuContainer: INodeProps;\r\n RefinerSectionContainer: INodeProps;\r\n refiners?: React.ReactNode[];\r\n}\r\n\r\nexport interface ICategoryHierarchyViewProps {\r\n categoryHierarchyList?: React.ReactNode[];\r\n categoryHierarchySeparator?: React.ReactNode;\r\n CategoryHierarchyContainer: INodeProps;\r\n}\r\n\r\nexport interface ISortByViewProps {\r\n SortingContainer: INodeProps;\r\n sortByDropDown?:React.ReactNode;\r\n}\r\n\r\nexport type GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\r\n\r\n/**\r\n * Title component for search result container\r\n */\r\nexport interface ISearchResultTitle {\r\n titlePrefix?: React.ReactNode;\r\n titleText?: React.ReactNode;\r\n titleCount?: React.ReactNode;\r\n}\r\n\r\nexport interface ISearchResultContainerState {\r\n sortingState: ISortByCollectionState;\r\n modalIsOpen: boolean;\r\n}\r\n\r\ninterface ISortByCollectionState {\r\n selectedSortByOption: ILabeledDropdownOption;\r\n pending: boolean;\r\n}\r\n\r\n/**\r\n *\r\n * SearchResultContainer component\r\n * @extends {React.PureComponent>}\r\n */\r\n@observer\r\nexport default class SearchResultContainer extends React.PureComponent, ISearchResultContainerState> {\r\n\r\n @computed get isMobile(): boolean {\r\n return (this._viewport === 'xs' || this._viewport === 'sm');\r\n }\r\n\r\n private sortByDropdownOptions: ILabeledDropdownOption[] = [\r\n { key: sortOptions.sortByOptionRelevanceDesc, value: this.props.resources.sortByOptionRelevanceDesc },\r\n { key: sortOptions.sortByOptionNameAsc, value: this.props.resources.sortByOptionNameAsc },\r\n { key: sortOptions.sortByOptionNameDesc, value: this.props.resources.sortByOptionNameDesc },\r\n { key: sortOptions.sortByOptionPriceAsc, value: this.props.resources.sortByOptionPriceAsc },\r\n { key: sortOptions.sortByOptionPriceDesc, value: this.props.resources.sortByOptionPriceDesc },\r\n { key: sortOptions.sortByOptionRatingDesc, value: this.props.resources.sortByOptionRatingDesc },\r\n ];\r\n private _refineItemCommonProps: IRefineItemCommonProps;\r\n private _pageType: string | undefined = this.props.context.request.urlTokens.pageType;\r\n @observable\r\n private _viewport: GridSize;\r\n\r\n private _modalToggleRef: React.RefObject;\r\n private _sortAndFilterContainerRef: React.RefObject;\r\n private expandrefinerCount: number | undefined = 0;\r\n private telemetryContent: ITelemetryContent;\r\n private productPrices: ProductPrice[];\r\n\r\n public static getFriendlyName(locale: string, nameTranslations?: TextValueTranslation[]): string | undefined {\r\n let nameTranslation: TextValueTranslation | undefined;\r\n if (locale && nameTranslations && nameTranslations.length > 0) {\r\n nameTranslation = nameTranslations.find(item => item.Language!.toLowerCase() === locale.toLowerCase());\r\n }\r\n\r\n return nameTranslation && nameTranslation.Text;\r\n }\r\n\r\n constructor(props: ICittaSearchResultContainerProps, state: ISearchResultContainerState) {\r\n super(props);\r\n this._viewport = props.context.request && props.context.request.device && props.context.request.device.Type === 'Mobile' ? 'xs' : 'lg';\r\n this._modalToggleRef = React.createRef();\r\n this._sortAndFilterContainerRef = React.createRef();\r\n this._toggleModal = this._toggleModal.bind(this);\r\n this._updateViewport = this._updateViewport.bind(this);\r\n this.productPrices=[];\r\n this.state = {\r\n sortingState: {\r\n pending: false,\r\n selectedSortByOption: this.sortByDropdownOptions[0]\r\n },\r\n modalIsOpen: false,\r\n };\r\n const {\r\n placeholderTextMax,\r\n minLabel,\r\n maxLabel,\r\n rangeNameFormat\r\n } = this.props.resources;\r\n\r\n const locale = this.props.context.request.locale;\r\n const telemetry = this.props.telemetry;\r\n const validationErrorNaN = this.props.resources.validationErrorNotNumber;\r\n const validationErrorRange = this.props.resources.validationErrorNotRange;\r\n this._refineItemCommonProps = {\r\n telemetry,\r\n locale,\r\n placeholderTextMax,\r\n minLabel,\r\n maxLabel,\r\n rangeNameFormat,\r\n validationErrorNaN,\r\n validationErrorRange\r\n };\r\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!,\r\n this.props.friendlyName,\r\n this.props.telemetry);\r\n\r\n // Initalization of list page\r\n this.props.data.products.then((products) => {\r\n this.props.data.listPageState.then((listPageState) => {\r\n if (this._pageType === 'Category') {\r\n listPageState.pageType = 'Category';\r\n } else {\r\n listPageState.pageType = 'Search';\r\n }\r\n\r\n let querySorting: SortColumn[] = [];\r\n\r\n if (this.props.context.request.query && this.props.context.request.query.sorting) {\r\n querySorting = JSON.parse(decodeURIComponent(this.props.context.request.query.sorting)) as SortColumn[];\r\n }\r\n\r\n listPageState.currentPageNumber = this.props.context.request.query && (+this.props.context.request.query.skip / (this.props.config.itemsPerPage || 10)) || 0;\r\n listPageState.sortingCritera = { Columns: querySorting };\r\n listPageState.pageSize = this.props.config.itemsPerPage || 10;\r\n listPageState.activeProducts = products.products;\r\n listPageState.totalProductCount = products.count;\r\n // Initialize reaction based on listPageState properties\r\n reaction(\r\n () => {\r\n return [listPageState.activeFilters && listPageState.activeFilters.length, listPageState.currentPageNumber, listPageState.sortingCritera && listPageState.sortingCritera.Columns && listPageState.sortingCritera.Columns.length];\r\n },\r\n () => {\r\n const input = new GetFullProductsByCollectionInput(\r\n listPageState.pageType,\r\n this.props.context.request.apiSettings,\r\n { Paging: { Top: this.props.config.itemsPerPage, Skip: Math.max((listPageState.pageSize * (listPageState.currentPageNumber || 0)), 0) }, count: true, Sorting: listPageState.sortingCritera || {} },\r\n listPageState.activeFilters || [],\r\n +(this.props.context.request.urlTokens.itemId || 0),\r\n this.props.context.request.query && this.props.context.request.query.q ? this.props.context.request.query.q : this.props.context.request.query?.productId,\r\n this.props && this.props.config && this.props.config.includeAttributes !== undefined && this.props.config.includeAttributes === true ? true : false,\r\n this.props.context.request.locale\r\n );\r\n getCollectionProducts(input, this.props.context.actionContext).then(productResults => {\r\n listPageState.activeProducts = productResults.products;\r\n listPageState.totalProductCount = productResults.count;\r\n this._getActivePrice().catch(ex=> {throw ex;});\r\n });\r\n }\r\n );\r\n\r\n });\r\n });\r\n\r\n if (this.props.context.request.query?.productId) {\r\n this.props.data.featureProduct.then((products) => {\r\n this.props.data.listPageState.then((listPageStateFeature) => {\r\n listPageStateFeature.featureProduct = products;\r\n\r\n });\r\n });\r\n }\r\n this._updateViewport();\r\n }\r\n\r\n public componentDidMount(): void {\r\n if (MsDyn365.isBrowser && window.addEventListener) {\r\n window.addEventListener('resize', this._updateViewport);\r\n this._updateViewport();\r\n }\r\n if (this.props.config.enableAffiliationBasedPricing &&\r\n this.props.context.actionContext.requestContext?.user?.isAuthenticated) {\r\n // tslint:disable-next-line:no-floating-promises\r\n this._getActivePrice();\r\n }\r\n }\r\n public componentWillUnmount(): void {\r\n if (MsDyn365.isBrowser && window.removeEventListener) {\r\n window.removeEventListener('resize', this._updateViewport);\r\n }\r\n }\r\n\r\n public render(): JSX.Element {\r\n const { imageSettings, className, allowBackNavigation } = this.props.config;\r\n const { resources } = this.props;\r\n const products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\r\n const searchProduct = (this.props.data.listPageState.result && this.props.data.listPageState.result.featureProduct) || null;\r\n let errorText = '';\r\n const breaCrumbType = this.props.context.app.config.breadcrumbType;\r\n const allowBack = allowBackNavigation && (breaCrumbType === 'back' || breaCrumbType === 'categoryAndBack');\r\n if(!products || products.length === 0) {\r\n errorText = this._pageType === 'Category'? resources.resultCategoryNotFoundText : resources.resultSearchNotFoundText;\r\n\r\n }\r\n const productsComponent = (\r\n \r\n );\r\n\r\n const featureComponent = (\r\n \r\n );\r\n\r\n const searchResultContainerViewProps = {\r\n ...this.props,\r\n products: productsComponent,\r\n TitleViewProps: this._getCollectionTitle(),\r\n categoryHierarchy: !this.props.config.disableHierarchy && this._getCategoryHierarchy(),\r\n refineMenu: this._getRefineMenu(),\r\n className: classnames('ms-search-result-container', className),\r\n SearchResultContainer: {\r\n moduleProps: this.props,\r\n className: classnames('ms-search-result-container', className)\r\n },\r\n sortByOptions: this.props.data.listPageState.result && this.props.data.listPageState.result.totalProductCount !== 0 ? this._getSortingDropDown(): null,\r\n pagination: this._getPagination(),\r\n ProductsContainer: { className: 'ms-search-result-container__Products' },\r\n ProductSectionContainer: {className: 'ms-search-result-container__product-section'},\r\n CategoryNavContainer: {className: 'ms-search-result-container__category-nav-section'},\r\n RefineAndProductSectionContainer: {className: 'ms-search-result-container__refine-product-section'},\r\n choiceSummary: this._getChoiceSummary(),\r\n modalToggle: this.props.data.listPageState.result && this.props.data.listPageState.result.totalProductCount !== 0 ?\r\n (\r\n \r\n ) : null,\r\n searchResultModal: this._getSearchResultModal(),\r\n isMobile: this.isMobile,\r\n errorMessage: errorText && (\r\n \r\n ),\r\n FeatureSearchContainer: { className: 'ms-feature-search-result' },\r\n similarLookProduct: this.props.data.listPageState.result && (this.props.data.listPageState.result.featureProduct !== null && this.props.data.listPageState.result.featureProduct !== undefined) ? featureComponent : null,\r\n productPrices: this.productPrices,\r\n toggleModal: this._toggleModal\r\n };\r\n return this.props.renderView(searchResultContainerViewProps) as React.ReactElement;\r\n }\r\n\r\n private _getActivePrice = async (): Promise => {\r\n let products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\r\n const productRecIds = ArrayExtensions.hasElements(products) ? products.map(prod => prod.RecordId) : [];\r\n const projectDomain: ProjectionDomain = { ChannelId: this.props.context.request.apiSettings.channelId, CatalogId: this.props.context.request.apiSettings.catalogId };\r\n const affliations: AffiliationLoyaltyTier[] = [];\r\n const customerInput = new GetCustomerInput(this.props.context.actionContext.requestContext.apiSettings);\r\n const customer = await getCustomer(customerInput, this.props.context.actionContext);\r\n\r\n if (customer && customer.CustomerAffiliations) {\r\n customer.CustomerAffiliations.forEach((affliation: CustomerAffiliation) => {\r\n const aff: AffiliationLoyaltyTier = { AffiliationId: affliation.RetailAffiliationId, CustomerId: customer.AccountNumber };\r\n affliations.push(aff);\r\n });\r\n }\r\n \r\n await getActivePricesAsync(\r\n { callerContext: this.props.context.actionContext, queryResultSettings: {} },\r\n projectDomain,\r\n productRecIds,\r\n new Date(),\r\n null,\r\n affliations,\r\n true\r\n ).then((activePricesResponse:ProductPrice[]) => {\r\n this.productPrices = activePricesResponse;\r\n products = products.map(prod => {\r\n const activePrice = activePricesResponse.find(price => price.ProductId === prod.RecordId);\r\n if (activePrice) {\r\n prod.Price = activePrice.CustomerContextualPrice ?? prod.Price;\r\n prod.BasePrice = Math.max(activePrice.BasePrice || 0, activePrice.TradeAgreementPrice || 0, activePrice.AdjustedPrice || 0);\r\n }\r\n return prod;\r\n });\r\n this.props.data.listPageState.then((listPageState) => {\r\n listPageState.activeProducts = products;\r\n });\r\n }).catch((error: Error) => {\r\n this.props.context.actionContext.trace(error.message);\r\n this.props.context.actionContext.telemetry.exception(error);\r\n this.props.context.actionContext.telemetry.debug(`[get Affiliation based price on search result container ]Error executing action`);\r\n throw new Error('[get Affiliation based price on search result container]Error executing action');\r\n });\r\n }\r\n private _getSearchResultModal = (): ISearchResultModalViewProps => {\r\n const {resources} = this.props;\r\n return SearchResultModal(\r\n {\r\n resources:{\r\n modalCloseButtonText: resources.modalCloseButtonText,\r\n modalTitle: resources.modalTitle\r\n },\r\n className: \"tetete\",\r\n isOpen:this.state.modalIsOpen,\r\n returnRef: this._modalToggleRef,\r\n onModalToggle: this._toggleModal\r\n });\r\n }\r\n\r\n private _getCollectionTitle = (): ITitleViewProps => {\r\n const { data, context, resources } = this.props;\r\n\r\n let collectionTitle: string | undefined = '';\r\n if (context && context.request && context.request.query && context.request.query.q) {\r\n collectionTitle = `\"${context.request.query.q}\"`;\r\n } else {\r\n collectionTitle = (data.category.result && SearchResultContainer.getFriendlyName(context.request.locale, data.category.result.NameTranslations)) ||\r\n (data.category.result && data.category.result.Name);\r\n }\r\n let productCountText = '';\r\n let productCountNumber: number | undefined;\r\n if (data.listPageState && data.listPageState.result && data.listPageState.result.totalProductCount !== undefined) {\r\n productCountNumber = data.listPageState.result.totalProductCount;\r\n } else if (data.products && data.products.result) {\r\n productCountNumber = data.products.result.count;\r\n }\r\n\r\n if (productCountNumber && productCountNumber !== 0) {\r\n productCountText = productCountNumber !== 1 ? format(this.props.resources.numberOfProducts, productCountNumber) : this.props.resources.oneProduct;\r\n } else {\r\n productCountText = format(this.props.resources.numberOfProducts, 0);\r\n }\r\n const titlePrefix = ;\r\n const titleText = collectionTitle && <Title className='ms-search-result__collection-title-text' text={collectionTitle} />;\r\n const titleCount = <Title className='ms-search-result__collection-title-count' text={productCountText} />;\r\n\r\n return {\r\n TitleContainer: { className: 'ms-search-result-container__title' },\r\n title:{\r\n titlePrefix: titlePrefix,\r\n titleText: titleText,\r\n titleCount: titleCount\r\n }\r\n };\r\n\r\n }\r\n private _getCategoryHierarchy = (): ICategoryHierarchyViewProps => {\r\n const { data } = this.props;\r\n const categoryHierarchy = data.categoryHierarchy.result;\r\n const categoryLinks =\r\n categoryHierarchy && categoryHierarchy.map((value: CategoryHierarchyData, index: number) => {\r\n\r\n return (\r\n <Link\r\n key={index}\r\n text={value.Name}\r\n ariaLabel={`${this.props.resources.categoryLinkAriaLabel} ${value.Name}`}\r\n href={value.Url}\r\n />\r\n );\r\n });\r\n const categoryLinkSeparator = <Separator separator='/' />;\r\n\r\n return {\r\n CategoryHierarchyContainer: { tag: 'nav', className: 'ms-search-result-container__category-hierarchy' },\r\n categoryHierarchyList: categoryLinks,\r\n categoryHierarchySeparator: categoryLinkSeparator\r\n };\r\n\r\n }\r\n\r\n private _getSortingDropDown = (): ISortByViewProps => {\r\n const { resources } = this.props;\r\n const activeDropdown = this._getCurrentlySelectedOption() || this.state.sortingState.selectedSortByOption;\r\n const dropdown = (\r\n <LabeledDropdown\r\n labelClassname='reviews-list-sort-by'\r\n labelText={resources.sortByDropdownLabel}\r\n dropdownId='categorySortByDropdown'\r\n dropdownClassname='reviews-list-dropdown'\r\n toggleColor='link'\r\n dropdownOptions={this.sortByDropdownOptions}\r\n selectedOption={activeDropdown}\r\n onSelectOption={this._updateSortByDropdown}\r\n ref={this._sortAndFilterContainerRef}\r\n />);\r\n return {\r\n SortingContainer: { className: 'ms-search-result-container__Sort-by-category' },\r\n sortByDropDown:dropdown\r\n };\r\n }\r\n\r\n private _getPagination = (): React.ReactNode => {\r\n const { config, context, data, resources } = this.props;\r\n const listPageState = data && data.listPageState && data.listPageState.result;\r\n const fullUrl = getCurrentUrl(context.request);\r\n const itemsPerPage = config.itemsPerPage || 10;\r\n const skipCount = listPageState && listPageState.currentPageNumber !== null ?\r\n (listPageState.currentPageNumber * (this.props.config.itemsPerPage || 10)) :\r\n ((this.props.context.request.query && +this.props.context.request.query.skip) || 0);\r\n const totalItems = listPageState && listPageState.totalProductCount || 0;\r\n const previousText = resources.flipperPrevious;\r\n const nextText = resources.flipperNext;\r\n if (totalItems <= itemsPerPage) {\r\n return null;\r\n }\r\n return (\r\n <UncontrolledPagination\r\n className='ms-search-result-container__pagination'\r\n role='navigation'\r\n aria-label={resources.paginationAriaLabel}\r\n url={fullUrl.href}\r\n qsp={'skip'}\r\n items={totalItems}\r\n itemsPerPage={itemsPerPage}\r\n startingItem={skipCount}\r\n previousText={<div className='msc-pagination__prev'><span className='ms-search-result__pagination-left' aria-hidden='true'/><span className='prev-text'>{previousText}</span></div>}\r\n nextText={<div className='msc-pagination__next'><span className='next-text'>{nextText}</span><span className='ms-search-result__pagination-right' aria-hidden='true'/></div>}\r\n previousAriaLabel={previousText}\r\n nextAriaLabel={nextText}\r\n telemetryContent={this.telemetryContent}\r\n />);\r\n }\r\n\r\n private _getRefineMenu = (): IRefineMenuViewProps => {\r\n const { data, context, config } = this.props;\r\n const tempRangeTypeTODO = context.request.query && context.request.query.inputRange ? 'input' : 'slider';\r\n const validRefiners = data.refiners.result && data.refiners.result.filter(refiner => {\r\n return refiner.Values.length > 0;\r\n });\r\n\r\n const activeRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n\r\n this._getexpandRefinerCount(validRefiners && validRefiners.length, config.expandRefinersCount);\r\n const expandedRefiners = this.expandrefinerCount;\r\n const subMenus = validRefiners && validRefiners.map((productRefinerHierarchy: IProductRefinerHierarchy, index: number) => {\r\n return (\r\n <RefineSubmenu\r\n productRefinerHierarchy={productRefinerHierarchy}\r\n selectedRefinerValues={activeRefiners}\r\n refineItemCommonProps={this._refineItemCommonProps}\r\n minValueSliderThumbAriaLabel={this.props.resources.minValueSliderThumbAriaLabel}\r\n maxValueSliderThumbAriaLabel={this.props.resources.maxValueSliderThumbAriaLabel}\r\n key={index}\r\n onUpdateRefiners={this._onUpdateRefiners}\r\n urlBuilder={this._buildRefinerUrl}\r\n isDisabled={false}\r\n isExpandedOnInitialLoad={expandedRefiners && expandedRefiners > index ? true : false}\r\n tempRangeTypeTODO={tempRangeTypeTODO}\r\n context = {context}\r\n moduleId={this.props.id}\r\n moduleTypeName={this.props.typeName}\r\n telemetryContent={this.telemetryContent}\r\n />\r\n );\r\n });\r\n \r\n return {\r\n RefineMenuContainer:{className: 'ms-search-result-container__refine-menu' },\r\n RefinerSectionContainer:{className: 'ms-search-result-container__refiner-section'},\r\n refiners: subMenus\r\n };\r\n\r\n }\r\n\r\n private _getChoiceSummary = (): React.ReactNode => {\r\n const { resources, data, telemetry } = this.props;\r\n const selectedRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n return (\r\n <ChoiceSummary\r\n classNames='ms-choice-summary-by-category'\r\n clearAllText={resources.clearAllText}\r\n label={resources.choiceSummaryLabel}\r\n selectedChoices={selectedRefiners}\r\n // @ts-ignore: NOTE Type-unsafe line below, null refinersByCategoryHierarchy case not handled\r\n refinerHierarchy={data.refiners.result}\r\n choiceFormat={resources.choiceFormat}\r\n choiceRangeValueFormat={resources.choiceRangeValueFormat}\r\n telemetry={telemetry}\r\n onChoiceClicked={this._onChoiceClicked}\r\n urlBuilder={this._buildRefinerUrlForChoiceSummary}\r\n choiceAriaLabel={resources.choiceAriaLabel}\r\n telemetryContent={this.telemetryContent}\r\n />\r\n );\r\n\r\n }\r\n\r\n private _updateSortByDropdown = (notification: ILabeledDropdownOnChangeNotification): void => {\r\n const { context } = this.props;\r\n const requestContext = context && context.request;\r\n const actionContext = context && context.actionContext;\r\n\r\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\r\n const error = `[sort-by-category] cannot sort without context: ${!requestContext ? 'requestContext ' : ''} ${!actionContext ? 'actionContext ' : ''} could not be found`;\r\n this.props.telemetry.warning(error);\r\n }\r\n\r\n window.history.pushState({}, '', buildListPageUrl(getCurrentUrl(this.props.context.request), undefined, [this._getSortColumnFromSelectedOption(notification.selectedOption)], undefined));\r\n transaction(() => {\r\n this.props.data.listPageState.result!.currentPageNumber = 0;\r\n this.props.data.listPageState.result!.sortingCritera = { Columns: [this._getSortColumnFromSelectedOption(notification.selectedOption)] };\r\n });\r\n }\r\n\r\n private _getSortColumnFromSelectedOption = (option: ILabeledDropdownOption): SortColumn => {\r\n const { data } = this.props;\r\n\r\n if (!data.searchConfiguration.result) {\r\n return {};\r\n }\r\n\r\n const mappedConfiguration = data.searchConfiguration.result.find((searchConfiguration) => { return searchConfiguration.key === option.key; });\r\n\r\n if (mappedConfiguration) {\r\n return mappedConfiguration.sortColumn;\r\n }\r\n\r\n return {};\r\n }\r\n\r\n private _getCurrentlySelectedOption = (): ILabeledDropdownOption | undefined => {\r\n const { data } = this.props;\r\n const sortCriteria = data.listPageState.result && data.listPageState.result.sortingCritera;\r\n\r\n const activeSortColumn =\r\n (sortCriteria && sortCriteria.Columns && sortCriteria.Columns[0]) ||\r\n (parseQueryParam<SortColumn[]>('sorting', this.props.context.request) || [])[0];\r\n\r\n if (activeSortColumn && data.searchConfiguration.result) {\r\n const activeMappedConfig = data.searchConfiguration.result.find((mappedSearchConfig) => {\r\n return (mappedSearchConfig.sortColumn.ColumnName === activeSortColumn.ColumnName) &&\r\n (mappedSearchConfig.sortColumn.IsDescending === activeSortColumn.IsDescending);\r\n });\r\n if (activeMappedConfig) {\r\n return this.sortByDropdownOptions.find((dropdownOption) => dropdownOption.key === activeMappedConfig.key);\r\n }\r\n }\r\n\r\n return;\r\n }\r\n\r\n private _onUpdateRefiners = (itemToggleNotification: IRefineItemToggleNotification): void => {\r\n const { context } = this.props;\r\n const requestContext = context && context.request;\r\n const actionContext = context && context.actionContext;\r\n\r\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\r\n const error = `Refine menu cannot refine search criteria: ${!requestContext ? 'requestContext ' : ''} ${!actionContext ? 'actionContext ' : ''} could not be found`;\r\n this.props.telemetry.warning(error);\r\n }\r\n\r\n const updatedRefinementCriteria = getUpdatedRefinementCriteria(itemToggleNotification, this.props.data.listPageState.result && this.props.data.listPageState.result.activeFilters || []);\r\n\r\n window.history.pushState({}, '', buildListPageUrl(getCurrentUrl(this.props.context.request), updatedRefinementCriteria));\r\n transaction(() => {\r\n this.props.data.listPageState.result!.currentPageNumber = 0;\r\n this.props.data.listPageState.result!.activeFilters = updatedRefinementCriteria;\r\n });\r\n }\r\n\r\n private _buildRefinerUrl = (itemToggleNotification: IRefineItemToggleNotification): string => {\r\n if (this.props.data.listPageState.result) {\r\n const newRefinementCriteria = getUpdatedRefinementCriteria(itemToggleNotification, this.props.data.listPageState.result.activeFilters || []);\r\n\r\n return buildListPageUrl(getCurrentUrl(this.props.context.request), newRefinementCriteria);\r\n } else {\r\n this.props.telemetry.warning(`[buildRefinerQueryString]List Page State Not available, unable to build refiner URL`);\r\n return '';\r\n }\r\n }\r\n\r\n private _onChoiceClicked = (notification: IChoiceSummaryClickNotification): void => {\r\n const { data, telemetry } = this.props;\r\n\r\n if (!data.listPageState.result) {\r\n telemetry.warning('[choice-summary-by-category._onChoiceClicked]ListPageState unavailable, unable to update refiners.');\r\n return;\r\n }\r\n\r\n let currentRefinementCriteria = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n\r\n if (!notification.clearAll) {\r\n const selectedChoice = notification.choiceClicked;\r\n if (!selectedChoice) {\r\n telemetry.warning('[choice-summary-by-category._onChoiceClicked] Choice could not be determined');\r\n return;\r\n }\r\n currentRefinementCriteria = currentRefinementCriteria.filter(\r\n (selectedCriterion: ProductRefinerValue) => !isMatchingRefinementCriterion(selectedChoice, selectedCriterion)\r\n );\r\n } else {\r\n currentRefinementCriteria = [];\r\n\r\n // set focus to sort and filter\r\n const dropdownElementId = this._sortAndFilterContainerRef.current && this._sortAndFilterContainerRef.current.props.dropdownId;\r\n const dropdownElement = dropdownElementId && document.getElementById(dropdownElementId);\r\n setTimeout(() => {\r\n dropdownElement && dropdownElement.focus();\r\n },\r\n 50);\r\n }\r\n\r\n const fullUrl = getCurrentUrl(this.props.context.request);\r\n window.history.pushState({}, '', buildListPageUrl(fullUrl, currentRefinementCriteria));\r\n data.listPageState.result.currentPageNumber = 0;\r\n data.listPageState.result.activeFilters = currentRefinementCriteria;\r\n }\r\n\r\n private _buildRefinerUrlForChoiceSummary = (selectedRefiner: ProductRefinerValue, isClearAll: boolean): string => {\r\n const { data, telemetry } = this.props;\r\n const fullUrl = getCurrentUrl(this.props.context.request);\r\n\r\n if (!data.listPageState.result) {\r\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl]ListPageState unavailable, unable to create refiner URL.');\r\n return fullUrl.href;\r\n }\r\n\r\n let currentRefinementCriteria = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n\r\n if (!isClearAll) {\r\n if (!selectedRefiner) {\r\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl] URL for Choice could not be determined');\r\n return fullUrl.href;\r\n }\r\n currentRefinementCriteria = currentRefinementCriteria.filter(\r\n (selectedCriterion: ProductRefinerValue) => !isMatchingRefinementCriterion(selectedRefiner, selectedCriterion)\r\n );\r\n } else {\r\n currentRefinementCriteria = [];\r\n }\r\n\r\n return buildListPageUrl(fullUrl, currentRefinementCriteria);\r\n }\r\n\r\n private _getViewport(): GridSize {\r\n const { context } = this.props;\r\n\r\n // always render in mobile viewport on a mobile device\r\n if (context.request && context.request.device && context.request.device.Type === 'Mobile') {\r\n return 'xs';\r\n }\r\n\r\n if (MsDyn365.isBrowser && window.innerWidth) {\r\n const gridSettings = context.request.gridSettings;\r\n if (gridSettings) {\r\n if (gridSettings.xs && window.innerWidth <= gridSettings.xs.w) {\r\n return 'xs';\r\n } else if (gridSettings.sm && window.innerWidth <= gridSettings.sm.w) {\r\n return 'sm';\r\n } else if (gridSettings.md && window.innerWidth <= gridSettings.md.w) {\r\n return 'md';\r\n } else if (gridSettings.lg && window.innerWidth <= gridSettings.lg.w) {\r\n return 'lg';\r\n } else {\r\n return 'xl';\r\n }\r\n }\r\n }\r\n\r\n return 'lg';\r\n }\r\n\r\n private _toggleModal(): void {\r\n this.setState({\r\n modalIsOpen: !this.state.modalIsOpen\r\n });\r\n }\r\n\r\n private _updateViewport(): void {\r\n this._viewport = this._getViewport();\r\n\r\n if (this.state.modalIsOpen && !this.isMobile) {\r\n this._toggleModal();\r\n }\r\n }\r\n\r\n private _getexpandRefinerCount = (validRefiners?: number, refinerCount?: expandRefinersCount): void => {\r\n switch(refinerCount) {\r\n case expandRefinersCount.all:\r\n this.expandrefinerCount = validRefiners;\r\n break;\r\n case expandRefinersCount.one:\r\n this.expandrefinerCount = 1;\r\n break;\r\n case expandRefinersCount.two:\r\n this.expandrefinerCount = 2;\r\n break;\r\n case expandRefinersCount.three:\r\n this.expandrefinerCount = 3;\r\n break;\r\n case expandRefinersCount.four:\r\n this.expandrefinerCount = 4;\r\n break;\r\n default:\r\n this.expandrefinerCount = 0;\r\n }\r\n }\r\n\r\n}\r\n","import { IRefineItemToggleNotification } from '@msdyn365-commerce-modules/search-result-container';\r\nimport { ITelemetry } from '@msdyn365-commerce/core';\r\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\r\n\r\n/**\r\n * Types of product refiner values\r\n */\r\nexport const enum ProductRefinerValueDataTypeValue {\r\n /**\r\n * Range slider is used for selections like price\r\n */\r\n Range = 1,\r\n\r\n /**\r\n * Range input is a different way to specify ranges and can be expressed with input boxes\r\n * as well as a set of discrete single-select type values\r\n */\r\n RangeInput = 4,\r\n\r\n /**\r\n * This is a discrete list item, either multi-select or single-select\r\n */\r\n List = 5,\r\n\r\n /**\r\n * Boolean types allows only single-select\r\n */\r\n Boolean = 6\r\n}\r\n\r\n/**\r\n * Types of product refiners\r\n */\r\nexport const enum ProductRefinerTypeValue {\r\n /**\r\n * Refiner values are single-select\r\n */\r\n Single = 0,\r\n\r\n /**\r\n * Refiner values are multi-select\r\n */\r\n Multi = 1\r\n}\r\n\r\n/**\r\n * ProductRefinerSource enum type.\r\n */\r\nexport const enum ProductRefinerSource {\r\n /**\r\n * The None member.\r\n */\r\n None = 0,\r\n /**\r\n * The Attribute member.\r\n */\r\n Attribute = 1,\r\n /**\r\n * The Category member.\r\n */\r\n Category = 2,\r\n /**\r\n * The Price member.\r\n */\r\n Price = 3,\r\n /**\r\n * The Rating member.\r\n */\r\n Rating = 4\r\n}\r\n\r\n/**\r\n * Find the refinement criterion associated with this product refiner value\r\n * @param productRefinerValue product refiner value to match\r\n * @param refinementCriteria selected refinement criteria\r\n */\r\nexport function findMatchingRefinementCriterion(\r\n productRefinerValue: ProductRefinerValue,\r\n refinementCriteria: ProductRefinerValue[]\r\n): ProductRefinerValue | undefined {\r\n // if the value is a range, then match only on data type value; otherwise match on item string\r\n return refinementCriteria.find(\r\n (refinementCriterion: ProductRefinerValue) => isMatchingRefinementCriterion(productRefinerValue, refinementCriterion)\r\n );\r\n}\r\n\r\n/**\r\n * Find the refinement criterion associated with this product refiner value\r\n * @param productRefinerValue product refiner value to match\r\n * @param refinementCriteria selected refinement criteria\r\n */\r\nexport function isMatchingRefinementCriterion(\r\n productRefinerValue: ProductRefinerValue,\r\n refinementCriterion: ProductRefinerValue\r\n): boolean {\r\n // if the value is a range, then match only on data type value; otherwise match on item string\r\n return (\r\n refinementCriterion.RefinerRecordId === productRefinerValue.RefinerRecordId &&\r\n refinementCriterion.RefinerSourceValue === productRefinerValue.RefinerSourceValue &&\r\n refinementCriterion.DataTypeValue === productRefinerValue.DataTypeValue &&\r\n (refinementCriterion.DataTypeValue === ProductRefinerValueDataTypeValue.Range ||\r\n refinementCriterion.LeftValueBoundString === productRefinerValue.LeftValueBoundString)\r\n );\r\n}\r\n\r\nexport function getUpdatedRefinementCriteria(\r\n itemToggleNotification: IRefineItemToggleNotification,\r\n currentRefinementCriteria: ProductRefinerValue[]): ProductRefinerValue[] {\r\n const updatedRefinementCriteria: ProductRefinerValue[] = [];\r\n let toggledItemFound = false;\r\n currentRefinementCriteria.forEach((selectedCriterion: ProductRefinerValue) => {\r\n if (isMatchingRefinementCriterion(itemToggleNotification.productRefinerValue, selectedCriterion)) {\r\n toggledItemFound = true;\r\n if (itemToggleNotification.isSelecting) {\r\n const next = {\r\n ...selectedCriterion,\r\n LeftValueBoundString: itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}` || selectedCriterion.LeftValueBoundString,\r\n RightValueBoundString: itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}` || selectedCriterion.RightValueBoundString,\r\n };\r\n updatedRefinementCriteria.push(next);\r\n\r\n } // else the item is being de-selected, so omit it from the refinement criteria\r\n } else {\r\n // keep existing criterion because it is not in the item toggle notification\r\n updatedRefinementCriteria.push(selectedCriterion);\r\n }\r\n });\r\n\r\n if (!toggledItemFound) {\r\n const next = {\r\n ...itemToggleNotification.productRefinerValue,\r\n LeftValueBoundString: itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}` || itemToggleNotification.productRefinerValue.LeftValueBoundString,\r\n RightValueBoundString: itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}` || itemToggleNotification.productRefinerValue.RightValueBoundString,\r\n };\r\n updatedRefinementCriteria.push(next);\r\n\r\n // If single select, then deselect any others in the parent refiner group\r\n if ((itemToggleNotification.productRefinerValue.DataTypeValue === ProductRefinerValueDataTypeValue.List || itemToggleNotification.productRefinerValue.DataTypeValue === ProductRefinerValueDataTypeValue.Boolean) &&\r\n itemToggleNotification.parentProductRefinerHierarchy.RefinerTypeValue === ProductRefinerTypeValue.Single) {\r\n itemToggleNotification.parentProductRefinerHierarchy.Values.forEach((child: ProductRefinerValue) => {\r\n if (child.RefinerRecordId === next.RefinerRecordId && child.LeftValueBoundString === next.LeftValueBoundString) {\r\n // do nothing\r\n } else {\r\n const matchingIndex = updatedRefinementCriteria.findIndex((criterion: ProductRefinerValue) => isMatchingRefinementCriterion(child, criterion));\r\n if (matchingIndex > -1) {\r\n updatedRefinementCriteria.splice(matchingIndex, 1);\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n return updatedRefinementCriteria;\r\n}\r\n\r\nexport function formatPrice(\r\n amount: string | undefined,\r\n currency: string | undefined,\r\n locale: string | undefined,\r\n telemetry: ITelemetry): string {\r\n if (!amount || !currency) {\r\n telemetry.trace(`[refine-menu.utilities.formatPrice] could not format price for ${amount} ${currency}`);\r\n return amount || '';\r\n }\r\n const priceAmount = (amount && Number(amount)) || 0;\r\n let result: string;\r\n\r\n try {\r\n result = new Intl.NumberFormat(locale, {\r\n style: 'currency',\r\n currencyDisplay: 'symbol',\r\n currency: currency\r\n }).format(priceAmount);\r\n } catch (e) {\r\n result = `${priceAmount} ${currency}`;\r\n telemetry.warning(`[refine-menu.utilities.formatPrice] Failed to format price for ${result}: ${e}`);\r\n }\r\n\r\n return result;\r\n}","import { Slider } from '@msdyn365-commerce-modules/utilities';\r\nimport debounce from 'lodash/debounce';\r\nimport { computed } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport { formatPrice } from './utilities';\r\n\r\ntype InputType = 'Min' | 'Max';\r\n\r\nimport { IRefineItemProps, IRefineItemState } from './refine-item';\r\n\r\nexport type RangeRefineItemType = 'slider' | 'input';\r\n\r\n/**\r\n * Range refine item properties\r\n */\r\nexport interface IRangeRefineItemProps extends IRefineItemProps {\r\n rangeType: RangeRefineItemType;\r\n minValueSliderThumbAriaLabel?: string;\r\n maxValueSliderThumbAriaLabel?: string;\r\n}\r\n\r\n/**\r\n * Range refine item state\r\n */\r\nexport interface IRangeRefineItemState extends IRefineItemState {\r\n validationErrorMin: string | undefined;\r\n validationErrorMax: string | undefined;\r\n selectedMin: string | undefined;\r\n selectedMax: string | undefined;\r\n touchedMin: boolean;\r\n touchedMax: boolean;\r\n}\r\n\r\n/**\r\n * RangeRefineItem component (controlled by RefineSubmenu)\r\n */\r\n@observer\r\nexport default class RangeRefineItem extends React.Component<IRangeRefineItemProps, IRangeRefineItemState> {\r\n private _formattedPriceReverseLookup: Map<string, string> = new Map();\r\n\r\n private minInput: React.RefObject<HTMLInputElement>;\r\n private maxInput: React.RefObject<HTMLInputElement>;\r\n\r\n @computed get currencyCode(): string {\r\n return this.props.productRefinerValue.UnitText || '';\r\n }\r\n\r\n constructor(props: IRangeRefineItemProps) {\r\n super(props);\r\n this._onRangeUpdate = this._onRangeUpdate.bind(this);\r\n this._onRangeUpdateEnd = this._onRangeUpdateEnd.bind(this);\r\n this._handleRangeTooltipText = this._handleRangeTooltipText.bind(this);\r\n this._changeMin = this._changeMin.bind(this);\r\n this._changeMax = this._changeMax.bind(this);\r\n this._finishChangeMin = this._finishChangeMin.bind(this);\r\n this._finishChangeMax = this._finishChangeMax.bind(this);\r\n\r\n this.minInput = React.createRef<HTMLInputElement>();\r\n this.maxInput = React.createRef<HTMLInputElement>();\r\n\r\n const { selectedRefinementCriterion } = this.props;\r\n const initialMin = selectedRefinementCriterion && selectedRefinementCriterion.LeftValueBoundString || '0';\r\n const initialMax = selectedRefinementCriterion && selectedRefinementCriterion.RightValueBoundString || undefined;\r\n this.state = {\r\n isChecked: false,\r\n validationErrorMin: undefined,\r\n validationErrorMax: undefined,\r\n selectedMin: initialMin,\r\n selectedMax: initialMax,\r\n touchedMin: false,\r\n touchedMax: false\r\n };\r\n }\r\n\r\n public render(): JSX.Element | undefined {\r\n const { productRefinerValue, parentProductRefinerHierarchy, refineItemCommonProps } = this.props;\r\n\r\n if (!productRefinerValue || !parentProductRefinerHierarchy) {\r\n refineItemCommonProps.telemetry.error('Cannot render refine value range without productRefinerValue and parentProductRefinerHierarchy');\r\n return undefined;\r\n }\r\n\r\n if (this.props.rangeType === 'input') {\r\n return this._renderInputFields();\r\n }\r\n\r\n return this._renderSlider();\r\n }\r\n\r\n private _renderInputFields(): JSX.Element | undefined {\r\n const { isDisabled, parentProductRefinerHierarchy, refineItemCommonProps } = this.props;\r\n const { selectedMin, selectedMax, touchedMin, touchedMax, validationErrorMin, validationErrorMax } = this.state;\r\n\r\n const rangeAriaLabel = (refineItemCommonProps.rangeNameFormat || '{0}').replace('{0}', (parentProductRefinerHierarchy.KeyName || ''));\r\n const formAttrs = {\r\n 'aria-label': rangeAriaLabel,\r\n 'aria-disabled': isDisabled\r\n };\r\n\r\n // To enable price formatting of selected fields, this is the approach:\r\n // initial value: min=0 formatted as price, max=undefined\r\n // onFocus/onChange: convert to number (unformat) and mark as touched to indicate value is being edited\r\n // onBlur: validate and format entered value as price\r\n const minInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-min ${validationErrorMin ? 'refine-submenu__input-range--error' : ''}`;\r\n const maxInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-max ${validationErrorMax ? 'refine-submenu__input-range--error' : ''}`;\r\n const minLabelClassName = 'ms-refine-submenu__input-range-label refine-submenu__input-range-label-min';\r\n const maxLabelClassName = 'ms-refine-submenu__input-range-label refine-submenu__input-range-label-max';\r\n const formattedSelectedMin = this._getFormattedSelectedValue(selectedMin, touchedMin, validationErrorMin);\r\n const formattedSelectedMax = this._getFormattedSelectedValue(selectedMax, touchedMax, validationErrorMax);\r\n return (\r\n <form className='ms-refine-submenu__input-range-refiner' {...formAttrs}>\r\n <label className={minLabelClassName}>\r\n {refineItemCommonProps.minLabel}\r\n <input\r\n className={minInputClassName}\r\n onChange={this._changeMin}\r\n onFocus={this._changeMin}\r\n onBlur={this._finishChangeMin}\r\n value={formattedSelectedMin}\r\n ref={this.minInput}\r\n />\r\n </label>\r\n <label className={maxLabelClassName}>\r\n {refineItemCommonProps.maxLabel}\r\n <input\r\n className={maxInputClassName}\r\n placeholder={formattedSelectedMax ? undefined : refineItemCommonProps.placeholderTextMax}\r\n onChange={this._changeMax}\r\n onFocus={this._changeMax}\r\n onBlur={this._finishChangeMax}\r\n value={formattedSelectedMax}\r\n ref={this.maxInput}\r\n />\r\n </label>\r\n {validationErrorMin &&\r\n <span className='ms-refine-submenu__input-range-error-text refine-submenu__input-range-min-error-text'>{validationErrorMin}</span>\r\n }\r\n {validationErrorMax && validationErrorMin !== validationErrorMax &&\r\n <span className='ms-refine-submenu__input-range-error-text refine-submenu__input-range-max-error-text'>{validationErrorMax}</span>\r\n }\r\n </form>\r\n );\r\n }\r\n\r\n private _renderSlider(): JSX.Element | undefined {\r\n const { isDisabled, productRefinerValue, parentProductRefinerHierarchy, selectedRefinementCriterion } = this.props;\r\n const min = productRefinerValue.LeftValueBoundString;\r\n const max = productRefinerValue.RightValueBoundString;\r\n const selectedMin = selectedRefinementCriterion && selectedRefinementCriterion.LeftValueBoundString || productRefinerValue.LeftValueBoundString || '0';\r\n const selectedMax = selectedRefinementCriterion && selectedRefinementCriterion.RightValueBoundString || productRefinerValue.RightValueBoundString || max;\r\n const sliderId = `slider_${parentProductRefinerHierarchy.RecordId}_${productRefinerValue.RefinerRecordId}`;\r\n const ariaAttributes = {\r\n 'aria-disabled': isDisabled\r\n };\r\n\r\n const minPrice = this._formatPrice(min);\r\n const maxPrice = this._formatPrice(max);\r\n const selectedMinPrice = this._formatPrice(selectedMin);\r\n const selectedMaxPrice = this._formatPrice(selectedMax);\r\n\r\n return (\r\n <Slider\r\n className={'ms-refine-submenu__range-refiner'}\r\n key={sliderId}\r\n id={sliderId}\r\n inForm={false}\r\n min={min && Number(min) || undefined}\r\n max={max && Number(max) || undefined}\r\n step={1}\r\n orientation={'horizontal'}\r\n labels={[\r\n {\r\n labelId: `${sliderId}_start`,\r\n labelString: `${minPrice}`,\r\n labelPositioning: 'start'\r\n },\r\n {\r\n labelId: `${sliderId}_end`,\r\n labelString: `${maxPrice}`,\r\n labelPositioning: 'end'\r\n }\r\n ]}\r\n showLabels={true}\r\n showTooltip={true}\r\n sliderThumbs={[\r\n {\r\n id: `${sliderId}_slider_thumb_start`,\r\n value: selectedMin && Number(selectedMin) || 0,\r\n ariaLabel: `${this.props.minValueSliderThumbAriaLabel} ${this.currencyCode}`,\r\n ariaValueText: `${selectedMinPrice}`\r\n },\r\n {\r\n id: `${sliderId}_slider_thumb_end`,\r\n value: Number(selectedMax) || Number(maxPrice),\r\n ariaLabel: `${this.props.maxValueSliderThumbAriaLabel} ${this.currencyCode}`,\r\n ariaValueText: `${selectedMaxPrice}`\r\n }\r\n ]}\r\n onChangeEnd={this._onRangeUpdateEnd}\r\n onChange={debounce(this._onRangeUpdate, 500)}\r\n handleTooltipText={this._handleRangeTooltipText}\r\n {...ariaAttributes}\r\n />\r\n );\r\n }\r\n\r\n private _changeMin(event: React.FocusEvent<HTMLInputElement>): void {\r\n this._changeValue(event, 'Min');\r\n }\r\n\r\n private _changeMax(event: React.FocusEvent<HTMLInputElement>): void {\r\n this._changeValue(event, 'Max');\r\n }\r\n\r\n private _changeValue(event: React.FocusEvent<HTMLInputElement>, inputType: InputType): void {\r\n const selectedKey = `selected${inputType}`;\r\n const touchedKey = `touched${inputType}`;\r\n this.setState({\r\n [selectedKey]: this._getInputWithoutFormatting(event.currentTarget.value),\r\n [touchedKey]: true\r\n });\r\n }\r\n\r\n private _finishChangeMin(event: React.FocusEvent<HTMLInputElement>): boolean {\r\n const selectedMinValue = this._getInputWithoutFormatting(event.currentTarget.value);\r\n this.setState({\r\n selectedMin: selectedMinValue,\r\n minTouched: false\r\n });\r\n const minInput = Number(selectedMinValue);\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue, refineItemCommonProps, selectedRefinementCriterion } = this.props;\r\n const max = selectedRefinementCriterion && selectedRefinementCriterion.RightValueBoundString || undefined;\r\n\r\n const maxNum = max ? Number(max) : undefined;\r\n\r\n if (isNaN(minInput)) {\r\n this.setState({ validationErrorMin: refineItemCommonProps.validationErrorNaN });\r\n this._focus('Min');\r\n return false;\r\n }\r\n\r\n if (this._validateRange(minInput, maxNum)) {\r\n onToggle({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: minInput,\r\n rangeEnd: maxNum\r\n });\r\n return true;\r\n } else {\r\n this._focus('Min');\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private _finishChangeMax(event: React.FocusEvent<HTMLInputElement>): boolean {\r\n const selectedMaxValue = this._getInputWithoutFormatting(event.currentTarget.value);\r\n this.setState({\r\n selectedMax: selectedMaxValue,\r\n maxTouched: false\r\n });\r\n const maxInput = Number(selectedMaxValue);\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue, refineItemCommonProps, selectedRefinementCriterion } = this.props;\r\n const min = selectedRefinementCriterion && selectedRefinementCriterion.LeftValueBoundString || '0';\r\n\r\n const minNum = Number(min);\r\n\r\n if (isNaN(maxInput)) {\r\n this.setState({ validationErrorMax: refineItemCommonProps.validationErrorNaN });\r\n this._focus('Max');\r\n return false;\r\n }\r\n\r\n if (this._validateRange(minNum, maxInput)) {\r\n if (productRefinerValue) {\r\n onToggle({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: minNum,\r\n rangeEnd: maxInput\r\n });\r\n } else {\r\n this._focus('Max');\r\n }\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private _focus(inputType: InputType): void {\r\n const ref = inputType === 'Max' ? this.maxInput : this.minInput;\r\n\r\n setTimeout(() => {\r\n if (ref && ref.current) {\r\n ref.current.focus();\r\n }\r\n }, 50);\r\n }\r\n\r\n private _getFormattedSelectedValue(selected: string | undefined, touched: boolean, validationError: string | undefined): string | undefined {\r\n if (touched || validationError || selected === undefined) {\r\n return selected;\r\n }\r\n return this._formatPrice(selected);\r\n }\r\n\r\n private _validateRange(min: number, max: number | undefined): boolean {\r\n const { refineItemCommonProps } = this.props;\r\n if (max === undefined) {\r\n return true;\r\n }\r\n\r\n if (min > max) {\r\n this.setState({\r\n validationErrorMin: refineItemCommonProps.validationErrorRange,\r\n validationErrorMax: refineItemCommonProps.validationErrorRange\r\n });\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private _formatPrice(amount: string | undefined): string {\r\n const locale = this.props.refineItemCommonProps.locale;\r\n const result = formatPrice(amount, this.currencyCode, locale, this.props.refineItemCommonProps.telemetry);\r\n if (this.props.productRefinerValue!.LeftValueBoundString === '0' && this.props.productRefinerValue!.RightValueBoundString === '0') {\r\n return result.slice(2);\r\n }\r\n if (amount !== undefined && !this._formattedPriceReverseLookup.has(result)) {\r\n this._formattedPriceReverseLookup.set(result, amount);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private _getInputWithoutFormatting(input: string): string {\r\n // First try to cast raw input to a number\r\n const inputAsNum = Number(input);\r\n if (!isNaN(inputAsNum)) {\r\n return input;\r\n }\r\n\r\n // Otherwise try a reverse lookup and fall back to the raw input if all else fails\r\n const reverseLookupResult = this._formattedPriceReverseLookup.get(input);\r\n return reverseLookupResult || input;\r\n }\r\n\r\n // NOTE: Fix types once Shared Components build pipeline bug fixed\r\n // tslint:disable-next-line:no-any\r\n private _onRangeUpdate(sliderChangeNotification: any): void {\r\n // Need to filter out mousemove events as these cause errors after the menu updates and slider re-renders\r\n if (sliderChangeNotification.eventType !== 'mousemove') {\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\r\n if (productRefinerValue && sliderChangeNotification) {\r\n onToggle({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: sliderChangeNotification.firstThumbValue,\r\n rangeEnd: sliderChangeNotification.secondThumbValue\r\n });\r\n\r\n this._focusOnSliderThumb(sliderChangeNotification);\r\n }\r\n }\r\n }\r\n\r\n // tslint:disable-next-line\r\n private _onRangeUpdateEnd(sliderChangeNotification: any): void {\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\r\n if (productRefinerValue && sliderChangeNotification) {\r\n onToggle({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: sliderChangeNotification.firstThumbValue,\r\n rangeEnd: sliderChangeNotification.secondThumbValue\r\n });\r\n\r\n this._focusOnSliderThumb(sliderChangeNotification);\r\n }\r\n }\r\n\r\n // tslint:disable-next-line\r\n private _focusOnSliderThumb(sliderChangeNotification: any): void {\r\n if (sliderChangeNotification.id) {\r\n const element = document.getElementById(sliderChangeNotification.id);\r\n if (!!element) {\r\n setTimeout(\r\n () => {\r\n element.focus();\r\n },\r\n 0);\r\n }\r\n }\r\n }\r\n\r\n private _handleRangeTooltipText(tooltip: number): string {\r\n return this._formatPrice(`${tooltip}`);\r\n }\r\n}","import { IRefineItemCommonProps, IRefineItemToggleNotification } from '@msdyn365-commerce-modules/search-result-container';\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { RatingComponent } from '@msdyn365-commerce/components';\r\nimport { ICoreContext } from '@msdyn365-commerce/core';\r\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\nimport { ProductRefinerSource, ProductRefinerTypeValue } from './utilities';\r\n\r\n/**\r\n * RefineItem properties\r\n */\r\nexport interface IRefineItemProps {\r\n\r\n parentProductRefinerHierarchy: IProductRefinerHierarchy;\r\n productRefinerValue: ProductRefinerValue;\r\n selectedRefinementCriterion: ProductRefinerValue | undefined;\r\n refineItemCommonProps: IRefineItemCommonProps;\r\n isDisabled: boolean;\r\n keyId: number;\r\n context: ICoreContext;\r\n moduleId: string;\r\n moduleTypeName: string;\r\n onToggle(notfication: Readonly<IRefineItemToggleNotification>): void;\r\n urlBuilder(refiner: IRefineItemToggleNotification): string;\r\n}\r\n\r\n/**\r\n * Refine item state\r\n */\r\nexport interface IRefineItemState extends React.ComponentState {\r\n isChecked: boolean;\r\n renderingError?: object;\r\n}\r\n\r\n/**\r\n * Single-select and multi-select refine item component (controlled by RefineSubmenu)\r\n */\r\nexport default class RefineItem extends React.Component<IRefineItemProps, IRefineItemState> {\r\n private anchorType: React.RefObject<HTMLAnchorElement>;\r\n\r\n constructor(props: IRefineItemProps) {\r\n super(props);\r\n this._onClick = this._onClick.bind(this);\r\n this.state = {\r\n isChecked: !!this.props.selectedRefinementCriterion\r\n };\r\n this.anchorType = React.createRef();\r\n }\r\n\r\n public render(): JSX.Element | undefined {\r\n const {\r\n isDisabled,\r\n refineItemCommonProps,\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n selectedRefinementCriterion,\r\n // @ts-ignore\r\n children,\r\n onToggle,\r\n context,\r\n keyId,\r\n ...attrs\r\n } = this.props;\r\n if (!productRefinerValue) {\r\n refineItemCommonProps.telemetry.error('[refine-item] Cannot render refineItem without productRefinerValue');\r\n return undefined;\r\n }\r\n if (!productRefinerValue.LeftValueBoundString) {\r\n refineItemCommonProps.telemetry.warning(`[refine-item] RefineItem without LeftValueBoundString: ${JSON.stringify(productRefinerValue)}`);\r\n }\r\n const isSingleSelect = parentProductRefinerHierarchy.RefinerTypeValue === ProductRefinerTypeValue.Single;\r\n let itemTypeClassName = isSingleSelect ? 'single-select' : 'multi-select';\r\n itemTypeClassName = `ms-refine-submenu-item ${itemTypeClassName}`;\r\n const inputType = isSingleSelect ? 'radio' : 'checkbox';\r\n const role = isSingleSelect ? 'radio' : undefined;\r\n itemTypeClassName = !!selectedRefinementCriterion ? `${itemTypeClassName}-checked` : itemTypeClassName;\r\n if (parentProductRefinerHierarchy.SourceValue === ProductRefinerSource.Rating) {\r\n if (productRefinerValue.LeftValueBoundString) {\r\n return (\r\n <li\r\n className='ms-refine-submenu-item'\r\n role='radio'\r\n aria-checked='false'\r\n id={`${parentProductRefinerHierarchy.KeyName!}_${productRefinerValue.LeftValueBoundLocalizedString}`}\r\n aria-label={`${parentProductRefinerHierarchy.KeyName!}_${productRefinerValue.LeftValueBoundLocalizedString}`}\r\n >\r\n <a\r\n href={this._getRefinerUrl()}\r\n aria-label={`${parentProductRefinerHierarchy.KeyName!}_${productRefinerValue.LeftValueBoundLocalizedString}`}\r\n onClick={this._onClick}\r\n >\r\n <RatingComponent\r\n avgRating={parseInt(productRefinerValue.LeftValueBoundString, 10)}\r\n ratingCount={productRefinerValue.LeftValueBoundLocalizedString ? productRefinerValue.LeftValueBoundLocalizedString : productRefinerValue.LeftValueBoundString}\r\n hideCount={false}\r\n readOnly={true}\r\n ariaLabel=''\r\n context={context}\r\n id={this.props.moduleId}\r\n typeName={this.props.moduleTypeName}\r\n data={{}}\r\n />\r\n <span className='refine-submenu-item__rating'>{productRefinerValue.Count !== undefined && `(${productRefinerValue.Count})`}</span>\r\n </a>\r\n </li>\r\n );\r\n } else {\r\n return undefined;\r\n }\r\n } else {\r\n return (\r\n <li className='ms-refine-submenu-item' role={role} id={`${parentProductRefinerHierarchy.KeyName!}_${productRefinerValue.LeftValueBoundString}_${keyId}`}>\r\n <a\r\n key={!!selectedRefinementCriterion ? 'true' : 'false'}\r\n ref={this.anchorType}\r\n href={this._getRefinerUrl()}\r\n tabIndex={0}\r\n onClick={this._onClick}\r\n className={itemTypeClassName}\r\n role={inputType}\r\n aria-checked={!!selectedRefinementCriterion}\r\n {...attrs}\r\n >\r\n <span className='checkmark'/>\r\n <span className='ms-refine-submenu-item__label'>\r\n {productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString}\r\n </span>\r\n </a>\r\n </li>\r\n );\r\n }\r\n }\r\n\r\n private _getRefinerUrl(): string {\r\n const { urlBuilder, parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\r\n\r\n if (productRefinerValue) {\r\n return urlBuilder({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: !selectedRefinementCriterion\r\n });\r\n }\r\n\r\n return '';\r\n }\r\n\r\n private _onClick = (e: React.MouseEvent<HTMLAnchorElement | HTMLInputElement>): void => {\r\n e.preventDefault();\r\n\r\n const { parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\r\n if (productRefinerValue) {\r\n this.props.onToggle({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: !selectedRefinementCriterion\r\n });\r\n\r\n setTimeout(\r\n () => {\r\n this.anchorType.current && this.anchorType.current.focus();\r\n },\r\n 0\r\n );\r\n }\r\n }\r\n}","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { findMatchingRefinementCriterion, IRefineItemCommonProps, IRefineItemToggleNotification, RangeRefineItemType } from '@msdyn365-commerce-modules/search-result-container';\r\nimport { Button, Collapse } from '@msdyn365-commerce-modules/utilities';\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { ICoreContext } from '@msdyn365-commerce/core';\r\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\nimport RangeRefineItem from './range-refine-item';\r\nimport RefineItem from './refine-item';\r\nimport { ProductRefinerTypeValue, ProductRefinerValueDataTypeValue } from './utilities';\r\n\r\n/**\r\n * Properties associated with the RefineSubmenu component\r\n */\r\nexport interface IRefineSubmenuProps {\r\n tempRangeTypeTODO: RangeRefineItemType;\r\n minValueSliderThumbAriaLabel?: string;\r\n maxValueSliderThumbAriaLabel?: string;\r\n productRefinerHierarchy: IProductRefinerHierarchy;\r\n selectedRefinerValues: ProductRefinerValue[];\r\n sortingCriteraValues?: string[];\r\n refineItemCommonProps: IRefineItemCommonProps;\r\n isDisabled: boolean;\r\n isExpandedOnInitialLoad: boolean;\r\n context: ICoreContext;\r\n moduleId: string;\r\n moduleTypeName: string;\r\n refinersToBeUpdated: string;\r\n onUpdateRefiners(notfication: Readonly<IRefineItemToggleNotification>): void;\r\n urlBuilder(refiner: IRefineItemToggleNotification): string;\r\n}\r\n\r\n/**\r\n * Refine submenu state\r\n */\r\nexport interface IRefineSubmenuState extends React.ComponentState {\r\n expanded: boolean;\r\n}\r\n\r\n/**\r\n *\r\n * The RefineSubmenu component renders the submenu category and child items.\r\n * This computed observes the stateful category hierarchy object.\r\n * @extends {React.PureComponent<IRefineSubmenuProps>}\r\n */\r\nclass RefineSubmenu extends React.Component<IRefineSubmenuProps, IRefineSubmenuState> {\r\n constructor(props: IRefineSubmenuProps) {\r\n super(props);\r\n\r\n this._onToggleItem = this._onToggleItem.bind(this);\r\n this._onToggleSubmenu = this._onToggleSubmenu.bind(this);\r\n\r\n let isExpanded = this.props.isExpandedOnInitialLoad;\r\n if (this.props.productRefinerHierarchy.DataTypeValue === ProductRefinerValueDataTypeValue.Range) {\r\n isExpanded = true;\r\n }\r\n\r\n this.state = {\r\n expanded: isExpanded\r\n };\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { productRefinerHierarchy, refineItemCommonProps, refinersToBeUpdated } = this.props;\r\n\r\n if (!productRefinerHierarchy) {\r\n refineItemCommonProps.telemetry.error('Cannot render submenu without refiner hierarchy data');\r\n }\r\n const refinersLists = refinersToBeUpdated && refinersToBeUpdated.split(',');\r\n let refinerName = productRefinerHierarchy.KeyName || '';\r\n refinersLists && refinersLists.map((refiners: string) => {\r\n if (refiners.split('|').length > 1 && refiners.split('|')[0].toLowerCase() === refinerName?.toLowerCase()) {\r\n refinerName = refiners.split('|')[1] && refiners.split('|')[1] || refinerName;\r\n }\r\n });\r\n\r\n return (\r\n <div className='ms-refine-submenu list-group'>\r\n <Button\r\n className={this.state.expanded ? 'ms-refine-submenu__toggle_expanded' : 'ms-refine-submenu__toggle_collapsed'}\r\n aria-label={refinerName || 'refiner.Name'}\r\n onClick={this._onToggleSubmenu}\r\n aria-expanded={this.state.expanded}\r\n >\r\n {refinerName}\r\n </Button>\r\n <Collapse isOpen={this.state.expanded} timeout={350}>\r\n {this._renderChildItems(productRefinerHierarchy)}\r\n </Collapse>\r\n </div>\r\n );\r\n }\r\n\r\n private _renderChildItems(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n switch (productRefinerHierarchy.DataTypeValue) {\r\n case ProductRefinerValueDataTypeValue.Range:\r\n case ProductRefinerValueDataTypeValue.RangeInput:\r\n return this._renderRange(productRefinerHierarchy);\r\n default:\r\n return this._renderSingleMultiSelect(productRefinerHierarchy);\r\n }\r\n }\r\n\r\n private _renderSingleMultiSelect(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n const { isDisabled, refineItemCommonProps, selectedRefinerValues, sortingCriteraValues, context } = this.props;\r\n const isSingleSelect = productRefinerHierarchy.RefinerTypeValue === ProductRefinerTypeValue.Single;\r\n const role = isSingleSelect ? { role: 'radiogroup' } : undefined;\r\n // const refinerValuesList = (productRefinerHierarchy.Values || []);\r\n const refinerValuesList = (productRefinerHierarchy.Values || []).sort(function (a:ProductRefinerValue,b:ProductRefinerValue){\r\n if(a.LeftValueBoundString && b.LeftValueBoundString){ return a.LeftValueBoundString.localeCompare(b.LeftValueBoundString)}\r\n return 0;\r\n });\r\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\r\n if (!child) {\r\n refineItemCommonProps.telemetry.error(\r\n `[refine-submenu] Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\r\n );\r\n return null;\r\n }\r\n\r\n let selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\r\n\r\n if (child.RightValueBoundString && sortingCriteraValues && sortingCriteraValues?.indexOf(child.RightValueBoundString) !== -1) {\r\n selectedRefinementCriterion = child;\r\n }\r\n return (\r\n <RefineItem\r\n parentProductRefinerHierarchy={productRefinerHierarchy}\r\n productRefinerValue={child}\r\n selectedRefinementCriterion={selectedRefinementCriterion}\r\n refineItemCommonProps={refineItemCommonProps}\r\n onToggle={this._onToggleItem}\r\n urlBuilder={this.props.urlBuilder}\r\n isDisabled={isDisabled}\r\n key={index}\r\n context={context}\r\n moduleId={this.props.moduleId}\r\n moduleTypeName={this.props.moduleTypeName}\r\n keyId = {index}\r\n />\r\n );\r\n });\r\n return (\r\n <ul className='ms-refine-submenu__list' {...role} aria-label={productRefinerHierarchy.KeyName}>\r\n {listItems}\r\n </ul>\r\n );\r\n }\r\n\r\n private _renderRange(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n const { isDisabled, refineItemCommonProps, selectedRefinerValues, context, minValueSliderThumbAriaLabel, maxValueSliderThumbAriaLabel } = this.props;\r\n const submenuClassNamePrefix = 'ms-refine-submenu__item list-group-item refine-submenu__item';\r\n const refinerValuesList = (productRefinerHierarchy.Values || []);\r\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\r\n if (!child) {\r\n refineItemCommonProps.telemetry.error(\r\n `Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\r\n );\r\n return null;\r\n }\r\n\r\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\r\n\r\n // TODO BUGBUG 22424559 determine only from the DataTypeValue once live example is working (can test with the tempRangeTypeTODO derived from QSP until then)\r\n const rangeType = (productRefinerHierarchy.DataTypeValue === ProductRefinerValueDataTypeValue.RangeInput || this.props.tempRangeTypeTODO === 'input') ?\r\n 'input' :\r\n 'slider';\r\n const key = selectedRefinementCriterion ? `${selectedRefinementCriterion.LeftValueBoundString}-${selectedRefinementCriterion.RightValueBoundString}` : `not-selected-${index}`;\r\n return (\r\n <li className={`${submenuClassNamePrefix}--range`} key={index}>\r\n <RangeRefineItem\r\n parentProductRefinerHierarchy={productRefinerHierarchy}\r\n productRefinerValue={child}\r\n selectedRefinementCriterion={selectedRefinementCriterion}\r\n refineItemCommonProps={refineItemCommonProps}\r\n onToggle={this._onToggleItem}\r\n urlBuilder={this.props.urlBuilder}\r\n isDisabled={isDisabled}\r\n rangeType={rangeType}\r\n key={key}\r\n context={context}\r\n minValueSliderThumbAriaLabel={minValueSliderThumbAriaLabel}\r\n maxValueSliderThumbAriaLabel={maxValueSliderThumbAriaLabel}\r\n moduleId={this.props.moduleId}\r\n moduleTypeName={this.props.moduleTypeName}\r\n keyId = {index}\r\n />\r\n </li>\r\n );\r\n });\r\n return <ul className='ms-refine-submenu__list list-unstyled'>{listItems}</ul>;\r\n }\r\n\r\n private _onToggleItem(itemToggleNotification: IRefineItemToggleNotification): void {\r\n this.props.onUpdateRefiners(itemToggleNotification);\r\n }\r\n\r\n private _onToggleSubmenu(): void {\r\n this.setState(prevState => ({\r\n expanded: !prevState.expanded\r\n }));\r\n }\r\n}\r\n\r\nexport default RefineSubmenu;","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport MsDyn365, { IRequestContext } from '@msdyn365-commerce/core';\r\nimport { ProductRefinerValue, SortColumn } from '@msdyn365-commerce/retail-proxy';\r\n\r\n/**\r\n * Refiner Compression:\r\n * Refiners contains a non-trivial amount of data that is required to successfully make\r\n * a refiner-based API call. To allow for deep-linking of refiners in the URL, refiner data\r\n * must be compressed so that URL max length is not exceeded. Refiners will be compressed into\r\n * the following array style index-based format:\r\n * [DataTypeValue, LeftValueBoundString, RefinerRecordId, RefinerSourceValue, RightValueBoundString, UnitText]\r\n */\r\nconst compressedRefinerKeys = ['DataTypeValue', 'LeftValueBoundString', 'RefinerRecordId', 'RefinerSourceValue', 'RightValueBoundString', 'UnitText'];\r\n\r\n/**\r\n * Hydrates compressed refiner data from URL\r\n * @param fullUrl The full URL of the page\r\n */\r\nexport const hydrateRefinersFromUrl = (requestContext: IRequestContext): ProductRefinerValue[] => {\r\n const compressedRefinerArray = parseQueryParam<(string | number)[][]>('refiners', requestContext);\r\n if (!compressedRefinerArray || !compressedRefinerArray.length) {\r\n return [];\r\n }\r\n\r\n return <ProductRefinerValue[]>compressedRefinerArray.map((compressedRefiner) => {\r\n try {\r\n const parsedRefiner: ProductRefinerValue = {};\r\n compressedRefinerKeys.forEach((refinerKey, index) => {\r\n // @ts-ignore: This line is intentionally not typesafe\r\n parsedRefiner[refinerKey] = compressedRefiner[index];\r\n });\r\n return parsedRefiner;\r\n } catch (e) {\r\n return undefined;\r\n }\r\n }).filter(Boolean);\r\n};\r\n\r\n/**\r\n * Compressed a list of refiners for use in URLs\r\n * @param refiners The uncompressed refiners\r\n */\r\nexport const compressRefiners = (refiners: ProductRefinerValue[]) => {\r\n const compressedRefiners: (string | number)[][] = [];\r\n\r\n refiners.forEach((refiner) => {\r\n const compressedRefiner: (string | number)[] = [];\r\n compressedRefinerKeys.forEach((refinerKey) => {\r\n // @ts-ignore: This line is intentionally not typesafe\r\n compressedRefiner.push(refiner[refinerKey]);\r\n });\r\n compressedRefiners.push(compressedRefiner);\r\n });\r\n\r\n return compressedRefiners;\r\n};\r\n\r\n/**\r\n * Method which creates a URL contiaining serialized active refiners\r\n * @param fullUrl The Current URL of the page\r\n * @param refiners The refiners which should be added to the URL\r\n */\r\nexport const buildListPageUrl = (fullUrl: URL, refiners?: ProductRefinerValue[], sortingColumns?: SortColumn[], skipCount?: number) => {\r\n // Refiner Change flow\r\n if (refiners !== undefined) {\r\n if (!refiners.length) {\r\n fullUrl.searchParams.delete('refiners');\r\n } else {\r\n fullUrl.searchParams.set('refiners', JSON.stringify(compressRefiners(refiners)));\r\n }\r\n\r\n // Adding or removing a refiner means we want to always load page 1\r\n fullUrl.searchParams.delete('skip');\r\n return fullUrl.href;\r\n }\r\n\r\n if (sortingColumns !== undefined) {\r\n if (!sortingColumns.length) {\r\n fullUrl.searchParams.delete('sorting');\r\n } else {\r\n fullUrl.searchParams.set('sorting', JSON.stringify(sortingColumns));\r\n }\r\n\r\n // Changing the sort means always load page 1\r\n fullUrl.searchParams.delete('skip');\r\n return fullUrl.href;\r\n }\r\n\r\n if (skipCount) {\r\n fullUrl.searchParams.set('skip', skipCount.toString());\r\n }\r\n\r\n return fullUrl.href;\r\n};\r\n\r\n/**\r\n * Parses a query param from the query object of the request context\r\n * @param key The query parameter key\r\n * @param requestContext The request context\r\n */\r\nexport const parseQueryParam = <T>(key: string, requestContext: IRequestContext): T | null => {\r\n if (requestContext.query && requestContext.query[key]) {\r\n return <T>JSON.parse(decodeURIComponent(requestContext.query[key]));\r\n }\r\n return null;\r\n};\r\n\r\n/**\r\n * Gets the current URL of the page from the request context\r\n * @param requestContext The request context\r\n */\r\nexport const getCurrentUrl = (requestContext: IRequestContext): URL => {\r\n if (MsDyn365.isBrowser) {\r\n return new URL(window.location.href);\r\n } else {\r\n // NOTE: Typing on requestURL is incorrect\r\n if (requestContext.url.requestUrl.href) {\r\n return new URL(requestContext.url.requestUrl.href);\r\n } else {\r\n return new URL(<string><unknown>(requestContext.url.requestUrl));\r\n }\r\n }\r\n};\r\n","import { getUpdatedRefinementCriteria, IRefineItemCommonProps, IRefineItemToggleNotification, ISearchResultContainerViewProps } from '@msdyn365-commerce-modules/search-result-container';\r\nimport { Button,ILabeledDropdownOption, INodeProps, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { SortColumn } from '@msdyn365-commerce/retail-proxy';\r\nimport { transaction } from 'mobx';\r\nimport * as React from 'react';\r\nimport { ICittaSearchResultContainerProps } from '../../modules/citta-search-result-container/citta-search-result-container.props.autogenerated';\r\nimport RefineSubmenu from './refine-submenu';\r\nimport { buildListPageUrl, getCurrentUrl } from './url-utils';\r\nexport interface ISortByViewProps {\r\n SortingContainer: INodeProps;\r\n sortByDropDown?: React.ReactNode;\r\n}\r\n\r\nexport interface ISortByProps {\r\n props: ISearchResultContainerViewProps & ICittaSearchResultContainerProps<{}>;\r\n}\r\n\r\nexport interface ISortByOptionsState {\r\n sortingState: ISortByCollectionState;\r\n}\r\n\r\ninterface ISortByCollectionState {\r\n selectedSortByOption: ILabeledDropdownOption;\r\n dropdownOpen: boolean;\r\n pending: boolean;\r\n}\r\nexport interface IRefineMenuViewProps {\r\n RefineMenuContainer: INodeProps;\r\n RefinerSectionContainer: INodeProps;\r\n refinersHeader: React.ReactNode;\r\n refiners?: React.ReactNode[];\r\n}\r\n\r\nconst sortOptions = {\r\n sortByOptionRelevanceDesc: 'Ranking-Desc',\r\n sortByOptionRatingAsc: 'AverageRating-Asc',\r\n sortByOptionRatingDesc: 'AverageRating-Desc',\r\n sortByOptionNameAsc: 'Name-Asc',\r\n sortByOptionNameDesc: 'Name-Desc',\r\n sortByOptionPriceAsc: 'Price-Asc',\r\n sortByOptionPriceDesc: 'Price-Desc'\r\n};\r\n\r\nexport interface IRefinerProps {\r\n props: ISearchResultContainerViewProps & ICittaSearchResultContainerProps<{}>;\r\n toggleModal: Function;\r\n}\r\n/** This component will be used to render Refiners on Citta category and search results page */\r\nexport default class CittaRefiners extends React.PureComponent<IRefinerProps> {\r\n private _refineItemCommonProps: IRefineItemCommonProps;\r\n \r\n private sortByDropdownOptions: ILabeledDropdownOption[] = [\r\n { key: sortOptions.sortByOptionRelevanceDesc, value: this.props.props.resources.sortByOptionRelevanceDesc },\r\n { key: sortOptions.sortByOptionNameAsc, value: this.props.props.resources.sortByOptionNameAsc },\r\n { key: sortOptions.sortByOptionNameDesc, value: this.props.props.resources.sortByOptionNameDesc },\r\n { key: sortOptions.sortByOptionPriceAsc, value: this.props.props.resources.sortByOptionPriceAsc },\r\n { key: sortOptions.sortByOptionPriceDesc, value: this.props.props.resources.sortByOptionPriceDesc },\r\n ];\r\n\r\n\r\n constructor(props: IRefinerProps) {\r\n super(props);\r\n const {\r\n placeholderTextMax,\r\n minLabel,\r\n maxLabel,\r\n rangeNameFormat\r\n } = props.props.resources;\r\n\r\n const locale = props.props.context.request.locale;\r\n const telemetry = props.props.telemetry;\r\n const validationErrorNaN = props.props.resources.validationErrorNotNumber;\r\n const validationErrorRange = props.props.resources.validationErrorNotRange;\r\n this._refineItemCommonProps = {\r\n telemetry,\r\n locale,\r\n placeholderTextMax,\r\n minLabel,\r\n maxLabel,\r\n rangeNameFormat,\r\n validationErrorNaN,\r\n validationErrorRange\r\n };\r\n\r\n this.state = {\r\n sortingState: {\r\n pending: false,\r\n dropdownOpen: false,\r\n selectedSortByOption: this.sortByDropdownOptions[0]\r\n }\r\n };\r\n\r\n this._renderRefiners = this._renderRefiners.bind(this);\r\n this._onClearRefiners = this._onClearRefiners.bind(this);\r\n this._getSortColumnFromSelectedOption = this._getSortColumnFromSelectedOption.bind(this);\r\n this._getSortingRefiner = this._getSortingRefiner.bind(this);\r\n\r\n }\r\n public render(): JSX.Element | null {\r\n const refineMenu: IRefineMenuViewProps = this._renderRefiners();\r\n const sortRefiner = this._getSortingRefiner();\r\n\r\n if (refineMenu.refiners) {\r\n return (\r\n \r\n <Node {...refineMenu.RefinerSectionContainer}>\r\n <Node {...refineMenu.RefineMenuContainer}>\r\n {refineMenu.refinersHeader}\r\n {sortRefiner.sortByDropDown}\r\n {refineMenu.refiners.map((submenu, index) => (\r\n <React.Fragment key={index}>\r\n {submenu}\r\n </React.Fragment>\r\n ))}\r\n </Node>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n private _onClearRefiners = (): void => {\r\n const { context } = this.props.props;\r\n const requestContext = context && context.request;\r\n const actionContext = context && context.actionContext;\r\n\r\n if (!requestContext || !actionContext || !this.props.props.data.listPageState.result) {\r\n const error = `Refine menu cannot refine search criteria: ${!requestContext ? 'requestContext ' : ''} ${!actionContext ? 'actionContext ' : ''} could not be found`;\r\n this.props.props.telemetry.warning(error);\r\n }\r\n\r\n window.history.pushState({}, '', buildListPageUrl(getCurrentUrl(requestContext), []));\r\n transaction(() => {\r\n this.props.props.data.listPageState.result!.currentPageNumber = 0;\r\n this.props.props.data.listPageState.result!.activeFilters = [];\r\n });\r\n }\r\n\r\n private _getSortingRefiner = (): ISortByViewProps => {\r\n const { data, context, config } = this.props.props;\r\n\r\n const tempRangeTypeTODO = context.request.query && context.request.query.inputRange ? 'input' : 'slider';\r\n const sortingCritera = (data.listPageState.result && data.listPageState.result.sortingCritera) || undefined;\r\n \r\n let sortByValues:string[] = [];\r\n const activeRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n\r\n if (data.searchConfiguration.result) {\r\n if (sortingCritera && sortingCritera.Columns?.length) {\r\n data.searchConfiguration!.result!.forEach((searchConfiguration) => { \r\n sortingCritera.Columns!.forEach (sortingC => {\r\n if (searchConfiguration.sortColumn.ColumnName === sortingC.ColumnName && searchConfiguration.sortColumn.IsDescending === sortingC.IsDescending) {\r\n sortByValues.push(searchConfiguration.key);\r\n }\r\n })\r\n });\r\n }\r\n }\r\n\r\n let sortByDropdownOptions = [\r\n {\r\n RefinerSourceValue: 1,\r\n DataValueType: 5,\r\n Count: 8,\r\n RowNumber: 0,\r\n RefinerRecordId: 0,\r\n UnitText: 'Sort By',\r\n RightValueBoundString: sortOptions.sortByOptionRelevanceDesc,\r\n LeftValueBoundString: this.props.props.resources.sortByOptionRelevanceDesc\r\n },\r\n {\r\n RefinerSourceValue: 1,\r\n DataValueType: 5,\r\n Count: 8,\r\n RowNumber: 0,\r\n RefinerRecordId: 0,\r\n UnitText: 'Sort By',\r\n RightValueBoundString: sortOptions.sortByOptionNameAsc,\r\n LeftValueBoundString: this.props.props.resources.sortByOptionNameAsc\r\n },\r\n {\r\n RefinerSourceValue: 1,\r\n DataValueType: 5,\r\n Count: 8,\r\n RowNumber: 0,\r\n RefinerRecordId: 0,\r\n UnitText: 'Sort By',\r\n RightValueBoundString: sortOptions.sortByOptionNameDesc,\r\n LeftValueBoundString: this.props.props.resources.sortByOptionNameDesc\r\n },\r\n {\r\n RefinerSourceValue: 1,\r\n DataValueType: 5,\r\n Count: 8,\r\n RowNumber: 0,\r\n RefinerRecordId: 0,\r\n UnitText: 'Sort By',\r\n RightValueBoundString: sortOptions.sortByOptionPriceAsc,\r\n LeftValueBoundString: this.props.props.resources.sortByOptionPriceAsc\r\n },\r\n {\r\n RefinerSourceValue: 1,\r\n DataValueType: 5,\r\n Count: 8,\r\n RowNumber: 0,\r\n RefinerRecordId: 0,\r\n UnitText: 'Sort By',\r\n RightValueBoundString: sortOptions.sortByOptionPriceDesc,\r\n LeftValueBoundString: this.props.props.resources.sortByOptionPriceDesc\r\n }\r\n ];\r\n\r\n let sortBy: IProductRefinerHierarchy = {\r\n KeyName: 'SortBy',\r\n Values: sortByDropdownOptions\r\n } ;\r\n const dropdown = (\r\n <RefineSubmenu\r\n productRefinerHierarchy={sortBy}\r\n sortingCriteraValues={sortByValues}\r\n selectedRefinerValues={activeRefiners}\r\n refineItemCommonProps={this._refineItemCommonProps}\r\n minValueSliderThumbAriaLabel={this.props.props.resources.minValueSliderThumbAriaLabel}\r\n maxValueSliderThumbAriaLabel={this.props.props.resources.maxValueSliderThumbAriaLabel}\r\n key={'sort-by-1'}\r\n onUpdateRefiners={this._updateDropDown}\r\n urlBuilder={this._buildRefinerUrl}\r\n isDisabled={false}\r\n isExpandedOnInitialLoad={false}\r\n tempRangeTypeTODO={tempRangeTypeTODO}\r\n context={context}\r\n moduleId={this.props.props.id}\r\n moduleTypeName={this.props.props.typeName}\r\n refinersToBeUpdated={config.refinersToBeUpdated || ''}\r\n />\r\n );\r\n return {\r\n SortingContainer: { className: 'ms-search-result-container__Sort-by-category' },\r\n sortByDropDown: dropdown\r\n };\r\n }\r\n\r\n private _updateDropDown = (notification: IRefineItemToggleNotification): void => {\r\n let sortColumn = this._getSortColumnFromSelectedOption(notification.productRefinerValue.RightValueBoundString || '')\r\n\r\n window.history.pushState({}, '', buildListPageUrl(getCurrentUrl(this.props.props.context.request), undefined, [sortColumn], undefined));\r\n transaction(() => {\r\n this.props.props.data.listPageState.result!.currentPageNumber = 0;\r\n this.props.props.data.listPageState.result!.sortingCritera = { Columns: [sortColumn] };\r\n });\r\n\r\n this.setState({\r\n sortingState: {\r\n dropdownOpen: false,\r\n pending: false,\r\n selectedSortByOption: this.sortByDropdownOptions[0]\r\n }\r\n });\r\n }\r\n\r\n private _getSortColumnFromSelectedOption = (type: string): SortColumn => {\r\n const { data } = this.props.props;\r\n\r\n if (!data.searchConfiguration.result) {\r\n return {};\r\n }\r\n\r\n const mappedConfiguration = data.searchConfiguration.result.find((searchConfiguration) => { return searchConfiguration.key === type; });\r\n\r\n if (mappedConfiguration) {\r\n return mappedConfiguration.sortColumn;\r\n }\r\n\r\n return {};\r\n }\r\n\r\n private _renderRefiners = (): IRefineMenuViewProps => {\r\n const { data, context, config } = this.props.props;\r\n\r\n const tempRangeTypeTODO = context.request.query && context.request.query.inputRange ? 'input' : 'slider';\r\n const validRefiners = data.refiners.result && data.refiners.result.filter(refiner => {\r\n return refiner.Values.length > 0;\r\n });\r\n const expandedMenusOnLoad = config.expandedMenusOnLoad || 'all';\r\n const activeRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n const refinersHeader =\r\n (\r\n <div className='refine-menu-header'>\r\n <div className='refine-menu-close'>\r\n <Button\r\n className={'refine-menu-close-button'}\r\n // @ts-ignore\r\n onClick={this.props.toggleModal}\r\n >{'x'}\r\n </Button>\r\n </div>\r\n\r\n <div className='refine-menu-header-text'>Refine</div>\r\n <div className='refine-menu-header-action'>\r\n <Button\r\n className={'refine-menu-header-action-link'}\r\n aria-label={'Clear'}\r\n // tslint:disable-next-line: react-this-binding-issue\r\n onClick={this._onClearRefiners}\r\n >{'Clear'}\r\n </Button>\r\n </div>\r\n </div>\r\n );\r\n\r\n \r\n let orderedRefiners: IProductRefinerHierarchy[] = [];\r\n\r\n if (validRefiners && validRefiners.length){\r\n let refinerCat = validRefiners.find(refiner => refiner.KeyName === 'Refiner Category');\r\n refinerCat && orderedRefiners.push(refinerCat)\r\n \r\n validRefiners.forEach(refiner => {\r\n \r\n if (refiner.KeyName !== 'Refiner Category') {\r\n orderedRefiners.push(refiner)\r\n }\r\n })\r\n }\r\n const subMenus = orderedRefiners && orderedRefiners.map((productRefinerHierarchy: IProductRefinerHierarchy, index: number) => {\r\n const hiddenRefinersList = config.refinersToBeHidden && config.refinersToBeHidden.toLowerCase().split(',');\r\n if (productRefinerHierarchy.KeyName !== 'Category' && (hiddenRefinersList ? (hiddenRefinersList.indexOf(productRefinerHierarchy.KeyName!.toLowerCase()) === -1 && productRefinerHierarchy.KeyName!.toLowerCase() !== 'rating') : true)) {\r\n let isExpanded: boolean;\r\n switch (expandedMenusOnLoad) {\r\n case 'none':\r\n isExpanded = false;\r\n break;\r\n case 'first':\r\n isExpanded = index === 0;\r\n break;\r\n case 'all':\r\n default:\r\n isExpanded = true;\r\n }\r\n if (context.request && context.request.device && context.request.device.Type === 'Mobile') {\r\n if (productRefinerHierarchy.KeyName === \"Refiner Category\") {\r\n isExpanded = true;\r\n }\r\n }\r\n\r\n return (\r\n <RefineSubmenu\r\n productRefinerHierarchy={productRefinerHierarchy}\r\n selectedRefinerValues={activeRefiners}\r\n refineItemCommonProps={this._refineItemCommonProps}\r\n minValueSliderThumbAriaLabel={this.props.props.resources.minValueSliderThumbAriaLabel}\r\n maxValueSliderThumbAriaLabel={this.props.props.resources.maxValueSliderThumbAriaLabel}\r\n key={index}\r\n onUpdateRefiners={this._onUpdateRefiners}\r\n urlBuilder={this._buildRefinerUrl}\r\n isDisabled={false}\r\n isExpandedOnInitialLoad={isExpanded}\r\n tempRangeTypeTODO={tempRangeTypeTODO}\r\n context={context}\r\n moduleId={this.props.props.id}\r\n moduleTypeName={this.props.props.typeName}\r\n refinersToBeUpdated={config.refinersToBeUpdated || ''}\r\n />\r\n );\r\n } else {\r\n return undefined;\r\n }\r\n });\r\n return {\r\n RefineMenuContainer: { className: 'ms-search-result-container__refine-menu' },\r\n RefinerSectionContainer: { className: 'ms-search-result-container__refiner-section' },\r\n refinersHeader: refinersHeader,\r\n refiners: subMenus\r\n };\r\n }\r\n\r\n private _buildRefinerUrl = (itemToggleNotification: IRefineItemToggleNotification): string => {\r\n if (this.props.props.data.listPageState.result) {\r\n const newRefinementCriteria = getUpdatedRefinementCriteria(itemToggleNotification, this.props.props.data.listPageState.result.activeFilters || []);\r\n\r\n return buildListPageUrl(getCurrentUrl(this.props.props.context.request), newRefinementCriteria);\r\n } else {\r\n this.props.props.telemetry.warning(`[buildRefinerQueryString]List Page State Not available, unable to build refiner URL`);\r\n return '';\r\n }\r\n }\r\n\r\n private _onUpdateRefiners = (itemToggleNotification: IRefineItemToggleNotification): void => {\r\n const { context } = this.props.props;\r\n const requestContext = context && context.request;\r\n const actionContext = context && context.actionContext;\r\n\r\n if (!requestContext || !actionContext || !this.props.props.data.listPageState.result) {\r\n const error = `Refine menu cannot refine search criteria: ${!requestContext ? 'requestContext ' : ''} ${!actionContext ? 'actionContext ' : ''} could not be found`;\r\n this.props.props.telemetry.warning(error);\r\n }\r\n\r\n const updatedRefinementCriteria = getUpdatedRefinementCriteria(itemToggleNotification, this.props.props.data.listPageState.result && this.props.props.data.listPageState.result.activeFilters || []);\r\n\r\n window.history.pushState({}, '', buildListPageUrl(getCurrentUrl(this.props.props.context.request), updatedRefinementCriteria));\r\n transaction(() => {\r\n this.props.props.data.listPageState.result!.currentPageNumber = 0;\r\n this.props.props.data.listPageState.result!.activeFilters = updatedRefinementCriteria;\r\n });\r\n }\r\n}\r\n","import { IGridSettings, IImageData, IImageSettings, Image } from '@msdyn365-commerce/core';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\nexport type PictureLoadFailureBehavior = 'default' | 'hide' | 'empty';\r\n\r\nexport interface IPictureState extends React.ComponentState {\r\n showHoverImg: boolean;\r\n}\r\nexport interface IPictureProps {\r\n loadFailureBehavior?: PictureLoadFailureBehavior;\r\n image1?: string;\r\n image2?: string;\r\n emptyImageUrl?: string;\r\n altText?: string;\r\n gridSettings: IGridSettings;\r\n imageSettings?: IImageSettings;\r\n className?: string;\r\n}\r\n/** The Picture component will return picture tag for an image based on ImageResize properties and settings needed to resize the image */\r\nexport default class CittaPicture extends React.PureComponent<IPictureProps, IPictureState> {\r\n\r\n public render(): JSX.Element | null {\r\n const { image1 = '', image2 = '', altText, gridSettings, imageSettings } = this.props;\r\n const img1: IImageData = {\r\n src: image1,\r\n altText: altText ? altText : ''\r\n };\r\n const img2: IImageData = {\r\n src: image2,\r\n altText: altText ? altText : ''\r\n };\r\n const imageProps = {\r\n gridSettings: gridSettings,\r\n imageSettings: imageSettings\r\n };\r\n return (\r\n <div className='images-container'>\r\n <Image\r\n {...img1}\r\n {...imageProps}\r\n loadFailureBehavior='empty'\r\n className={classnames('image1', this.props.className)}\r\n onMouseOver={this.handleMoveHover}\r\n />\r\n <Image\r\n {...img2}\r\n {...imageProps}\r\n loadFailureBehavior='hide'\r\n className={classnames((this.state?.showHoverImg ? 'image2 hoverImg ' : 'image2 hoverImg hideImg '), this.props.className)}\r\n onMouseOut={this.handleMoveOut}\r\n />\r\n </div>\r\n );\r\n }\r\n\r\n private handleMoveHover = () => {\r\n this.setState({ showHoverImg: true });\r\n }\r\n\r\n private handleMoveOut = () => {\r\n this.setState({ showHoverImg: false });\r\n }\r\n}\r\n","import { generateImageUrl, getProductPageUrlSync } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { format } from '@msdyn365-commerce-modules/utilities';\r\nimport { RatingComponent } from '@msdyn365-commerce/components';\r\nimport { IComponentProps, ICoreContext, IGridSettings, IImageSettings } from '@msdyn365-commerce/core';\r\nimport { ProductPrice, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\nimport CittaPicture from '../../../components/citta-picture';\r\n\r\nimport PriceComponent from '../../../components/price-component';\r\n\r\nexport interface IProductComponentProps extends IComponentProps<{ product?: ProductSearchResult }> {\r\n className?: string;\r\n imageSettings?: IImageSettings;\r\n savingsText?: string;\r\n freePriceText?: string;\r\n originalPriceText?: string;\r\n currentPriceText?: string;\r\n ratingAriaLabel?: string;\r\n salesLineTagKey?: string;\r\n tagsToIgnore?: string;\r\n}\r\n\r\n/**\r\n *\r\n * The ProductComponent renders the products.\r\n * @extends {React.PureComponent<IProductComponentProps>}\r\n */\r\nclass ProductComponent extends React.Component<IProductComponentProps> {\r\n\r\n constructor(props: IProductComponentProps) {\r\n super(props);\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const product = this.props.data.product;\r\n if (!product) {\r\n return null;\r\n }\r\n let imageOrientation: string = '';\r\n let onlineTags: string = '';\r\n let salesLineTag: string = '';\r\n let productImage1: string = '';\r\n let productImage2: string = '';\r\n let stockAvailabilityPropertyText: string = '';\r\n let stockAvailabilities: any[] = [];\r\n\r\n if (product.ExtensionProperties!.length > 0) {\r\n product.ExtensionProperties!.map(property => {\r\n if (property.Key === 'ProductImage1') {\r\n productImage1 = property.Value!.StringValue!;\r\n } else if (property.Key === 'ProductImage2') {\r\n productImage2 = property.Value!.StringValue!;\r\n }\r\n else if (property.Key === 'ProductAvailability') {\r\n stockAvailabilities.push({name: property.Value?.StringValue, value: property.Value?.IntegerValue});\r\n }\r\n });\r\n }\r\n if (product.AttributeValues!.length > 0) {\r\n product.AttributeValues!.map(property => {\r\n if (property.Name === 'Image Orientation') {\r\n imageOrientation = property.TextValue!;\r\n } else if (property.Name === 'Online Tags' || property.Name === \"Online Tags B2BN\" || property.Name === \"Online Tags B2BA\" || property.Name === \"Online Tags B2BI\") {\r\n onlineTags = property.TextValue!;\r\n if (this.props.tagsToIgnore && onlineTags) {\r\n let tags = this.props.tagsToIgnore.split('|');\r\n if (tags.includes(onlineTags)) {\r\n onlineTags = '';\r\n }\r\n }\r\n } else if (property.Name === this.props.salesLineTagKey) {\r\n salesLineTag = property.TextValue!;\r\n }\r\n });\r\n }\r\n\r\n const image1 = generateImageUrl(productImage1, this.props.context.request.apiSettings);\r\n const image2 = generateImageUrl(productImage2, this.props.context.request.apiSettings);\r\n\r\n const productUrl = getProductPageUrlSync(product.Name || '', product.RecordId, this.props.context && this.props.context.actionContext, undefined);\r\n\r\n // Construct telemetry attribute to render\r\n const attribute = this.props.context\r\n && this.props.context.telemetry\r\n && this.props.context.telemetry.setTelemetryAttribute\r\n && this.props.context.telemetry.setTelemetryAttribute(product.RecordId.toString(), {\r\n pid: product.RecordId,\r\n pname: product.Name,\r\n mname: this.props.id\r\n }\r\n );\r\n const productImageSettings = imageOrientation === 'Landscape' ? this._getLandscapeImageSettings(this.props.imageSettings) : this.props.imageSettings;\r\n return (\r\n <a href={productUrl} aria-label={this._renderLabel(product.Name, this.props.context.cultureFormatter.formatCurrency(product.Price), product.AverageRating, this.props.ratingAriaLabel)} className='msc-product' {...attribute}>\r\n <div className={(onlineTags && onlineTags !== '') ? 'product-placement__item-imagetag' : 'product-placement__item-imagetagnone'} style={onlineTags.toLocaleLowerCase().includes('essentials') ? {backgroundColor: '#96999b'}: {}}>{onlineTags}</div>\r\n <div className='msc-product__image'>\r\n {this._renderProductPlacementImage(productImageSettings, this.props.context.request.gridSettings, product.PrimaryImageUrl, image1, image2, product.Name)}\r\n </div>\r\n <div className='msc-product__details'>\r\n <h4 className='msc-product__title'>{product.Name}</h4>\r\n {this._renderPrice(this.props.context, this.props.typeName, this.props.id, product.BasePrice, product.Price, this.props.savingsText, this.props.freePriceText, this.props.originalPriceText, this.props.currentPriceText)}\r\n {this._renderSalesLineTag(salesLineTag)}\r\n {this._renderDescription(product.Description)}\r\n {!this.props.context.app.config.hideRating && this._renderRating(this.props.context, this.props.typeName, this.props.id, product.AverageRating, product.TotalRatings, this.props.ratingAriaLabel)}\r\n {stockAvailabilityPropertyText}\r\n <div className=\"msc-product__availabilities\">\r\n {this._renderAvailabilities(stockAvailabilities)}\r\n </div>\r\n </div>\r\n </a>\r\n );\r\n }\r\n\r\n private _renderAvailabilities(stockAvailabilities: any[]) {\r\n return stockAvailabilities && stockAvailabilities.map(sA => <div className=\"msc-product__availabilities_product\">\r\n <span className={sA.value > 0 ? 'in-stock' : 'out-of-stock'}>{sA.name.match(/\\b(\\w)/g).join('')}</span>\r\n </div>\r\n )\r\n }\r\n\r\n private _renderLabel(name?: string, price?: string, rating?: number, ratingAriaLabel?: string): string {\r\n let ratingLabel = '';\r\n\r\n name = name || '';\r\n price = price || '';\r\n\r\n if (rating) {\r\n const roundedRating = rating.toFixed(2);\r\n ratingLabel = format(ratingAriaLabel || '', roundedRating, '5');\r\n }\r\n\r\n return (`${name} ${price} ${ratingLabel}`);\r\n }\r\n\r\n private _renderSalesLineTag(salesLineTag?: string): JSX.Element | null {\r\n if (salesLineTag! && salesLineTag !== '') {\r\n return (\r\n <div className='product-placement__item-saleslinetag'>{salesLineTag}</div>\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n private _renderDescription(description?: string): JSX.Element | null {\r\n return <p className='msc-product__text'>{description}</p>;\r\n }\r\n\r\n private _renderRating(context: ICoreContext, typeName: string, id: string, avgRating?: number, totalRatings?: number, ariaLabel?: string): JSX.Element | null {\r\n if (!avgRating) {\r\n return null;\r\n }\r\n\r\n const numRatings = totalRatings && totalRatings.toString() || undefined;\r\n\r\n return (\r\n <RatingComponent\r\n context={context}\r\n id={id}\r\n typeName={typeName}\r\n avgRating={avgRating}\r\n ratingCount={numRatings}\r\n readOnly={true}\r\n ariaLabel={ariaLabel || ''}\r\n data={{}}\r\n />\r\n );\r\n }\r\n\r\n private _renderPrice(context: ICoreContext, typeName: string, id: string, basePrice?: number, adjustedPrice?: number, savingsText?: string, freePriceText?: string, originalPriceText?: string, currentPriceText?: string): JSX.Element | null {\r\n const price: ProductPrice = {\r\n BasePrice: basePrice,\r\n AdjustedPrice: adjustedPrice,\r\n CustomerContextualPrice: adjustedPrice\r\n };\r\n\r\n return (\r\n <PriceComponent\r\n context={context}\r\n id={id}\r\n typeName={typeName}\r\n data={{ price: price }}\r\n // @ts-ignore\r\n savingsText={savingsText}\r\n freePriceText={freePriceText}\r\n originalPriceText={originalPriceText}\r\n />\r\n );\r\n }\r\n\r\n private _renderProductPlacementImage(imageSettings?: IImageSettings, gridSettings?: IGridSettings, imageUrl?: string, image1?: string, image2?: string, altText?: string): JSX.Element | null {\r\n if (!imageUrl || !gridSettings || !imageSettings) {\r\n return null;\r\n }\r\n return (\r\n <CittaPicture\r\n className='product-placement__item-image'\r\n image1={image1 ? image1 : imageUrl}\r\n image2={image2 ? image2 : ''}\r\n altText={altText}\r\n gridSettings={gridSettings}\r\n imageSettings={imageSettings}\r\n loadFailureBehavior='empty'\r\n />\r\n );\r\n }\r\n\r\n private _getLandscapeImageSettings(cmsImageSettings?: IImageSettings): IImageSettings {\r\n // tslint:disable-next-line: no-unnecessary-local-variable\r\n const landscapeImageSettings: IImageSettings = {\r\n viewports: {\r\n xs: { q: 'w=735&h=481&q=80&m=6&f=jpg', w: 735, h: 481 },\r\n sm: { q: 'w=467&h=303&q=80&m=6&f=jpg', w: 467, h: 303 },\r\n md: { q: 'w=563&h=366&q=80&m=6&f=jpg', w: 563, h: 366 },\r\n lg: { q: 'w=636&h=451&q=80&m=6&f=jpg', w: 636, h: 451 },\r\n xl: { q: 'w=974&h=693&q=80&m=6&f=jpg', w: 974, h: 693 }\r\n },\r\n disableLazyLoad: cmsImageSettings && cmsImageSettings.disableLazyLoad,\r\n lazyload: cmsImageSettings && cmsImageSettings.lazyload\r\n };\r\n\r\n return landscapeImageSettings;\r\n }\r\n}\r\n\r\nexport default ProductComponent;\r\n","import { ICategoryHierarchyViewProps, ISearchResultContainerViewProps, ITitleViewProps, ISearchResultModalViewProps } from '@msdyn365-commerce-modules/search-result-container';\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\nimport CittaRefiners from '../../components/citta-search-result/citta-refiners';\r\n// import CittaSortByOptions from '../../components/citta-search-result/citta-sortbyoptions';\r\nimport { ICittaSearchResultContainerProps } from './citta-search-result-container.props.autogenerated';\r\nimport ProductComponent from './components/product-component';\r\n\r\nconst SearchResultContainerView: React.FC<ISearchResultContainerViewProps & ICittaSearchResultContainerProps<{}>> = props => {\r\n const {\r\n SearchResultContainer,\r\n pagination,\r\n ProductsContainer,\r\n modalToggle,\r\n searchResultModal,\r\n TitleViewProps,\r\n categoryHierarchy,\r\n errorMessage,\r\n // @ts-ignore\r\n toggleModal\r\n } = props;\r\n\r\n return (\r\n <Module {...SearchResultContainer}>\r\n {renderCategoryHierarchy(categoryHierarchy)}\r\n <div className=\"filter-button-container\">\r\n {modalToggle}\r\n </div>\r\n {createSearchResultModal(searchResultModal, props, toggleModal)}\r\n {renderTitle(TitleViewProps)}\r\n <Node {...ProductsContainer}>\r\n {errorMessage}\r\n {renderProducts(props)}\r\n </Node>\r\n {pagination}\r\n </Module>\r\n );\r\n};\r\n\r\nfunction renderProducts(props: ISearchResultContainerViewProps & ICittaSearchResultContainerProps<{}>): JSX.Element | null {\r\n const { config, context, resources } = props;\r\n const liClass = 'ms-product-search-result__item';\r\n const isB2B = props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits === 'b2b';\r\n const products = (isB2B ? props.data.listPageState.result && props.data.listPageState.result.activeProducts && props.data.listPageState.result.activeProducts.filter((item) => item.ItemId !==\"GiftCard\") : props.data.listPageState.result && props.data.listPageState.result.activeProducts) || [];\r\n if (!products || products.length === 0) {\r\n return null;\r\n }\r\n return (\r\n <ul className='list-unstyled'>\r\n {products.map((product: ProductSearchResult, index: number) => (\r\n <li className={`${liClass} ${getImageOrientation(product) === 'Landscape' ? 'product-placement__item-limage' : 'product-placement__item-pimage'}`} key={index} >\r\n <ProductComponent\r\n context={context}\r\n imageSettings={config.imageSettings}\r\n freePriceText={resources.priceFree}\r\n originalPriceText={resources.originalPriceText}\r\n currentPriceText={resources.currentPriceText}\r\n ratingAriaLabel={resources.ratingAriaLabel}\r\n id={props.id}\r\n salesLineTagKey={config.salesLineTagKey}\r\n typeName={props.typeName}\r\n data={{ product: product }}\r\n tagsToIgnore={config.tagsToIgnore}\r\n />\r\n </li>\r\n ))}\r\n </ul>\r\n );\r\n}\r\n\r\nfunction getImageOrientation(product: ProductSearchResult): string {\r\n let imageOrientation: string = '';\r\n if (product.AttributeValues!.length > 0) {\r\n product.AttributeValues!.map(property => {\r\n if (property.Name === 'Image Orientation') {\r\n imageOrientation = property.TextValue!;\r\n }\r\n });\r\n }\r\n return imageOrientation;\r\n}\r\n\r\nconst createSearchResultModal = (modalProps: ISearchResultModalViewProps, props: ISearchResultContainerViewProps & ICittaSearchResultContainerProps<{}>, toggleModal: Function): JSX.Element => {\r\n return React.cloneElement(modalProps.modal, {className: \"category-refiner\"}, null, createModalBody(modalProps, props, toggleModal))\r\n};\r\n\r\nconst createModalBody = (modalProps: ISearchResultModalViewProps, props: ISearchResultContainerViewProps & ICittaSearchResultContainerProps<{}>, toggleModal: Function): JSX.Element | null => {\r\n return React.cloneElement(modalProps.modalBody, {}, null, renderRefineMenu(props, toggleModal));\r\n};\r\n\r\nfunction renderRefineMenu(props: ISearchResultContainerViewProps & ICittaSearchResultContainerProps<{}>, toggleModal: Function): JSX.Element {\r\n return (\r\n <CittaRefiners\r\n props={props}\r\n toggleModal={toggleModal}\r\n />\r\n );\r\n}\r\n\r\n// function renderSort(props: ISearchResultContainerViewProps & ICittaSearchResultContainerProps<{}>): JSX.Element {\r\n// return (\r\n// <CittaSortByOptions\r\n// props={props}\r\n// />\r\n// );\r\n// }\r\n\r\nconst renderCategoryHierarchy = (props: ICategoryHierarchyViewProps): JSX.Element | null => {\r\n const { CategoryHierarchyContainer, categoryHierarchyList, categoryHierarchySeparator } = props;\r\n if (categoryHierarchyList) {\r\n return (\r\n <Node {...CategoryHierarchyContainer}>\r\n {categoryHierarchyList.map((category, index) => (\r\n <React.Fragment key={index}>\r\n {category}\r\n {categoryHierarchyList && categoryHierarchyList[index + 1] && categoryHierarchySeparator}\r\n </React.Fragment>\r\n ))}\r\n </Node>\r\n );\r\n }\r\n\r\n return null;\r\n};\r\n\r\nconst renderTitle = (props: ITitleViewProps): JSX.Element | null => {\r\n const { title, TitleContainer } = props;\r\n if (title) {\r\n return (\r\n <Node {...TitleContainer}>\r\n <label style={{display: 'none'}} className=\"hide emarsys-collection-name\">{title.titleText}</label>\r\n <h2>\r\n {title.titleCount}\r\n </h2>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\n// const renderTitleCount = (props: ITitleViewProps): JSX.Element | null => {\r\n// const { title, TitleContainer } = props;\r\n// if (title) {\r\n// return (\r\n// <Node {...TitleContainer}>\r\n// <label className=\"hide emarsys-collection-name\">{title.titleText}</label>\r\n// <h5>\r\n// {title.titleCount}\r\n// </h5>\r\n// </Node>\r\n// );\r\n// }\r\n// return null;\r\n// };\r\n\r\nexport default SearchResultContainerView;","import { generateImageUrl } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { Autosuggestions } from '@msdyn365-commerce/commerce-entities';\r\nimport {\r\n CacheType, createObservableDataAction, IAction, IActionContext, IActionInput,\r\n ICreateActionContext\r\n} from '@msdyn365-commerce/core';\r\nimport { SearchSuggestion, SearchSuggestionCriteria } from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n getSearchSuggestionsAsync\r\n} from '@msdyn365-commerce/retail-proxy/dist/DataActions/StoreOperationsDataActions.g';\r\n\r\n// @ts-ignore\r\nexport const enum SuggestionType {\r\n Category = 'ScopedCategory',\r\n Keyword = 'Keyword',\r\n Product = 'Product',\r\n None = 'None'\r\n}\r\n\r\n/**\r\n * Input class for auto suggest search input\r\n */\r\nexport class AutoSuggestInput implements IActionInput {\r\n public searchQuery?: string;\r\n public topResultsCount?: number;\r\n public suggestionType?: string;\r\n public hitPrefix?: string;\r\n public hitSuffix?: string;\r\n\r\n constructor(searchText?: string, top?: number, suggestionType?: string, hitPrefix?: string, hitSuffix?: string) {\r\n this.searchQuery = searchText;\r\n this.topResultsCount = top;\r\n this.suggestionType = suggestionType;\r\n this.hitPrefix = hitPrefix;\r\n this.hitSuffix = hitSuffix;\r\n }\r\n\r\n public getCacheKey = () => `AutoSuggestSearchSuggestions`;\r\n public getCacheObjectType = () => 'AutoSuggestSearchSuggestions';\r\n public dataCacheType = (): CacheType => 'none';\r\n}\r\n\r\nconst createInput = (inputData: ICreateActionContext) => {\r\n return new AutoSuggestInput();\r\n};\r\n\r\n/**\r\n * Calls the Retail API and returns a auto-suggest suggestions\r\n */\r\nexport async function getSearchSuggestionsAction(input: AutoSuggestInput, ctx: IActionContext): Promise<Autosuggestions | null> {\r\n // If no input is provided fail out\r\n if (!input || !input.searchQuery) {\r\n throw new Error('[getSearchSuggestionsAction]No valid Input was provided, failing');\r\n }\r\n\r\n const autosuggest: Autosuggestions = {};\r\n\r\n const autoSuggestPromises = [\r\n _getAutoSuggest(input, autosuggest, ctx),\r\n ];\r\n return Promise.all(autoSuggestPromises).then(() => {\r\n return autosuggest;\r\n });\r\n}\r\n\r\nasync function _getAutoSuggest(\r\n input: AutoSuggestInput,\r\n autosuggest: Autosuggestions,\r\n ctx: IActionContext\r\n): Promise<void> {\r\n const searchCriteria: SearchSuggestionCriteria = {\r\n ProductSearchCriteria: {\r\n SearchCondition: input.searchQuery && input.searchQuery.length > 0 ? input.searchQuery : '',\r\n Context: {\r\n ChannelId: +ctx.requestContext.apiSettings.channelId,\r\n CatalogId: +ctx.requestContext.apiSettings.catalogId\r\n }\r\n },\r\n HitPrefix: input.hitPrefix,\r\n HitSuffix: input.hitSuffix,\r\n SuggestionType: input.suggestionType\r\n };\r\n\r\n const searchSuggestions = await getSearchSuggestionsAsync(\r\n { callerContext: ctx, queryResultSettings: { Paging: { Top: input.topResultsCount } } },\r\n searchCriteria\r\n );\r\n\r\n if (searchSuggestions && searchSuggestions.length > 0) {\r\n // Generate image url\r\n searchSuggestions.map(\r\n (item: SearchSuggestion) =>\r\n (item.ImageUrl = item.ImageUrl ? generateImageUrl(item.ImageUrl, ctx.requestContext.apiSettings) : '')\r\n );\r\n\r\n autosuggest.AllSearchResults = searchSuggestions;\r\n } else {\r\n ctx.telemetry.error(`[getSearchSuggestionsAction] unable to get availabilites for search with suggestion type ${searchCriteria.SuggestionType}`);\r\n }\r\n}\r\n\r\nexport default createObservableDataAction({\r\n id: '@msdyn365-commerce-modules/citta-search/get-auto-suggest-suggestions',\r\n action: <IAction<Autosuggestions>>getSearchSuggestionsAction,\r\n input: createInput\r\n});\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n\r\nimport * as React from 'react';\r\n\r\nimport { getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport { getRichTextHtml } from '@msdyn365-commerce/core';\r\nimport { SearchSuggestion } from '@msdyn365-commerce/retail-proxy';\r\n\r\nimport { ICittaSearchData } from '../citta-search.data';\r\nimport { ICittaSearchProps } from '../citta-search.props.autogenerated';\r\n\r\nexport interface ISearchKeywordSuggestProps {\r\n searchKeywordSuggestClass: string;\r\n searchPageURL: string;\r\n searchQsp: string | undefined;\r\n hitPrefix: string;\r\n hitSuffix: string;\r\n autoSuggestProps: ICittaSearchProps<ICittaSearchData>;\r\n searchText: string;\r\n suggestions: SearchSuggestion[] | undefined;\r\n telemetryContent?: ITelemetryContent;\r\n}\r\n\r\nexport interface ISearchKeywordViewProps {\r\n text: React.ReactNode[];\r\n}\r\n\r\nlet payLoad: IPayLoad;\r\n\r\n/**\r\n *\r\n * KeywordSuggestionsComponent\r\n */\r\nexport const KeywordSuggestionsComponent = (props: ISearchKeywordSuggestProps): ISearchKeywordViewProps | undefined => {\r\n const {\r\n suggestions,\r\n hitPrefix,\r\n hitSuffix\r\n } = props;\r\n\r\n if (!suggestions) {\r\n return undefined;\r\n }\r\n\r\n payLoad = getPayloadObject('click', props.telemetryContent!, '');\r\n\r\n const reactNodes: React.ReactNode[] = [];\r\n\r\n suggestions.map(item => {\r\n reactNodes.push(_assembleNode(item, hitPrefix, hitSuffix, props));\r\n });\r\n\r\n return { text: reactNodes };\r\n};\r\n\r\nconst _assembleNode = (item: SearchSuggestion, hitPrefix: string, hitSuffix: string, props: ISearchKeywordSuggestProps) => {\r\n const ariaLabel = item.Value &&\r\n (item.Value).replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\r\n payLoad.contentAction.etext = ariaLabel;\r\n const attribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\r\n return (\r\n <li className='msc-autoSuggest__keywordResults-item' key={item.Id}>\r\n <a\r\n aria-label={ariaLabel}\r\n href={_generateLink(item, hitPrefix, hitSuffix, props)}\r\n {...attribute}\r\n >\r\n {_generateLink(item, hitPrefix, hitSuffix, props) &&\r\n _getHighlightedText(item.Value ? item.Value : '', hitPrefix, hitSuffix)}\r\n </a>\r\n </li>\r\n );\r\n};\r\n\r\nconst _generateLink = (suggestion: SearchSuggestion, hitPrefix: string, hitSuffix: string, props: ISearchKeywordSuggestProps): string => {\r\n const { searchPageURL, searchQsp } = props;\r\n\r\n const formattedLink = (suggestion.Value as string)\r\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '')\r\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\r\n const route = searchPageURL || '';\r\n return formattedLink && formattedLink.length > 0\r\n ? `${route}${route.indexOf('?') === -1 ? '?' : '&'}${searchQsp}=${formattedLink}`\r\n : route;\r\n};\r\n\r\nconst _getHighlightedText = (suggestion: string, hitPrefix: string, hitSuffix: string): JSX.Element => {\r\n const formattedText = suggestion\r\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '<strong>')\r\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '</strong>');\r\n\r\n // tslint:disable:react-no-dangerous-html\r\n return <span dangerouslySetInnerHTML={getRichTextHtml(formattedText)} />;\r\n};\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n\r\nimport * as React from 'react';\r\n\r\nimport { PriceComponent } from '@msdyn365-commerce/components';\r\nimport { getRichTextHtml, IActionContext, ITelemetry } from '@msdyn365-commerce/core';\r\nimport { SearchSuggestion } from '@msdyn365-commerce/retail-proxy';\r\n\r\nimport { getProductPageUrlSync } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { getPayloadObject, getTelemetryAttributes, INodeProps, IPayLoad, ITelemetryContent, NodeTag } from '@msdyn365-commerce-modules/utilities';\r\nimport { ICittaSearchData } from '../citta-search.data';\r\nimport { ICittaSearchProps } from '../citta-search.props.autogenerated';\r\n\r\nexport interface ISearchProductSuggestProps {\r\n searchProductSuggestClass: string;\r\n searchPageURL: string;\r\n searchQsp: string | undefined;\r\n hitPrefix: string;\r\n hitSuffix: string;\r\n autoSuggestProps: ICittaSearchProps<ICittaSearchData>;\r\n searchText: string;\r\n suggestions: SearchSuggestion[] | undefined;\r\n telemetry: ITelemetry;\r\n moduleType: string;\r\n moduleId: string;\r\n telemetryContent?: ITelemetryContent;\r\n}\r\n\r\nexport interface ISearchProductViewProps {\r\n title: React.ReactNode;\r\n items: ISearchProductItemViewProps[];\r\n}\r\n\r\nexport interface ISearchProductItemViewProps {\r\n text: React.ReactNode;\r\n price: React.ReactNode;\r\n LiProduct: INodeProps;\r\n AProduct: INodeProps;\r\n id: string | undefined;\r\n}\r\n\r\nlet payLoad: IPayLoad;\r\nlet telemetryContent: ITelemetryContent | undefined;\r\n\r\n/**\r\n *\r\n * ProductSuggestionsComponent\r\n */\r\nexport const ProductSuggestionsComponent = (props: ISearchProductSuggestProps): ISearchProductViewProps | undefined => {\r\n const {\r\n suggestions,\r\n hitSuffix,\r\n hitPrefix,\r\n autoSuggestProps: {\r\n context: { actionContext },\r\n resources: { productSuggestionHeading }\r\n },\r\n moduleType,\r\n moduleId\r\n } = props;\r\n const reactNodes: ISearchProductItemViewProps[] = [];\r\n telemetryContent = props.telemetryContent;\r\n payLoad = getPayloadObject('click', props.telemetryContent!, '');\r\n\r\n if (!suggestions) {\r\n return undefined;\r\n }\r\n\r\n suggestions.map(item => {\r\n reactNodes.push(_assembleNode(item, hitPrefix, hitSuffix, actionContext, props, moduleType, moduleId));\r\n });\r\n\r\n const titleNode = _renderTitle(productSuggestionHeading);\r\n\r\n return { title: titleNode, items: reactNodes };\r\n};\r\n\r\nconst _renderTitle = (productSuggestionHeading: string) => {\r\n const productAutoSuggestionHeading = productSuggestionHeading ? productSuggestionHeading : 'Go to products';\r\n\r\n return <li className='msc-autoSuggest__productResults-title'>{productAutoSuggestionHeading}</li>;\r\n};\r\n\r\nconst _assembleNode = (\r\n item: SearchSuggestion,\r\n hitPrefix: string,\r\n hitSuffix: string,\r\n actionContext: IActionContext,\r\n props: ISearchProductSuggestProps,\r\n moduleType: string,\r\n moduleId: string\r\n): ISearchProductItemViewProps => {\r\n return {\r\n text: _getHighlightedText(item.Value ? item.Value : '', hitPrefix, hitSuffix),\r\n price:\r\n item.Id &&\r\n item.Value3 &&\r\n item.Value3.Value &&\r\n item.Value3.Value.DecimalValue &&\r\n _renderPrice(item.Value3.Value.DecimalValue, item.Value3.Value.DecimalValue, moduleId, moduleType, props),\r\n LiProduct: _getLiWrapper(),\r\n AProduct: _getAWrapper(item, hitPrefix, hitSuffix, actionContext),\r\n id: item.Id\r\n };\r\n};\r\n\r\nconst _getLiWrapper = () => {\r\n return {\r\n className: 'msc-autoSuggest__productResults-item',\r\n tag: 'li' as NodeTag\r\n };\r\n};\r\n\r\nconst _getAWrapper = (item: SearchSuggestion, hitPrefix: string, hitSuffix: string, actionContext: IActionContext) => {\r\n const ariaLabel = item.Value &&\r\n (item.Value).replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\r\n\r\n payLoad.contentAction.recid = item.Id;\r\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\r\n\r\n return {\r\n className: 'msc-autoSuggest__productResults-item',\r\n tag: 'a' as NodeTag,\r\n 'aria-label': ariaLabel,\r\n href: _generateLink(item, hitPrefix, hitSuffix, actionContext),\r\n ...attribute\r\n };\r\n};\r\n\r\nconst _generateLink = (suggestion: SearchSuggestion, hitPrefix: string, hitSuffix: string, actionContext: IActionContext) => {\r\n const formattedLink = (suggestion.Value as string).replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\r\n return suggestion.Value && suggestion.Id ?\r\n getProductPageUrlSync(formattedLink,suggestion.Id as unknown as number, actionContext, undefined) : '';\r\n};\r\n\r\nconst _getHighlightedText = (suggestion: string, hitPrefix: string, hitSuffix: string): JSX.Element => {\r\n const formattedText = suggestion\r\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '<strong>')\r\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '</strong>');\r\n\r\n // tslint:disable:react-no-dangerous-html\r\n return <span className='msc-price msc-autoSuggest__productResults-item-text' dangerouslySetInnerHTML={getRichTextHtml(formattedText)} />;\r\n};\r\n\r\nconst _renderPrice = (adjustedPrice: number, basePrice: number, moduleId: string, moduleType: string, props: ISearchProductSuggestProps): JSX.Element | null => {\r\n const {\r\n autoSuggestProps: { context }\r\n } = props;\r\n\r\n return (\r\n <PriceComponent\r\n id={moduleId}\r\n typeName={moduleType}\r\n context={context}\r\n data={{\r\n price: {\r\n CustomerContextualPrice: adjustedPrice,\r\n BasePrice: basePrice\r\n }\r\n }}\r\n className='msc-autoSuggest__productResults-item-price'\r\n />\r\n );\r\n};\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n\r\nimport * as React from 'react';\r\n\r\nimport { getRichTextHtml } from '@msdyn365-commerce/core';\r\nimport { ProductRefiner, ProductRefinerValue, SearchSuggestion } from '@msdyn365-commerce/retail-proxy';\r\n\r\nimport { format, getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport { ICittaSearchData } from '../citta-search.data';\r\nimport { ICittaSearchProps } from '../citta-search.props.autogenerated';\r\n\r\nexport interface ISearchCategorySuggestProps {\r\n searchCategorySuggestClass: string;\r\n searchPageURL: string;\r\n searchQsp: string | undefined;\r\n hitPrefix: string;\r\n hitSuffix: string;\r\n autoSuggestProps: ICittaSearchProps<ICittaSearchData>;\r\n searchText: string;\r\n searchRefiners: ProductRefiner[] | undefined;\r\n suggestions: SearchSuggestion[] | undefined;\r\n telemetryContent?: ITelemetryContent;\r\n}\r\n\r\nexport interface ISearchCategoryViewProps {\r\n title: React.ReactNode;\r\n text: React.ReactNode[];\r\n}\r\n\r\nlet payLoad: IPayLoad;\r\n\r\n/**\r\n *\r\n * CategorySuggestionsComponent\r\n */\r\nexport const CategorySuggestionsComponent = (props: ISearchCategorySuggestProps): ISearchCategoryViewProps | undefined => {\r\n const {\r\n suggestions,\r\n searchText,\r\n autoSuggestProps: {\r\n resources: { categorySuggestionHeading }\r\n }\r\n } = props;\r\n\r\n if (!suggestions) {\r\n return undefined;\r\n }\r\n\r\n const reactNodes: React.ReactNode[] = [];\r\n payLoad = getPayloadObject('click', props.telemetryContent!, '');\r\n\r\n suggestions.map(item => {\r\n reactNodes.push(_assembleNode(item, props));\r\n });\r\n\r\n const titleNode = _renderTitle(categorySuggestionHeading, searchText);\r\n\r\n return { title: titleNode, text: reactNodes };\r\n};\r\n\r\nconst _renderTitle = (categorySuggestionHeading: string, searchText: string) => {\r\n const categoryAutoSuggestionHeading = categorySuggestionHeading\r\n ? format(categorySuggestionHeading, searchText)\r\n : `Search \"${searchText}\" in categories`;\r\n\r\n return <li className='msc-autoSuggest__categoryResults-title'>{categoryAutoSuggestionHeading}</li>;\r\n};\r\n\r\nconst _assembleNode = (item: SearchSuggestion, props: ISearchCategorySuggestProps) => {\r\n const { searchText, hitPrefix, hitSuffix } = props;\r\n\r\n const splitValue = item.Value && item.Value.split('|').pop();\r\n const ariaLabel = splitValue\r\n ? splitValue.replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '')\r\n : item.Value && item.Value.replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\r\n payLoad.contentAction.etext = item.Value;\r\n const attribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\r\n return (\r\n <li className='msc-autoSuggest__categoryResults-item' key={item.Id}>\r\n <a aria-label={ariaLabel} href={_generateLink(item, searchText, props)} {...attribute}>\r\n {_generateLink(item, searchText, props) && _getHighlightedText(item.Value ? item.Value : '', hitPrefix, hitSuffix)}\r\n </a>\r\n </li>\r\n );\r\n};\r\n\r\nconst _generateLink = (suggestion: SearchSuggestion, searchText: string, props: ISearchCategorySuggestProps): string => {\r\n return suggestion && suggestion.Id ? _getCategoryLink(suggestion.Id, searchText, props) : '';\r\n};\r\n\r\nconst _getCategoryLink = (id: string, searchText: string, props: ISearchCategorySuggestProps): string => {\r\n const { searchPageURL, searchQsp, searchRefiners } = props;\r\n\r\n const route = searchPageURL || '';\r\n const urlPath = `${route}${route.indexOf('?') === -1 ? '?' : '&'}${searchQsp}=${searchText}`;\r\n const categoryRefiners =\r\n searchRefiners &&\r\n searchRefiners.find(refiners => {\r\n return refiners.KeyName === 'Category';\r\n });\r\n const refiner =\r\n categoryRefiners &&\r\n categoryRefiners.Values &&\r\n categoryRefiners.Values.find(item => {\r\n return item.RefinerRecordId === parseInt(id, 10);\r\n });\r\n\r\n const encodedRefiner = refiner && encodeURIComponent(JSON.stringify(compressRefiners([refiner])));\r\n\r\n return encodedRefiner ? `${urlPath}&refiners=${encodedRefiner}` : urlPath;\r\n};\r\n\r\nconst _getHighlightedText = (suggestion: string, hitPrefix: string, hitSuffix: string): JSX.Element => {\r\n let formattedText = suggestion\r\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '<strong>')\r\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '</strong>');\r\n formattedText = formattedText.split('|').pop() || '';\r\n\r\n // tslint:disable:react-no-dangerous-html\r\n return <span dangerouslySetInnerHTML={getRichTextHtml(formattedText)} />;\r\n};\r\n\r\n// TODO: This code is currently duplicated in categoryautosuggest need to either remove one of these files\r\n// or move this code to a common place\r\nconst compressedRefinerKeys = ['DataTypeValue', 'LeftValueBoundString', 'RefinerRecordId', 'RefinerSourceValue', 'RightValueBoundString', 'UnitText'];\r\n\r\n/**\r\n * Compressed a list of refiners for use in URLs\r\n * @param refiners The uncompressed refiners\r\n */\r\nconst compressRefiners = (refiners: ProductRefinerValue[]) => {\r\n const compressedRefiners: (string | number)[][] = [];\r\n\r\n refiners.forEach((refiner) => {\r\n const compressedRefiner: (string | number)[] = [];\r\n compressedRefinerKeys.forEach((refinerKey) => {\r\n // @ts-ignore: This line is intentionally not typesafe\r\n compressedRefiner.push(refiner[refinerKey]);\r\n });\r\n compressedRefiners.push(compressedRefiner);\r\n });\r\n\r\n return compressedRefiners;\r\n};\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n\r\nimport { Button } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nexport interface ISearchFormProps {\r\n hideSearchLabel: boolean | undefined;\r\n isSearchFormExpanded: boolean | undefined;\r\n disableSubmitSearch: boolean | undefined;\r\n searchTextInput: React.RefObject<HTMLInputElement>;\r\n maxChars: number;\r\n searchQsp: string;\r\n searchPlaceholder: string;\r\n query: string;\r\n ariaLabelCancel: string;\r\n ariaLabelSearch: string;\r\n ariaLabelSubmit: string;\r\n handleCancelSearchChange(): void;\r\n handleInputChange(query: string): void;\r\n handleSearchClick(): void;\r\n}\r\n\r\nexport interface ISearchFormViewProps {\r\n input: React.ReactNode;\r\n submitBtn: React.ReactNode;\r\n cancelBtn: React.ReactNode;\r\n searchBtn: React.ReactNode;\r\n}\r\n\r\nexport const FormComponent = (props: ISearchFormProps): ISearchFormViewProps => {\r\n const {\r\n searchQsp,\r\n searchPlaceholder,\r\n hideSearchLabel,\r\n isSearchFormExpanded,\r\n searchTextInput,\r\n handleInputChange,\r\n maxChars,\r\n disableSubmitSearch,\r\n handleCancelSearchChange,\r\n handleSearchClick,\r\n query,\r\n ariaLabelCancel,\r\n ariaLabelSearch,\r\n ariaLabelSubmit\r\n } = props;\r\n\r\n const onInputChange = (e: React.ChangeEvent<HTMLInputElement>): void => {\r\n handleInputChange(e.target.value || '');\r\n };\r\n\r\n const inputNode = !hideSearchLabel ? (\r\n <input\r\n className='ms-search__form-control'\r\n type='text'\r\n aria-label={isSearchFormExpanded ? 'Search expanded' : 'Search collapsed'}\r\n name={searchQsp}\r\n placeholder={searchPlaceholder}\r\n ref={searchTextInput}\r\n onChange={onInputChange}\r\n maxLength={maxChars}\r\n value={query}\r\n />\r\n ) : (\r\n <input\r\n className='ms-search__form-control'\r\n type='text'\r\n aria-label={ariaLabelSearch}\r\n name={searchQsp}\r\n placeholder={searchPlaceholder}\r\n ref={searchTextInput}\r\n onChange={onInputChange}\r\n value={query}\r\n />\r\n );\r\n\r\n const submitBtnNode = !disableSubmitSearch && (\r\n <Button className='ms-search__form-submitSearch' aria-label={ariaLabelSubmit} />\r\n );\r\n\r\n const searchBtnNode = !disableSubmitSearch && (\r\n <Button className='ms-search_form_startSearch' aria-label={ariaLabelSearch} onClick={handleSearchClick}></Button>\r\n );\r\n\r\n const cancelBtNoden = (\r\n <Button\r\n className={!disableSubmitSearch ? 'ms-search__form-cancelSearch' : 'ms-search__form-cancelSearchNoSumbit'}\r\n aria-label={ariaLabelCancel}\r\n onClick={handleCancelSearchChange}\r\n type='button'\r\n />\r\n );\r\n\r\n return {input: inputNode, cancelBtn: cancelBtNoden, submitBtn: submitBtnNode, searchBtn: searchBtnNode };\r\n};","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n\r\nimport { Button, getPayloadObject, getTelemetryAttributes, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nexport interface ISearchLabelProps {\r\n isSearchFormExpanded: boolean;\r\n searchLabelClass: string;\r\n searchLabelArialLabel: string;\r\n searchtext: string;\r\n searchCollapsedLabel: React.RefObject<HTMLButtonElement>;\r\n hideSearchLabel?: boolean;\r\n telemetryContent: ITelemetryContent;\r\n handleCancelSearchChange(): void;\r\n}\r\n\r\nexport const LabelComponent = (props: ISearchLabelProps) => {\r\n const { searchLabelClass, searchLabelArialLabel, isSearchFormExpanded, searchtext, searchCollapsedLabel, hideSearchLabel, handleCancelSearchChange, telemetryContent} = props;\r\n const payLoad = getPayloadObject('click', telemetryContent, searchtext, '');\r\n const attributes = getTelemetryAttributes(telemetryContent, payLoad);\r\n\r\n return (\r\n <div className={searchLabelClass}>\r\n <Button\r\n className='ms-search__icon'\r\n aria-expanded={isSearchFormExpanded}\r\n aria-label={searchLabelArialLabel}\r\n onClick={handleCancelSearchChange}\r\n innerRef={searchCollapsedLabel}\r\n {...attributes}\r\n >\r\n {!hideSearchLabel && <span className='ms-search__icon-text' aria-hidden={true}>{searchtext}</span>}\r\n </Button>\r\n </div>\r\n );\r\n};","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport classnames from 'classnames';\r\nimport { debounce } from 'lodash';\r\nimport * as React from 'react';\r\n\r\nimport { Autosuggestions } from '@msdyn365-commerce/commerce-entities';\r\nimport { getUrlSync } from '@msdyn365-commerce/core';\r\nimport { ProductRefiner } from '@msdyn365-commerce/retail-proxy';\r\nimport { getProductSearchRefinersAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\n\r\nimport { createSearchStateInput } from '@msdyn365-commerce-modules/search-utilities';\r\nimport { getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent, KeyCodes } from '@msdyn365-commerce-modules/utilities';\r\n\r\nimport getSearchSuggestionsAction, { AutoSuggestInput, SuggestionType } from './actions/get-auto-suggest-suggestions';\r\nimport { ICittaSearchData } from './citta-search.data';\r\nimport { ICittaSearchProps, ISuggestionTypeCriterionData } from './citta-search.props.autogenerated';\r\nimport {\r\n CategorySuggestionsComponent,\r\n FormComponent,\r\n ISearchCategoryViewProps,\r\n ISearchKeywordViewProps,\r\n ISearchProductViewProps,\r\n KeywordSuggestionsComponent,\r\n LabelComponent,\r\n ProductSuggestionsComponent\r\n} from './components';\r\n\r\nexport interface ISearchState {\r\n isSearchFormExpanded: boolean;\r\n searchText: string;\r\n searchKeywordSuggestClass: string;\r\n searchProductSuggestClass: string;\r\n searchCategorySuggestClass: string;\r\n suggestions: Autosuggestions | undefined;\r\n searchRefiners?: ProductRefiner[] | undefined;\r\n autoSuggestAriaLabel: string;\r\n isInitialState: boolean;\r\n inSearchMode: boolean;\r\n}\r\n\r\nexport interface ISearchViewProps extends ICittaSearchProps<ICittaSearchData> {\r\n Search: IModuleProps;\r\n AutoSuggestAriaLabel: INodeProps;\r\n AutoSuggestAriaLabelText: string;\r\n searchText: string;\r\n AutoSuggest: INodeProps;\r\n KeywordSuggest: INodeProps;\r\n ProductSuggest: INodeProps;\r\n CategorySuggest: INodeProps;\r\n SearchForm: INodeProps;\r\n SearchBtn: INodeProps;\r\n FormWrapper: INodeProps;\r\n BtnWrapper: INodeProps;\r\n UlKeyword: INodeProps;\r\n UlProduct: INodeProps;\r\n UlCategory: INodeProps;\r\n label: React.ReactNode;\r\n searchLabel: INodeProps;\r\n searchLabelText: string;\r\n form: React.ReactNode;\r\n autosuggestKeyword?: ISearchKeywordViewProps;\r\n autosuggestProduct?: ISearchProductViewProps;\r\n autosuggestCategory?: ISearchCategoryViewProps;\r\n callbacks: {\r\n handleCancelSearchChange(): void;\r\n handleSearchClick(): void;\r\n };\r\n isSearchFormExpanded: boolean;\r\n}\r\n\r\n/**\r\n *\r\n * Search module\r\n * @extends {React.Component<ICittaSearchProps<ICittaSearchData>, ISearchState>}\r\n */\r\nclass Search extends React.Component<ICittaSearchProps<ICittaSearchData>, ISearchState> {\r\n private searchTextInput: React.RefObject<HTMLInputElement>;\r\n private searchCollapsedLabel: React.RefObject<HTMLButtonElement>;\r\n private formReference: React.RefObject<HTMLButtonElement>;\r\n private maxChars: number;\r\n private inputSuggestionType?: ISuggestionTypeCriterionData[];\r\n private topResultsCount?: number;\r\n private hitPrefix: string = '{';\r\n private hitSuffix: string = '}';\r\n private waitTime: number = 500;\r\n private autoSuggestResultScreenReaderDiv: React.RefObject<HTMLDivElement>;\r\n private autoSuggestResultDiv: React.RefObject<HTMLDivElement>;\r\n private searchFormClass: string;\r\n private searchBtnClass: string;\r\n private searchLabelClass: string;\r\n private telemetryContent: ITelemetryContent;\r\n // @ts-ignore\r\n private cancellabelDebounce: debounce;\r\n\r\n constructor(props: ICittaSearchProps<ICittaSearchData>) {\r\n super(props);\r\n this.searchTextInput = React.createRef();\r\n this.searchCollapsedLabel = React.createRef();\r\n this.autoSuggestResultScreenReaderDiv = React.createRef();\r\n this.autoSuggestResultDiv = React.createRef();\r\n this.formReference = React.createRef();\r\n this.state = {\r\n isSearchFormExpanded: false,\r\n searchText: '',\r\n searchKeywordSuggestClass: 'ms-search__autoSuggest__keyword',\r\n searchProductSuggestClass: 'ms-search__autoSuggest__product',\r\n searchCategorySuggestClass: 'ms-search__autoSuggest__category',\r\n suggestions: undefined,\r\n searchRefiners: undefined,\r\n autoSuggestAriaLabel: '',\r\n isInitialState: true,\r\n inSearchMode: false\r\n };\r\n this.maxChars =\r\n (this.props.context &&\r\n this.props.context.app &&\r\n this.props.context.app.config &&\r\n this.props.context.app.config.searchInputMaxLength) ||\r\n 50;\r\n this.inputSuggestionType = this.props.config && this.props.config.suggestionTypeCriterion;\r\n this.topResultsCount = this.props.config && this.props.config.topResultsCount ? this.props.config.topResultsCount : 5;\r\n this.searchFormClass = 'ms-search__form';\r\n this.searchBtnClass = 'ms-search__btn';\r\n this.searchLabelClass = 'ms-search__label';\r\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!, this.props.friendlyName, this.props.telemetry);\r\n }\r\n\r\n public async componentDidMount(): Promise<void> {\r\n document.body && document.body.addEventListener('mousedown', this._focusOutTarget);\r\n window && window.addEventListener('keyup', this._keyup);\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n document.body && document.body.removeEventListener('mousedown', this._focusOutTarget, false);\r\n window && window.removeEventListener('keyup', this._keyup, false);\r\n }\r\n\r\n public componentDidUpdate(): void {\r\n const {\r\n config: { hideSearchLabel }\r\n } = this.props;\r\n const { isSearchFormExpanded, isInitialState } = this.state;\r\n\r\n if (!this.props.context.request.params.isEditor) {\r\n if (!hideSearchLabel && isSearchFormExpanded) {\r\n this.searchTextInput && this.searchTextInput.current && this.searchTextInput.current.focus();\r\n } else if (!isInitialState) {\r\n this.searchCollapsedLabel && this.searchCollapsedLabel.current && this.searchCollapsedLabel.current.focus();\r\n }\r\n }\r\n }\r\n\r\n // tslint:disable-next-line: cyclomatic-complexity max-func-body-length\r\n public render(): JSX.Element {\r\n const {\r\n context,\r\n resources: { searchtext, searchLabelArialLabel, cancelBtnAriaLabel, searchBtnAriaLabel, submitBtnAriaLabel },\r\n config: { hideSearchLabel, disableSubmitSearch, searchplaceholderText, className = '' }\r\n } = this.props;\r\n\r\n const {\r\n isSearchFormExpanded,\r\n searchText,\r\n searchKeywordSuggestClass,\r\n searchProductSuggestClass,\r\n searchCategorySuggestClass,\r\n suggestions,\r\n searchRefiners\r\n } = this.state;\r\n\r\n const searchQsp = (context && context.app && context.app.config && context.app.config.searchQueryStringParameter) || 'q';\r\n const searchPageURL = getUrlSync('search', context && context.actionContext) || '';\r\n const searchURL = this._appendQueryParams(searchPageURL, searchText, searchQsp);\r\n const searchPlaceholder = searchplaceholderText && searchplaceholderText.length > 0 ? searchplaceholderText : '';\r\n\r\n const keywordSuggestions =\r\n suggestions &&\r\n suggestions.AllSearchResults &&\r\n suggestions.AllSearchResults.filter(\r\n i => i.SuggestionType === SuggestionType.Keyword || i.SuggestionType === SuggestionType.None\r\n );\r\n const productSuggestions =\r\n suggestions &&\r\n suggestions.AllSearchResults &&\r\n suggestions.AllSearchResults.filter(i => i.SuggestionType === SuggestionType.Product);\r\n const categorySuggestions =\r\n suggestions &&\r\n suggestions.AllSearchResults &&\r\n suggestions.AllSearchResults.filter(i => i.SuggestionType === SuggestionType.Category);\r\n\r\n const viewProps: ISearchViewProps = {\r\n ...(this.props as ICittaSearchProps<ICittaSearchData>),\r\n\r\n Search: {\r\n moduleProps: this.props,\r\n className: `${classnames('ms-search', className)} ${disableSubmitSearch ? 'no-submit' : 'with-submit'}`,\r\n },\r\n AutoSuggestAriaLabel: {\r\n tag: 'div',\r\n className: 'msc-autoSuggest__screen-reader',\r\n 'aria-live': 'assertive',\r\n ref: this.autoSuggestResultScreenReaderDiv\r\n },\r\n AutoSuggestAriaLabelText: this.state.autoSuggestAriaLabel,\r\n searchText: this.state.searchText,\r\n AutoSuggest: {\r\n ref: this.autoSuggestResultDiv,\r\n className: 'ms-search__autoSuggest'\r\n },\r\n KeywordSuggest: {\r\n className: searchKeywordSuggestClass\r\n },\r\n ProductSuggest: {\r\n className: searchProductSuggestClass\r\n },\r\n CategorySuggest: {\r\n className: searchCategorySuggestClass\r\n },\r\n SearchForm: {\r\n className: `${this.searchFormClass} ${isSearchFormExpanded ? 'bx-show' : 'bx-hide'}`\r\n },\r\n SearchBtn: {\r\n className: `${this.searchBtnClass} ${isSearchFormExpanded ? 'bx-show' : 'bx-show'}`\r\n },\r\n BtnWrapper: {\r\n className: 'ms-search__btnWrapper',\r\n 'aria-label': 'Search',\r\n },\r\n FormWrapper: {\r\n tag: 'form',\r\n ref: this.formReference,\r\n className: 'ms-search__searchForm',\r\n 'aria-label': 'Search',\r\n name: 'searchForm',\r\n role: 'Search',\r\n action: searchURL,\r\n autoComplete: 'off',\r\n onSubmit: this._handleSubmit\r\n },\r\n UlKeyword: {\r\n tag: 'ul',\r\n className: classnames('msc-autoSuggest__keywordResults-items', className)\r\n },\r\n UlProduct: {\r\n tag: 'ul',\r\n className: classnames('msc-autoSuggest__productResults-items', className)\r\n },\r\n UlCategory: {\r\n tag: 'ul',\r\n className: classnames('msc-autoSuggest__categoryResults-items', className)\r\n },\r\n searchLabel: {\r\n tag: 'div',\r\n className: 'search-label',\r\n },\r\n searchLabelText: 'Search',\r\n label: LabelComponent({\r\n isSearchFormExpanded: isSearchFormExpanded,\r\n searchLabelClass: `${this.searchLabelClass} 'bx-show'}`,\r\n searchtext: searchtext,\r\n searchLabelArialLabel: searchLabelArialLabel,\r\n searchCollapsedLabel: this.searchCollapsedLabel,\r\n hideSearchLabel: hideSearchLabel,\r\n handleCancelSearchChange: this._handleCancelSearchChange,\r\n telemetryContent: this.telemetryContent\r\n }),\r\n // @ts-ignore\r\n form: FormComponent({\r\n ariaLabelCancel: cancelBtnAriaLabel,\r\n ariaLabelSearch: searchBtnAriaLabel,\r\n ariaLabelSubmit: submitBtnAriaLabel,\r\n hideSearchLabel: hideSearchLabel,\r\n searchTextInput: this.searchTextInput,\r\n isSearchFormExpanded: isSearchFormExpanded,\r\n disableSubmitSearch: disableSubmitSearch,\r\n handleInputChange: this._handleInputChange,\r\n handleCancelSearchChange: this._handleCancelSearchChange,\r\n handleSearchClick: this._handleSearchClick,\r\n maxChars: this.maxChars,\r\n searchQsp: searchQsp,\r\n searchPlaceholder: searchPlaceholder,\r\n query: searchText\r\n }),\r\n autosuggestKeyword:\r\n searchText && searchText.length > 0 && keywordSuggestions && keywordSuggestions.length > 0\r\n ? KeywordSuggestionsComponent({\r\n searchKeywordSuggestClass: searchKeywordSuggestClass,\r\n searchPageURL: searchPageURL,\r\n searchQsp: searchQsp,\r\n hitPrefix: this.hitPrefix,\r\n hitSuffix: this.hitSuffix,\r\n autoSuggestProps: this.props,\r\n searchText: searchText,\r\n suggestions: keywordSuggestions,\r\n telemetryContent: this.telemetryContent\r\n })\r\n : undefined,\r\n autosuggestProduct:\r\n searchText && searchText.length > 0 && productSuggestions && productSuggestions.length > 0\r\n ? ProductSuggestionsComponent({\r\n searchProductSuggestClass: searchProductSuggestClass,\r\n searchPageURL: searchPageURL,\r\n searchQsp: searchQsp,\r\n hitPrefix: this.hitPrefix,\r\n hitSuffix: this.hitSuffix,\r\n autoSuggestProps: this.props,\r\n searchText: searchText,\r\n suggestions: productSuggestions,\r\n telemetry: this.props.telemetry,\r\n moduleType: this.props.typeName,\r\n moduleId: this.props.id,\r\n telemetryContent: this.telemetryContent\r\n })\r\n : undefined,\r\n autosuggestCategory:\r\n searchText && searchText.length > 0 && categorySuggestions && categorySuggestions.length > 0\r\n ? CategorySuggestionsComponent({\r\n searchCategorySuggestClass: searchCategorySuggestClass,\r\n searchPageURL: searchPageURL,\r\n searchQsp: searchQsp,\r\n hitPrefix: this.hitPrefix,\r\n hitSuffix: this.hitSuffix,\r\n autoSuggestProps: this.props,\r\n searchText: searchText,\r\n suggestions: categorySuggestions,\r\n searchRefiners: searchRefiners,\r\n telemetryContent: this.telemetryContent\r\n })\r\n : undefined,\r\n callbacks: {\r\n handleCancelSearchChange: this._handleCancelSearchChange,\r\n handleSearchClick: this._handleSearchClick\r\n },\r\n isSearchFormExpanded: this.state.isSearchFormExpanded\r\n };\r\n\r\n return this.props.renderView(viewProps) as React.ReactElement;\r\n }\r\n\r\n // tslint:disable-next-line:no-any\r\n private _focusOutTarget = (e: any): void => {\r\n const { suggestions } = this.state;\r\n\r\n if (\r\n suggestions &&\r\n suggestions.AllSearchResults &&\r\n e.target.closest('.ms-search') === null\r\n ) {\r\n this._clearAutoSuggestState();\r\n }\r\n };\r\n\r\n private _keyup = (e: KeyboardEvent): void => {\r\n const { suggestions } = this.state;\r\n\r\n if (suggestions && suggestions.AllSearchResults && e.keyCode === KeyCodes.Escape) {\r\n this._clearAutoSuggestState();\r\n } else if (this.state.isSearchFormExpanded && e.keyCode === KeyCodes.Escape) {\r\n if (this.state.isSearchFormExpanded) {\r\n this.setState({ isSearchFormExpanded: false });\r\n window.document.body.classList.toggle('search-open', false);\r\n }\r\n }\r\n\r\n if (!((this.formReference.current && this.formReference.current.contains(e.target as unknown as Node)) ||\r\n (this.autoSuggestResultDiv.current && this.autoSuggestResultDiv.current.contains(e.target as unknown as Node)))) {\r\n if (suggestions && suggestions.AllSearchResults) {\r\n this._clearAutoSuggestState();\r\n }\r\n\r\n if (this.state.isSearchFormExpanded) {\r\n this.setState({ isSearchFormExpanded: false });\r\n window.document.body.classList.toggle('search-open', false);\r\n }\r\n }\r\n };\r\n\r\n private _clearAutoSuggestState = (): void => {\r\n const {\r\n context: { actionContext },\r\n data: { searchState }\r\n } = this.props;\r\n\r\n if (this.searchTextInput.current && this.searchTextInput.current.value.length > 0) {\r\n searchState.searchText = '';\r\n searchState.defaultBasicSearchUrl = '';\r\n searchState.searchQueryStringParameter = '';\r\n actionContext ? actionContext.update(createSearchStateInput(searchState), searchState) : null;\r\n this.searchTextInput.current.value = '';\r\n }\r\n\r\n this.setState({ searchText: '', suggestions: undefined, searchRefiners: undefined });\r\n };\r\n\r\n private _handleSearchClick = (): void => {\r\n console.log('handle search click')\r\n const { isSearchFormExpanded } = this.state;\r\n const updatedIsSearchFormExpanded = !isSearchFormExpanded;\r\n const headerElem = document.querySelector('.ms-header');\r\n if (headerElem) {\r\n if (updatedIsSearchFormExpanded) {\r\n headerElem.classList.add('lock-opaque');\r\n // window.document.body.classList.toggle('menu-open', true);\r\n window.document.body.classList.toggle('search-open', true);\r\n } else {\r\n if (document.documentElement.scrollTop < 2) {\r\n headerElem.classList.remove('lock-opaque');\r\n }\r\n // window.document.body.classList.toggle('menu-open', false);\r\n window.document.body.classList.toggle('search-open', false);\r\n }\r\n }\r\n this.setState({ isSearchFormExpanded: updatedIsSearchFormExpanded });\r\n }\r\n\r\n private _handleInputChange = (query: string): void => {\r\n if (!query || query.length < this.maxChars) {\r\n this.setState({ searchText: query });\r\n }\r\n\r\n if (this.cancellabelDebounce) {\r\n this.cancellabelDebounce.cancel();\r\n }\r\n\r\n const {\r\n telemetry,\r\n context,\r\n data: { searchState }\r\n } = this.props;\r\n\r\n if (context) {\r\n if (query && query.length > 0) {\r\n if (query.length > this.maxChars) {\r\n return;\r\n }\r\n\r\n this.cancellabelDebounce = debounce(\r\n () => {\r\n getSearchSuggestionsAction(\r\n new AutoSuggestInput(\r\n query,\r\n this.topResultsCount,\r\n this._getSuggestionType(this.inputSuggestionType),\r\n this.hitPrefix,\r\n this.hitSuffix\r\n ),\r\n context.actionContext\r\n )\r\n .then(results => {\r\n this._getSearchRefiners(query)\r\n .then(refiners => {\r\n this.setState({\r\n suggestions: results, searchRefiners: refiners,\r\n autoSuggestAriaLabel: this._setAutoSuggestResultCount(results)\r\n });\r\n })\r\n .catch(error => {\r\n this.setState({\r\n suggestions: results, searchRefiners: undefined,\r\n autoSuggestAriaLabel: this._setAutoSuggestResultCount(results)\r\n });\r\n telemetry.exception(error);\r\n telemetry.debug('Unable to get refiners results');\r\n });\r\n })\r\n .catch(error => {\r\n this.setState({\r\n suggestions: undefined, searchRefiners: undefined,\r\n autoSuggestAriaLabel: this._setAutoSuggestResultCount()\r\n });\r\n telemetry.exception(error);\r\n telemetry.debug('Unable to get auto suggest results');\r\n });\r\n },\r\n this.waitTime\r\n );\r\n\r\n setTimeout(\r\n () => {\r\n this.cancellabelDebounce();\r\n },\r\n 0\r\n );\r\n\r\n searchState.searchText = query;\r\n } else {\r\n this.setState({ suggestions: undefined, searchRefiners: undefined });\r\n searchState.searchText = '';\r\n }\r\n context.actionContext.update(createSearchStateInput(searchState), searchState);\r\n }\r\n };\r\n\r\n private _getSuggestionType = (suggestionTypes?: ISuggestionTypeCriterionData[]): string => {\r\n if (suggestionTypes && suggestionTypes.length > 0) {\r\n const distinctSuggestionTypes: string[] = [];\r\n suggestionTypes && suggestionTypes.forEach((suggestionTypeItem, index) => {\r\n suggestionTypeItem.SuggestionType && distinctSuggestionTypes.push(suggestionTypeItem.SuggestionType.charAt(0).toUpperCase() + suggestionTypeItem.SuggestionType.slice(1));\r\n });\r\n return distinctSuggestionTypes.join(',');\r\n }\r\n return 'Keyword, Product, ScopedCategory';\r\n };\r\n\r\n private async _getSearchRefiners(searchText: string): Promise<ProductRefiner[]> {\r\n const { actionContext: ctx } = this.props.context;\r\n return getProductSearchRefinersAsync(\r\n { callerContext: ctx },\r\n {\r\n SearchCondition: searchText,\r\n Context: {\r\n ChannelId: +ctx.requestContext.apiSettings.channelId,\r\n CatalogId: +ctx.requestContext.apiSettings.catalogId\r\n }\r\n }\r\n );\r\n }\r\n\r\n private _handleSubmit = (\r\n e: React.MouseEvent<HTMLElement> | React.KeyboardEvent<HTMLElement> | React.FormEvent<HTMLFormElement>\r\n ): void => {\r\n const {\r\n config: { disableSubmitSearch },\r\n context: {\r\n actionContext,\r\n app: {\r\n config: { searchQueryStringParameter }\r\n }\r\n }\r\n } = this.props;\r\n\r\n const query = this.searchTextInput.current && this.searchTextInput.current.value;\r\n e.preventDefault();\r\n\r\n if (!query || (query && query.length === 0) || disableSubmitSearch) {\r\n this.searchTextInput && this.searchTextInput.current && this.searchTextInput.current.focus();\r\n } else {\r\n const searchQsp = searchQueryStringParameter || 'q';\r\n const searchURL = this._appendQueryParams(getUrlSync('search', actionContext) || '', query, searchQsp);\r\n document.location.href = searchURL;\r\n }\r\n };\r\n\r\n private _handleCancelSearchChange = (): void => {\r\n const { isSearchFormExpanded, suggestions } = this.state;\r\n\r\n if (!isSearchFormExpanded) {\r\n this.setState({\r\n isSearchFormExpanded: true,\r\n searchText: '',\r\n isInitialState: false\r\n });\r\n } else {\r\n if (suggestions && suggestions.AllSearchResults) {\r\n this._clearAutoSuggestState();\r\n }\r\n\r\n this.setState({ isSearchFormExpanded: false });\r\n window.document.body.classList.toggle('search-open', false);\r\n }\r\n };\r\n\r\n private _appendQueryParams = (route: string, query: string, qsp: string): string => {\r\n if (route && route.length > 0) {\r\n return query && query.length > 0 ? `${route}${route.indexOf('?') === -1 ? '?' : '&'}${qsp}=${query}` : route;\r\n }\r\n return '';\r\n };\r\n\r\n private _setAutoSuggestResultCount = (result?: Autosuggestions) => {\r\n if (this.autoSuggestResultScreenReaderDiv.current !== null) {\r\n const ariaLiveRegion = this.autoSuggestResultScreenReaderDiv.current;\r\n const suggestResultString = this.props.resources.autoSuggestFoundMessage;\r\n const emptyResultString = this.props.resources.noAutoSuggestionMessage;\r\n ariaLiveRegion.innerText = result && (result.AllSearchResults && result.AllSearchResults.length > 0) ? suggestResultString : emptyResultString;\r\n ariaLiveRegion.setAttribute('aria-live', 'assertive');\r\n return ariaLiveRegion.innerText;\r\n } else {\r\n return '';\r\n }\r\n };\r\n}\r\n\r\nexport default Search;\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport * as React from 'react';\r\nimport { ISearchCategoryViewProps, ISearchFormViewProps, ISearchKeywordViewProps, ISearchProductViewProps } from './components';\r\n\r\nimport { INodeProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport { ISearchViewProps } from './citta-search';\r\n\r\nconst SearchView: React.FC<ISearchViewProps> = props => {\r\n const {\r\n Search,\r\n AutoSuggestAriaLabel,\r\n AutoSuggestAriaLabelText,\r\n searchText,\r\n AutoSuggest,\r\n KeywordSuggest,\r\n ProductSuggest,\r\n CategorySuggest,\r\n UlKeyword,\r\n UlProduct,\r\n UlCategory,\r\n form,\r\n searchLabel,\r\n searchLabelText,\r\n autosuggestCategory,\r\n autosuggestKeyword,\r\n autosuggestProduct,\r\n SearchForm,\r\n SearchBtn,\r\n FormWrapper,\r\n BtnWrapper\r\n } = props;\r\n\r\n return (\r\n <Module {...Search}>\r\n { /* @ts-ignore */}\r\n {_renderButton(form as ISearchFormViewProps, SearchBtn, BtnWrapper)}\r\n { /* @ts-ignore */}\r\n {_renderForm(form as ISearchFormViewProps, SearchForm, FormWrapper, searchLabel, searchLabelText)}\r\n <Node {...AutoSuggest}>\r\n {searchText && searchText.length > 0 ?\r\n <Node {...AutoSuggestAriaLabel}>{AutoSuggestAriaLabelText}</Node> : ''\r\n }\r\n {_renderKeywordSuggestions(KeywordSuggest, UlKeyword, autosuggestKeyword)}\r\n {_renderProductSuggestions(ProductSuggest, UlProduct, autosuggestProduct)}\r\n {_renderCategorySuggestions(CategorySuggest, UlCategory, autosuggestCategory)}\r\n </Node>\r\n </Module>\r\n );\r\n};\r\n\r\nconst _renderButton = (form: ISearchFormViewProps, SearchBtn: INodeProps, BtnWrapper: INodeProps) => {\r\n return (\r\n <Node {...SearchBtn}>\r\n <Node {...BtnWrapper}>\r\n {form.searchBtn}\r\n </Node>\r\n </Node>\r\n );\r\n};\r\n\r\nconst _renderForm = (form: ISearchFormViewProps, SearchForm: INodeProps, FormWrapper: INodeProps, searchLabel: INodeProps, searchLabelText: string) => {\r\n return (\r\n <Node {...SearchForm}>\r\n <Node {...FormWrapper}>\r\n {form.input}\r\n <span id='cancelBtn'>\r\n {form.cancelBtn}\r\n </span>\r\n </Node>\r\n </Node>\r\n );\r\n};\r\n\r\nconst _renderKeywordSuggestions = (\r\n KeywordSuggest: INodeProps,\r\n UlKeyword: INodeProps,\r\n keywordSuggestions?: ISearchKeywordViewProps\r\n) => {\r\n return (\r\n keywordSuggestions && (\r\n <Node {...KeywordSuggest}>\r\n <Node {...UlKeyword}>\r\n {keywordSuggestions.text.map(text => {\r\n return text;\r\n })}\r\n </Node>\r\n </Node>\r\n )\r\n );\r\n};\r\n\r\nconst _renderProductSuggestions = (\r\n ProductSuggest: INodeProps,\r\n UlProduct: INodeProps,\r\n productSuggestions?: ISearchProductViewProps\r\n) => {\r\n return (\r\n productSuggestions && (\r\n <Node {...ProductSuggest}>\r\n <Node {...UlProduct}>\r\n {productSuggestions.title}\r\n {productSuggestions.items.map((item, index) => {\r\n return (\r\n <Node {...item.LiProduct} key={item.id || index}>\r\n <Node {...item.AProduct}>\r\n {item.text}\r\n {item.price}\r\n </Node>\r\n </Node>\r\n );\r\n })}\r\n </Node>\r\n </Node>\r\n )\r\n );\r\n};\r\n\r\nconst _renderCategorySuggestions = (\r\n CategorySuggest: INodeProps,\r\n UlCategory: INodeProps,\r\n categorySuggestions?: ISearchCategoryViewProps\r\n) => {\r\n return (\r\n categorySuggestions && (\r\n <Node {...CategorySuggest}>\r\n <Node {...UlCategory}>\r\n {categorySuggestions.title}\r\n {categorySuggestions.text.map(text => {\r\n return text;\r\n })}\r\n </Node>\r\n </Node>\r\n )\r\n );\r\n};\r\n\r\nexport default SearchView;","/*!\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<IActiveProductProps> {}\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 <p className='msc-active-image-product__text'>{description}</p>;\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 <RatingComponent\n context={context}\n id={ratingId}\n typeName={typeName}\n avgRating={avgRating}\n ratingCount={numberRatings}\n readOnly\n ariaLabel={ratingAriaLabel}\n data={{}}\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 <PriceComponent\n context={context}\n id={productId}\n typeName={typeName}\n data={{ price }}\n savingsText={savingsText}\n freePriceText={freePriceText}\n originalPriceText={originalPriceText}\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 <Image {...imgData} {...imageProps} requestContext={requestContext} loadFailureBehavior='empty' />;\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<IActiveProductProps> = ({\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 <div className='msc-active-image-product'>\n <div className='msc-active-image-product__image'>\n {renderProductPlacementImage(\n context.actionContext.requestContext,\n imageSettings,\n context.request.gridSettings,\n product.PrimaryImageUrl,\n product.Name\n )}\n </div>\n <div className='msc-active-image-product__details'>\n <h4 className='msc-active-image-product__title'>{product.Name}</h4>\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 </div>\n </div>\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 <Msdyn365.Text\n text={additionalContentHeading}\n tag='p'\n className='msc-active-image__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 - 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 <Msdyn365.Text\n text={additionalContentParagraphText}\n tag='p'\n className='msc-active-image__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.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 <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 - 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<HTMLAreaElement, MouseEvent> | React.FocusEvent<HTMLAreaElement>;\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<HTMLDivElement>;\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<IImageMapperProps> {\n private readonly _backgroundImage: React.RefObject<Image>;\n\n private readonly _container: React.RefObject<HTMLDivElement>;\n\n private readonly _canvas: React.RefObject<HTMLCanvasElement>;\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 <area\n key={areaKey}\n shape='circle'\n coords={scaledCoords.join(',')}\n onMouseEnter={this.hoverOn(extendedArea, index)}\n onMouseLeave={this.hoverOff(extendedArea, index)}\n onClick={this.click(extendedArea, index)}\n onFocus={this.hoverOn(extendedArea, index)}\n onBlur={this.hoverOff(extendedArea, index)}\n href={area.productUrl}\n tabIndex={0}\n alt={altTextWithProductName}\n aria-label={altTextWithProductName}\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 <div className='msc-active-image-container' ref={this._container}>\n <Image\n src={imageData.src}\n useMap={`#${areaMap.name}`}\n alt={areaMap.name}\n ref={this._backgroundImage}\n height={imageData.height}\n width={imageData.width}\n className='msc-active-image-img'\n imageSettings={imageData.imageSettings}\n gridSettings={requestContext.gridSettings ?? {}}\n requestContext={requestContext}\n />\n <canvas ref={this._canvas} className='msc-active-image-canvas' />\n <map name={areaMap.name} className='msc-active-image-map'>\n {this.renderAreas()}\n </map>\n </div>\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<HTMLAreaElement, MouseEvent> | React.FocusEvent<HTMLAreaElement>;\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<IActiveImageProps<{}> & IImageMapperProps, IActiveImageState>}\n */\nexport class ActiveImage extends React.PureComponent<IActiveImageProps<IActiveImageData> & 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<HTMLDivElement>;\n\n private readonly _activeImageClass: string;\n\n private readonly _productCardDivRef: React.RefObject<HTMLDivElement>;\n\n public constructor(props: IActiveImageProps<IActiveImageData> & 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<Element> = 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 <ImageMapper\n viewPort={this.state.viewport}\n requestContext={this.props.context.actionContext.requestContext}\n width={this.state.clientWidth}\n imgWidth={this.props.config.canvasWidth}\n onClick={this.enterArea}\n onFocus={this.enterArea}\n onMouseEnter={this.enterArea}\n onMouseLeave={this.leaveArea}\n imageData={this.props.config.activeImage ?? {}}\n areaMap={mappedArea}\n activeImageRefs={this._activeImageRefs}\n imageMapperResources={{\n altText: this.props.resources.altTextForSeeMoreButtonWithProductName,\n buttonText: this.props.resources.seeMoreButtonText\n }}\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 <ActiveProductComponent\n context={this.props.context}\n imageSettings={this.props.config.productImageSettings}\n id={product.ItemId ?? ''}\n typeName={this.props.typeName || ''}\n data={{ product }}\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 <div className='msc-active-image-product-card' ref={this._productCardDivRef}>\n <div className='msc-active-image-product-card-wrapper' key={area.areaId}>\n {!this._isDesktopViewPort && <button onClick={this.resetState} className='close-button' />}\n {area.productSearchResult && this.renderProductComponent()}\n {!this._isDesktopViewPort && (\n <a href={area.productUrl} className='see-more-button'>\n {this.props.resources.seeMoreButtonText}\n </a>\n )}\n </div>\n </div>\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 && <div className={this.state.overlayClass} />}</>;\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 <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 /**\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 <MsDyn365.Text\n className='msc-active-image__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 /**\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 <MsDyn365.RichTextComponent\n text={paragraph}\n className='msc-active-image__details__text'\n editProps={{ onEdit: this.handleParagraphChange, requestContext: this.props.context.request }}\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 <Node {...additionalContent.additionalContentNode}>\n {additionalContent.heading}\n <Node {...additionalContent.additionalContentContainer}>\n {additionalContent.text}\n <Node {...additionalContent.additionalContentItemLinks}>{additionalContent.links}</Node>\n </Node>\n </Node>\n );\n};\n\n/**\n * Render View.\n * @param props - The view props.\n * @returns -The JSX Element.\n */\nexport const activeImageView: React.FC<IActiveImageViewProps> = props => {\n return (\n <Module {...props.activePointContainer}>\n <Node {...props.activePointDetailsContainer}>\n {props.imageMapper}\n <Node {...props.detailsContainer} className={props.detailsContainer ? props.detailsContainer.className : ''}>\n {props.title}\n {props.text}\n {props.additionalContent && renderAdditionalContent(props.additionalContent)}\n <Node {...props.detailsContainerCta} className={props.detailsContainerCta ? props.detailsContainerCta.className : ''}>\n {props.links}\n </Node>\n </Node>\n </Node>\n <Node\n className='msc-active-image-product-card-container'\n style={{ top: `${props.productCardtopPosition}px`, left: `${props.productCardleftPosition}px` }}\n >\n {props.overlay}\n {props.productCard}\n </Node>\n </Module>\n );\n};\n\nexport default activeImageView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { getTelemetryObject, IModuleProps, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { ICarouselData } from './carousel.data';\nimport { ICarouselProps } from './carousel.props.autogenerated';\nimport { ICarouselState } from './carousel.state';\n\nexport interface ICarouselViewProps extends ICarouselProps<{}>, ICarouselState {\n closeAnimation: string;\n carouselContainer: IModuleProps;\n telemetryContent: ITelemetryContent;\n next(): void;\n previous(): void;\n onIndicatorsClickHandler(): void;\n handleDismissCarousel(): void;\n handleOnExited(): void;\n handleOnExiting(): void;\n}\n\n/**\n *\n * CarouselModule component.\n * @extends {React.PureComponent<ICarouselProps<ICarouselData>>}\n */\nclass CarouselModule extends React.PureComponent<ICarouselProps<ICarouselData>, ICarouselState> {\n private animating: boolean;\n\n private readonly telemetryContent: ITelemetryContent;\n\n constructor(props: ICarouselProps<ICarouselData>, state: ICarouselState) {\n super(props);\n this.state = { activeIndex: 0, closeNow: false, dismissCarousel: false };\n this.animating = false;\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n }\n\n public componentDidMount(): void {\n if (this.props.context && this.props.context.request && this.props.context.request.cookies) {\n if (this.props.context.request.cookies.get(`CarouselDismiss_${this.props.id}`) === undefined) {\n this.props.context.request.cookies.set(`CarouselDismiss_${this.props.id}`, 'false');\n this.setState({ dismissCarousel: false });\n }\n }\n }\n\n public render(): JSX.Element | null {\n if (this.state.dismissCarousel) {\n return null;\n }\n\n const { className } = this.props.config;\n\n const viewProps = {\n // Context for telemetry and raw data for C1 to do customization\n // Including computed data, state data and methods\n ...this.props,\n ...this.state,\n telemetryContent: this.telemetryContent,\n carouselContainer: {\n moduleProps: this.props,\n className: classnames('ms-carousel', className)\n },\n closeAnimation: this.state.closeNow ? 'close-now' : '',\n next: this._next,\n previous: this._previous,\n onIndicatorsClickHandler: this._goToIndex,\n handleDismissCarousel: this._handleDismissCarousel,\n handleOnExited: this._onExited,\n handleOnExiting: this._onExiting\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n /**\n * Function implementation to dismiss the Carousel.\n */\n private readonly _handleDismissCarousel = (): void => {\n if (this.props.context && this.props.context.request && this.props.context.request.cookies) {\n this.props.context.request.cookies.set(`CarouselDismiss_${this.props.id}`, 'true');\n this.setState({ dismissCarousel: true });\n }\n };\n\n /**\n * Function implementation to move to next slide.\n */\n private readonly _next = (): void => {\n const { slots } = this.props;\n const nextIndex = this.state.activeIndex === (slots && slots.content && slots.content.length - 1) ? 0 : this.state.activeIndex + 1;\n\n if (this.animating) {\n this.setState({ closeNow: true, activeIndex: nextIndex });\n } else {\n this.setState({ activeIndex: nextIndex });\n }\n };\n\n /**\n * Function implementation to move to previous slide.\n */\n private readonly _previous = (): void => {\n const slots = this.props.slots && this.props.slots.content;\n const nextIndex = this.state.activeIndex === 0 ? (slots ? slots.length - 1 : 0) : this.state.activeIndex - 1;\n\n if (this.animating) {\n this.setState({ closeNow: true, activeIndex: nextIndex });\n } else {\n this.setState({ activeIndex: nextIndex });\n }\n };\n\n private readonly _onExiting = (): void => {\n this.animating = true;\n };\n\n private readonly _onExited = (): void => {\n this.animating = false;\n this.setState({ closeNow: false });\n };\n\n /**\n * Function implementation to move to a given slide.\n * @param newIndex\n */\n private readonly _goToIndex = (newIndex: number): void => {\n if (this.animating) {\n return;\n }\n this.setState({ activeIndex: newIndex });\n };\n}\n\nexport default CarouselModule;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Carousel } from '@msdyn365-commerce/components';\nimport { Module } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { ICarouselViewProps } from './carousel';\n\n/**\n * Returns item slots.\n * @returns Array of item slots.\n * @param props -Props.\n */\nconst retrieveItems = (props: ICarouselViewProps): React.ReactNode[] => {\n let items = [];\n items = props.slots && props.slots.content && props.slots.content.length > 0 ? props.slots.content : [];\n return items;\n};\nconst CarouselView: React.FC<ICarouselViewProps> = props => (\n <Module {...props.carouselContainer} {...props.renderModuleAttributes(props)}>\n <Carousel\n className={classnames(props.closeAnimation)}\n activeIndex={props.activeIndex}\n next={props.next}\n previous={props.previous}\n pause={props.config.pauseOnHover ? 'hover' : false}\n ride={props.config.autoplay ? 'carousel' : undefined}\n autoplay={props.config.autoplay}\n interval={props.config.interval}\n transitionType={props.config.transitionType ? props.config.transitionType : undefined}\n items={retrieveItems(props)}\n hideFlipper={props.config.hideFlipper}\n dismissEnabled={props.config.dismissEnabled}\n onIndicatorsClickHandler={props.onIndicatorsClickHandler}\n handleDismissCarousel={props.handleDismissCarousel}\n dismissCarouselAriaText={props.resources && props.resources.ariaLabelForDismissButton}\n indicatorAriaText={props.resources && props.resources.ariaLabelForSlide}\n directionTextPrev={props.resources && props.resources.flipperPrevious}\n directionTextNext={props.resources && props.resources.flipperNext}\n handleOnExited={props.handleOnExited}\n handleOnExiting={props.handleOnExiting}\n telemetryContent={props.telemetryContent}\n keyboard={props.config.keyboard}\n />\n </Module>\n);\n\nexport default CarouselView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport msdyn365Commerce, { getCatalogId, getUrlSync, IImageSettings, Image, isChannelTypeB2B } from '@msdyn365-commerce/core';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport {\n ArrayExtensions,\n convertProductDimensionTypeToDimensionTypes,\n getFallbackImageUrl,\n getProductUrlSync,\n ObjectExtensions,\n Random,\n StringExtensions,\n validateCatalogId\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, IModuleProps, isMobile, VariantType, INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport React from 'react';\n\nimport { RemoveFromComparisonButtonComponent } from '../product-comparison';\nimport { ProductComparisonState } from '../product-comparison-state';\nimport {\n getProductsInPreviewProductComparisonAction,\n GetProductsInPreviewProductComparisonInput,\n IProductComparisonProductData\n} from './actions';\nimport { IProductComparisonPreviewData } from './product-comparison-preview.data';\nimport { IProductComparisonPreviewProps } from './product-comparison-preview.props.autogenerated';\n\n/**\n * Represents product comparison view props for main product info.\n */\nexport interface IProductComparisonPreviewProductMainInfo {\n productData: IProductComparisonProductData;\n productNameLink?: string;\n\n removeFromComparisonButton: React.ReactNode;\n productImage: React.ReactNode;\n productLink: React.ReactNode;\n}\n\n/**\n * Represents product comparison view props.\n */\nexport interface IProductComparisonPreviewViewProps extends IProductComparisonPreviewProps<{}> {\n moduleProps: IModuleProps;\n collapseButton: INodeProps;\n isMainContentReady: boolean;\n\n hasUserInteractedWithComparison?: boolean;\n isExpanded?: boolean;\n subheaderText?: string;\n productsMainInfo?: IProductComparisonPreviewProductMainInfo[];\n previewGreyPlaceHolders?: React.ReactNode;\n\n productComparisonLink?: string;\n goToComparisonButton?: React.ReactNode;\n clearAllButton?: React.ReactNode;\n\n handleCollapseClick?(): void;\n clearAllProductsFromTheComparison?(): void;\n removeProductFromList?(itemId: string): void;\n}\n\n/**\n * Extended props for the module including info about the product.\n */\nexport interface IProductComparisonPreviewState {\n isExpanded?: boolean;\n productsData?: IProductComparisonProductData[];\n greyPlaceHoldersCount?: number;\n}\n\n/**\n * Extended props for the module including info about the product.\n */\nexport interface IProductComparisonPreviewFullProps extends IProductComparisonPreviewProps<IProductComparisonPreviewData> {}\n\n/**\n * Represents the component which renders product comparison table.\n */\nexport class ProductComparisonPreview extends React.PureComponent<IProductComparisonPreviewFullProps, IProductComparisonPreviewState> {\n public static readonly className = 'ms-product-comparison-preview';\n\n public static readonly containerClassName = `${ProductComparisonPreview.className}__container`;\n\n public static readonly mainContainerClassName = `${ProductComparisonPreview.containerClassName}__main-container`;\n\n public static readonly headerClassName = `${ProductComparisonPreview.mainContainerClassName}__header`;\n\n public static readonly headerLabelClassName = `${ProductComparisonPreview.headerClassName}__label`;\n\n public static readonly tableClassName = `${ProductComparisonPreview.mainContainerClassName}__table`;\n\n public static readonly tableRowClassName = `${ProductComparisonPreview.tableClassName}__product-row`;\n\n public static readonly footerClassName = `${ProductComparisonPreview.mainContainerClassName}__footer`;\n\n public static readonly collapseButtonClassName = `${ProductComparisonPreview.headerClassName}__collapse`;\n\n public static _displayedInstanceId?: string;\n\n private readonly _instanceId: string;\n\n private _hasUserInteractedWithComparison: boolean;\n\n public constructor(props: IProductComparisonPreviewFullProps) {\n super(props);\n\n this.state = {};\n\n this._instanceId = `${ProductComparisonPreview.className}-${this.props.id}-${Random.Guid.generateGuid()}`;\n ProductComparisonPreview._displayedInstanceId = this._instanceId;\n\n this._hasUserInteractedWithComparison = false;\n }\n\n public componentDidMount(): void {\n if (this._instanceId !== ProductComparisonPreview._displayedInstanceId) {\n return;\n }\n\n this._loadProducts();\n ProductComparisonState.instance(this.props.context.request, this.props.data.accountInformation?.result).listModifiedEvent.subscribe(\n {\n instanceId: this._instanceId,\n\n /**\n * Updates the state in case the state for the particular product was changed.\n */\n handler: () => {\n this._hasUserInteractedWithComparison = true;\n // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Initialize data downloading.\n this._loadProducts();\n }\n }\n );\n }\n\n public componentWillUnmount(): void {\n ProductComparisonState.instance(\n this.props.context.request,\n this.props.data.accountInformation?.result\n ).listModifiedEvent.unsubscribe(this._instanceId);\n }\n\n public render(): React.ReactNode {\n if (this._instanceId !== ProductComparisonPreview._displayedInstanceId) {\n return null;\n }\n\n const viewProps: IProductComparisonPreviewViewProps = {\n ...this.props,\n moduleProps: {\n moduleProps: this.props,\n className: ProductComparisonPreview.className,\n id: this._instanceId\n },\n collapseButton: this._renderCollapseButton(),\n isMainContentReady: false,\n hasUserInteractedWithComparison: this._hasUserInteractedWithComparison\n };\n\n const productData = this._getProdutComparisonDataByCatalogId(this.state.productsData ?? this.props.data.productsData?.result);\n\n if (!ArrayExtensions.hasElements(productData)) {\n return this.props.renderView(viewProps);\n }\n\n viewProps.isMainContentReady = true;\n\n const productsLimit = this._getProductsLimit();\n if (!ObjectExtensions.isNullOrUndefined(productsLimit)) {\n viewProps.subheaderText = this.props.resources.productComparisonPreviewHeaderTextWithLimit\n .replace('{0}', productData.length.toString())\n .replace('{1}', productsLimit.toString());\n }\n\n viewProps.isExpanded = this.state.isExpanded;\n viewProps.handleCollapseClick = this._handleCollapseClick;\n viewProps.productsMainInfo = this._getProductsMainInfo(productData);\n viewProps.previewGreyPlaceHolders = this._renderGreyPlaceHolders(productData);\n viewProps.productComparisonLink = getUrlSync('product-comparison', this.props.context.actionContext);\n viewProps.clearAllProductsFromTheComparison = this._clearAllProductsFromTheComparison;\n viewProps.removeProductFromList = this._removeProductFromList;\n viewProps.goToComparisonButton = this._renderGoToComparisonButton(viewProps.productComparisonLink);\n viewProps.clearAllButton = this._renderClearAllButton();\n\n return this.props.renderView(viewProps);\n }\n private _getProdutComparisonDataByCatalogId(productData: IProductComparisonProductData[] | undefined): IProductComparisonProductData[] {\n const catalogId = getCatalogId(this.props.context.request);\n validateCatalogId(catalogId);\n const productByCatalogId = productData?.filter(product => product.catalogId === catalogId) ?? [];\n return productByCatalogId;\n }\n private async _loadProducts(): Promise<void> {\n const items = ProductComparisonState.instance(this.props.context.request, this.props.data.accountInformation?.result).items;\n const input = new GetProductsInPreviewProductComparisonInput(items);\n const productData = await getProductsInPreviewProductComparisonAction(input, this.props.context.actionContext);\n const productDataByCatalogId = this._getProdutComparisonDataByCatalogId(productData);\n this.setState({ productsData: productDataByCatalogId });\n this._getGreyPlaceHoldersCount(productDataByCatalogId);\n }\n\n private _getGreyPlaceHoldersCount(productData: IProductComparisonProductData[]): number | undefined {\n if (productData && ArrayExtensions.hasElements(productData)) {\n const limit = this._getProductsLimit();\n if (limit && this.props.context.app.config.displayGreyPlaceHolders) {\n const placeHolder = limit - productData.length;\n this.setState({ greyPlaceHoldersCount: placeHolder });\n return placeHolder;\n }\n }\n return;\n }\n\n private _getProductsMainInfo(products: IProductComparisonProductData[]): IProductComparisonPreviewProductMainInfo[] {\n const productImageContainerClassName = `${ProductComparisonPreview.tableRowClassName}__product-image-container`;\n const productImageClassName = `${productImageContainerClassName}__product-image`;\n const productNameClassName = `${ProductComparisonPreview.tableRowClassName}__product-name`;\n\n return products.map(productData => {\n const product = productData.product;\n\n let productNameLink: string | undefined;\n if (msdyn365Commerce.isBrowser) {\n const productUrl = getProductUrlSync(product, this.props.context.actionContext);\n const fullUrl = new URL(productUrl, window.location.href);\n if (isChannelTypeB2B(this.props.context.actionContext.requestContext)) {\n fullUrl.searchParams.set('catalogid', `${productData.catalogId}`);\n }\n product.Dimensions?.map(dimension => {\n const dimensionValue = dimension.DimensionValue?.Value;\n if (!StringExtensions.isNullOrWhitespace(dimensionValue)) {\n const dimensionName = convertProductDimensionTypeToDimensionTypes(dimension.DimensionTypeValue);\n fullUrl.searchParams.set(dimensionName, dimensionValue!);\n }\n });\n productNameLink = fullUrl.href;\n }\n\n return {\n productNameLink,\n productData,\n removeFromComparisonButton: (\n <RemoveFromComparisonButtonComponent\n className={`${ProductComparisonPreview.tableRowClassName}__remove`}\n resources={this.props.resources}\n itemId={productData.itemId}\n onClickHandler={this._removeProductFromList}\n context={this.props.context}\n id={this.props.id}\n typeName={this.props.typeName}\n data={{}}\n />\n ),\n productImage: (\n <a className={productImageContainerClassName} href={productNameLink}>\n {this._renderProductImage(productImageClassName, productData.product)}\n </a>\n ),\n productLink: (\n <a className={productNameClassName} href={productNameLink}>\n {productData.product.Name}\n </a>\n )\n };\n });\n }\n\n /**\n * Represents product comparison preview view.\n * @returns Elements.\n */\n private _renderGreyPlaceHolders = (productData: IProductComparisonProductData[]): React.ReactNode[] | undefined => {\n const counts = this.state.greyPlaceHoldersCount;\n if (this.props.context.app.config.displayGreyPlaceHolders && counts! > 0) {\n const elements = [];\n for (let index = 0; index < counts!; index++) {\n elements.push(\n <td className='' key={index}>\n <div className='placeholder-preview' />\n </td>\n );\n }\n return elements;\n }\n return;\n };\n\n /**\n * Removes the product from a list.\n * @param itemId - The id of a product to remove.\n */\n private readonly _removeProductFromList = (itemId: string): void => {\n ProductComparisonState.instance(this.props.context.request, this.props.data.accountInformation?.result).removeItemById(itemId);\n this.setState(previousState => {\n return {\n productsData: previousState.productsData?.filter(item => item.itemId !== itemId)\n };\n });\n };\n\n /**\n * Toggle collapsing.\n */\n private readonly _handleCollapseClick: () => void = () => {\n this.setState(previousState => {\n return {\n isExpanded: !(previousState.isExpanded ?? this._hasUserInteractedWithComparison)\n };\n });\n };\n\n /**\n * Removes all products from the comparison.\n */\n private readonly _clearAllProductsFromTheComparison = () => {\n ProductComparisonState.instance(this.props.context.request, this.props.data.accountInformation?.result).clearAll();\n this.setState({ productsData: [] });\n };\n\n private _getProductsLimit(): number | undefined {\n const viewport = isMobile({ variant: VariantType.Browser, context: this.props.context.request });\n if (viewport === 'xs' || viewport === 'sm') {\n return this.props.context.app.config.productComparisonMobileProductsLimit;\n }\n return this.props.context.app.config.productComparisonDesktopProductsLimit;\n }\n\n /**\n * Retrieves product image react node.\n * @param className - Class name to use.\n * @param product - Product info.\n * @returns React node.\n */\n private _renderProductImage(className: string, product?: SimpleProduct): React.ReactNode | undefined {\n if (ObjectExtensions.isNullOrUndefined(product)) {\n return undefined;\n }\n\n const defaultImageSettingQ = 'w=140&h=140&m=6';\n const defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: defaultImageSettingQ, w: 0, h: 0 },\n lg: { q: defaultImageSettingQ, w: 0, h: 0 },\n xl: { q: defaultImageSettingQ, w: 0, h: 0 }\n },\n lazyload: true\n };\n\n return (\n <Image\n key={product.Name}\n src={product.PrimaryImageUrl ?? ''}\n fallBackSrc={\n getFallbackImageUrl(\n product.ItemId,\n this.props.context.actionContext.requestContext.apiSettings,\n this.props.context.request.app?.config?.OmniChannelMedia\n ) ?? ''\n }\n gridSettings={this.props.context.request.gridSettings!}\n imageSettings={defaultImageSettings}\n loadFailureBehavior='empty'\n className={className}\n requestContext={this.props.context.actionContext.requestContext}\n />\n );\n }\n\n private _renderCollapseButton(): INodeProps {\n const shouldBeExpanded = this.state.isExpanded ?? this._hasUserInteractedWithComparison;\n const headerContainerClassName = `${ProductComparisonPreview.mainContainerClassName}__header_button`;\n let collapseClassName = `${ProductComparisonPreview.collapseButtonClassName}__expanded`;\n if (!shouldBeExpanded) {\n collapseClassName = `${ProductComparisonPreview.collapseButtonClassName}__collapsed`;\n }\n\n return {\n className: classnames(headerContainerClassName, ProductComparisonPreview.collapseButtonClassName, collapseClassName),\n onClick: this._handleCollapseClick,\n role: 'button',\n tabIndex: 0\n };\n }\n\n private _renderGoToComparisonButton(productComparisonLink: string | undefined): React.ReactNode {\n return (\n <Button\n className={`${ProductComparisonPreview.footerClassName}__go-to-comparison`}\n href={productComparisonLink}\n title={this.props.resources.productComparisonCompareProductsButtonText}\n >\n {this.props.resources.productComparisonCompareProductsButtonText}\n </Button>\n );\n }\n\n private _renderClearAllButton(): React.ReactNode {\n return (\n <Button\n className={`${ProductComparisonPreview.footerClassName}__clear-all`}\n title={this.props.resources.productComparisonClearAllProductsButtonText}\n onClick={this._clearAllProductsFromTheComparison}\n >\n {this.props.resources.productComparisonClearAllProductsButtonText}\n </Button>\n );\n }\n}\n\nexport default ProductComparisonPreview;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport msdyn365Commerce from '@msdyn365-commerce/core';\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { IProductComparisonPreviewViewProps, ProductComparisonPreview } from './product-comparison-preview';\n\n/**\n * Represents product comparison preview view.\n * @param props - View props for product comparison preview.\n * @returns Functional component of product comparison preview.\n */\nexport const ProductComparisonPreviewViewFunctionalComponent: React.FC<IProductComparisonPreviewViewProps> = props => {\n if (!props.isMainContentReady) {\n return null;\n }\n\n const shouldBeExpanded = props.isExpanded ?? props.hasUserInteractedWithComparison;\n\n const containerClassName = classnames(\n ProductComparisonPreview.mainContainerClassName,\n shouldBeExpanded ? '' : `${ProductComparisonPreview.mainContainerClassName}__collapsed`\n );\n\n return (\n <Module {...props.moduleProps}>\n <Node className={ProductComparisonPreview.containerClassName}>\n <Node className={containerClassName}>\n <Node className={`${ProductComparisonPreview.mainContainerClassName}__header__section`}>\n <Node {...props.collapseButton}>\n <Node className={ProductComparisonPreview.headerClassName}>\n <Node className={ProductComparisonPreview.headerLabelClassName}>\n <Node className={`${ProductComparisonPreview.headerLabelClassName}__icon`} />\n <Node className={`${ProductComparisonPreview.headerLabelClassName}__main-text`}>\n {props.resources.productComparisonPreviewHeaderText}\n </Node>\n <Node className={`${ProductComparisonPreview.headerLabelClassName}__sub-text`}>\n {props.subheaderText}\n </Node>\n </Node>\n </Node>\n </Node>\n <Node className={ProductComparisonPreview.tableClassName} tag='table'>\n <Node className='' tag='tbody'>\n <Node className={ProductComparisonPreview.tableRowClassName} tag='tr'>\n {props.productsMainInfo?.map(info => {\n return (\n <Node className='' tag='td' key={info.productData.itemId}>\n {info.removeFromComparisonButton}\n {info.productImage}\n </Node>\n );\n })}\n {props.previewGreyPlaceHolders}\n </Node>\n <Node className={ProductComparisonPreview.tableRowClassName} tag='tr'>\n {props.productsMainInfo?.map(info => {\n return (\n <Node className='' tag='td' key={info.productData.itemId}>\n {msdyn365Commerce.isBrowser ? info.productLink : undefined}\n </Node>\n );\n })}\n </Node>\n </Node>\n </Node>\n </Node>\n <Node className={ProductComparisonPreview.footerClassName}>\n {props.clearAllButton}\n {props.goToComparisonButton}\n </Node>\n </Node>\n </Node>\n </Module>\n );\n};\n\nexport default ProductComparisonPreviewViewFunctionalComponent;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { getRichTextHtml, ICoreContext, ITelemetry } from '@msdyn365-commerce/core';\nimport { AttributeValue } from '@msdyn365-commerce/retail-proxy';\nimport { ObjectExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport React from 'react';\n\n/**\n * Represents resources for the component.\n */\nexport interface IProductSpecificationResources {\n productComparisonProductItemSpecificationTrue: string;\n productComparisonProductItemSpecificationFalse: string;\n}\n\n/**\n * Represent configuration of the component.\n */\nexport interface IProductSpecificationProps {\n telemetry: ITelemetry;\n specification?: AttributeValue;\n context: ICoreContext;\n\n resources: IProductSpecificationResources;\n}\n\n/**\n * Represents the product specification values that comes from the server.\n */\nexport enum SpecificationDataTypeValues {\n none = 0,\n currency = 1,\n dateTime = 2,\n decimal = 3,\n integer = 4,\n text = 5,\n boolean = 6,\n video = 40,\n image = 41\n}\n\n/**\n * Represents the component which renders product comparison table.\n */\nexport class ProductSpecification extends React.PureComponent<IProductSpecificationProps> {\n private static _renderCurrencyCell(product: AttributeValue): React.ReactNode | null {\n if (ObjectExtensions.isNullOrUndefined(product.CurrencyValue)) {\n return null;\n }\n\n return (\n <span>\n {product.CurrencyCode}\n {product.CurrencyValue}\n </span>\n );\n }\n\n private static _renderDateTimeCell(product: AttributeValue): React.ReactNode | null {\n if (ObjectExtensions.isFunction(product.DateTimeOffsetValue?.toUTCString)) {\n return null;\n }\n\n return <span>{product.DateTimeOffsetValue!.toUTCString()}</span>;\n }\n\n private static _renderIntegerCell(product: AttributeValue): React.ReactNode | null {\n if (ObjectExtensions.isNullOrUndefined(product.IntegerValue)) {\n return null;\n }\n\n return <span>{product.IntegerValue}</span>;\n }\n\n private static _renderDecimalCell(product: AttributeValue): React.ReactNode | null {\n if (ObjectExtensions.isNullOrUndefined(product.FloatValue)) {\n return null;\n }\n\n return <span>{product.FloatValue}</span>;\n }\n\n private static _renderTextCell(product: AttributeValue): React.ReactNode | null {\n if (ObjectExtensions.isNullOrUndefined(product.TextValue)) {\n return null;\n }\n\n // eslint-disable-next-line react/no-danger -- Implementation is a copy.\n return <span dangerouslySetInnerHTML={getRichTextHtml(product.TextValue)} />;\n }\n\n public constructor(props: IProductSpecificationProps) {\n super(props);\n }\n\n public render(): React.ReactNode | null {\n const specification = this.props.specification;\n if (ObjectExtensions.isNullOrUndefined(specification)) {\n return null;\n }\n\n switch (specification.DataTypeValue) {\n case SpecificationDataTypeValues.none:\n // Return span here instead of null so the row still shows\n return <span />;\n case SpecificationDataTypeValues.currency:\n return ProductSpecification._renderCurrencyCell(specification);\n case SpecificationDataTypeValues.dateTime:\n return ProductSpecification._renderDateTimeCell(specification);\n case SpecificationDataTypeValues.decimal:\n return ProductSpecification._renderDecimalCell(specification);\n case SpecificationDataTypeValues.integer:\n return ProductSpecification._renderIntegerCell(specification);\n case SpecificationDataTypeValues.text:\n return ProductSpecification._renderTextCell(specification);\n case SpecificationDataTypeValues.boolean:\n return this._renderTrueFalseCell(specification);\n case SpecificationDataTypeValues.video:\n this.props.telemetry.warning('Got video specification type, not supported yet so skipping line');\n return null;\n case SpecificationDataTypeValues.image:\n this.props.telemetry.warning('Got image specification type, not supported yet so skipping line');\n return null;\n default:\n this.props.telemetry.warning(`Got unknown specification type ${specification.DataTypeValue ?? 'null'} so skipping line`);\n return null;\n }\n }\n\n private _renderTrueFalseCell(product: AttributeValue): React.ReactNode | null {\n if (product.BooleanValue) {\n return <span>{this.props.resources.productComparisonProductItemSpecificationTrue}</span>;\n }\n return <span>{this.props.resources.productComparisonProductItemSpecificationFalse}</span>;\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IComponentProps } from '@msdyn365-commerce/core';\nimport { Button } from '@msdyn365-commerce-modules/utilities';\nimport React, { useCallback } from 'react';\n\n/**\n * Resources for the remove from comparison button component.\n */\nexport interface IRemoveFromComparisonButtonResources {\n productComparisonRemoveProductFromListAriaLabel: string;\n}\n\n/**\n * The configuration of the remove from comparison button component.\n */\nexport interface IRemoveFromComparisonButtonComponentProps extends IComponentProps {\n className: string;\n itemId: string;\n\n resources: IRemoveFromComparisonButtonResources;\n\n onClickHandler(itemId: string): void;\n}\n\n/**\n * Represents a button which handles adding to product comparison.\n * @param props - Configuration of the component.\n * @returns React functional component.\n */\nconst RemoveFromComparisonButtonFunctionalComponent: React.FC<IRemoveFromComparisonButtonComponentProps> = (\n props: IRemoveFromComparisonButtonComponentProps\n) => {\n const onClick = useCallback(() => {\n props.onClickHandler(props.itemId);\n }, [props]);\n\n const { className } = props;\n\n return <Button className={className} title={props.resources.productComparisonRemoveProductFromListAriaLabel} onClick={onClick} />;\n};\n\n/**\n * Represents a button which handles removing the product from the comparison.\n * @param props - Configuration of the component.\n * @returns React functional component.\n */\nexport const RemoveFromComparisonButtonComponent: React.FunctionComponent<IRemoveFromComparisonButtonComponentProps> = (\n props: IRemoveFromComparisonButtonComponentProps\n) => React.createElement(RemoveFromComparisonButtonFunctionalComponent, props);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { RatingsSummary } from '@msdyn365-commerce/commerce-entities';\nimport { ISwatchItem, PriceComponent, RatingComponent, SwatchComponent } from '@msdyn365-commerce/components';\nimport MsDyn365, { getCatalogId, IImageSettings, Image, msdyn365Commerce, getUrlSync, isChannelTypeB2B } from '@msdyn365-commerce/core';\nimport { AttributeValue, ProductDimension, ProductDimensionType, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport {\n ArrayExtensions,\n getFallbackImageUrl,\n getProductUrlSync,\n ObjectExtensions,\n Random,\n StringExtensions,\n convertProductDimensionTypeToDimensionTypes,\n DimensionTypes,\n validateCatalogId\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, format, Heading, IModuleProps, INodeProps, isMobile, VariantType } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport React from 'react';\nimport { debounce } from 'lodash';\n\nimport { ProductComparisonState } from '../product-comparison-state';\nimport {\n getProductsInProductComparisonAction,\n GetProductsInProductComparisonInput,\n IDimensionResult,\n IProductComparisonItemData\n} from './actions';\nimport { ProductSpecification, RemoveFromComparisonButtonComponent } from './base';\nimport { IProductComparisonData } from './product-comparison.data';\nimport { IProductComparisonProps } from './product-comparison.props.autogenerated';\n\n/**\n * Represents product comparison view props for main product info.\n */\nexport interface IProductComparisonProductMainInfo {\n cellContainerProps: INodeProps;\n tableCellProps: INodeProps;\n tableHeaderProps: INodeProps;\n\n product: IProductComparisonItemData;\n productUrl?: string;\n\n isFromCurrentCatalog: boolean;\n\n removeFromComparisonButton: React.ReactNode;\n productImage: React.ReactNode;\n productLink: React.ReactNode;\n productPrice: React.ReactNode;\n quickView: React.ReactNode;\n goToProductDetailsButton: React.ReactNode;\n productRating: React.ReactNode;\n productDescription: React.ReactNode;\n}\n\n/**\n * Specifies the type of selection.\n */\nexport enum SelectionType {\n text = 'text',\n swatch = 'swatch'\n}\n\n/**\n * Represents product comparison view props.\n */\nexport interface IProductComparisonViewProps extends IProductComparisonProps<{}> {\n moduleProps: IModuleProps;\n\n isMainContentReady: boolean;\n isEmptyContent: boolean;\n productCountText?: string;\n\n actionBarContainerProps: INodeProps;\n\n heading: React.ReactNode;\n loading: React.ReactNode;\n emptyComparison: React.ReactNode;\n clearAllButton: React.ReactNode;\n previousClicker: React.ReactNode;\n nextClicker: React.ReactNode;\n backToShopping: React.ReactNode;\n\n productsMainInfo?: IProductComparisonProductMainInfo[];\n\n tableReference?: React.RefObject<HTMLDivElement>;\n\n tableHeaderReference?: React.RefObject<HTMLDivElement>;\n\n tableBodyReference?: React.RefObject<HTMLDivElement>;\n\n tableCellReference?: React.RefObject<HTMLDivElement>;\n\n shouldShowPreviousClicker?: boolean;\n shouldShowNextClicker?: boolean;\n currentClickerPosition?: number;\n\n hoveringCellItemId?: string;\n hoverStateLastUpdate?: number;\n\n uniqueSpecifications?: AttributeValue[];\n uniqueDimensionIds?: number[];\n\n dimensionsProps?: (\n | {\n dimensionId: number;\n dimensionName: string | undefined;\n dimensionClassName: string;\n productDimensionValues: {\n dimensionProps: { RecordId: number; Value: string; DimensionId: number; ImageUrl: string | undefined };\n productMainInfo: IProductComparisonProductMainInfo;\n node: JSX.Element;\n }[];\n }\n | undefined\n )[];\n\n specificationsProps?: {\n specification: AttributeValue;\n specificationClassName: string;\n specificationValues: {\n productSpecification: AttributeValue | undefined;\n productMainInfo: IProductComparisonProductMainInfo;\n node: React.ReactNode;\n }[];\n }[];\n\n clearAllProductsFromComparison(): void;\n removeProductFromList?(itemId: string): void;\n handleScroll?(event: React.UIEvent<HTMLDivElement>): void;\n handleHoverIn?(itemId: string): () => void;\n handleHoverOut?(itemId: string): () => void;\n handlePreviousClick?(): void;\n handleNextClick?(): void;\n}\n\n/**\n * Represents the state of the product comparison component.\n */\nexport interface IProductComparisonState {\n productsData?: IProductComparisonItemData[];\n hoverStateLastUpdate?: number;\n hoveringCellItemId?: string;\n currentClickerPosition?: number;\n}\n\n/**\n * Represents the direction of product clicker.\n */\nexport enum ProductClickerDirections {\n left = 0,\n right = 1\n}\n\n/**\n * Represents the component which renders product comparison table.\n */\nexport class ProductComparison extends React.Component<IProductComparisonProps<IProductComparisonData>, IProductComparisonState> {\n public static readonly className: string = 'msc-product-comparison';\n\n public static readonly mainContainerClassName = `${ProductComparison.className}__main-container`;\n\n public static readonly containerClassName = `${ProductComparison.mainContainerClassName}__container`;\n\n public static readonly tableClassName = `${ProductComparison.containerClassName}__table`;\n\n public static readonly tableHeaderClassName = `${ProductComparison.tableClassName}__header`;\n\n public static readonly productRowClassName = `${ProductComparison.tableHeaderClassName}__product-row`;\n\n public static readonly tableClickerClassName = `${ProductComparison.tableClassName}__clicker`;\n\n public static readonly tableBodyClassName = `${ProductComparison.tableClassName}__body`;\n\n public static readonly tableRowClassName = `${ProductComparison.tableClassName}__row`;\n\n public static readonly dimensionsRowClassName = `${ProductComparison.tableBodyClassName}__dimensions-row`;\n\n public static readonly specificationsRowClassName = `${ProductComparison.tableBodyClassName}__specifications-row`;\n\n public static readonly tableRowContentClassName = `${ProductComparison.tableClassName}__row-content`;\n\n public static readonly tableHeaderCellClassName = `${ProductComparison.tableRowClassName}__header-cell`;\n\n public static readonly tableCellClassName = `${ProductComparison.tableRowClassName}__cell`;\n\n public static readonly actionBarClassName = `${ProductComparison.className}__action-bar`;\n\n public static readonly tableHeaderLockedClassName = `${ProductComparison.tableHeaderClassName}__locked`;\n\n public static readonly tableRowContentInformationClassName = `${ProductComparison.tableRowContentClassName}__information`;\n\n private readonly _tableReference?: React.RefObject<HTMLDivElement>;\n\n private readonly _tableHeaderReference?: React.RefObject<HTMLDivElement>;\n\n private readonly _tableBodyReference?: React.RefObject<HTMLDivElement>;\n\n private readonly _tableCellReference?: React.RefObject<HTMLDivElement>;\n\n private _shouldShowPreviousClicker?: boolean;\n\n private _shouldShowNextClicker?: boolean;\n\n private _hoveringCellItemId?: string;\n\n private readonly _instanceId: string;\n\n private static _getProductsSpecifications(products: IProductComparisonItemData[]): AttributeValue[] {\n const specifications = products.map(product => product.specifications?.specificationsList);\n const allSpecifications: AttributeValue[] = ArrayExtensions.flatten(specifications);\n\n const emptyAttributeValue = 0;\n const specificationNames = ArrayExtensions.validValues(\n allSpecifications\n .filter(specification => specification.AttributeValueId !== emptyAttributeValue)\n .map(specification => specification.Name)\n );\n const uniqueSpecificationNames = ArrayExtensions.unique(specificationNames);\n const uniqueSpecifications = ArrayExtensions.validValues(\n uniqueSpecificationNames.map(name => allSpecifications.find(specification => specification.Name === name))\n );\n\n return uniqueSpecifications;\n }\n\n private static _getProductsDimensions(products: IProductComparisonItemData[]): number[] {\n const dimensions = products.map(product => product.productInfo.Dimensions);\n const allDimensions: ProductDimension[] = ArrayExtensions.flatten(dimensions).filter(\n dimension => !ObjectExtensions.isNullOrUndefined(dimension.DimensionValue)\n );\n\n const dimensionIds = ArrayExtensions.validValues(allDimensions.map(dimension => dimension.DimensionTypeValue));\n const uniqueDimensionIds = ArrayExtensions.unique(dimensionIds);\n\n return uniqueDimensionIds;\n }\n\n private static _renderProductDescription(product?: SimpleProduct): React.ReactNode {\n if (StringExtensions.isNullOrWhitespace(product?.Description)) {\n return null;\n }\n return <p className={`${ProductComparison.className}__description`}>{product!.Description}</p>;\n }\n\n private static _getActionBarContainerProps(): INodeProps {\n return {\n className: ProductComparison.actionBarClassName\n };\n }\n\n public constructor(props: IProductComparisonProps<IProductComparisonData>) {\n super(props);\n\n this._instanceId = `${ProductComparison.className}-${this.props.id}-${Random.Guid.generateGuid()}`;\n\n this.state = {\n productsData: undefined,\n hoverStateLastUpdate: Date.now(),\n hoveringCellItemId: undefined,\n currentClickerPosition: 0\n };\n\n this._tableReference = React.createRef<HTMLDivElement>();\n this._tableHeaderReference = React.createRef<HTMLDivElement>();\n this._tableBodyReference = React.createRef<HTMLDivElement>();\n this._tableCellReference = React.createRef<HTMLDivElement>();\n }\n\n public componentDidMount(): void {\n this._loadProducts();\n ProductComparisonState.instance(this.props.context.request, this.props.data.accountInformation?.result).listModifiedEvent.subscribe(\n {\n instanceId: this._instanceId,\n\n /**\n * Updates the state in case the state for the particular product was changed.\n */\n handler: () => {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Initialize data downloading.\n this._loadProducts();\n }\n }\n );\n if (MsDyn365.isBrowser) {\n window.addEventListener('scroll', () => {\n this._configureBoxShadowOnScroll();\n });\n }\n this._configureBoxShadowOnScroll();\n }\n\n public componentWillUnmount(): void {\n ProductComparisonState.instance(\n this.props.context.request,\n this.props.data.accountInformation?.result\n ).listModifiedEvent.unsubscribe(this._instanceId);\n }\n\n public shouldComponentUpdate(\n nextProps: Readonly<IProductComparisonProps<IProductComparisonData>>,\n nextState: Readonly<IProductComparisonState>\n ): boolean {\n if (this.state.productsData !== nextState.productsData || this.props !== nextProps) {\n return true;\n }\n\n return (\n this.state.hoveringCellItemId !== nextState.hoveringCellItemId ||\n this.state.currentClickerPosition !== nextState.currentClickerPosition\n );\n }\n\n public render(): React.ReactNode | null {\n const viewProps: IProductComparisonViewProps = {\n ...this.props,\n moduleProps: {\n moduleProps: this.props,\n className: ProductComparison.className\n },\n clearAllProductsFromComparison: this._clearAllProductsFromComparison,\n isMainContentReady: false,\n isEmptyContent: false,\n heading: this._renderHeading(),\n loading: this._renderLoading(),\n clearAllButton: this._renderClearAllButton(),\n actionBarContainerProps: ProductComparison._getActionBarContainerProps(),\n previousClicker: this._renderPreviousClicker(),\n nextClicker: this._renderNextClicker(),\n backToShopping: this._renderBackToShoppingButton(),\n emptyComparison: (\n <div className={`${ProductComparison.className}__empty-container`}>{this.props.slots.emptyComparisonContentSlots}</div>\n )\n };\n\n const productsData = this.state.productsData ?? this._getProductComparisonDataByCatalogId(this.props.data.productsData?.result);\n if (productsData === undefined) {\n return this.props.renderView(viewProps) as React.ReactNode;\n }\n\n const isConsentGiven = this.props.context.request.cookies.isConsentGiven();\n if (!isConsentGiven || !ArrayExtensions.hasElements(productsData)) {\n viewProps.isEmptyContent = true;\n return this.props.renderView(viewProps) as React.ReactNode;\n }\n\n if (ArrayExtensions.hasElements(productsData)) {\n viewProps.productCountText = this.props.resources.productComparisonCountText.replace('{0}', productsData.length.toString());\n }\n\n this._checkClickersState();\n const productsMainInfoData = this._getProductsMainInfo(productsData);\n const allUniqueDimensionIds = this.getProductsDimensionsIds(productsData);\n const updatedDimensionProps: (\n | {\n dimensionId: number;\n dimensionName: string | undefined;\n dimensionClassName: string;\n productDimensionValues: {\n dimensionProps: { RecordId: number; Value: string; DimensionId: number; ImageUrl: string | undefined };\n productMainInfo: IProductComparisonProductMainInfo;\n node: JSX.Element;\n }[];\n }\n | undefined\n )[] = [];\n allUniqueDimensionIds?.map(dimension => {\n const dimensionValue = this.getUpdatedDimensionsProps(dimension, productsMainInfoData);\n updatedDimensionProps.push(dimensionValue);\n return updatedDimensionProps;\n });\n viewProps.isMainContentReady = true;\n viewProps.tableReference = this._tableReference;\n viewProps.tableHeaderReference = this._tableHeaderReference;\n viewProps.tableBodyReference = this._tableBodyReference;\n viewProps.tableCellReference = this._tableCellReference;\n viewProps.hoverStateLastUpdate = this.state.hoverStateLastUpdate;\n viewProps.hoveringCellItemId = this.state.hoveringCellItemId;\n viewProps.shouldShowPreviousClicker = this._shouldShowPreviousClicker;\n viewProps.shouldShowNextClicker = this._shouldShowNextClicker;\n viewProps.currentClickerPosition = this.state.currentClickerPosition;\n viewProps.handlePreviousClick = this._handlePreviousClick;\n viewProps.handleNextClick = this._handleNextClick;\n viewProps.handleScroll = this._handleScroll;\n viewProps.handleHoverIn = this._handleHoverIn;\n viewProps.handleHoverOut = this._handleHoverOut;\n viewProps.removeProductFromList = this._removeProductFromList;\n viewProps.productsMainInfo = productsMainInfoData;\n viewProps.uniqueDimensionIds = ProductComparison._getProductsDimensions(productsData);\n viewProps.dimensionsProps = updatedDimensionProps;\n viewProps.uniqueSpecifications = ProductComparison._getProductsSpecifications(productsData);\n viewProps.specificationsProps = this._getSpecificationProps(viewProps.uniqueSpecifications, viewProps.productsMainInfo);\n\n return this.props.renderView(viewProps) as React.ReactNode;\n }\n\n /**\n * Removes all product from the comparison list.\n */\n private readonly _clearAllProductsFromComparison = (): void => {\n ProductComparisonState.instance(this.props.context.request, this.props.data.accountInformation?.result).clearAll();\n this.setState({ productsData: [] });\n };\n\n /**\n * Configures box shadow on scroll.\n */\n private readonly _configureBoxShadowOnScroll = (): void => {\n const defaultValue = 0;\n if (this._tableReference?.current) {\n const comparisonProductCardHeader: HTMLCollectionOf<Element> = this._tableReference.current.getElementsByClassName(\n ProductComparison.tableHeaderClassName\n );\n if (ArrayExtensions.hasElements(Array.from(comparisonProductCardHeader))) {\n if (MsDyn365.isBrowser && document.documentElement.scrollTop > defaultValue) {\n comparisonProductCardHeader[0].classList.add(ProductComparison.tableHeaderLockedClassName);\n } else {\n comparisonProductCardHeader[0].classList.remove(ProductComparison.tableHeaderLockedClassName);\n }\n }\n }\n };\n\n private _getProductComparisonDataByCatalogId(\n productData: IProductComparisonItemData[] | undefined\n ): IProductComparisonItemData[] | undefined {\n const catalogId = getCatalogId(this.props.context.request);\n validateCatalogId(catalogId);\n const productByCatalogId = productData?.filter(product => product.catalogId === catalogId) ?? undefined;\n return productByCatalogId;\n }\n\n private async _loadProducts(): Promise<void> {\n const items = ProductComparisonState.instance(this.props.context.request, this.props.data.accountInformation?.result).items;\n const input = new GetProductsInProductComparisonInput(items);\n let productData: IProductComparisonItemData[] | undefined;\n await getProductsInProductComparisonAction(input, this.props.context.actionContext).then(item => {\n productData = item;\n });\n const productDataByCatalogId = this._getProductComparisonDataByCatalogId(productData);\n this.setState({ productsData: productDataByCatalogId });\n }\n\n /**\n * Handles scroll inside table.\n * Used to update header position accordingly to the scroll in table body.\n * @param event - Scroll event.\n */\n private readonly _handleScroll = (event: React.UIEvent<HTMLDivElement>) => {\n this._tableHeaderReference?.current?.scrollTo({ top: event.currentTarget.scrollTop, left: event.currentTarget.scrollLeft });\n this._checkClickersState();\n };\n\n /**\n * Handles product clicker click.\n * Used to update table scroll position accordingly to the clicker.\n * @param direction - Direction of scrolling.\n */\n private readonly _handleScrollClick = (direction: ProductClickerDirections) => {\n const tableBody = this._tableBodyReference?.current;\n if (!tableBody) {\n return;\n }\n\n let cellWidth = this._tableCellReference?.current?.clientWidth;\n if (cellWidth === undefined) {\n cellWidth = this._getCellWidth();\n }\n\n let newLeftPosition: number | undefined;\n const scrollPosition = Math.ceil(tableBody.scrollLeft);\n if (direction === ProductClickerDirections.left) {\n newLeftPosition = scrollPosition - cellWidth;\n const minLeftPosition = 0;\n newLeftPosition = Math.max(newLeftPosition, minLeftPosition);\n } else {\n const maxScroll = tableBody.scrollWidth - tableBody.clientWidth;\n newLeftPosition = scrollPosition + cellWidth;\n newLeftPosition = Math.min(newLeftPosition, maxScroll);\n }\n\n if (MsDyn365.isBrowser && document.body.parentElement?.getAttribute('dir') === 'rtl') {\n newLeftPosition = -newLeftPosition;\n }\n\n tableBody.scrollTo({\n top: tableBody.scrollTop,\n left: newLeftPosition\n });\n\n this.setState(previousState => {\n if (previousState.currentClickerPosition === undefined) {\n return {};\n }\n let change = 1;\n if (direction === ProductClickerDirections.left) {\n change = -1;\n }\n return {\n currentClickerPosition: previousState.currentClickerPosition + change,\n hoverStateLastUpdate: Date.now(),\n hoveringCellItemId: undefined\n };\n });\n\n this._checkClickersState();\n };\n\n /**\n * Handles previous product click.\n * Used to update table scroll position accordingly to the clicker.\n */\n private readonly _handlePreviousClick = () => {\n if (MsDyn365.isBrowser && document.body.parentElement?.getAttribute('dir') === 'rtl') {\n this._handleScrollClick(ProductClickerDirections.right);\n } else {\n this._handleScrollClick(ProductClickerDirections.left);\n }\n };\n\n /**\n * Handles next product click.\n * Used to update table scroll position accordingly to the clicker.\n */\n private readonly _handleNextClick = () => {\n if (MsDyn365.isBrowser && document.body.parentElement?.getAttribute('dir') === 'rtl') {\n this._handleScrollClick(ProductClickerDirections.left);\n } else {\n this._handleScrollClick(ProductClickerDirections.right);\n }\n };\n\n /**\n * Get set width.\n */\n private readonly _getCellWidth = (): number => {\n const tableBody = this._tableBodyReference?.current;\n const viewport = isMobile({ variant: VariantType.Browser, context: this.props.context.request });\n let cellWidth: number = 400;\n\n if (viewport === 'xs' && tableBody) {\n cellWidth = tableBody && tableBody.clientWidth / 2;\n } else if ((viewport === 'sm' || viewport === 'md') && tableBody) {\n cellWidth = tableBody && tableBody.clientWidth / 3;\n } else {\n if (tableBody) {\n cellWidth = tableBody && tableBody.clientWidth / 4;\n }\n }\n\n cellWidth = Math.floor(cellWidth);\n\n return cellWidth;\n };\n\n /**\n * Updates clickers state.\n */\n private readonly _checkClickersState = () => {\n const tableBody = this._tableBodyReference?.current;\n if (!tableBody) {\n return;\n }\n\n const previousScrollMinLimit = 0;\n const maxScroll = tableBody.scrollWidth - tableBody.clientWidth;\n const scrollPosition = Math.ceil(tableBody.scrollLeft);\n\n if (MsDyn365.isBrowser && document.body.parentElement?.getAttribute('dir') === 'rtl') {\n if (scrollPosition <= previousScrollMinLimit) {\n if (this._shouldShowNextClicker) {\n this._shouldShowNextClicker = false;\n this.forceUpdate();\n }\n } else if (!this._shouldShowNextClicker) {\n this._shouldShowNextClicker = true;\n this.forceUpdate();\n }\n\n if (scrollPosition >= maxScroll) {\n if (this._shouldShowPreviousClicker) {\n this._shouldShowPreviousClicker = false;\n this.forceUpdate();\n }\n } else if (!this._shouldShowPreviousClicker) {\n this._shouldShowPreviousClicker = true;\n this.forceUpdate();\n }\n } else {\n if (scrollPosition <= previousScrollMinLimit) {\n if (this._shouldShowPreviousClicker) {\n this._shouldShowPreviousClicker = false;\n this.forceUpdate();\n }\n } else if (!this._shouldShowPreviousClicker) {\n this._shouldShowPreviousClicker = true;\n this.forceUpdate();\n }\n\n if (scrollPosition >= maxScroll) {\n if (this._shouldShowNextClicker) {\n this._shouldShowNextClicker = false;\n this.forceUpdate();\n }\n } else if (!this._shouldShowNextClicker) {\n this._shouldShowNextClicker = true;\n this.forceUpdate();\n }\n }\n };\n\n /**\n * Removes the product from a list.\n * @param itemId - The id of a product to remove.\n */\n private readonly _removeProductFromList = (itemId: string): void => {\n ProductComparisonState.instance(this.props.context.request, this.props.data.accountInformation?.result).removeItemById(itemId);\n this.setState(previousState => {\n let newClickerPosition = previousState.currentClickerPosition;\n if (newClickerPosition && !this._shouldShowNextClicker && this._shouldShowPreviousClicker) {\n newClickerPosition -= 1;\n }\n return {\n productsData: previousState.productsData?.filter(item => item.itemId !== itemId),\n hoverStateLastUpdate: Date.now(),\n hoveringCellItemId: undefined,\n currentClickerPosition: newClickerPosition\n };\n });\n };\n\n /**\n * Prepares quick view component for the given product.\n * @param product - Product information.\n * @returns The quick view component or null if no quick view info is provided.\n */\n private _renderQuickView(product: IProductComparisonItemData): React.ReactNode | null {\n const quickViewSlot = ArrayExtensions.hasElements(this.props.slots.quickViews) ? this.props.slots.quickViews[0] : null;\n if (ObjectExtensions.isNullOrUndefined(quickViewSlot)) {\n return null;\n }\n\n const selectedDimensions = product.productInfo.Dimensions?.filter(dimension => dimension.DimensionValue?.Value);\n\n return React.cloneElement(quickViewSlot as React.ReactElement, {\n selectedProductId: product.productInfo.RecordId,\n selectedDimensions\n });\n }\n\n /**\n * Handles entering into hover mode.\n * @param itemId - Item id of the cell which is hovered.\n * @returns Event handler.\n */\n private readonly _handleHoverIn = (itemId: string) => () => {\n this._hoveringCellItemId = itemId;\n\n this.setState({\n hoverStateLastUpdate: Date.now(),\n hoveringCellItemId: itemId\n });\n };\n\n /**\n * Handles exiting from the hover mode.\n * @param itemId - Item id of the cell which is hovered.\n * @returns Event handler.\n */\n private readonly _handleHoverOut = (itemId: string) => () => {\n if (this._hoveringCellItemId !== itemId) {\n return;\n }\n\n this._hoveringCellItemId = undefined;\n debounce(() => {\n this.setState({\n hoverStateLastUpdate: Date.now(),\n hoveringCellItemId: undefined\n });\n }, 10);\n };\n\n /**\n * Retrieves product image react node.\n * @param className - Class name to use.\n * @param product - Product info.\n * @returns React node.\n */\n private _renderProductImage(className: string, product?: SimpleProduct): React.ReactNode | undefined {\n const {\n context: {\n actionContext: {\n requestContext: { apiSettings }\n },\n request: {\n app: { OmniChannelMedia }\n }\n }\n } = this.props;\n\n if (ObjectExtensions.isNullOrUndefined(product)) {\n return undefined;\n }\n\n const defaultImageSettingsQ = 'w=140&h=140&m=6';\n const defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: defaultImageSettingsQ, w: 0, h: 0 },\n lg: { q: defaultImageSettingsQ, w: 0, h: 0 },\n xl: { q: defaultImageSettingsQ, w: 0, h: 0 }\n },\n lazyload: true\n };\n\n return (\n <Image\n altText={product?.Name}\n key={product.Name}\n src={product.PrimaryImageUrl ?? ''}\n fallBackSrc={getFallbackImageUrl(product.ItemId, apiSettings, OmniChannelMedia) ?? ''}\n gridSettings={this.props.context.request.gridSettings!}\n imageSettings={defaultImageSettings}\n loadFailureBehavior='empty'\n className={className}\n requestContext={this.props.context.actionContext.requestContext}\n />\n );\n }\n\n private _getTableHeaderProps(itemId: string): INodeProps {\n const isHoverModeEnabled = this.state.hoveringCellItemId === itemId;\n let headerClassName = ProductComparison.tableHeaderCellClassName;\n if (isHoverModeEnabled) {\n headerClassName = classnames(headerClassName, 'msc-product-comparison__cell-hover');\n }\n return {\n className: headerClassName,\n key: `${headerClassName}__product-${itemId}-${this.state.hoveringCellItemId}-${this.state.currentClickerPosition}`,\n onMouseEnter: this._handleHoverIn(itemId),\n onMouseLeave: this._handleHoverOut(itemId)\n };\n }\n\n private _getTableCellProps(itemId: string): INodeProps {\n const isHoverModeEnabled = this.state.hoveringCellItemId === itemId;\n let cellClassName = ProductComparison.tableCellClassName;\n if (isHoverModeEnabled) {\n cellClassName = classnames(cellClassName, 'msc-product-comparison__cell-hover');\n }\n return {\n className: cellClassName,\n key: `${cellClassName}__product-${itemId}-${this.state.hoveringCellItemId}`,\n onMouseEnter: this._handleHoverIn(itemId),\n onMouseLeave: this._handleHoverOut(itemId),\n role: 'menuitem',\n tabIndex: 0\n };\n }\n\n private _renderProductRating(rating?: RatingsSummary): React.ReactNode {\n if (ObjectExtensions.isNullOrUndefined(rating?.averageRating)) {\n return null;\n }\n\n const ratingValue = rating!;\n\n const defaultReviewsCount = 0;\n\n return (\n <RatingComponent\n avgRating={ratingValue.averageRating!}\n readOnly\n ariaLabel={format(this.props.resources.productComparisonProductItemRatingAriaLabel, ratingValue.averageRating, '5')}\n ratingCount={`${ratingValue.reviewsCount ?? defaultReviewsCount}`}\n shouldShowFullRatingDescription\n data={{}}\n context={this.props.context}\n id={this.props.id}\n typeName={this.props.typeName}\n />\n );\n }\n\n private _renderBackToShoppingButton() {\n return (\n <Button\n className='msc-product-comparison__back-button'\n {...this.props.telemetry}\n role='button'\n href='#'\n onClick={this._goBack}\n title={this.props.resources.backToShoppingLabel}\n >\n {this.props.resources.backToShoppingLabel}\n </Button>\n );\n }\n\n private readonly _goBack = (): void => {\n const backToShoppingUrl = getUrlSync('home', this.props.context.actionContext) || '';\n if (document.referrer === '') {\n window.location.href = backToShoppingUrl;\n } else {\n window.history.back();\n }\n };\n\n /**\n * Retrieves localized text for dimension.\n * @param dimensionId - Dimension id.\n * @returns Localized text.\n */\n private _getDimensionName(dimensionId: number): string | undefined {\n if (dimensionId === ProductDimensionType.Color) {\n return this.props.resources.productComparisonProductItemColorDimension;\n }\n if (dimensionId === ProductDimensionType.Size) {\n return this.props.resources.productComparisonProductItemSizeDimension;\n }\n\n if (dimensionId === ProductDimensionType.Style) {\n return this.props.resources.productComparisonProductItemStyleDimension;\n }\n return undefined;\n }\n\n private getUpdatedDimensionsProps(dimensionId: number, products: IProductComparisonProductMainInfo[]) {\n const dimensionClassName = `${ProductComparison.dimensionsRowClassName}__dimension-${dimensionId}`;\n const dimensionDescription = this._getDimensionName(dimensionId);\n const dimensionName = convertProductDimensionTypeToDimensionTypes(dimensionId);\n let dimensionSelectionType = SelectionType.text;\n\n const dimensionsAsSwatchConfiguration: DimensionTypes[] | undefined = this.props.context.app.config.dimensionsAsSwatchType;\n if (\n ArrayExtensions.hasElements(dimensionsAsSwatchConfiguration) &&\n !dimensionsAsSwatchConfiguration?.includes(DimensionTypes.none) &&\n dimensionsAsSwatchConfiguration?.includes(dimensionName)\n ) {\n dimensionSelectionType = SelectionType.swatch;\n }\n\n const productDimensionValues = products.map(productMainInfo => {\n let dimension: IDimensionResult[] = [];\n let textValue: string = '';\n let renderSwatch: JSX.Element | undefined;\n this.props.data.productsData?.result?.map(productsDimension => {\n if (productsDimension.productInfo.RecordId === productMainInfo.product.productInfo.RecordId) {\n dimension = productsDimension.dimensions?.dimensions ?? [];\n }\n return dimension;\n });\n\n if (dimensionSelectionType === SelectionType.swatch) {\n renderSwatch = (\n <div className='msc-product__dimensions'>\n {dimension.map(dimensionItems => {\n return (\n <div\n className='msc-product__dimensions-item'\n key={`msc-product__dimensions-item-${productMainInfo.product.itemId}`}\n >\n {dimensionItems.result.map(dimensionItem => {\n let currentDimensionId: number | undefined;\n const swatches =\n dimensionItem.map<ISwatchItem>(swatchItem => {\n let isDefaultDimension: boolean = false;\n const selectedDimensions = productMainInfo.product.productInfo.Dimensions?.filter(\n item => item.DimensionTypeValue === swatchItem.DimensionTypeValue\n );\n selectedDimensions?.map(selectedDimension => {\n if (\n selectedDimension.DimensionValue !== undefined &&\n selectedDimension.DimensionValue.DimensionId ===\n swatchItem.DimensionValue?.DimensionId\n ) {\n isDefaultDimension = true;\n }\n return isDefaultDimension;\n });\n\n if (swatchItem.DimensionTypeValue === dimensionId) {\n currentDimensionId = swatchItem.DimensionTypeValue;\n }\n const dimensionType = dimensionName;\n return {\n itemId: `${swatchItem.DimensionValue?.RecordId ?? ''}-${swatchItem.DimensionValue\n ?.Value ?? ''}`,\n value: swatchItem.DimensionValue?.Value ?? '',\n dimensionType,\n colorHexCode: swatchItem.DimensionValue?.ColorHexCode,\n imageUrl: swatchItem.DimensionValue?.ImageUrl,\n isDefault: isDefaultDimension\n };\n }) ?? [];\n if (currentDimensionId && currentDimensionId === dimensionId) {\n return (\n <SwatchComponent\n key={dimensionId}\n apiSettings={this.props.context.request.apiSettings}\n list={swatches}\n isSelectionEnabled={false}\n />\n );\n }\n return null;\n })}\n </div>\n );\n })}\n </div>\n );\n }\n\n if (dimensionSelectionType === SelectionType.text) {\n dimension.map(item => {\n return item.result.map(items => {\n return items.map(dimensionItem => {\n if (dimensionItem.DimensionTypeValue === dimensionId) {\n const productDimensionSeperatorValue =\n textValue !== ''\n ? this.props.resources.productDimensionSeparator\n : this.props.resources.productDimensionSeparator.replace('/', '');\n textValue = textValue + format(productDimensionSeperatorValue, dimensionItem.DimensionValue?.Value ?? '');\n }\n return textValue;\n });\n });\n });\n }\n\n const dimensionProps = {\n RecordId: productMainInfo.product.productInfo.RecordId,\n Value: textValue,\n DimensionId: dimensionId,\n ImageUrl: productMainInfo.product.productInfo.PrimaryImageUrl\n };\n\n return {\n dimensionProps,\n productMainInfo,\n node: (\n <div key={`${productMainInfo.product.itemId}-${dimensionClassName}`}>\n {dimensionSelectionType === SelectionType.swatch ? renderSwatch : dimensionProps.Value}\n </div>\n )\n };\n });\n return {\n dimensionId,\n dimensionName: dimensionDescription,\n dimensionClassName,\n productDimensionValues\n };\n }\n private _getSpecificationProps(specifications: AttributeValue[], products: IProductComparisonProductMainInfo[]) {\n return specifications.map(specification => {\n const specificationClassName = `${ProductComparison.specificationsRowClassName}__specification-${specification.Name!}`;\n\n const specificationValues = products.map(productMainInfo => {\n const productSpecification = productMainInfo.product.specifications?.specificationsList.find(\n productSpecifications => productSpecifications.Name === specification.Name\n );\n\n return {\n productSpecification,\n productMainInfo,\n node: (\n <div key={`${productMainInfo.product.itemId}-${specificationClassName}`}>\n <ProductSpecification\n specification={productSpecification}\n telemetry={this.props.telemetry}\n context={this.props.context}\n resources={this.props.resources}\n />\n </div>\n )\n };\n });\n\n return {\n specification,\n specificationClassName,\n specificationValues\n };\n });\n }\n\n private _renderHeading(): React.ReactNode {\n return <Heading className={`${ProductComparison.className}__header`} text={this.props.resources.productComparisonTitle} />;\n }\n\n private _renderLoading(): React.ReactNode {\n return <div className={`${ProductComparison.className}__loading`}>{this.props.resources.productComparisonLoadingText}</div>;\n }\n\n private _renderClearAllButton(): React.ReactNode {\n return (\n <Button\n className={`${ProductComparison.actionBarClassName}__clear-all-button`}\n aria-label={this.props.resources.productComparisonClearAllButtonAriaLabel}\n onClick={this._clearAllProductsFromComparison}\n >\n {this.props.resources.productComparisonClearAllButtonText}\n </Button>\n );\n }\n\n /**\n * Retrieves unique dimension ids of product.\n * @param products - Product.\n * @returns Unique dimension ids.\n */\n private getProductsDimensionsIds(products: IProductComparisonItemData[]): number[] {\n const dimensions = products.map(product => product.productInfo.Dimensions);\n const allDimensions: ProductDimension[] = ArrayExtensions.flatten(dimensions);\n\n const dimensionIds = ArrayExtensions.validValues(allDimensions.map(dimension => dimension.DimensionTypeValue));\n const uniqueDimensionIds = ArrayExtensions.unique(dimensionIds);\n\n return uniqueDimensionIds;\n }\n\n private _renderPreviousClicker(): React.ReactNode {\n return (\n <Button\n className={classnames(ProductComparison.tableClickerClassName, `${ProductComparison.tableClickerClassName}__previous`)}\n role='button'\n onClick={this._handlePreviousClick}\n onKeyUp={this._handlePreviousClick}\n >\n <span className={`${ProductComparison.tableClickerClassName}__previous__icon`} aria-hidden='true' />\n <span className='screen-reader-only'>{this.props.resources.productComparisonPreviousProduct}</span>\n </Button>\n );\n }\n\n private _renderNextClicker(): React.ReactNode {\n return (\n <Button\n className={classnames(ProductComparison.tableClickerClassName, `${ProductComparison.tableClickerClassName}__next`)}\n role='button'\n onClick={this._handleNextClick}\n onKeyUp={this._handleNextClick}\n >\n <span className={`${ProductComparison.tableClickerClassName}__next__icon`} aria-hidden='true' />\n <span className='screen-reader-only'>{this.props.resources.productComparisonNextProduct}</span>\n </Button>\n );\n }\n\n private _renderRemoveFromComparisonButton(itemId: string): React.ReactNode {\n return (\n <RemoveFromComparisonButtonComponent\n className={`${ProductComparison.productRowClassName}__remove`}\n key={itemId}\n resources={this.props.resources}\n itemId={itemId}\n onClickHandler={this._removeProductFromList}\n context={this.props.context}\n id={this.props.id}\n typeName={this.props.typeName}\n data={{}}\n />\n );\n }\n\n private _getProductsMainInfo(products: IProductComparisonItemData[]): IProductComparisonProductMainInfo[] {\n const currentCatalogId = getCatalogId(this.props.context.request);\n validateCatalogId(currentCatalogId);\n return products.map(product => {\n let productUrlLink: string | undefined;\n if (msdyn365Commerce.isBrowser) {\n const productUrl = getProductUrlSync(product.productInfo, this.props.context.actionContext);\n const fullUrl = new URL(productUrl, window.location.href);\n if (isChannelTypeB2B(this.props.context.actionContext.requestContext)) {\n fullUrl.searchParams.set('catalogid', `${product.catalogId}`);\n }\n product.productInfo.Dimensions?.map(dimension => {\n const dimensionValue = dimension.DimensionValue?.Value;\n if (!StringExtensions.isNullOrWhitespace(dimensionValue)) {\n const dimensionName = convertProductDimensionTypeToDimensionTypes(dimension.DimensionTypeValue);\n fullUrl.searchParams.set(dimensionName, dimensionValue!);\n }\n });\n productUrlLink = fullUrl.href;\n }\n const isHoverModeEnabled = this.state.hoveringCellItemId === product.itemId;\n let cellClassName = ProductComparison.tableHeaderCellClassName;\n if (isHoverModeEnabled) {\n cellClassName = classnames(cellClassName, 'msc-product-comparison__cell-hover');\n }\n const isFromCurrentCatalog = product.catalogId === currentCatalogId;\n\n const productImageContainerClassName = `${ProductComparison.productRowClassName}__product-image-container`;\n const productImageClassName = `${productImageContainerClassName}__product-image`;\n const productNameClassName = `${ProductComparison.productRowClassName}__product-name`;\n const productPriceClassName = `${ProductComparison.productRowClassName}__product-price`;\n const cellNewWidth = this._getCellWidth();\n const style = {\n width: `${cellNewWidth}px`,\n minWidth: `${cellNewWidth}px`,\n maxWidth: `${cellNewWidth}px`\n };\n return {\n cellContainerProps: {\n className: cellClassName,\n key: product.itemId,\n ref: this._tableCellReference,\n onMouseEnter: this._handleHoverIn(product.itemId),\n onMouseLeave: this._handleHoverOut(product.itemId),\n role: 'menuitem',\n tabIndex: 0,\n style: style\n },\n product,\n productUrl: productUrlLink,\n removeFromComparisonButton: this._renderRemoveFromComparisonButton(product.itemId),\n productImage: (\n <div className={productImageContainerClassName} key={product.itemId}>\n {this._renderProductImage(productImageClassName, product.productInfo)}\n </div>\n ),\n productLink: (\n <a className={productNameClassName} href={productUrlLink} key={product.itemId}>\n {product.productInfo.Name}\n </a>\n ),\n productPrice: (\n <div className={productPriceClassName} key={product.itemId}>\n {product.price && (\n <PriceComponent\n context={this.props.context}\n id={this.props.id}\n typeName={this.props.typeName}\n data={{ price: product.price }}\n freePriceText={this.props.resources.productComparisonProductItemFreePrice}\n originalPriceText={this.props.resources.productComparisonProductItemOriginalPrice}\n currentPriceText={this.props.resources.productComparisonProductItemCurrentPrice}\n />\n )}\n </div>\n ),\n quickView: this._renderQuickView(product),\n isFromCurrentCatalog,\n goToProductDetailsButton: (\n <Button href={productUrlLink} title={this.props.resources.productComparisonGoToProductDetailsButtonText}>\n {this.props.resources.productComparisonGoToProductDetailsButtonText}\n </Button>\n ),\n tableCellProps: this._getTableCellProps(product.itemId),\n tableHeaderProps: this._getTableHeaderProps(product.itemId),\n productRating:\n product.rating !== undefined ? <div key={product.itemId}>{this._renderProductRating(product.rating)}</div> : undefined,\n productDescription:\n product.productInfo !== undefined ? (\n <div key={product.itemId}>{ProductComparison._renderProductDescription(product.productInfo)}</div>\n ) : (\n undefined\n )\n };\n });\n }\n}\n\nexport default ProductComparison;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport msdyn365Commerce from '@msdyn365-commerce/core';\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { IProductComparisonProductMainInfo, IProductComparisonViewProps, ProductComparison } from './product-comparison';\n\n/**\n * Renders dynamic header values.\n * @param values - cd..info.\n * @param headerName - Header Name.\n * @returns List of react nodes.\n */\nconst renderDynamicHeaderCells = (\n values: {\n productMainInfo: IProductComparisonProductMainInfo;\n node: React.ReactNode;\n }[],\n headerName: string,\n currentClickerPosition?: number\n) => {\n return values.map((value, index) => {\n if (index === currentClickerPosition) {\n return (\n <Node\n key={value.productMainInfo.tableHeaderProps.key}\n {...value.productMainInfo.tableHeaderProps}\n role='menuitem'\n tabindex='0'\n style={value.productMainInfo.cellContainerProps.style}\n >\n {headerName}\n </Node>\n );\n }\n return <Node key={index} {...value.productMainInfo.tableHeaderProps} style={value.productMainInfo.cellContainerProps.style}></Node>;\n });\n};\n\n/**\n * Renders dynamic cell values.\n * @param values - Cells info.\n * @param hoveringCellItemId - Currently hovered cell.\n * @returns List of react nodes.\n */\nconst renderDynamicCells = (\n values: {\n productMainInfo: IProductComparisonProductMainInfo;\n node: React.ReactNode;\n }[],\n hoveringCellItemId: string\n) => {\n return values.map(value => {\n return (\n <Node\n {...value.productMainInfo.tableCellProps}\n key={`${value.productMainInfo.product.itemId}-${hoveringCellItemId}`}\n style={value.productMainInfo.cellContainerProps.style}\n >\n {value.node}\n </Node>\n );\n });\n};\n/**\n * Represents product comparison view.\n * @param props - View props for product comparison.\n * @returns Functional component of product comparison.\n */\nexport const ProductComparisonViewFunctionalComponent: React.FC<IProductComparisonViewProps> = props => {\n return (\n <Module {...props.moduleProps}>\n {props.backToShopping}\n {props.heading}\n <Node className={`${ProductComparison.className}__product_count_text`}>{props.productCountText}</Node>\n {props.isEmptyContent || props.isMainContentReady ? undefined : props.loading}\n {props.isEmptyContent ? props.emptyComparison : undefined}\n <Node {...props.actionBarContainerProps}>\n {!props.isEmptyContent && props.isMainContentReady ? props.clearAllButton : undefined}\n </Node>\n {props.isMainContentReady ? (\n <Node className={ProductComparison.mainContainerClassName}>\n <Node className={ProductComparison.containerClassName}>\n <Node className={ProductComparison.tableClassName} ref={props.tableReference}>\n <Node className={`${ProductComparison.tableHeaderClassName}`}>\n <Node\n className={`${ProductComparison.tableHeaderClassName}__header__container`}\n ref={props.tableHeaderReference}\n >\n {props.shouldShowPreviousClicker && props.previousClicker}\n <Node\n className={classnames(\n ProductComparison.tableRowClassName,\n `${ProductComparison.tableHeaderClassName}__product-row`\n )}\n role='menu'\n >\n {props.productsMainInfo?.map(productMainInfo => {\n const isFromCurrentCatalog = productMainInfo.isFromCurrentCatalog;\n const actionsClassName = `${ProductComparison.productRowClassName}__actions`;\n return (\n <Node\n {...productMainInfo.cellContainerProps}\n key={productMainInfo.cellContainerProps.key as string}\n style={productMainInfo.cellContainerProps.style}\n >\n {productMainInfo.removeFromComparisonButton}\n {productMainInfo.productImage}\n {msdyn365Commerce.isBrowser ? productMainInfo.productLink : undefined}\n {productMainInfo.productPrice}\n <Node className={actionsClassName} key={productMainInfo.product.itemId}>\n {isFromCurrentCatalog\n ? productMainInfo.quickView\n : productMainInfo.goToProductDetailsButton}\n </Node>\n </Node>\n );\n })}\n </Node>\n {props.shouldShowNextClicker && props.nextClicker}\n </Node>\n </Node>\n <Node\n className={ProductComparison.tableBodyClassName}\n onScroll={props.handleScroll}\n ref={props.tableBodyReference}\n >\n {props.productsMainInfo?.map((rating, key) => {\n return rating.productRating !== undefined && key === 0 ? (\n <Node\n className={classnames(\n `${ProductComparison.tableBodyClassName}__rating-row`,\n ProductComparison.tableRowClassName\n )}\n >\n <Node\n className={ProductComparison.tableRowContentClassName}\n key={`rating-${props.currentClickerPosition}`}\n role='menu'\n >\n {props.productsMainInfo?.map((productMainInfo, index) => {\n if (index === props.currentClickerPosition) {\n return (\n <Node\n key={productMainInfo.tableHeaderProps.key}\n {...productMainInfo.tableHeaderProps}\n role='menuitem'\n tabindex='0'\n style={productMainInfo.cellContainerProps.style}\n >\n {props.resources.productComparisonProductItemRating}\n </Node>\n );\n }\n return (\n <Node\n key={productMainInfo.tableHeaderProps.key}\n {...productMainInfo.tableHeaderProps}\n role='none'\n tabindex='-1'\n style={productMainInfo.cellContainerProps.style}\n ></Node>\n );\n })}\n </Node>\n <Node\n className={`${ProductComparison.tableRowContentClassName} ${ProductComparison.tableRowContentInformationClassName}`}\n role='menu'\n >\n {props.productsMainInfo?.map(productMainInfo => {\n return (\n <Node\n {...productMainInfo.tableCellProps}\n key={`${productMainInfo.product.itemId}-${props.hoveringCellItemId!}`}\n style={productMainInfo.cellContainerProps.style}\n >\n {productMainInfo.productRating}\n </Node>\n );\n })}\n </Node>\n </Node>\n ) : (\n undefined\n );\n })}\n {props.productsMainInfo?.map((description, key) => {\n return description.productDescription !== undefined && key === 0 ? (\n <Node\n className={classnames(\n `${ProductComparison.tableBodyClassName}__description-row`,\n ProductComparison.tableRowClassName\n )}\n >\n <Node\n className={ProductComparison.tableRowContentClassName}\n key={`description-${props.currentClickerPosition}`}\n role='menu'\n >\n {props.productsMainInfo?.map((productMainInfo, index) => {\n if (index === props.currentClickerPosition) {\n return (\n <Node\n key={productMainInfo.tableHeaderProps.key}\n {...productMainInfo.tableHeaderProps}\n role='menuitem'\n tabindex='0'\n style={productMainInfo.cellContainerProps.style}\n >\n {props.resources.productComparisonProductItemDescription}\n </Node>\n );\n }\n return (\n <Node\n key={productMainInfo.tableHeaderProps.key}\n {...productMainInfo.tableHeaderProps}\n role='none'\n tabindex='-1'\n style={productMainInfo.cellContainerProps.style}\n ></Node>\n );\n })}\n </Node>\n <Node\n className={`${ProductComparison.tableRowContentClassName} ${ProductComparison.tableRowContentInformationClassName}`}\n role='menu'\n >\n {props.productsMainInfo?.map(productMainInfo => {\n return (\n <Node\n {...productMainInfo.tableCellProps}\n key={`${productMainInfo.product.itemId}-${props.hoveringCellItemId!}`}\n style={productMainInfo.cellContainerProps.style}\n >\n {productMainInfo.productDescription}\n </Node>\n );\n })}\n </Node>\n </Node>\n ) : (\n undefined\n );\n })}\n {props.dimensionsProps?.map(dimensionProps => {\n return (\n dimensionProps?.dimensionName && (\n <Node\n className={classnames(\n ProductComparison.dimensionsRowClassName,\n ProductComparison.tableRowClassName,\n dimensionProps.dimensionClassName\n )}\n key={dimensionProps.dimensionClassName}\n >\n <Node\n className={ProductComparison.tableRowContentClassName}\n key={`${dimensionProps.dimensionName}-${props.currentClickerPosition}`}\n role='menu'\n >\n {renderDynamicHeaderCells(\n dimensionProps.productDimensionValues,\n dimensionProps.dimensionName,\n props.currentClickerPosition\n )}\n </Node>\n\n <Node\n className={`${ProductComparison.tableRowContentClassName} ${ProductComparison.tableRowContentInformationClassName}`}\n role='menu'\n >\n {renderDynamicCells(dimensionProps.productDimensionValues, props.hoveringCellItemId!)}\n </Node>\n </Node>\n )\n );\n })}\n {props.specificationsProps?.map(specificationProps => {\n return StringExtensions.isNullOrEmpty(specificationProps.specification.TextValue) === false ? (\n <Node\n className={classnames(\n ProductComparison.specificationsRowClassName,\n ProductComparison.tableRowClassName,\n specificationProps.specificationClassName\n )}\n key={specificationProps.specificationClassName}\n >\n <Node\n className={ProductComparison.tableRowContentClassName}\n key={`${specificationProps.specification.Name}-${props.currentClickerPosition}`}\n role='menu'\n >\n {renderDynamicHeaderCells(\n specificationProps.specificationValues,\n specificationProps.specification.Name!,\n props.currentClickerPosition\n )}\n </Node>\n <Node\n className={`${ProductComparison.tableRowContentClassName} ${ProductComparison.tableRowContentInformationClassName}`}\n role='menu'\n >\n {renderDynamicCells(specificationProps.specificationValues, props.hoveringCellItemId!)}\n </Node>\n </Node>\n ) : (\n undefined\n );\n })}\n <Node\n className={classnames(\n `${ProductComparison.tableBodyClassName}__sku-row`,\n ProductComparison.tableRowClassName\n )}\n >\n <Node\n className={ProductComparison.tableRowContentClassName}\n key={`sku-${props.currentClickerPosition}`}\n role='menu'\n >\n {props.productsMainInfo?.map((productMainInfo, index) => {\n if (index === props.currentClickerPosition) {\n return (\n <Node\n key={productMainInfo.tableHeaderProps.key}\n {...productMainInfo.tableHeaderProps}\n role='menuitem'\n tabindex='0'\n style={productMainInfo.cellContainerProps.style}\n >\n {props.resources.productComparisonProductItemSku}\n </Node>\n );\n }\n return (\n <Node\n key={productMainInfo.tableHeaderProps.key}\n {...productMainInfo.tableHeaderProps}\n style={productMainInfo.cellContainerProps.style}\n ></Node>\n );\n })}\n </Node>\n <Node\n className={`${ProductComparison.tableRowContentClassName} ${ProductComparison.tableRowContentInformationClassName}`}\n role='menu'\n >\n {props.productsMainInfo?.map(productMainInfo => {\n return (\n <Node\n {...productMainInfo.tableCellProps}\n key={`${productMainInfo.product.itemId}-${props.hoveringCellItemId!}`}\n style={productMainInfo.cellContainerProps.style}\n >\n {productMainInfo.product.productInfo.ItemId}\n </Node>\n );\n })}\n </Node>\n </Node>\n </Node>\n </Node>\n </Node>\n </Node>\n ) : (\n undefined\n )}\n </Module>\n );\n};\n\nexport default ProductComparisonViewFunctionalComponent;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { 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<IQuickOrderDrawerProps, IQuickOrderDrawerState> {\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 <div className={drawerClass}>\n <Button\n {...this.props.toggleButtonProps}\n onClick={this._toggle}\n aria-expanded={collapseProps.isOpen}\n block\n disabled={this.props.disabled}\n className='drawer__button'\n color='secondary'\n >\n {this._generateDrawerButtonInnerMarkup(collapseProps.isOpen)}\n </Button>\n <Collapse {...collapseProps} />\n </div>\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 <h2 className={classnames(drawerButtonTextClass, '__start ms-quick-order__heading')}>{this.props.moduleHeadingText}</h2>\n <span className={classnames(drawerButtonTextClass, '__start ms-quick-order__description')}>\n {this.props.moduleDescriptionText}\n </span>\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 <span className={glyphClass} />;\n }\n\n private _toggle(e: React.MouseEvent<HTMLElement> | React.KeyboardEvent<HTMLElement>): 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<HTMLInputElement>;\n quantityTextInput: React.RefObject<HTMLInputElement>;\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<void>;\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<HTMLInputElement>) => {\n handleInputChange(event.target.value || '');\n};\n\n/**\n * On Quantity Change functionality.\n * @param handleQuantityChange -Quantity change function.\n * @returns Quantity change value.\n */\nconst onQuantityChangeFunction = (handleQuantityChange: (query: string) => void) => (event: React.ChangeEvent<HTMLInputElement>) => {\n handleQuantityChange(event.target.value || '');\n};\n\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 <div className='ms-quick-order__content-form-main-product'>\n <h2 className='ms-quick-order__content-form-main-product-lable' aria-label={ariaLabelProduct}>\n {ariaLabelProduct}\n </h2>\n <input\n className='ms-quick-order__content-form-main-product-input'\n type='text'\n aria-label={ariaLabelProduct}\n ref={productTextInput}\n onChange={onInputChange}\n />\n </div>\n );\n\n const quantityNode = (\n <div className='ms-quick-order__content-form-main-quantity'>\n <h2 className='ms-quick-order__content-form-main-quantity-lable' aria-label={ariaLabelQuantity}>\n {ariaLabelQuantity}\n </h2>\n <input\n className='ms-quick-order__content-form-main-quantity-input'\n pattern='[0-9]*'\n ref={quantityTextInput}\n onChange={onQuantityInputChange}\n maxLength={maxChars}\n type='number'\n aria-live='polite'\n aria-label={ariaLabelQuantity}\n aria-valuemin={0}\n aria-valuemax={maxQuantity}\n aria-valuenow={quickOrderState.quantity}\n placeholder={addQuantityPlaceholderText}\n />\n </div>\n );\n\n const addtoCartNode = (\n <div className='ms-quick-order__content-form-main-addtocart'>\n <Button\n className='ms-quick-order__content-form-main-addtocart-button'\n disabled={disableAddtoCart}\n aria-label={ariaLabelAddtoCart}\n onClick={handleAddToCartClick}\n >\n {ariaLabelAddtoCart}\n </Button>\n </div>\n );\n\n const userMessageNode =\n quickOrderState && quickOrderState.stateMessage ? (\n <Alert color={quickOrderState.stateMessage.statusCssString} isOpen={quickOrderState.stateMessage.isOpen}>\n <span className={quickOrderState.stateMessage.messageGlyph} />\n <span>{quickOrderState.stateMessage.messageText}</span>\n </Alert>\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<IQuickOrderTableHeaderProps> {}\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<IQuickOrderTableHeaderProps> = (props: IQuickOrderTableHeaderProps) => {\n const { resources } = props;\n const columnWithNumberClassName = `${props.className}__row__column-with-number`;\n return (\n <>\n <th>\n <span className={classnames(`${props.className}__emptyColumn`)} />\n </th>\n <th>{resources.quickOrderProductNumberText}</th>\n <th>{resources.quickOrderProductText}</th>\n <th className={columnWithNumberClassName}>{resources.quickOrderUnitPriceText}</th>\n <th>{resources.quickOrderUnitOfMeasureText}</th>\n <th className={columnWithNumberClassName}>{resources.quickOrderQuantityText}</th>\n <th className={columnWithNumberClassName}>{resources.quickOrderTotalText}</th>\n <th>{resources.quickOrderActionsText}</th>\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<IQuickOrderTableHeaderProps> = (props: IQuickOrderTableHeaderProps) => {\n const { resources } = props;\n return (\n <>\n <th className={classnames(`${props.className}__emptyColumn`)} />\n <th>{resources.quickOrderProductNumberText}</th>\n <th />\n </>\n );\n};\n\n/**\n * Quick order table header component.\n * @param props - Configuration of the component.\n * @returns React node with the header.\n */\nexport const QuickOrderTableHeaderComponent: React.FC<IQuickOrderTableHeaderProps> = (props: IQuickOrderTableHeaderProps) => {\n const rowClassName = `${props.className}__row`;\n\n let headerCells: JSX.Element;\n if (props.isMobile) {\n headerCells = <QuickOrderMobileHeaderCellsComponent {...props} />;\n } else {\n headerCells = <QuickOrderDesktopHeaderCellsComponent {...props} />;\n }\n\n return (\n <thead className={props.className}>\n <tr className={rowClassName}>{headerCells}</tr>\n </thead>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { 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<IQuickOrderTableRowData> {\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<IQuickOrderTableRowProps> = (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 <div className={containerClassName}>\n <Image\n requestContext={props.context.actionContext.requestContext}\n className={`${containerClassName}__product-image`}\n altText={props.data.product.Name}\n src={props.data.product.PrimaryImageUrl ?? ''}\n fallBackSrc={fallbackImageUrl}\n gridSettings={props.context.request.gridSettings!}\n imageSettings={props.imageSettings ?? defaultImageSettings}\n loadFailureBehavior='empty'\n />\n </div>\n );\n};\n\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<IQuickOrderTableRowProps> = (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 <div className={className}>\n <Button className={`${className}__toggle`} />\n </div>\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<IQuickOrderTableRowProps> = (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 <td>\n <QuickOrderTableRowProductImageComponent {...props} />\n </td>\n <td>{product.ItemId}</td>\n <td>\n <div className={`${props.className}__product-info`}>\n <a className={`${props.className}__product-name`} href={productUrl}>\n {product.Name}\n </a>\n <span className={`${props.className}__product-dimensions`}>\n {product.Dimensions?.map(dimension => dimension.DimensionValue?.Value)\n .filter(dimensionValue => !StringExtensions.isNullOrWhitespace(dimensionValue))\n .join(props.resources.quickOrderProductDimensionsSeparator)}\n </span>\n </div>\n </td>\n <td className={columnWithNumberClassName}>{cartLine.Price}</td>\n <td>{cartLine.UnitOfMeasureSymbol}</td>\n <td className={`${props.className}__product-quantity`}>\n <IncrementalQuantity\n id={`msc-quick-order__quantity_${product.RecordId}-${cartLine.LineId ?? ''}`}\n max={10}\n currentCount={cartLine.Quantity}\n inputQuantityAriaLabel={props.resources.quickOrderInputQuantityAriaLabel}\n decrementButtonAriaLabel={props.resources.quickOrderDecrementButtonAriaLabel}\n incrementButtonAriaLabel={props.resources.quickOrderIncrementButtonAriaLabel}\n key={cartLine.LineId}\n isGiftCard={product.IsGiftCard}\n />\n </td>\n <td className={columnWithNumberClassName}>{cartLine.TotalAmount}</td>\n <td>\n <Button className={`${props.className}__product-remove`} aria-label={props.resources.quickOrderRemoveItemButtonAriaLabel} />\n </td>\n </>\n );\n};\n\n/**\n * Renders rows for mobile view.\n * @param props - Configuration for the rows.\n * @returns A react node with a list of quick order rows for mobile view.\n */\nexport const QuickOrderMobileTableRowCellComponent: React.FC<IQuickOrderTableRowProps> = (props: IQuickOrderTableRowProps) => {\n const product: SimpleProduct = props.data.product;\n const cartLine: CartLine = props.data.cartLine;\n\n return (\n <>\n <td>\n <QuickOrderTableRowProductImageComponent {...props} />\n </td>\n <td>\n <div className={`${props.className}__product-info`}>\n <span className={`${props.className}__product-name`}>{product.ItemId}</span>\n <span className={`${props.className}__product-quantity`}>\n {format(props.resources.quickOrderQuantityMobileText, cartLine.Quantity)}\n </span>\n </div>\n </td>\n <td>\n <QuickOrderExtraActionsPopupComponent {...props} />\n </td>\n </>\n );\n};\n\n/**\n * Quick order table row component.\n * @param props - Configuration of the component.\n * @returns React node for the row.\n */\nexport const QuickOrderTableRowComponent: React.FC<IQuickOrderTableRowProps> = (props: IQuickOrderTableRowProps) => {\n const rowClassName = `${props.className}__row`;\n\n let headerCells: JSX.Element;\n if (props.isMobile) {\n headerCells = <QuickOrderMobileTableRowCellComponent {...props} />;\n } else {\n headerCells = <QuickOrderDesktopTableRowCellComponent {...props} />;\n }\n\n return (\n <thead className={props.className}>\n <tr className={rowClassName}>{headerCells}</tr>\n </thead>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport MsDyn365, { IComponent, IComponentProps, ICoreContext } from '@msdyn365-commerce/core';\nimport React from 'react';\n\nimport { QuickOrderProduct } from '../quick-order-product';\nimport { IQuickOrderTableHeaderResources, QuickOrderTableHeaderComponent } from './components/quick-order-table-header-component';\nimport { IQuickOrderTableRowResources, QuickOrderTableRowComponent } from './components/quick-order-table-row-component';\n\n/**\n * Quick order table data interface.\n */\ninterface IQuickOrderTableData {\n quickOrderProducts: QuickOrderProduct[];\n}\n\n/**\n * Quick order table resources.\n */\nexport interface IQuickOrderTableResources extends IQuickOrderTableHeaderResources, IQuickOrderTableRowResources {}\n\n/**\n * Quick order table props.\n */\nexport interface IQuickOrderTableProps extends IComponentProps<IQuickOrderTableData> {\n context: ICoreContext;\n className: string;\n\n resources: IQuickOrderTableResources;\n isMobileView: boolean;\n}\n\n/**\n * Quick order table component.\n */\nexport interface IQuickOrderTableComponent extends IComponent<IQuickOrderTableProps> {}\n\n/**\n * The quick order table.\n * @param props -- The quick order table props.\n * @returns The quick order table element.\n */\nexport const QuickOrderTableComponent: React.FC<IQuickOrderTableProps> = (props: IQuickOrderTableProps) => {\n const [isMobile, setIsMobile] = React.useState(props.isMobileView);\n const quickOrderProducts = props.data.quickOrderProducts;\n\n /**\n * Update the view port.\n */\n const updateViewport = () => {\n setIsMobile(props.isMobileView);\n };\n if (MsDyn365.isBrowser) {\n window.addEventListener('resize', updateViewport);\n }\n\n const headerClassName = `${props.className}__header`;\n const rowClassName = `${props.className}__row`;\n\n return (\n <table className={props.className}>\n <QuickOrderTableHeaderComponent\n context={props.context}\n typeName={props.typeName}\n id={headerClassName}\n className={headerClassName}\n isMobile={isMobile}\n resources={props.resources}\n data={{}}\n />\n {quickOrderProducts.map((quickOrderProduct, index) => {\n return (\n <QuickOrderTableRowComponent\n context={props.context}\n typeName={props.typeName}\n id={`${rowClassName}-${index}`}\n key={quickOrderProduct.simpleProduct.ItemId}\n className={rowClassName}\n resources={props.resources}\n isMobile={isMobile}\n data={{\n cartLine: quickOrderProduct.cartLine,\n product: quickOrderProduct.simpleProduct\n }}\n />\n );\n })}\n </table>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ProductDimensionFull } from '@msdyn365-commerce/commerce-entities';\nimport {\n getProductConfigure,\n IErrorState,\n IProductDimensionCallbacks,\n IProductDimensionConfigureResources,\n IProductDimensionConfigureViewProps\n} from '@msdyn365-commerce/components';\nimport { CartLine, ProductDimension, ProductDimensionValue, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { getDeliveryOptionsAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\nimport {\n ArrayExtensions,\n FinitePromiseQueue,\n FinitePromiseQueueError,\n getDimensionsForSelectedVariant,\n GetDimensionsForSelectedVariantInput,\n getProductAvailabilitiesForSelectedVariant,\n getScanResult,\n GetScanResultInput,\n getSelectedVariant,\n IProductInventoryInformation,\n IPromiseQueue,\n ObjectExtensions,\n ProductAvailabilitiesForSelectedVariantInput,\n QueryResultSettingsProxy,\n SelectedVariantInput,\n StringExtensions\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 { debounce } from 'lodash';\nimport { computed, observable } from 'mobx';\nimport * as React from 'react';\n\nimport { QuickOrderDrawer, QuickOrderFormComponent, QuickOrderProduct } from './components';\nimport { QuickOrderTableComponent } from './components/quick-order-table/quick-order-table-component';\nimport { IQuickOrderData } from './quick-order.data';\nimport { IQuickOrderProps, IQuickOrderResources } from './quick-order.props.autogenerated';\n\n/**\n * Quick Order View Props Interface properties.\n */\nexport interface IQuickOrderViewProps extends IQuickOrderProps<IQuickOrderData> {\n isB2B?: boolean;\n productText: string;\n isQuickOrderFormExpanded: boolean;\n contentProps: INodeProps;\n drawer: INodeProps;\n quickOrderForm: INodeProps;\n quickOrderFormProductContent: INodeProps;\n quickOrderFormMsgContent: INodeProps;\n quickOrderProps: IModuleProps;\n quickOrderList?: React.ReactNode;\n form: React.ReactNode;\n configure?: IProductDimensionConfigureViewProps;\n isMobileView: boolean;\n}\n\n/**\n * Quick Order State Message Interface properties.\n */\nexport interface IQuickOrderStateMessage {\n isOpen: boolean;\n messageGlyph: string;\n messageText: string;\n statusCssString: string;\n}\n\n/**\n * GridSize Interface properties.\n */\nexport type GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\n/**\n * Quick Order Interface properties.\n */\nexport interface IQuickOrderState {\n isQuickOrderFormExpanded: boolean;\n isUpdatingDimension?: boolean;\n productAvailableQuantity: IProductInventoryInformation | undefined;\n productResponse: SimpleProduct | undefined;\n productDimensions: ProductDimensionFull[] | undefined;\n productText: string;\n quantity: number;\n stateMessage?: IQuickOrderStateMessage;\n productDimensionErrorState: IErrorState;\n isMobile: boolean;\n products: SimpleProduct[];\n}\n\n/**\n *\n * QuickOrder component.\n * @extends {React.PureComponent<IQuickOrderProps<IQuickOrderData>, IQuickOrderState>}\n */\nclass QuickOrder extends React.PureComponent<IQuickOrderProps<IQuickOrderData>, IQuickOrderState> {\n @observable\n private readonly viewport: GridSize;\n\n private readonly productTextInput: React.RefObject<HTMLInputElement>;\n\n private readonly quantityInput: React.RefObject<HTMLInputElement>;\n\n private readonly waitTime: number = 500;\n\n private readonly quickOrderFormClass: string;\n\n private readonly quickOrderFormProductContent: string;\n\n private readonly quickOrderFormMsgContent: string;\n\n private readonly telemetryContent: ITelemetryContent;\n\n private readonly dimensionUpdateQueue: IPromiseQueue<void> = new FinitePromiseQueue<void>(2);\n\n private dimensions: { [id: number]: string } = {};\n\n private initializedDimensions: Set<string> = new Set();\n\n private readonly cssClassNameConfigure: string = 'ms-quick-order__content-form-main';\n\n // @ts-expect-error -- Existing code.\n private cancellableDebounce: debounce;\n\n private readonly quickOrderCallbacks: IProductDimensionCallbacks = {\n initializeDimension: (initializedDimension: string): void => {\n if (initializedDimension) {\n this.initializedDimensions.add(initializedDimension);\n }\n },\n /**\n * Get Dropdown name.\n * @param selectedDimensionId - Dimension type.\n * @param selectedDimensionValueId - Resources.\n * @returns Dropdown name.\n */\n /* eslint-disable @typescript-eslint/no-explicit-any */\n dimensionSelectedAsync: async (selectedDimensionId: number, selectedDimensionValueId: string): Promise<void> => {\n this.dimensions[selectedDimensionId] = selectedDimensionValueId;\n // Only trigger _updateDimensions when all dimensions are initialized\n if (this.initializedDimensions.size === this.state.productDimensions?.length) {\n return this.dimensionUpdateQueue\n .enqueue(async () => {\n return this._updateDimensions();\n })\n .catch((error: any) => {\n // Ignore discarded processes.\n if (error !== FinitePromiseQueueError.ProcessWasDiscardedFromTheQueue) {\n throw error;\n }\n });\n }\n },\n\n /**\n * Get Dropdown name.\n * @param dimensionType - Dimension type.\n * @param resources - Resources.\n * @returns Dropdown name.\n */\n getDropdownName: (dimensionType: number, resources: IProductDimensionConfigureResources): string => {\n return this._getDropdownName(dimensionType, resources);\n },\n\n /**\n * Method to call on dimension change.\n * @param isUpdatingDimension - Flag to update dimension.\n */\n changeUpdatingDimension: (isUpdatingDimension: boolean): void => {\n this.setState({ isUpdatingDimension });\n }\n };\n\n public constructor(props: IQuickOrderProps<IQuickOrderData>) {\n super(props);\n this.productTextInput = React.createRef();\n this.quantityInput = React.createRef<HTMLInputElement>();\n this.viewport = props.context.request.device.Type === 'Mobile' ? 'xs' : 'lg';\n\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n this.state = {\n productText: '',\n isQuickOrderFormExpanded: false,\n productAvailableQuantity: undefined,\n quantity: 1,\n productResponse: undefined,\n productDimensions: undefined,\n productDimensionErrorState: {\n configureErrors: {}\n },\n isMobile: this.isMobile,\n products: []\n };\n this._handleInputChange = this._handleInputChange.bind(this);\n this._handleQuantityChange = this._handleQuantityChange.bind(this);\n this.quickOrderFormClass = 'ms-quick-order__content-form';\n this.quickOrderFormProductContent = 'ms-quick-order__content-form-main';\n this.quickOrderFormMsgContent = 'ms-quick-order__content-form-msg';\n }\n\n @computed get isMobile(): boolean {\n return this.viewport === 'xs' || this.viewport === 'sm';\n }\n\n public render(): JSX.Element | null {\n const { data } = this.props;\n if (!data.customerInformation.result) {\n return null;\n }\n\n const { className = '', maxQuantity } = this.props.config;\n const customerInfo = this.props.data.customerInformation.result;\n const {\n quickOrderModuleHeading,\n quickOrderModuleDescription,\n quickOrderAddtobag,\n quickOrderProductQuantityInputLabel,\n quickOrderProductInputLabel,\n quickOrderProductDimensionTypeColor,\n quickOrderProductDimensionTypeConfiguration,\n quickOrderSelectDimensionFormatString,\n quickOrderProductDimensionTypeSize,\n quickOrderProductDimensionTypeStyle,\n quickOrderProductDimensionTypeAmount,\n quickAddQuantityPlaceholderText\n } = this.props.resources;\n\n const productConfigureResources: IProductDimensionConfigureResources = {\n selectDimensionFormatString: quickOrderSelectDimensionFormatString,\n productDimensionTypeColor: quickOrderProductDimensionTypeColor,\n productDimensionTypeConfiguration: quickOrderProductDimensionTypeConfiguration,\n productDimensionTypeSize: quickOrderProductDimensionTypeSize,\n productDimensionTypeStyle: quickOrderProductDimensionTypeStyle,\n productDimensionTypeAmount: quickOrderProductDimensionTypeAmount\n };\n\n const { isQuickOrderFormExpanded, productText, productDimensionErrorState, productResponse, productDimensions } = this.state;\n\n const moduleClassName: string = 'ms-quick-order';\n\n const viewProps: IQuickOrderViewProps = {\n ...(this.props as IQuickOrderProps<IQuickOrderData>),\n\n quickOrderProps: { className: classnames('ms-quick-order', className), moduleProps: this.props },\n contentProps: { className: 'ms-quick-order__content' },\n isB2B: customerInfo?.IsB2b,\n drawer: {\n tag: QuickOrderDrawer,\n className: `${moduleClassName}__drawer`,\n collapseProps: { isOpen: this.state.isQuickOrderFormExpanded },\n moduleHeadingText: quickOrderModuleHeading,\n moduleDescriptionText: quickOrderModuleDescription,\n requestContext: this.props.context.request,\n telemetryContent: this.telemetryContent\n },\n quickOrderForm: {\n className: `${this.quickOrderFormClass} ${isQuickOrderFormExpanded ? 'qo-show' : 'qo-hide'}`\n },\n quickOrderFormProductContent: {\n className: this.quickOrderFormProductContent\n },\n quickOrderFormMsgContent: {\n className: this.quickOrderFormMsgContent\n },\n productText,\n quickOrderList: ArrayExtensions.hasElements(this.state.products) ? this._renderQuickOrderTable('ms-quick-order') : undefined,\n form: QuickOrderFormComponent({\n productTextInput: this.productTextInput,\n quantityTextInput: this.quantityInput,\n disableAddtoCart: !productResponse,\n ariaLabelAddtoCart: quickOrderAddtobag,\n ariaLabelProduct: quickOrderProductInputLabel,\n ariaLabelQuantity: quickOrderProductQuantityInputLabel,\n addQuantityPlaceholderText: quickAddQuantityPlaceholderText,\n maxChars: 50,\n maxQuantity,\n quickOrderState: this.state,\n handleInputChange: this._handleInputChange,\n handleAddToCartClick: this._addItemToCart,\n handleQuantityChange: this._handleQuantityChange\n }),\n configure:\n productResponse && productDimensions\n ? getProductConfigure(\n this.cssClassNameConfigure,\n this.props.context,\n this.props.friendlyName,\n this.props.telemetry,\n quickOrderSelectDimensionFormatString,\n productConfigureResources,\n this.quickOrderCallbacks,\n productResponse,\n productDimensions,\n productDimensionErrorState\n )\n : undefined,\n isQuickOrderFormExpanded: this.state.isQuickOrderFormExpanded,\n isMobileView: this.state.isMobile\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n /**\n * Initial the products on quick order.\n * @returns List of quick order products or undefined.\n */\n private _initQuickOrderProducts(): QuickOrderProduct[] {\n const {\n data: {\n cart: { result: cart }\n }\n } = this.props;\n\n const products: SimpleProduct[] = this.state.products;\n\n const quickOrderProducts = cart?.cart.CartLines?.map((cartLine: CartLine) => {\n const quickOrderProduct = products.find(product => product.RecordId === cartLine.ProductId);\n if (ObjectExtensions.isNullOrUndefined(quickOrderProduct)) {\n return undefined;\n }\n\n return new QuickOrderProduct(cartLine, quickOrderProduct);\n });\n\n return ArrayExtensions.validValues(quickOrderProducts);\n }\n\n /**\n * Render Quick Order Table.\n * @param className - Class name.\n * @returns JSX element.\n */\n private _renderQuickOrderTable(className: string): JSX.Element {\n const tableClassName = `${className}__table-list`;\n\n return (\n <QuickOrderTableComponent\n id={tableClassName}\n typeName={this.props.typeName}\n key={tableClassName}\n className={tableClassName}\n data={{ quickOrderProducts: this._initQuickOrderProducts() }}\n context={this.props.context}\n resources={this.props.resources}\n isMobileView={this.state.isMobile}\n />\n );\n }\n\n /**\n * Method to handle input change.\n * @param query - Class name.\n */\n private readonly _handleInputChange = (query: string): void => {\n if (!query || query.length > 4) {\n this.setState({ productText: query, quantity: 0, productResponse: undefined, productDimensions: [] });\n this.setState({\n stateMessage: {\n messageText: '',\n statusCssString: '',\n messageGlyph: '',\n isOpen: false\n }\n });\n const inputQuantityText = this.quantityInput.current instanceof HTMLInputElement && this.quantityInput.current;\n if (inputQuantityText) {\n inputQuantityText.value = '0';\n }\n } else {\n return;\n }\n\n if (this.cancellableDebounce) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call -- existing code.\n this.cancellableDebounce.cancel();\n }\n\n const { telemetry, context } = this.props;\n const maxChar = 50;\n if (context) {\n if (!StringExtensions.isNullOrWhitespace(query)) {\n if (query.length > maxChar) {\n return;\n }\n\n this.cancellableDebounce = debounce(() => {\n getScanResult(\n new GetScanResultInput(\n context.actionContext.requestContext.apiSettings,\n query,\n context.actionContext.requestContext.apiSettings.channelId\n ),\n this.props.context.actionContext\n )\n .then(results => {\n this.setState({\n productResponse: results?.Product,\n productDimensions: results?.ProductDimensionFull,\n isQuickOrderFormExpanded: true\n });\n })\n .catch(error => {\n this.setState({ productText: '' });\n telemetry.exception(error);\n telemetry.debug('Unable to get scan results');\n });\n }, this.waitTime);\n\n setTimeout(() => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call -- Existing code.\n this.cancellableDebounce();\n }, 0);\n this.setState({ productText: query, isQuickOrderFormExpanded: true });\n } else {\n this.setState({ productText: '', productResponse: undefined, isQuickOrderFormExpanded: true });\n }\n }\n };\n\n /**\n * Method to add product in cart.\n */\n // eslint-disable-next-line complexity\n private readonly _addItemToCart = async (): Promise<void> => {\n const { context, data, resources, telemetry } = this.props;\n const { cart } = data;\n const { quickOrderAddedToCartSuccessMessage, quickOrderAddedToCartFailureMessage } = resources;\n const { productResponse, quantity } = this.state;\n this.setState({\n stateMessage: {\n messageText: '',\n statusCssString: '',\n messageGlyph: '',\n isOpen: false\n }\n });\n\n const isValidCart = productResponse && (await this._validateCart(productResponse, quantity));\n if (isValidCart && cart.result && productResponse !== undefined) {\n // Get product delivery mode info\n const deliveryOptions = await getDeliveryOptionsAsync(\n {\n callerContext: this.props.context.actionContext,\n queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(this.props.context.actionContext)\n },\n [productResponse.RecordId]\n );\n const emailDeliveryModeCode = this.props.context.actionContext.requestContext.channel?.EmailDeliveryModeCode;\n const defaultDeliveryOption =\n ArrayExtensions.hasElements(deliveryOptions) && ArrayExtensions.hasElements(deliveryOptions[0].DeliveryOptions)\n ? deliveryOptions[0].DeliveryOptions[0].Code\n : undefined;\n\n if (this.state.productAvailableQuantity === undefined) {\n await this._updateAvailability();\n }\n const shouldValidateQuantityLimits: boolean = this._shouldValidateQuantityLimits();\n const { productAvailableQuantity } = this.state;\n const addProductToCartInput = {\n product: productResponse,\n count: quantity,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- Existing code.\n enableStockCheck: context.app.config.enableStockCheck,\n availableQuantity: productAvailableQuantity ? productAvailableQuantity.ProductAvailableQuantity.AvailableQuantity : 0,\n additionalProperties: { orderQuantityLimitsFeatureIsEnabled: shouldValidateQuantityLimits },\n isAddEmailDeliveryItemToCart: defaultDeliveryOption !== undefined && defaultDeliveryOption === emailDeliveryModeCode,\n deliveryMode: defaultDeliveryOption\n };\n\n cart.result\n .addProductToCart(addProductToCartInput)\n .then(async result => {\n if (result.status === 'SUCCESS') {\n this.props.telemetry.debug('[quick-order] Cart Updated');\n const inputProductText = this.productTextInput.current instanceof HTMLInputElement && this.productTextInput.current;\n const inputQuantityText = this.quantityInput.current instanceof HTMLInputElement && this.quantityInput.current;\n if (inputProductText) {\n inputProductText.value = '';\n }\n if (inputQuantityText) {\n inputQuantityText.value = '0';\n }\n // clean dimensions once product is added to cart\n this.dimensions = [];\n this.setState({\n productText: '',\n quantity: 0,\n productResponse: undefined,\n productDimensions: [],\n stateMessage: {\n messageText: quickOrderAddedToCartSuccessMessage,\n statusCssString: 'success',\n messageGlyph: 'fas fa-check',\n isOpen: true\n }\n });\n } else if (result.substatus === 'MAXQUANTITY') {\n this.props.telemetry.debug('[quick-order] Unable to Update Cart Line from the quick order', quantity);\n const maxQtyLimitReachedMessage = this._getMaxQtyMessage(productAvailableQuantity, quantity);\n\n this.setState({\n stateMessage: {\n messageText: maxQtyLimitReachedMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n }\n });\n } else if (result.substatus === 'QUANTITYLIMITS' && shouldValidateQuantityLimits) {\n const maxQtyLimitReachedMessage = result.errorDetails?.LocalizedMessage!;\n this.props.telemetry.debug(\n '[quick-order] Unable to Update Cart Line from the quick order',\n maxQtyLimitReachedMessage\n );\n\n this.setState({\n stateMessage: {\n messageText: maxQtyLimitReachedMessage || quickOrderAddedToCartFailureMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n }\n });\n } else {\n this.props.telemetry.debug('[quick-order] Unable to Update Cart Line from the quick order');\n\n this.setState({\n stateMessage: {\n messageText: quickOrderAddedToCartFailureMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n }\n });\n }\n })\n .catch(error => {\n telemetry.warning(error);\n telemetry.debug('[quick-order] Error trying to Update Cart Line from the quick order');\n\n this.setState({\n stateMessage: {\n messageText: quickOrderAddedToCartFailureMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n }\n });\n });\n }\n };\n\n private readonly _shouldValidateQuantityLimits = (): boolean => {\n const featureStatuses = this.props.data.featureState.result;\n const isECommerceQuantityLimitsFeatureEnabledInHq =\n featureStatuses?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.EcommerceQuantityLimitConfigurationsFeature'\n )?.IsEnabled || false;\n\n if (isECommerceQuantityLimitsFeatureEnabledInHq) {\n return true;\n }\n\n const isOrderQuantityLimitsFeatureEnabledInHq =\n featureStatuses?.find(featureState => featureState.Name === 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature')\n ?.IsEnabled || false;\n\n if (!isOrderQuantityLimitsFeatureEnabledInHq) {\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 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\n return isOrderQuantityLimitsFeatureEnabledInSiteSettings ?? false;\n } else {\n const cartConfiguration = this.props.data.cartConfiguration?.result;\n return !(cartConfiguration?.IgnoreOrderSettings ?? false);\n }\n };\n\n private _getMaxQtyMessage(productInventoryInfo: IProductInventoryInformation | undefined, currentQuantity: number): string {\n const { context, data } = this.props;\n const { cart } = data;\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- existing code.\n const maxQuantityForLineItem = updateMaxQuantityForCartLineItem(context.app.config.maxQuantityForCartLineItem);\n\n const addedQuantity =\n cart.result?.cart.CartLines?.find(\n item => item.ItemId?.toString() === this.state.productText && item.ProductId === this.state.productResponse?.RecordId\n )?.Quantity || 0;\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- existing code.\n if (\n !productInventoryInfo ||\n !productInventoryInfo.ProductAvailableQuantity.AvailableQuantity ||\n !context.app.config.enableStockCheck\n ) {\n return this._getConcatenatedMaxQtyMessage(addedQuantity.toString(), maxQuantityForLineItem.toString());\n }\n\n const minInventory = Math.min(maxQuantityForLineItem, productInventoryInfo.ProductAvailableQuantity.AvailableQuantity);\n\n return this._getConcatenatedMaxQtyMessage(addedQuantity.toString(), minInventory.toString());\n }\n\n /**\n * Method to return concatenated added quantity Message.\n * @param currentQuantity - Current or added Quantity.\n * @param maxQuantity - Max Quantity.\n * @returns - ConcatenatedMaxQtyMessage.\n */\n private readonly _getConcatenatedMaxQtyMessage = (currentQuantity: string, maxQuantity: string): string => {\n const { quickOrderMaxQuantityLimitText, quickOrderAlreadyItemQuantityText } = this.props.resources;\n\n if (currentQuantity !== '0') {\n return (\n quickOrderAlreadyItemQuantityText.replace('{curQuantity}', currentQuantity) +\n quickOrderMaxQuantityLimitText.replace('{maxQuantity}', maxQuantity)\n );\n }\n\n return quickOrderMaxQuantityLimitText.replace('{maxQuantity}', maxQuantity);\n };\n\n /**\n * Method to handle quantity change.\n * @param value - Quantity.\n */\n private readonly _handleQuantityChange = (value: string): void => {\n let currentValue = Number.parseInt(value, 10);\n const inputElement = this.quantityInput.current instanceof HTMLInputElement && this.quantityInput.current;\n\n if (isNaN(currentValue)) {\n currentValue = 0;\n }\n\n this.setState({ quantity: currentValue }, () => {\n debounce(() => {\n if (!isNaN(this.state.quantity) && this.state.quantity >= 0 && inputElement) {\n inputElement.setAttribute('aria-valuenow', currentValue.toString());\n inputElement.setAttribute('value', currentValue.toString());\n }\n }, 200)();\n });\n };\n\n private readonly _updateDimensionValue = (\n productDimensionFull: ProductDimensionFull,\n newValueId: string | undefined\n ): ProductDimensionValue | undefined => {\n if (newValueId && productDimensionFull.DimensionValues) {\n return productDimensionFull.DimensionValues.find(dimension => dimension.RecordId === +newValueId);\n }\n\n return undefined;\n };\n\n private readonly _getDropdownName = (dimensionType: number, resources: IProductDimensionConfigureResources): string => {\n const isGiftCard = this.state.productResponse?.IsGiftCard;\n\n switch (dimensionType) {\n case 1: // ProductDimensionType.Color\n return resources.productDimensionTypeColor;\n case 2: // ProductDimensionType.Configuration\n return resources.productDimensionTypeConfiguration;\n case 3: // ProductDimensionType.Size\n return resources.productDimensionTypeSize;\n case 4: // ProductDimensionType.Style\n return isGiftCard ? resources.productDimensionTypeAmount : resources.productDimensionTypeStyle;\n default:\n return '';\n }\n };\n\n /**\n * Method to update product dimension.\n */\n private readonly _updateDimensions = async (): Promise<void> => {\n const {\n context: {\n actionContext,\n request: {\n apiSettings: { channelId }\n }\n }\n } = this.props;\n const { productDimensions, productResponse } = this.state;\n if (!productResponse || !productDimensions) {\n return;\n }\n\n const dimensionsToUpdate: { [id: number]: string } = { ...this.dimensions };\n this.setState({ isUpdatingDimension: true });\n\n // Step 1: Update state to indicate which dimensions are selected\n if (this.state.productDimensionErrorState.otherError) {\n const clearOtherErrorState = { ...this.state.productDimensionErrorState };\n clearOtherErrorState.otherError = undefined;\n this.setState({ productDimensionErrorState: clearOtherErrorState });\n }\n\n // Step 2: Clear any errors indicating the dimension wasn't selected\n for (const key of Object.keys(dimensionsToUpdate)) {\n if (this.state.productDimensionErrorState.configureErrors[key]) {\n const errorState = { ...this.state.productDimensionErrorState };\n errorState.configureErrors[key] = undefined;\n\n this.setState({ productDimensionErrorState: errorState });\n }\n }\n\n // Step 3, Build the actually selected dimensions, prioritizing the information in state\n // over the information in data\n const mappedDimensions = productDimensions\n .map(dimension => {\n return {\n DimensionTypeValue: dimension.DimensionTypeValue,\n DimensionValue:\n this._updateDimensionValue(dimension, dimensionsToUpdate[dimension.DimensionTypeValue]) || dimension.DimensionValue,\n ExtensionProperties: dimension.ExtensionProperties\n };\n })\n .filter(dimension => {\n return dimension.DimensionValue;\n });\n\n // Step 4. Use these dimensions hydrate the product. Wrap this in a promise\n // so that places like add to cart can await it\n const selectedProduct = new Promise<SimpleProduct | null>(async (resolve, reject) => {\n const newProduct = await getSelectedVariant(\n new SelectedVariantInput(\n productResponse.MasterProductId ? productResponse.MasterProductId : productResponse.RecordId,\n channelId,\n mappedDimensions,\n undefined,\n this.props.context.request\n ),\n actionContext\n );\n if (newProduct) {\n await getDimensionsForSelectedVariant(\n new GetDimensionsForSelectedVariantInput(\n newProduct.MasterProductId ? newProduct.MasterProductId : newProduct.RecordId,\n channelId,\n mappedDimensions,\n this.props.context.request\n ),\n actionContext\n );\n }\n\n resolve(newProduct);\n });\n\n const variantProduct = await selectedProduct;\n this.setState({ productResponse: variantProduct !== null ? variantProduct : undefined });\n if (variantProduct) {\n // Step 5. Use these dimensions hydrate the inventory. Wrap this in a promise\n // so that places like add to cart can await it\n const newAvailableQuantity = await getProductAvailabilitiesForSelectedVariant(\n new ProductAvailabilitiesForSelectedVariantInput(variantProduct.RecordId, channelId),\n actionContext\n );\n\n if (newAvailableQuantity && newAvailableQuantity.length > 0) {\n this.setState({ productAvailableQuantity: newAvailableQuantity[0] });\n } else {\n this.setState({ productAvailableQuantity: undefined });\n }\n }\n };\n\n /**\n * Method to update product availability.\n */\n private readonly _updateAvailability = async (): Promise<void> => {\n const {\n context: {\n actionContext,\n request: {\n apiSettings: { channelId }\n }\n }\n } = this.props;\n const { productResponse } = this.state;\n if (!productResponse) {\n return;\n }\n\n let productAvailable: IProductInventoryInformation | undefined;\n await getProductAvailabilitiesForSelectedVariant(\n new ProductAvailabilitiesForSelectedVariantInput(productResponse.RecordId, channelId),\n actionContext\n ).then(result => {\n if (ArrayExtensions.hasElements(result)) {\n productAvailable = result.find(quantity => quantity.ProductAvailableQuantity.ProductId === productResponse.RecordId);\n } else {\n this.setState({ productAvailableQuantity: undefined });\n }\n this.setState({ productAvailableQuantity: productAvailable });\n });\n };\n\n /**\n * Method to get dimension error string.\n * @param dimensionTypeValue - Dimension value.\n * @param resources - Localized error message.\n * @param isGiftCard - Flag to check giftcard.\n * @returns Dimension error string.\n */\n private readonly _getDimensionErrorString = (\n dimensionTypeValue: number,\n resources: IQuickOrderResources,\n isGiftCard?: boolean\n ): string => {\n switch (dimensionTypeValue) {\n case 1: // ProductDimensionType.Color\n return resources.quickOrderproductDimensionTypeColorErrorMessage;\n case 2: // ProductDimensionType.Configuration\n return resources.quickOrderproductDimensionTypeConfigurationErrorMessage;\n case 3: // ProductDimensionType.Size\n return resources.quickOrderproductDimensionTypeSizeErrorMessage;\n case 4: // ProductDimensionType.Style\n return isGiftCard\n ? resources.quickOrderproductDimensionTypeAmountErrorMessage\n : resources.quickOrderproductDimensionTypeStyleErrorMessage;\n default:\n return '';\n }\n };\n\n private readonly _updateProductAvailability = async (): Promise<void> => {\n if (this.state.productAvailableQuantity === undefined) {\n await this._updateAvailability();\n }\n };\n\n /**\n * Method to validate the cart.\n * @param productResponse - Simple product object.\n * @param quantity - Quantity.\n * @returns Flag after validating cart.\n */\n private readonly _validateCart = async (productResponse: SimpleProduct, quantity: number): Promise<boolean> => {\n const missingDimensions = productResponse.Dimensions?.filter((dimension: ProductDimension) => !dimension.DimensionValue?.Value);\n if (missingDimensions && missingDimensions.length > 0) {\n const userMessage = this._getConfigureErrors(missingDimensions, false);\n if (this.state.productDimensionErrorState.configureErrors) {\n const errorState = { ...this.state.productDimensionErrorState };\n errorState.configureErrors = userMessage;\n\n this.setState({ productDimensionErrorState: errorState });\n return false;\n }\n }\n\n if (quantity <= 0) {\n const resources = this.props.resources;\n this.setState({\n stateMessage: {\n messageText: resources.quickOrderWrongQuantityErrorMsg,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n }\n });\n return false;\n }\n\n // If stock check false no need to check the availability.\n const { context } = this.props;\n if (!context.app.config.enableStockCheck) {\n return true;\n }\n\n await this._updateProductAvailability();\n const { productAvailableQuantity } = this.state;\n const availableQuantity = productAvailableQuantity ? productAvailableQuantity.ProductAvailableQuantity.AvailableQuantity : 0;\n if (availableQuantity === undefined || availableQuantity <= 0) {\n this.setState({\n stateMessage: {\n messageText: this.props.resources.quickOrderOutofStockErrorMsg,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n }\n });\n return false;\n }\n return true;\n };\n\n /**\n * Method to get configuration error string.\n * @param result - List of Dimension values.\n * @param isGiftCard - Flag to check giftcard.\n * @returns Error object.\n */\n private _getConfigureErrors(\n result: ProductDimension[] | undefined,\n isGiftCard?: boolean\n ): { [configureId: string]: string | undefined } {\n if (!result) {\n return {};\n }\n const dimensions: { [configureId: string]: string | undefined } = {};\n const resources = this.props.resources;\n for (const dimension of result) {\n dimensions[dimension.DimensionTypeValue] = this._getDimensionErrorString(dimension.DimensionTypeValue, resources, isGiftCard);\n }\n return dimensions;\n }\n}\n\nexport default QuickOrder;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IProductDimensionConfigureDropdownViewProps, IProductDimensionConfigureViewProps } from '@msdyn365-commerce/components';\nimport { INodeProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IQuickOrderFormViewProps, IQuickOrderViewProps } from './index';\n\n/**\n * Render product dimension/configure container.\n * @param configure -- Product dimension configuration.\n * @returns Container to have dimension dropdown.\n */\nconst renderConfigure = (configure?: IProductDimensionConfigureViewProps): JSX.Element | null => {\n if (configure !== undefined) {\n const { containerProps, dropdowns } = configure;\n\n return <Node {...containerProps}>{dropdowns.map(renderConfigureDropdown)}</Node>;\n }\n return null;\n};\n\n/**\n * Render product dimension/configure dropdown.\n * @param dropdown -- Product dimension drop down.\n * @returns Dropdown.\n */\nconst renderConfigureDropdown = (dropdown: IProductDimensionConfigureDropdownViewProps): JSX.Element => {\n const { containerProps, labelContainerProps, heading, errors, select } = dropdown;\n\n return (\n <Node {...containerProps}>\n <Node {...labelContainerProps}>{heading}</Node>\n {errors}\n {select}\n </Node>\n );\n};\n\nconst renderForm = (\n form: IQuickOrderFormViewProps,\n isMobileView: boolean,\n quickOrderForm: INodeProps,\n quickOrderProductContent: INodeProps,\n quickOrderMsgContent: INodeProps,\n configure?: IProductDimensionConfigureViewProps\n) => {\n return isMobileView ? (\n <Node {...quickOrderForm}>\n <Node {...quickOrderProductContent}>\n {form.product}\n {renderConfigure(configure)}\n {form.quantity}\n <Node {...quickOrderMsgContent}>{form.userMessage}</Node>\n {form.addToCartBtn}\n </Node>\n </Node>\n ) : (\n <Node {...quickOrderForm}>\n <Node {...quickOrderMsgContent}>{form.userMessage}</Node>\n <Node {...quickOrderProductContent}>\n {form.product}\n {renderConfigure(configure)}\n {form.quantity}\n {form.addToCartBtn}\n </Node>\n </Node>\n );\n};\n\nconst quickOrderView: React.FC<IQuickOrderViewProps> = props => {\n const {\n quickOrderProps,\n contentProps,\n form,\n quickOrderForm,\n drawer,\n configure,\n quickOrderFormProductContent,\n quickOrderFormMsgContent,\n quickOrderList,\n isMobileView\n } = props;\n\n return (\n <Module {...quickOrderProps}>\n <Node {...drawer}>\n <Node {...contentProps}>\n {renderForm(\n form as IQuickOrderFormViewProps,\n isMobileView,\n quickOrderForm,\n quickOrderFormProductContent,\n quickOrderFormMsgContent,\n configure\n )}\n </Node>\n </Node>\n\n {quickOrderList}\n </Module>\n );\n};\nexport default quickOrderView;\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 { SubmitUserReviewInput } from './inputs/submit-user-review-input';\n\n/**\n * This data action allows submitting review to the reviews service.\n * @param input This user review submission text.\n * @param ctx The data action context.\n */\nasync function submitReview(input: SubmitUserReviewInput, ctx: IActionContext): Promise<string> {\n if (!inputIsValid(input)) {\n ctx.trace(`[SubmitUserReview] Failed to submit reviews for product due to bad input ${input}`);\n return '';\n }\n\n const requestUrl =\n `${input.serviceEndpoint}/v2.0/reviews/product/${input.productId}/user?` +\n `tenantId=${input.tenantId}&` +\n `channelId=${input.channelId}&` +\n `locale=${input.locale}`;\n\n return sendRequest<string>(requestUrl, 'post', input.userReviewData, { headers: { Authorization: `id_token ${input.authorization}` } })\n .then(response => {\n if (response.status !== 200 && response.status !== 201) {\n ctx.trace('[SubmitUserReview] Failed to submit reviews for product');\n ctx.trace(response.data);\n return '';\n }\n return response.data;\n })\n .catch(error => {\n ctx.trace('[SubmitUserReview] Failed to submit reviews for product');\n ctx.telemetry.exception(error);\n ctx.telemetry.debug('[SubmitUserReview] Failed to submit reviews for product');\n ctx.trace(error);\n return '';\n });\n}\n\nfunction inputIsValid(input: SubmitUserReviewInput): boolean {\n return input && !!input.productId && !!input.tenantId;\n}\n\nexport const submitReviewDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/ratings-reviews/submit-user-review',\n action: <IAction<string>>submitReview\n});\n\nexport default submitReviewDataAction;\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\nimport { IUserReviewData } from './submit-user-review-input-data';\n\n/**\n * SubmitUserReview Input Action.\n */\nexport class SubmitUserReviewInput implements IActionInput {\n /**\n * The Id representing the product to get the ratings for.\n */\n public productId?: string;\n\n /**\n * The ID representing the tenant.\n */\n public tenantId: string;\n\n /**\n * The calling organization's channel id.\n */\n public channelId: string;\n\n /**\n * The locale for which to get the ratings from.\n */\n public locale: string;\n\n /**\n * The user's review data.\n */\n public userReviewData: IUserReviewData;\n\n /**\n * The user's authorization token.\n */\n public authorization: string;\n\n /**\n * The ratings and reviews service endpoint.\n */\n public serviceEndpoint: string;\n\n constructor(\n productId: string | undefined,\n tenantId: string,\n channelId: string,\n locale: string,\n userReviewData: IUserReviewData,\n authorization: string,\n serviceEndpoint: string\n ) {\n this.productId = productId;\n this.tenantId = tenantId;\n this.channelId = channelId;\n this.locale = locale;\n this.userReviewData = userReviewData;\n this.authorization = authorization;\n this.serviceEndpoint = serviceEndpoint;\n }\n\n public getCacheKey = () => 'SubmitUserReview';\n\n public getCacheObjectType = () => 'SubmitUserReview';\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 { getUrlSync, IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { getRnrAuthEndpointId, getRnrPartnerId } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n Alert,\n Button,\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 classNames from 'classnames';\nimport { GetUserReviewInput } from '../actions/inputs/get-user-review-input';\nimport { SubmitUserReviewInput } from '../actions/inputs/submit-user-review-input';\nimport submitUserReview from '../actions/submit-user-review';\n\nexport interface IReviewModalProps {\n userReview?: Review;\n product?: SimpleProduct;\n renderContextId: string;\n resources: IReviewModalResources;\n context: ICoreContext<IGeneric<IAny>>;\n parentId: string;\n parentType: string;\n isOpen: boolean;\n rating: number;\n reviewTitle: string;\n reviewText: string;\n returnRef: React.RefObject<HTMLButtonElement> | undefined;\n hasError: boolean;\n telemetryContent?: ITelemetryContent;\n onModalToggle(): void;\n onTitleChange(event: React.ChangeEvent<HTMLInputElement>): void;\n onTextChange(event: React.ChangeEvent<HTMLTextAreaElement>): void;\n onRatingChange(value: number): void;\n onReviewComplete?(isSuccess: boolean): void;\n modalCSS?: string;\n}\n\nexport interface IReviewModalResources {\n selectRatingAriaLabel: string;\n selectRatingLabel: string;\n reviewTitleLabel: string;\n reviewTextLabel: string;\n privacyPolicyTitle: string;\n privacyPolicyTextFormat: string;\n writeReviewModalTitle: string;\n editReviewModalTitle: string;\n submitReviewButtonText: string;\n discardReviewButtonText: string;\n errorMessageText: string;\n reviewTitleAriaLabel?: string;\n reviewAriaLabel?: string;\n}\n\nexport interface IReviewModalViewProps {\n modal: INodeProps;\n modalHeader: React.ReactElement;\n modalFooter: INodeProps;\n modalBody: INodeProps;\n cancelButton: React.ReactElement;\n submitButton: React.ReactElement;\n rating: React.ReactElement;\n ratingLabel: React.ReactElement;\n titleInput: React.ReactElement;\n titleLabel: React.ReactElement;\n textInput: React.ReactElement;\n textLabel: React.ReactElement;\n privacyPolicyUrl: React.ReactElement;\n form: INodeProps;\n inputRow: INodeProps;\n error: React.ReactElement;\n}\n\n/**\n * On Click Submit.\n * @param props -Review Modal props.\n * @returns On submit.\n */\nconst onClickSubmit = (props: IReviewModalProps) => () => {\n onSubmit(props);\n};\n\n/**\n * CartLineItems component.\n */\n\nexport const ReviewModal = (props: IReviewModalProps): IReviewModalViewProps => {\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.SubmitReview);\n const submitButtonAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n payLoad.contentAction.etext = TelemetryConstant.Cancel;\n const cancelButtonAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n return {\n modal: {\n tag: Modal,\n className: props.modalCSS ? classNames(props.modalCSS, 'msc-modal-input-required') : 'ms-review-modal msc-modal-input-required',\n toggle: props.onModalToggle,\n applicationNode: 'renderPage',\n isOpen: props.isOpen,\n returnFocusRef: props.returnRef\n },\n modalHeader: modalHeaderNode(props),\n modalFooter: { tag: ModalFooter, className: 'ms-review-modal-footer' },\n modalBody: { tag: ModalBody, className: 'ms-review-modal-body' },\n cancelButton: (\n <Button className='ms-review-modal-cancel' onClick={props.onModalToggle} {...submitButtonAttribute}>\n {props.resources.discardReviewButtonText}\n </Button>\n ),\n submitButton: (\n <Button\n className='ms-review-modal-submit'\n onClick={onClickSubmit(props)}\n {...cancelButtonAttribute}\n disabled={submitDisabled(props)}\n >\n {props.resources.submitReviewButtonText}\n </Button>\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 <Alert className='ms-review-modal-error' isOpen={props.hasError} color='danger'>\n {props.resources.errorMessageText}\n </Alert>\n )\n };\n};\n\nconst modalHeaderNode = (props: IReviewModalProps) => {\n return (\n <ModalHeader toggle={props.onModalToggle} className='ms-review-modal-header'>\n {props.userReview && props.userReview.reviewId ? props.resources.editReviewModalTitle : props.resources.writeReviewModalTitle}\n </ModalHeader>\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 <RatingComponent\n readOnly={false}\n avgRating={0}\n ariaLabel={props.resources.selectRatingAriaLabel}\n initialRating={props.rating}\n context={props.context}\n id={props.parentId}\n typeName={props.parentType}\n data={{}}\n key='ratings'\n onChange={props.onRatingChange}\n />\n );\n};\n\nconst ratingsLabel = (props: IReviewModalProps) => {\n return (\n <label className='ms-review-modal-rating-label' key='ratingsLabel'>\n {props.resources.selectRatingLabel}*\n </label>\n );\n};\n\nconst titleInput = (props: IReviewModalProps) => {\n const maxLength = props.context.app.config.reviewTitleMaxLength;\n\n return (\n <input\n maxLength={maxLength}\n id={`reviewTitle-${props.renderContextId}`}\n onChange={props.onTitleChange}\n value={props.reviewTitle}\n aria-required='true'\n className='ms-review-modal-title'\n aria-label={props.resources.reviewTitleAriaLabel}\n />\n );\n};\n\nconst titleLabel = (props: IReviewModalProps) => {\n return (\n <label className='ms-review-modal-title-label' htmlFor={`reviewTitle-${props.renderContextId}`}>\n {props.resources.reviewTitleLabel}\n </label>\n );\n};\n\nconst reviewTextWidth: number = 50;\n\nconst textInput = (props: IReviewModalProps) => {\n const maxLength = props.context.app.config.reviewTextMaxLength;\n return (\n <textarea\n maxLength={maxLength}\n className='ms-review-modal-text'\n id={`reviewTextArea-${props.renderContextId}`}\n onChange={props.onTextChange}\n rows={maxLength / reviewTextWidth}\n value={props.reviewText}\n aria-required='true'\n aria-label={props.resources.reviewAriaLabel}\n />\n );\n};\n\nconst textLabel = (props: IReviewModalProps) => {\n return (\n <label htmlFor={`reviewTextArea-${props.renderContextId}`} className='ms-review-modal-text-label'>\n {props.resources.reviewTextLabel}\n </label>\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 <p className='ms-review-modal-policy'>\n {isSeparatorAtStart ? '' : policyTextBlocks[0]}\n <a href={privacyPolicyUrl} rel='noreferrer' target='_blank' className='msc-link' {...privacyPolicyAttribute}>\n {props.resources.privacyPolicyTitle}\n </a>\n {isSeparatorAtEnd ? '' : isSeparatorAtStart ? policyTextBlocks[0] : policyTextBlocks[1]}\n </p>\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 <span aria-hidden='true' className='ms-ratings-histogram__star'>\n {stars}\n </span>\n ),\n percentage: (\n <span aria-hidden='true' className='ms-ratings-histogram__percentage'>\n {formattedPercent}\n </span>\n ),\n bar: <Progress value={percentage * 100} max={100} ariaLabel={ariaLabel} className='ms-ratings-histogram__bar' />,\n buttonProps: {\n tag: 'button',\n className: 'ms-ratings-histogram__item',\n onClick: () => {\n props.onClick(stars);\n }\n }\n };\n};\n\nexport const AverageRatingNumber: React.FC<{ summary: RatingsSummary }> = (props: { summary: RatingsSummary }) => {\n return (\n <p className='ms-ratings-histogram__average'>\n {props.summary.averageRating}\n {` `}/ 5\n </p>\n );\n};\n\nexport const TotalReviews: React.FC<{ summary: RatingsSummary }> = (props: { summary: RatingsSummary }) => {\n return <p className='ms-ratings-histogram__total'>{props.summary.totalRatingsCount}</p>;\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { RatingComponent } from '@msdyn365-commerce/components';\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { format, IModuleProps, INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport classname from 'classnames';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { createRatingsReviewsStateInput } from '../../actions/ratings-reviews-state-data-action';\nimport { AverageRatingNumber, HistogramItems, IHistogramItemViewProps, TotalReviews } from './component/components';\nimport { IRatingsHistogramData } from './ratings-histogram.data';\nimport { IRatingsHistogramProps } from './ratings-histogram.props.autogenerated';\n\nexport interface IRatingsHistogramViewProps extends IRatingsHistogramProps<IRatingsHistogramData> {\n className: string;\n histogramItems: IHistogramItemViewProps[];\n moduleProps: IModuleProps;\n heading: React.ReactNode;\n averageRating: React.ReactNode;\n averageNumber: React.ReactNode;\n totalReviews: React.ReactNode;\n histogramProps: INodeProps;\n ratingsSummaryProps: INodeProps;\n callbacks: IRatingsHistogramCallbacks;\n}\n\nexport interface IRatingsHistogramCallbacks {\n selectFilterBy(stars: number): void;\n}\n\n/**\n * RatingsHistogram component.\n * @extends {React.Component<IRatingsHistogramProps<IRatingsHistogramData>>}\n */\n@observer\nclass RatingsHistogram extends React.PureComponent<IRatingsHistogramProps<IRatingsHistogramData>> {\n constructor(props: IRatingsHistogramProps<IRatingsHistogramData>) {\n super(props);\n this.selectFilterBy = this.selectFilterBy.bind(this);\n }\n\n public render(): JSX.Element | null {\n const { resources } = this.props;\n const { className, heading } = this.props.config;\n const {\n ratingsSummary: { result: ratingsSummary }\n } = this.props.data;\n const ratingCount = ratingsSummary && ratingsSummary.totalRatingsCount ? `${ratingsSummary.totalRatingsCount}` : '0';\n\n const completeClass = classname('ms-ratings-histogram', className);\n const viewProps: IRatingsHistogramViewProps = {\n ...this.props,\n className: completeClass,\n callbacks: {\n selectFilterBy: this.selectFilterBy\n },\n moduleProps: {\n moduleProps: this.props,\n className: completeClass\n },\n histogramItems: ratingsSummary\n ? HistogramItems({\n ratingsSummary,\n resources: { ...resources },\n locale: this.props.context.request.locale,\n onClick: this.selectFilterBy\n })\n : [],\n averageRating: ratingsSummary && (\n <RatingComponent\n avgRating={ratingsSummary.averageRating!}\n ratingCount={ratingCount}\n ariaLabel={format(this.props.resources.averageRatingAriaLabel, ratingsSummary.averageRating, '5')}\n readOnly\n context={this.props.context}\n hideCount\n id={this.props.id}\n typeName={this.props.typeName}\n data={{}}\n />\n ),\n averageNumber: ratingsSummary && <AverageRatingNumber summary={ratingsSummary} />,\n totalReviews: ratingsSummary && <TotalReviews summary={ratingsSummary} />,\n ratingsSummaryProps: { className: 'ms-ratings-histogram__summary' },\n heading: heading && (\n <Msdyn365.Text\n className='ms-ratings-histogram__heading'\n tag={heading.tag || 'h2'}\n text={heading.text}\n editProps={{ onEdit: this.handleHeadingChange, requestContext: this.props.context.request }}\n />\n ),\n histogramProps: { className: 'ms-ratings-histogram__histogram' }\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n public handleHeadingChange = (event: Msdyn365.ContentEditableEvent) => (this.props.config.heading!.text = event.target.value);\n\n public selectFilterBy(stars: number): void {\n const filterKey = `${stars}`;\n this.props.context.actionContext.update(createRatingsReviewsStateInput({ filterKey }), { filterKey });\n }\n}\n\nexport default RatingsHistogram;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IHistogramItemViewProps } from './component/components';\nimport { IRatingsHistogramViewProps } from './ratings-histogram';\n\nconst RatingsHistogramView: React.FC<IRatingsHistogramViewProps> = props => {\n const { heading, histogramItems, histogramProps, moduleProps } = props;\n\n return (\n <Module {...moduleProps}>\n {heading}\n <Node {...histogramProps}>\n {histogramItems.map(item => {\n return histogramItem(item);\n })}\n </Node>\n </Module>\n );\n};\n\nconst histogramItem = (props: IHistogramItemViewProps) => {\n return (\n <Node {...props.buttonProps}>\n {props.starLabel}\n {props.bar}\n {props.percentage}\n </Node>\n );\n};\n\nexport default RatingsHistogramView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { 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<boolean> {\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<boolean>(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: <IAction<boolean>>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<boolean> {\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<boolean>(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: <IAction<boolean>>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<IReviewCountProps> = (props: IReviewCountProps) => {\n const { currentPage, resources, reviewsCount, reviewsShownOnEachPage } = props;\n\n return (\n <span aria-live='polite' className='sr-only'>\n {format(\n resources.pageReviewCountText,\n _getReviewStartNumber(currentPage, reviewsShownOnEachPage),\n _getReviewEndNumber(currentPage, reviewsCount, reviewsShownOnEachPage),\n reviewsCount\n )}\n </span>\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<void>;\n}\n\nexport const PageControls: React.FC<IPageControlsProps> = (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 <div className='ms-reviews-list__page-controls'>\n {_hasPreviousPage(currentPage) && (\n <button\n onClick={previousPageClick}\n className='ms-reviews-list__previous'\n aria-label={_paginationAriaLabel(\n resources.pageReviewAriaLabel,\n currentPage,\n reviewsCount,\n reviewsShownOnEachPage,\n false\n )}\n {...previousAttribute}\n >\n {resources.previousButtonText}\n </button>\n )}\n {_hasNextPage(currentPage, reviewsCount, reviewsShownOnEachPage) && (\n <button\n onClick={nextPageClick}\n className='ms-reviews-list__next'\n aria-label={_paginationAriaLabel(\n resources.pageReviewAriaLabel,\n currentPage,\n reviewsCount,\n reviewsShownOnEachPage,\n true\n )}\n {...nextAttribute}\n >\n {resources.nextButtonText}\n </button>\n )}\n </div>\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<IGeneric<IAny>>;\n isOpen: boolean;\n returnRef: React.RefObject<HTMLButtonElement> | undefined;\n reportedKey: string;\n hasError: boolean;\n telemetryContent?: ITelemetryContent;\n onModalToggle(): void;\n onRadioChange(event: React.ChangeEvent<HTMLInputElement>): 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: <p className='ms-reviews-list__report-header'>{props.resources.reportConcernText}</p>,\n headerSubmitted: <p className='ms-reviews-list__report-header'>{props.resources.feedbackThankYouText}</p>,\n cancelButton: (\n <button className='msc-btn ms-reviews-list__cancel' onClick={props.onModalToggle} {...cancelAttribute}>\n {props.resources.cancelReportReviewText}\n </button>\n ),\n submitButton: (\n <button className='msc-btn ms-reviews-list__submit' onClick={props.reportReview} {...submitReviewAttribute}>\n {' '}\n {props.resources.reportReviewButtonText || 'Report'}\n </button>\n ),\n succesfulButton: (\n <button className='msc-btn ms-reviews-list__success' onClick={props.onModalToggle} {...successAttribute}>\n {props.resources.okReportReviewText}\n </button>\n ),\n reportMessage: <p className='ms-reviews-list__report-message'>{props.resources.reportModalMessage}</p>,\n reportSubmittedMessage: <p className='ms-reviews-list__report-message'>{props.resources.reportSubmittedMessage}</p>,\n radioButtons: radioPairs(props),\n error: (\n <Alert className='ms-reviews-list__report-error' isOpen={props.hasError} color='danger'>\n {props.resources.errorMessageText}\n </Alert>\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 <div className='ms-report-review-modal-pair' key={option.key}>\n <input\n className='msc-radio-input'\n type='radio'\n name='report-error'\n id={inputId}\n data-key={option.key}\n value={option.value}\n checked={checked}\n aria-checked={checked}\n onChange={props.onRadioChange}\n />\n <label className='msc-radio-label' htmlFor={inputId}>\n {option.value}\n </label>\n </div>\n );\n }\n\n return <fieldset>{pairs}</fieldset>;\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<IGeneric<IAny>>;\n isUserReview?: boolean;\n parentId: string;\n parentType: string;\n reportedReviews: string[];\n returnRef: React.RefObject<HTMLButtonElement> | 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: <p className='ms-reviews-list__name'>{props.review.userName}</p>,\n rating: rating(props),\n date: <p className='ms-reviews-list__date'>{renderDate(props, props.review.submittedDateTime)}</p>,\n reviewTitle: <h4 className='ms-reviews-list__title'>{props.review.title}</h4>,\n reviewText: <p className='ms-reviews-list__text'>{props.review.reviewText}</p>,\n ratingHelpfulLabel: props.isUserReview ? (\n undefined\n ) : (\n <p className='ms-reviews-list__helpful'>{props.resources.wasReviewHelpfulText}</p>\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 <p className='ms-reviews-list__response-name'>{props.review.userResponse.responderName}</p>\n ) : (\n undefined\n ),\n responseText: props.review.userResponse ? (\n <p className='ms-reviews-list__response-text'>{props.review.userResponse.responseText}</p>\n ) : (\n undefined\n ),\n responseDate: props.review.userResponse ? (\n <p className='ms-reviews-list__response-date'>{renderDate(props, props.review.userResponse.submittedDateTime)}</p>\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 <RatingComponent\n readOnly\n avgRating={props.review.rating}\n ariaLabel={format(props.resources.reviewRatingNarratorText || '', props.review.rating, '5')}\n context={props.context}\n className='ms-reviews-list__rating'\n id={props.parentId}\n typeName={props.parentType}\n data={{}}\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 <Button aria-label={label} className={className} title={title} onClick={onClick}>\n {title}\n </Button>\n );\n }\n return (\n <Button href={user.signInUrl} aria-label={label} className={className} title={title} tag='a'>\n {title}\n </Button>\n );\n};\n\nconst editButton = (props: IReviewCardProps) => {\n if (props.isUserReview && !isOboRequest(props.context.request)) {\n return (\n <Button id={TOGGLE_EDIT_MODAL_BUTTON_CARD_ID} className='ms-reviews-list__edit' onClick={props.toggleWriteReviewModal}>\n {props.resources.editReviewCardText}\n </Button>\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 <Button href={user.signInUrl} className='ms-reviews-list__report' tag='a'>\n {' '}\n {props.resources.reportConcernText}\n </Button>\n );\n }\n\n if (props.reportedReviews.includes(props.review.reviewId!)) {\n return <p className='ms-reviews-list__reported'>{props.resources.reportedText}</p>;\n }\n\n const ref = props.review.reviewId === props.reportedReviewId ? props.returnRef : undefined;\n\n return (\n <Button className='ms-reviews-list__report' onClick={onClick(props)} innerRef={ref}>\n {props.resources.reportConcernText}\n </Button>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { 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<IReviewsListData> {\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<IReviewsListProps<IReviewsListData>, IReviewsListState>}\n */\n@observer\nclass ReviewsList extends React.Component<IReviewsListProps<IReviewsListData>, 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<HTMLButtonElement>;\n\n private readonly _userReportModalToggle: React.RefObject<HTMLButtonElement>;\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<IReviewsListData>) {\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<HTMLButtonElement>();\n this._userReportModalToggle = React.createRef<HTMLButtonElement>();\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<IReviewsListData>, 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 <LabeledDropdown\n labelText={resources.filterByDropdownText}\n dropdownId='reviewsListFilterBy'\n dropdownOptions={this.filterByDropdownOptions}\n selectedOption={selectedFilterByOption}\n onSelectOption={this.updateFilterByDropdown}\n controlledByParent\n />\n ),\n sortByDropdown: (\n <LabeledDropdown\n labelText={resources.sortByDropdownText}\n dropdownId='reviewsListSortBy'\n dropdownOptions={this.sortByDropdownOptions}\n selectedOption={selectedSortByOption}\n onSelectOption={this.updateSortByDropdown}\n />\n ),\n averageRating: ratingsSummary && (\n <RatingComponent\n avgRating={ratingsSummary.averageRating || 0}\n readOnly\n ariaLabel={format(resources.averageRatingAriaLabel, ratingsSummary.averageRating, '5')}\n ratingCount={`${ratingsSummary.reviewsCount}`}\n data={{}}\n context={this.props.context}\n id={this.props.id}\n typeName={this.props.typeName}\n />\n ),\n reviewCount: (\n <ReviewCount\n resources={{ ...this.props.resources }}\n currentPage={currentPage}\n reviewsCount={reviewsCount}\n reviewsShownOnEachPage={reviewsShownOnEachPage}\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 <PageControls\n resources={{ ...this.props.resources }}\n currentPage={currentPage}\n reviewsShownOnEachPage={reviewsShownOnEachPage}\n selectedSortByOption={selectedSortByOption}\n selectedFilterByOption={selectedFilterByOption}\n updateReviews={this.updateReviews}\n reviewsCount={reviewsCount}\n telemetryContent={this.telemetryContent}\n />\n ),\n noReviewsMessage: (\n <span className='ms-reviews-list__empty-message' aria-live='polite'>\n {resources.noReviewsMessage}\n </span>\n ),\n noReviewsWithFilterMessage: (\n <span className='ms-reviews-list__filter-message' aria-live='polite'>\n {resources.noReviewsWithSelectedFilterMessage}\n </span>\n ),\n heading: heading && heading.text && (\n <Msdyn365.Text\n className='ms-reviews-list__heading'\n tag={heading.tag || 'h2'}\n text={heading.text}\n editProps={{ onEdit: this.handleHeadingChange, requestContext: this.props.context.request }}\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<HTMLInputElement>): void => {\n this.reviewsListCallbacks.updateReviewTitle(event.target.value);\n };\n\n private readonly _onTextChange = (event: React.ChangeEvent<HTMLTextAreaElement>): 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<HTMLInputElement>) => {\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<IReviewsListViewProps> = 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 <Module {...moduleProps}>{noReviewsMessage}</Module>;\n }\n\n return (\n <Module {...moduleProps}>\n {heading}\n {averageRating}\n {reviewCount}\n <Node {...refineReviewsProps}>\n {sortByDropdown}\n {filterByDropdown}\n </Node>\n <Node {...reviewsListProps}>\n {userReview && buildReviewCard(userReview)}\n {reviewCards.map(review => {\n return buildReviewCard(review);\n })}\n </Node>\n {reviewCards.length === 0 && state.isFilterApplied && noReviewsWithFilterMessage}\n {pageControls}\n {createReviewModal(reviewModal, moduleProps)}\n {createReportModal(reportReviewModal, state)}\n </Module>\n );\n};\n\nconst buildReviewCard = (props: IReviewCardViewProps) => {\n return (\n <Node {...props.cardProps}>\n <Node {...props.headerProps}>\n {props.rating}\n {props.name}\n </Node>\n <Node {...props.cardBodyProps}>\n <Node {...props.reviewProps}>\n {props.reviewTitle}\n {props.date}\n {props.reviewText}\n </Node>\n <Node {...props.responseProps}>\n {props.responseName}\n {props.responseDate}\n {props.responseText}\n </Node>\n <Node {...props.controlsProps}>\n {props.ratingHelpfulLabel}\n {props.like}\n {props.dislike}\n {props.edit}\n {props.report}\n </Node>\n </Node>\n </Node>\n );\n};\n\nconst createReviewModal = (props: IReviewModalViewProps, moduleProps: IModuleProps): JSX.Element => {\n return (\n <Module {...props.modal} {...moduleProps}>\n {props.modalHeader}\n <Node {...props.modalBody}>\n <Node {...props.form}>\n <Node {...props.inputRow}>\n {props.rating}\n {props.ratingLabel}\n </Node>\n <Node {...props.inputRow}>\n {props.titleLabel}\n {props.titleInput}\n </Node>\n <Node {...props.inputRow}>\n {props.textLabel}\n {props.textInput}\n </Node>\n {props.privacyPolicyUrl}\n {props.error}\n </Node>\n </Node>\n <Node {...props.modalFooter}>\n {props.submitButton}\n {props.cancelButton}\n </Node>\n </Module>\n );\n};\n\nconst createReportModal = (props: IReportReviewModalViewProps, state: IReviewsListState): JSX.Element => {\n return (\n <Node {...props.modal}>\n <Node {...props.modalHeader}>{state.reported ? props.headerSubmitted : props.header}</Node>\n <Node {...props.modalBody}>\n {state.reported ? props.reportSubmittedMessage : [props.reportMessage, props.radioButtons, props.error]}\n </Node>\n <Node {...props.modalFooter}>{state.reported ? props.succesfulButton : [props.submitButton, props.cancelButton]}</Node>\n </Node>\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 <p className='ms-write-review__sign-in'>{props.text}</p>;\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 <a href={href} className='ms-write-review__sign-in-btn msc-btn' aria-label={ariaLabel} {...attributes}>\n {text}\n </a>\n );\n};\n\ninterface IModalToggleProps {\n innerRef: React.RefObject<HTMLButtonElement> | undefined;\n id: string;\n text: string;\n ariaLabel: string;\n telemetryContent?: ITelemetryContent;\n onClick(): void;\n}\n\nexport const ModalToggle: React.FC<IModalToggleProps> = (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 <button id={id} className='ms-write-review__toggle msc-btn' aria-label={ariaLabel} onClick={onClick} ref={innerRef} {...attributes}>\n {text}\n </button>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { 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<IWriteReviewData> {\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<IWriteReviewProps<IWriteReviewData>>}\n */\nclass WriteReview extends React.PureComponent<IWriteReviewProps<IWriteReviewData>, IWriteReviewState> {\n private readonly _modalToggleRef: React.RefObject<HTMLButtonElement> | 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<IWriteReviewData>) {\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<HTMLButtonElement>();\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: <SignInMessage text={resources.signInMessage} />,\n signInButton: (\n <SignInButton\n text={resources.signInLabel}\n ariaLabel={resources.signInAriaLabel}\n href={userInfo.signInUrl!}\n telemetryContent={this.telemetryContent}\n />\n ),\n modalToggle: !Msdyn365.isOboRequest(this.props.context.request) && product && (\n <ModalToggle\n text={userReview ? resources.editReviewButtonText : resources.reviewButtonLabel}\n ariaLabel={resources.reviewButtonLabel}\n innerRef={this._modalToggleRef}\n onClick={this._toggleReviewModal}\n id={TOGGLE_REVIEW_MODAL_BUTTON_ID}\n telemetryContent={this.telemetryContent}\n />\n ),\n reviewModal: this._buildUserReviewModal(),\n heading: heading && heading.text && (\n <Msdyn365.Text\n className='ms-write-review__heading'\n tag={heading.tag || 'h2'}\n text={heading.text}\n editProps={{ onEdit: this.handleHeadingChange, requestContext: this.props.context.request }}\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<HTMLInputElement>): void => {\n this.writeReviewCallbacks.updateReviewTitle(event.target.value);\n };\n\n private readonly _onTextChange = (event: React.ChangeEvent<HTMLTextAreaElement>): 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<IWriteReviewViewProps> = props => {\n const { heading, signInMessage, signInButton, modalToggle, reviewModal, moduleProps } = props;\n const isAuthenticated = props.context.request.user.isAuthenticated;\n return (\n <Module {...moduleProps}>\n {heading}\n {!isAuthenticated ? (\n <>\n {signInMessage}\n {signInButton}\n </>\n ) : (\n <>\n {modalToggle}\n {createReviewModal(reviewModal, moduleProps)}\n </>\n )}\n </Module>\n );\n};\n\nconst createReviewModal = (props: IReviewModalViewProps, moduleProps: IModuleProps): JSX.Element => {\n return (\n <Module {...props.modal} {...moduleProps}>\n {props.modalHeader}\n <Node {...props.modalBody}>\n <Node {...props.form}>\n <Node {...props.inputRow}>\n {props.rating}\n {props.ratingLabel}\n </Node>\n <Node {...props.inputRow}>\n {props.titleLabel}\n {props.titleInput}\n </Node>\n <Node {...props.inputRow}>\n {props.textLabel}\n {props.textInput}\n </Node>\n {props.privacyPolicyUrl}\n {props.error}\n </Node>\n </Node>\n <Node {...props.modalFooter}>\n {props.submitButton}\n {props.cancelButton}\n </Node>\n </Module>\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 { 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<IChoiceSummaryProps> {\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<IChoiceSummaryProps>) {\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 <div className='msc-choice-summary'>\n {items.length > 0 && label && <span className='msc-choice-summary__label'>{label}</span>}\n <ul className={classnames(classNames, 'msc-choice-summary__list', 'list-unstyled')}>\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 <li className='msc-choice-summary__list-item' key={item.key}>\n <a\n className='msc-choice-summary__item'\n href={this.props.urlBuilder(item.value, false)}\n aria-label={`${item.value.LeftValueBoundString} ${choiceAriaLabel}`}\n onClick={this._onClick}\n role='button'\n id={item.key}\n {...attribute}\n >\n {newIntRange}\n <span\n className={`${this.closeButtonGlyph} msc-choice-summary__glyph`}\n role='button'\n aria-label={closeAriaLabel}\n />\n </a>\n </li>\n );\n })}\n </ul>\n {items.length > 0 && clearAllText && (\n <a\n href={this.props.urlBuilder({}, true)}\n className='msc-choice-summary__clear-all'\n {...clearAllAttributes}\n onClick={this._onClick}\n >\n {clearAllText}\n </a>\n )}\n </div>\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<HTMLAnchorElement>): 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<IErrorMessage> = ({ text }) => {\n return (\n <span className='ms-search-result-container__no-results-message'>\n <h5 className='error-text'>\n {` `}\n {text}\n {` `}\n </h5>\n </span>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { 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<IFeatureSearchResultItem> = ({\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 <div className='ms-feature-search-result__item'>\n <a\n href={productUrl}\n onClick={onTelemetryClick(telemetryContent!, payLoad, product.Name!)}\n {...attribute}\n aria-label={product.Name}\n >\n <div className='msc-feature-search-result__item__image'>\n {renderProductPlacementImage(\n imageSettings,\n context.request.gridSettings,\n product.PrimaryImageUrl,\n product.Name,\n fallbackImage,\n context.actionContext.requestContext\n )}\n </div>\n </a>\n <div className='msc-feature-search-result__item__detail'>\n <p className='msc-feature-search-result__item__heading'>{heading}</p>\n {renderProductTitle(product?.Name)}\n </div>\n </div>\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 <Image {...img} {...imageProps} loadFailureBehavior='empty' requestContext={context} />;\n}\n\nfunction renderProductTitle(title?: string): JSX.Element | null {\n return <h1 className='msc-feature-search-result__item__product-title'>{title}</h1>;\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<ILink> = ({ text, className, href, ariaLabel }) => (\n <a className={className} href={href} aria-label={ariaLabel}>\n {' '}\n {text}{' '}\n </a>\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<HTMLButtonElement> | 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<HTMLButtonElement> | undefined;\n onModalToggle(): void;\n}\n\nexport const ModalToggle: React.FC<IModalToggleProps> = (props: IModalToggleProps) => {\n const { text, onClick, ariaLabel, innerRef, id } = props;\n return (\n <button id={id} className='msc-button' aria-label={ariaLabel} onClick={onClick} ref={innerRef}>\n {text}\n </button>\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: <ModalBody className='msc-review-modal-body' />\n };\n};\n\nconst modalNode = (props: ISearchResultModalProps) => {\n return (\n <Modal\n autoFocus\n applicationNode='renderPage'\n returnFocusRef={props.returnRef}\n isOpen={props.isOpen}\n toggle={props.onModalToggle}\n className='msc-search-result-modal'\n zIndex={1050}\n />\n );\n};\n\nconst modalHeaderNode = (props: ISearchResultModalProps) => {\n return <ModalHeader toggle={props.onModalToggle}>{props.resources.modalTitle}</ModalHeader>;\n};\n\nconst modalFooterNode = (props: ISearchResultModalProps) => {\n return (\n <ModalFooter>\n <Button onClick={props.onModalToggle} className='ms-sort-and-filter-modal-close'>\n {props.resources.modalCloseButtonText}\n </Button>\n </ModalFooter>\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<IProductSearchResultItems> = ({\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 <ul className='list-unstyled'>\n {products.map((product: ProductSearchResult, index: number) => (\n <li className='ms-product-search-result__item' key={index}>\n <ProductComponent\n context={context}\n telemetryContent={telemetryContent}\n imageSettings={imageSettings}\n freePriceText={resources.priceFree}\n originalPriceText={resources.originalPriceText}\n currentPriceText={resources.currentPriceText}\n ratingAriaLabel={resources.ratingAriaLabel}\n allowBack={allowBackNavigation}\n id={moduleId}\n key={product.RecordId}\n typeName={moduleType}\n data={{ product }}\n quickViewButton={quickviewSlot}\n productComparisonButton={productComparisonButton}\n inventoryLabel={getInventoryLabel(channelInventoryConfigurationId, product)}\n isPriceMinMaxEnabled={isPriceMinMaxEnabled}\n priceResources={priceResources}\n swatchItemAriaLabel={resources.swatchItemAriaLabel}\n dimensionAvailabilities={productsDimensionAvailabilities?.find(\n dimensionAvailability =>\n ArrayExtensions.hasElements(dimensionAvailability) &&\n dimensionAvailability[0].masterProductId === product.MasterProductId\n )}\n />\n </li>\n ))}\n </ul>\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 ISeparator {\n separator: string;\n}\n\nexport const Separator: React.FC<ISeparator> = ({ separator }) => (\n <span>\n {` `}\n {separator}\n {` `}\n </span>\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<ITitle> = ({ text, className }) => (\n <span className={className}>\n {` `}\n {text}\n {` `}\n </span>\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<IRefineItemToggleNotification>): 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<IRangeRefineItemInputProps, IRangeRefineItemInputState> {\n private readonly _formattedPriceReverseLookup: Map<string, string> = new Map();\n\n private readonly minInput: React.RefObject<HTMLInputElement>;\n\n private readonly maxInput: React.RefObject<HTMLInputElement>;\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<HTMLInputElement>();\n this.maxInput = React.createRef<HTMLInputElement>();\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 <li className='ms-refine-submenu-item list-group-item refine-submenu__item--range--custom'>\n <form className={`ms-refine-submenu__input-range-refiner`} {...formAttrs}>\n <div>\n <input\n className={minInputClassName}\n placeholder={'Min'}\n onChange={this._changeMinInputRange}\n value={this.state.selectedMin}\n ref={this.minInput}\n />\n <span>{' - '}</span>\n <input\n className={maxInputClassName}\n placeholder={'Max'}\n onChange={this._changeMaxInputRange}\n value={this.state.selectedMax}\n ref={this.maxInput}\n />\n {validationErrorMin && (\n <span className='ms-refine-submenu__input-range-error-text refine-submenu__input-range-min-error-text'>\n {validationErrorMin}\n </span>\n )}\n {validationErrorMax && validationErrorMin !== validationErrorMax && (\n <span className='ms-refine-submenu__input-range-error-text refine-submenu__input-range-max-error-text'>\n {validationErrorMax}\n </span>\n )}\n </div>\n <div>\n <Button title={'Apply'} className='applyBtn' onClick={this._applyCustom} disabled={this.state.invalidData}>\n {'Apply'}\n </Button>\n </div>\n </form>\n </li>\n );\n }\n\n private _applyCustom(event: React.MouseEvent<HTMLElement>): 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<HTMLInputElement>): void {\n this.setState({\n selectedMin: event.target.value.trim()\n });\n }\n\n private _changeMaxInputRange(event: React.ChangeEvent<HTMLInputElement>): 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 { 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<IRangeRefineItemProps, IRangeRefineItemState> {\n private readonly _formattedPriceReverseLookup: Map<string, string> = new Map();\n\n private readonly minInput: React.RefObject<HTMLInputElement>;\n\n private readonly maxInput: React.RefObject<HTMLInputElement>;\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<HTMLInputElement>();\n this.maxInput = React.createRef<HTMLInputElement>();\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 <form className='ms-refine-submenu__input-range-refiner' {...formAttrs}>\n <label className={minLabelClassName}>\n {refineItemCommonProps.minLabel}\n <input\n className={minInputClassName}\n onChange={this._changeMin}\n onFocus={this._changeMin}\n onBlur={this._finishChangeMin}\n value={formattedSelectedMin}\n ref={this.minInput}\n />\n </label>\n <label className={maxLabelClassName}>\n {refineItemCommonProps.maxLabel}\n <input\n className={maxInputClassName}\n placeholder={formattedSelectedMax ? undefined : refineItemCommonProps.placeholderTextMax}\n onChange={this._changeMax}\n onFocus={this._changeMax}\n onBlur={this._finishChangeMax}\n value={formattedSelectedMax}\n ref={this.maxInput}\n />\n </label>\n {validationErrorMin && (\n <span className='ms-refine-submenu__input-range-error-text refine-submenu__input-range-min-error-text'>\n {validationErrorMin}\n </span>\n )}\n {validationErrorMax && validationErrorMin !== validationErrorMax && (\n <span className='ms-refine-submenu__input-range-error-text refine-submenu__input-range-max-error-text'>\n {validationErrorMax}\n </span>\n )}\n </form>\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 <Slider\n className='ms-refine-submenu__range-refiner'\n key={this.state.sliderId}\n sliderKey={sliderKey}\n id={this.state.sliderId}\n inForm={false}\n min={(this.state.minValue && Number(this.state.minValue)) || undefined}\n max={(this.state.maxValue && Number(this.state.maxValue)) || undefined}\n step={1}\n orientation='horizontal'\n labels={this.state.labels}\n showLabels\n showTooltip\n sliderThumbs={this.state.sliderThumbs}\n onChangeEnd={this._onRangeUpdateEnd}\n onChange={debounce(this._onRangeUpdate, 500)}\n handleTooltipText={this._handleRangeTooltipText}\n {...ariaAttributes}\n />\n );\n }\n\n private _changeMin(event: React.FocusEvent<HTMLInputElement>): void {\n this._changeValue(event, 'Min');\n }\n\n private _changeMax(event: React.FocusEvent<HTMLInputElement>): void {\n this._changeValue(event, 'Max');\n }\n\n private _changeValue(event: React.FocusEvent<HTMLInputElement>, 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<HTMLInputElement>): 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<HTMLInputElement>): 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<IGeneric<IAny>>;\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<IRefineItemToggleNotification>): 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<IRefineItemProps, IRefineItemState> {\n private readonly anchorType: React.RefObject<HTMLAnchorElement>;\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 <li className={className} id={`${parentProductRefinerHierarchy.KeyName!}_${index}`}>\n <a\n key={selectedRefinementCriterion ? 'true' : 'false'}\n ref={this.anchorType}\n href={this._getRefinerUrl()}\n tabIndex={hasColor ? -1 : 0}\n onClick={this._onClick}\n className={\n isSingleSelectRangeTypeIntegerSelected(selectedRefinementCriterion!, productRefinerValue)\n ? `ms-refine-submenu-item ${itemTypeClassName}-selected`\n : `ms-refine-submenu-item ${itemTypeClassName}-range`\n }\n role='radio'\n aria-label={refineMenuItemAriaLabel}\n aria-checked={!!selectedRefinementCriterion}\n {...attribute}\n {...attrs}\n >\n <span className='ms-refine-submenu-item__label' aria-hidden='true'>\n {rangeValue}\n {productRefinerValue.Count !== undefined && ` (${productRefinerValue.Count})`}\n </span>\n </a>\n </li>\n );\n } else {\n return (\n <li className={className} id={`${parentProductRefinerHierarchy.KeyName!}_${index}`}>\n <a\n key={selectedRefinementCriterion ? 'true' : 'false'}\n ref={this.anchorType}\n href={this._getRefinerUrl()}\n tabIndex={hasColor ? -1 : 0}\n onClick={this._onClick}\n className={itemTypeClassName}\n role={inputType}\n aria-label={refineMenuItemAriaLabel}\n aria-checked={!!selectedRefinementCriterion}\n {...attribute}\n {...attrs}\n >\n {hasContentSwatch && shouldDisplayAsSwatch && this._renderSwatch(dimensionType)}\n <span className='ms-refine-submenu-item__label' aria-hidden='true'>\n {/* eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string. */}\n {productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString}\n {productRefinerValue.Count !== undefined && ` (${productRefinerValue.Count})`}\n </span>\n </a>\n </li>\n );\n }\n }\n\n private _getShouldDisplayAsSwatch(dimensionType: DimensionTypes) {\n const shouldDisplayAsSwatch = checkIfShouldDisplayAsSwatch(dimensionType, this.props.context as ICoreContext<IDimensionsApp>);\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 <SwatchComponent\n className='ms-refine-submenu-item__swatch'\n apiSettings={this.props.context.request.apiSettings}\n list={swatchItems}\n isSelectionEnabled={false}\n isRefineItem\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<HTMLAnchorElement | HTMLInputElement>): 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 <li\n className='ms-refine-submenu-item ms-refine-submenu-item__rating'\n role={!this.props.isMobileView ? 'presentation' : undefined}\n id={`${parentProductRefinerHierarchy.KeyName!}_${index!}`}\n >\n <a\n href={this._getRefinerUrl()}\n role='option'\n aria-selected={isChecked}\n aria-label={`${parentProductRefinerHierarchy.KeyName!}_${productRefinerValue.LeftValueBoundLocalizedString!}\n ${productCountAriaLabelValue!}`}\n onClick={this._onClick}\n {...attribute}\n >\n <RatingComponent\n className={ratingComponentClass}\n avgRating={refinerRating}\n ratingCount={productRefinerValue.LeftValueBoundLocalizedString ?? productRefinerValue.LeftValueBoundString}\n hideCount={false}\n readOnly\n ariaLabel=''\n context={context}\n id={this.props.moduleId}\n typeName={this.props.moduleTypeName}\n data={{}}\n />\n <span className='refine-submenu-item__rating' aria-hidden={this.props.isMobileView ? 'true' : undefined}>\n {productRefinerValue.Count !== undefined && `(${productRefinerValue.Count})`}\n </span>\n </a>\n </li>\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 { 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<IGeneric<IAny>>;\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<IRefineItemToggleNotification>): 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<IRefineSubmenuProps>}\n */\nclass RefineSubmenu extends React.Component<IRefineSubmenuProps, IRefineSubmenuState> {\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 <div className={className}>\n <Button\n className={this.state.expanded ? 'ms-refine-submenu__toggle_expanded' : 'ms-refine-submenu__toggle_collapsed'}\n aria-label={productRefinerHierarchy.KeyName}\n onClick={this._onToggleSubmenu}\n aria-expanded={this.state.expanded}\n >\n {productRefinerHierarchy.KeyName}\n </Button>\n <Collapse isOpen={this.state.expanded} timeout={350}>\n {this._renderChildItems(productRefinerHierarchy)}\n </Collapse>\n </div>\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 <RefineItem\n parentProductRefinerHierarchy={productRefinerHierarchy}\n productRefinerValue={child}\n selectedRefinementCriterion={selectedRefinementCriterion}\n selectedRefinerValues={selectedRefinerValues.filter(selectedValue =>\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 <ul\n className={`ms-refine-submenu__list ${productRefinerHierarchy.KeyName}`}\n {...role}\n aria-label={productRefinerHierarchy.KeyName}\n >\n {listItems}\n {productRefinerHierarchy.DataTypeValue === AttributeDataType.Integer &&\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Range && (\n <RangeRefineItemInput\n parentProductRefinerHierarchy={productRefinerHierarchy}\n selectedRefinementCriterion={selectedRefinementCriterion}\n refineItemCommonProps={refineItemCommonProps}\n onToggle={this._onToggleItem}\n isDisabled={isDisabled}\n rangeType={'input'}\n key={productRefinerHierarchy.KeyName}\n />\n )}\n </ul>\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 <li className={`${submenuClassNamePrefix}--range`} key={index}>\n <RangeRefineItem\n parentProductRefinerHierarchy={productRefinerHierarchy}\n productRefinerValue={child}\n selectedRefinementCriterion={selectedRefinementCriterion}\n refineItemCommonProps={refineItemCommonProps}\n onToggle={this._onToggleItem}\n urlBuilder={this.props.urlBuilder}\n isDisabled={isDisabled}\n rangeType={rangeType}\n key={key}\n sliderKey={key}\n context={context}\n minValueSliderThumbAriaLabel={minValueSliderThumbAriaLabel}\n maxValueSliderThumbAriaLabel={maxValueSliderThumbAriaLabel}\n moduleId={this.props.moduleId}\n moduleTypeName={this.props.moduleTypeName}\n />\n </li>\n );\n });\n return <ul className={`ms-refine-submenu__list list-unstyled ${productRefinerHierarchy.KeyName}`}>{listItems}</ul>;\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 { 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 {\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<ISearchResultContainerData> {\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<ISearchResultContainerProps<ISearchResultContainerData>>}\n */\n@observer\nexport default class SearchResultContainer extends React.PureComponent<\n ISearchResultContainerProps<ISearchResultContainerData>,\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<HTMLButtonElement>;\n\n private readonly _sortAndFilterContainerRef: React.RefObject<LabeledDropdown>;\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<ISearchResultContainerData>, 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<HTMLButtonElement>();\n this._sortAndFilterContainerRef = React.createRef<LabeledDropdown>();\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<void> {\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 <FeatureSearchResultItem\n product={searchProduct}\n context={this.props.context}\n imageSettings={imageSettings}\n resources={resources}\n moduleType={this.props.typeName}\n moduleId={this.props.id}\n telemetryContent={this.telemetryContent}\n recommendation={this.props.context.request.query?.recommendation}\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 <ModalToggle\n text={resources.modalTitle}\n ariaLabel={resources.modalTitle}\n innerRef={this._modalToggleRef}\n onClick={this._toggleModal}\n id='search-result-modal'\n />\n ) : null,\n searchResultModal: this._getSearchResultModal(),\n isMobile: this.isMobile,\n errorMessage: errorText && <ErrorMessage text={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<void> => {\n const context = this.props.context as ICoreContext<IDimensionsApp>;\n const dimensionsToDisplayOnProductCard = context.app.config.dimensionsInProductCard;\n const dimensionsToDisplayAsSwatch = context.app.config.dimensionsAsSwatchType;\n 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<void> => {\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<IDimensionsApp>,\n DimensionSwatchDisplayTypes.productCard\n ),\n this.props.context.actionContext\n );\n\n if (ArrayExtensions.hasElements(productsDimensionAvailabilities)) {\n this.setState({ productsDimensionAvailabilities });\n }\n };\n\n /**\n * Get the active price for the products.\n */\n private readonly _getActivePrice = async (): Promise<void> => {\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 = <Title className='ms-search-result__collection-title-prefix' text={resources.searchTextPrefix} />;\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 { 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"],"names":["showStrikethroughPricing","props","originalPrice","getOriginalPrice","data","price","CustomerContextualPrice","Math","max","BasePrice","TradeAgreementPrice","AdjustedPrice","renderCurrentPrice","initialPrice","formatCurrency","React","className","itemProp","undefined","freePriceText","returnPrice","Intl","NumberFormat","context","cultureFormatter","locale","style","currency","currencyCode","currencyDisplay","format","_unused","renderCurrentPriceWithOriginalPrice","originalPriceText","currentPriceText","savingsText","msdyn365Commerce","createComponent","component","__assign","classnames","WishlistItemDimension","_ref","key","dimensionType","dimensionValue","WishListItemActions","product","itemKey","handlers","onAddToCart","onRemoveItem","RecordId","_renderAriaLabel","resources","Name","Dimensions","productDimensionTypeColor","productDimensionTypeSize","productDimensionTypeStyle","formattedPrice","dimensions","CurrencyCode","map","productDimension","DimensionTypeValue","DimensionValue","Value","join","renderProductLink","input","productUrl","telemetryContent","recordId","productName","payLoad","getPayloadObject","toString","productAttributes","getTelemetryAttributes","productPageUrlWithSwatch","StringExtensions","isNullOrWhitespace","Object","assign","href","renderInventoryInformationLabel","inventoryInformationLabel","inventoryLabelClassName","inventoryCssName","WishlistItemAddToCartButtonComponent","isInStock","addToCartText","outOfStockText","isServiceItem","ItemTypeValue","ReleasedProductType","Service","addItemAction","Button","title","onClick","disabled","WishlistItemRemoveFromWishlistButtonComponent","removeFromWishlistText","removeItemAction","renderUnitOfMeasure","unitOfMeasure","app","config","unitOfMeasureDisplayType","WishlistItem","imageSettings","wishlistState","enableImageProductLink","PrimaryImageUrl","fallbackImage","getFallbackImageUrl","ItemId","actionContext","requestContext","apiSettings","isBrowser","fullUrl","URL","window","location","dimension","_props$product$Dimens","_dimension$DimensionV","dimensionName","convertProductDimensionTypeToDimensionTypes","searchParams","set","_getFullProductLink","productImage","_renderProductImage","productLink","productDimensions","_renderProductDimensions","productPrice","_renderPrice","productUnitOfMeasure","DefaultUnitOfMeasure","entireProductLink","productAriaLabel","addToCartButton","inventoryInformation","removeButton","productStatusMessage","isOpen","productId","Alert","color","statusCssString","toggle","onDismiss","userMessage","heading","image","defaultImageSettings","viewports","xs","q","w","h","lg","xl","lazyload","cropFocalRegion","Image","altText","src","fallBackSrc","gridSettings","request","loadFailureBehavior","moduleId","moduleTypeName","PriceComponent","id","typeName","index","type","WishlistItemsStatusMessage","errorType","text","WishlistItems","constructor","super","handleHeadingChange","event","this","target","value","_onDismiss","setState","_renderHeading","MsDyn365","tag","editProps","onEdit","_addItemToCart","async","telemetry","cart","productAvailability","addedToCartSuccessMessage","addedToCartFailureMessage","invoiceInCartErrorMessage","productInventoryInformation","_getProductInventory","ProductDetails","result","_this$props$data$feat","_this$props$context","_this$props$context$a","_product$Behavior","isOrderQuantityLimitsFeatureEnabledInHq","featureState","find","IsEnabled","defaultOrderQuantityLimitsFeatureConfig","platform","enableDefaultOrderQuantityLimits","customerInfo","customerInformation","isOrderQuantityLimitsFeatureEnabledInSiteSettings","IsB2b","emailDeliveryModeCode","channel","EmailDeliveryModeCode","deliveryOptions","getDeliveryOptionsAsync","callerContext","queryResultSettings","QueryResultSettingsProxy","getPagingFromInputDataOrDefaultValue","isOrderQuantityLimitsFeatureEnabled","eoqCount","Behavior","MultipleOfQuantity","addProductToCartInput","count","enableStockCheck","availableQuantity","ProductAvailableQuantity","AvailableQuantity","additionalProperties","orderQuantityLimitsFeatureIsEnabled","isAddEmailDeliveryItemToCart","ArrayExtensions","hasElements","DeliveryOptions","Code","addProductToCart","then","status","messageGlyph","substatus","_await$cart$cart","curQuantity","CartLines","item","ProductId","Quantity","maxQtyLimitReachedMessage","_getInventoryValueMessage","_result$errorDetails","errorDetails","LocalizedMessage","_result$errorDetails2","debug","catch","error","warning","_removeItemFromWishlist","wishlists","noLongerLineExist","userToken","user","isAuthenticated","token","wishlistLineId","_getWishlistLineIdFromProductId","removeLinesAsync","Id","LineId","commerceList","castCommerceList","_getProductsNoLongerExists","length","_removeNoLongerExistsLines","update","createGetByCustomerInput","getItemsInWishlists","ActiveWishlistInput","products","castSimpleProducts","isError","_inventoryLabel","StockLevelLabel","_inventoryClassName","StockLevelCode","toLowerCase","_isProductInStock","productResult","IsProductAvailable","CommerceListLines","foundWishlistItem","filter","commerceListLine","_castCommerceList$Com","noLongerExist","line","push","getTelemetryObject","telemetryPageName","friendlyName","shouldComponentUpdate","nextProps","nextState","state","render","emptyWishlistText","wishlistErrorGettingWishlist","noLongerExitsWishlistItemText","errorProps","_objectSpread","moduleProps","statusMessage","renderView","productsList","emptyViewProps","viewProps","Products","Product","ProductDimensions","_renderProductList","statusNotExistsMessage","_getProductNotExists","emptytext","noLongerExisttext","priceFree","addToCartButtonText","removeButtonText","productDimensionTypeAmount","currentProductProps","ProductPrice","getProductUrlSync","IsGiftCard","maxQuantityLimitText","maxQuantityForLineItem","updateMaxQuantityForCartLineItem","maxQuantityForCartLineItem","replace","minInventory","min","productInventoryCollection","__decorate","observer","_renderItem","Node","Module","expandRefinersCount","expandedMenusOnLoad","Link","ariaLabel","ProductSearchResultItems","moduleType","allowBackNavigation","ProductComponent","ratingAriaLabel","allowBack","FeatureSearchResultItem","productRecordId","getProductPageUrlSync","attribute","onTelemetryClick","imageUrl","img","imageProps","renderProductPlacementImage","featureSimilarLooksTitle","Title","Separator","separator","ProductRefinerValueDataTypeValue","ProductRefinerTypeValue","ProductRefinerSource","isRangeType","dataTypeValue","AttributeDataType","Currency","Decimal","Integer","findMatchingRefinementCriterion","productRefinerValue","refinementCriteria","refinementCriterion","isMatchingRefinementCriterion","RefinerRecordId","RefinerSourceValue","DataTypeValue","LeftValueBoundString","getUpdatedRefinementCriteria","itemToggleNotification","currentRefinementCriteria","updatedRefinementCriteria","toggledItemFound","forEach","selectedCriterion","isSelecting","next","rangeStart","RightValueBoundString","rangeEnd","Text","TrueFalse","parentProductRefinerHierarchy","RefinerTypeValue","RefinerType","SingleSelect","Values","child","matchingIndex","findIndex","criterion","splice","RangeRefineItem","_formattedPriceReverseLookup","Map","_onRangeUpdate","bind","_onRangeUpdateEnd","_handleRangeTooltipText","_changeMin","_changeMax","_finishChangeMin","_finishChangeMax","minInput","maxInput","selectedRefinementCriterion","initialMin","initialMax","isChecked","validationErrorMin","validationErrorMax","selectedMin","selectedMax","touchedMin","touchedMax","UnitText","refineItemCommonProps","rangeType","_renderInputFields","_renderSlider","isDisabled","formAttrs","rangeNameFormat","KeyName","minInputClassName","maxInputClassName","formattedSelectedMin","_getFormattedSelectedValue","formattedSelectedMax","minLabel","onChange","onFocus","onBlur","ref","maxLabel","placeholder","placeholderTextMax","sliderId","ariaAttributes","minPrice","_formatPrice","maxPrice","selectedMinPrice","selectedMaxPrice","Slider","inForm","Number","step","orientation","labels","labelId","labelString","labelPositioning","showLabels","showTooltip","sliderThumbs","minValueSliderThumbAriaLabel","ariaValueText","maxValueSliderThumbAriaLabel","onChangeEnd","debounce","handleTooltipText","_changeValue","inputType","selectedKey","touchedKey","_getInputWithoutFormatting","currentTarget","selectedMinValue","minTouched","onToggle","maxNum","isNaN","validationErrorNaN","_focus","_validateRange","selectedMaxValue","maxTouched","minNum","setTimeout","current","focus","selected","touched","validationError","validationErrorRange","amount","trace","priceAmount","minimumFractionDigits","e","formatPrice","has","inputAsNum","get","sliderChangeNotification","eventType","firstThumbValue","secondThumbValue","_focusOnSliderThumb","element","document","getElementById","tooltip","computed","RefineItem","_onClick","preventDefault","anchorType","_this$props","children","attrs","_objectWithoutProperties","_excluded","JSON","stringify","isSingleSelect","itemTypeClassName","SourceValue","Rating","contentAction","etext","LeftValueBoundLocalizedString","_getRefinerUrl","tabIndex","role","Count","_this$props$selectedR","_productRefinerValue$","refinerRating","parseInt","ratingRefiner","selectedRefinerValues","selectedRating","ratingComponentClass","RatingComponent","avgRating","ratingCount","hideCount","readOnly","urlBuilder","ChoiceSummary","closeButtonGlyph","stopPropagation","clearAll","getAttribute","indexOf","selectedRefiner","_getSelectedRefinerChoice","onChoiceClicked","itemClicked","choiceClicked","nextItemToFocus","nextSibling","selectedRefinersMap","selectedChoices","_getKeyForRefinerValue","clearAllText","label","classNames","choiceAriaLabel","items","clearAllAttributes","listItemProps","choiceFormat","choiceRangeValueFormat","refinerHierarchy","overallFormat","rangeFormat","refinerValueName","refinerName","parent","hierarchy","_get","innerText","trim","ModalToggle","innerRef","modalNode","Modal","autoFocus","applicationNode","returnFocusRef","returnRef","onModalToggle","zIndex","modalHeaderNode","ModalHeader","modalTitle","modalFooterNode","ModalFooter","modalCloseButtonText","RefineSubmenu","_onToggleItem","_onToggleSubmenu","isExpanded","isExpandedOnInitialLoad","expanded","productRefinerHierarchy","hideRating","Collapse","timeout","_renderChildItems","_renderRange","_renderSingleMultiSelect","refinerValuesList","listItems","selectedValue","_getRangeType","DisplayTemplateValue","DisplayTemplate","Range","SliderWithBars","onUpdateRefiners","prevState","ErrorMessage","SearchResultContainer","SearchResultContainer_1","_this$props$context$r2","sortByDropdownOptions","sortOptions","sortByOptionRelevanceDesc","sortByOptionNameAsc","sortByOptionNameDesc","sortByOptionPriceAsc","sortByOptionPriceDesc","sortByOptionRatingDesc","_pageType","urlTokens","pageType","expandrefinerCount","_getActivePrice","listPageState","activeProducts","productRecIds","prod","projectDomain","ChannelId","channelId","CatalogId","catalogId","affliations","customerInput","GetCustomerInput","customer","getCustomer","CustomerAffiliations","affliation","aff","AffiliationId","RetailAffiliationId","CustomerId","AccountNumber","getActivePricesAsync","Date","activePricesResponse","productPrices","activePrice","_activePrice$Customer","Price","message","exception","Error","_getSearchResultModal","modal","modalHeader","modalFooter","modalBody","ModalBody","SearchResultModal","modalIsOpen","_modalToggleRef","_toggleModal","_getCollectionTitle","collectionTitle","query","category","getFriendlyName","NameTranslations","productCountNumber","productCountText","totalProductCount","numberOfProducts","oneProduct","TitleContainer","titlePrefix","searchTextPrefix","titleText","titleCount","_getCategoryHierarchy","categoryHierarchy","CategoryHierarchyContainer","categoryHierarchyList","categoryLinkAriaLabel","Url","categoryHierarchySeparator","_getSortingDropDown","activeDropdown","_getCurrentlySelectedOption","sortingState","selectedSortByOption","SortingContainer","sortByDropDown","LabeledDropdown","labelClassname","labelText","sortByDropdownLabel","dropdownId","dropdownClassname","toggleColor","dropdownOptions","selectedOption","onSelectOption","_updateSortByDropdown","_sortAndFilterContainerRef","_getPagination","getCurrentUrl","itemsPerPage","skipCount","currentPageNumber","skip","totalItems","previousText","flipperPrevious","nextText","flipperNext","UncontrolledPagination","paginationAriaLabel","url","qsp","startingItem","previousAriaLabel","nextAriaLabel","_getRefineMenu","tempRangeTypeTODO","inputRange","validRefiners","refiners","refiner","activeRefiners","activeFilters","_getexpandRefinerCount","expandedRefiners","RefineMenuContainer","RefinerSectionContainer","_refineItemCommonProps","_onUpdateRefiners","_buildRefinerUrl","_getChoiceSummary","selectedRefiners","choiceSummaryLabel","_onChoiceClicked","_buildRefinerUrlForChoiceSummary","notification","history","pushState","buildListPageUrl","_getSortColumnFromSelectedOption","transaction","sortingCritera","Columns","option","searchConfiguration","mappedConfiguration","sortColumn","sortCriteria","activeSortColumn","parseQueryParam","activeMappedConfig","mappedSearchConfig","ColumnName","IsDescending","dropdownOption","newRefinementCriteria","dropdownElementId","dropdownElement","selectedChoice","isClearAll","refinerCount","all","one","two","three","four","_viewport","device","Type","_updateViewport","pending","validationErrorNotNumber","validationErrorNotRange","querySorting","sorting","parse","decodeURIComponent","pageSize","reaction","_this$props$context$r","GetFullProductsByCollectionInput","Paging","Top","Skip","Sorting","itemId","includeAttributes","getCollectionProducts","productResults","ex","featureProduct","listPageStateFeature","isMobile","static","nameTranslations","nameTranslation","Language","componentDidMount","addEventListener","enableAffiliationBasedPricing","componentWillUnmount","removeEventListener","searchProduct","errorText","breaCrumbType","breadcrumbType","resultCategoryNotFoundText","resultSearchNotFoundText","productsComponent","featureComponent","searchResultContainerViewProps","TitleViewProps","disableHierarchy","refineMenu","sortByOptions","pagination","ProductsContainer","ProductSectionContainer","CategoryNavContainer","RefineAndProductSectionContainer","choiceSummary","modalToggle","searchResultModal","errorMessage","FeatureSearchContainer","similarLookProduct","toggleModal","_getViewport","innerWidth","sm","md","observable","slice","keyId","Single","refinersToBeUpdated","refinersLists","split","_refinerName","RangeInput","sortingCriteraValues","sort","a","b","localeCompare","compressedRefinerKeys","sortingColumns","compressedRefiners","compressedRefiner","refinerKey","compressRefiners","delete","requestUrl","CittaRefiners","_onClearRefiners","_getSortingRefiner","sortByValues","_sortingCritera$Colum","sortingC","sortBy","DataValueType","RowNumber","_updateDropDown","dropdownOpen","_renderRefiners","refinersHeader","orderedRefiners","refinerCat","hiddenRefinersList","refinersToBeHidden","sortRefiner","submenu","CittaPicture","handleMoveHover","showHoverImg","handleMoveOut","_this$state","image1","image2","img1","img2","onMouseOver","onMouseOut","imageOrientation","onlineTags","salesLineTag","productImage1","productImage2","stockAvailabilities","ExtensionProperties","property","Key","StringValue","_property$Value","_property$Value2","name","IntegerValue","AttributeValues","TextValue","tagsToIgnore","includes","salesLineTagKey","generateImageUrl","setTelemetryAttribute","pid","pname","mname","productImageSettings","_getLandscapeImageSettings","_renderLabel","AverageRating","toLocaleLowerCase","backgroundColor","_renderProductPlacementImage","_renderSalesLineTag","_renderDescription","Description","_renderRating","TotalRatings","_renderAvailabilities","sA","match","rating","ratingLabel","roundedRating","toFixed","description","totalRatings","numRatings","basePrice","adjustedPrice","cmsImageSettings","disableLazyLoad","getImageOrientation","createSearchResultModal","modalProps","createModalBody","renderRefineMenu","renderCategoryHierarchy","renderTitle","display","_props$context","liClass","renderProducts","SuggestionType","AutoSuggestInput","searchText","top","suggestionType","hitPrefix","hitSuffix","getCacheKey","getCacheObjectType","dataCacheType","searchQuery","topResultsCount","_getAutoSuggest","autosuggest","ctx","searchCriteria","ProductSearchCriteria","SearchCondition","Context","HitPrefix","HitSuffix","searchSuggestions","getSearchSuggestionsAsync","ImageUrl","AllSearchResults","createObservableDataAction","action","autoSuggestPromises","Promise","inputData","KeywordSuggestionsComponent","suggestions","reactNodes","_assembleNode","RegExp","_generateLink","_getHighlightedText","suggestion","searchPageURL","searchQsp","formattedLink","route","formattedText","dangerouslySetInnerHTML","getRichTextHtml","ProductSuggestionsComponent","autoSuggestProps","productSuggestionHeading","_renderTitle","productAutoSuggestionHeading","Value3","DecimalValue","LiProduct","_getLiWrapper","AProduct","_getAWrapper","recid","CategorySuggestionsComponent","categorySuggestionHeading","categoryAutoSuggestionHeading","splitValue","pop","_getCategoryLink","searchRefiners","urlPath","categoryRefiners","encodedRefiner","encodeURIComponent","FormComponent","searchPlaceholder","hideSearchLabel","isSearchFormExpanded","searchTextInput","handleInputChange","maxChars","disableSubmitSearch","handleCancelSearchChange","handleSearchClick","ariaLabelCancel","ariaLabelSearch","ariaLabelSubmit","onInputChange","inputNode","maxLength","submitBtnNode","searchBtnNode","cancelBtn","submitBtn","searchBtn","LabelComponent","searchLabelClass","searchLabelArialLabel","searchtext","searchCollapsedLabel","attributes","Search","waitTime","_focusOutTarget","closest","_clearAutoSuggestState","_keyup","keyCode","KeyCodes","Escape","body","classList","formReference","contains","autoSuggestResultDiv","searchState","defaultBasicSearchUrl","searchQueryStringParameter","createSearchStateInput","_handleSearchClick","console","log","updatedIsSearchFormExpanded","headerElem","querySelector","add","documentElement","scrollTop","remove","_handleInputChange","cancellabelDebounce","cancel","_debounce","getSearchSuggestionsAction","_getSuggestionType","inputSuggestionType","results","_getSearchRefiners","autoSuggestAriaLabel","_setAutoSuggestResultCount","suggestionTypes","distinctSuggestionTypes","suggestionTypeItem","charAt","toUpperCase","_handleSubmit","searchURL","_appendQueryParams","getUrlSync","_handleCancelSearchChange","isInitialState","autoSuggestResultScreenReaderDiv","ariaLiveRegion","suggestResultString","autoSuggestFoundMessage","emptyResultString","noAutoSuggestionMessage","setAttribute","searchKeywordSuggestClass","searchProductSuggestClass","searchCategorySuggestClass","inSearchMode","searchInputMaxLength","suggestionTypeCriterion","searchFormClass","searchBtnClass","componentDidUpdate","params","isEditor","cancelBtnAriaLabel","searchBtnAriaLabel","submitBtnAriaLabel","searchplaceholderText","keywordSuggestions","i","Keyword","None","productSuggestions","categorySuggestions","Category","AutoSuggestAriaLabel","AutoSuggestAriaLabelText","AutoSuggest","KeywordSuggest","ProductSuggest","CategorySuggest","SearchForm","SearchBtn","BtnWrapper","FormWrapper","autoComplete","onSubmit","UlKeyword","UlProduct","UlCategory","searchLabel","searchLabelText","form","autosuggestKeyword","autosuggestProduct","autosuggestCategory","callbacks","getProductSearchRefinersAsync","_renderButton","_renderForm","_renderKeywordSuggestions","_renderProductSuggestions","_renderCategorySuggestions","renderRating","ratingId","_totalRatings$toStrin","numberRatings","getRatingAriaLabel","ActiveProductComponent","imgData","renderPrice","assembleNode","_item$links","headingNode","renderHeading","additionalContentHeading","Msdyn365","handleAdditionalTextChange","paragraphNode","subtext","renderParagraph","additionalContentParagraphText","linksNode","links","ctaLink","renderLinks","linkIndex","editableLink","linkText","linkUrl","destinationUrl","openInNewTab","isOpenInNewTab","link","onTextChange","handleAdditionalLinkTextChange","additionalContentNode","additionalContentContainer","additionalContentItemLinks","activeImageAdditionalContent","additionalContent","CanvasCalculations","CanvasStyles","ImageMapper","_isDesktopViewPort","_context","getActiveImageWidth","activeImageReferenceValue","activeImageRefs","clientWidth","getActiveImageHeight","clientHeight","convertHexToRgb","hexColor","exec","rValue","gValue","bValue","applyFadingTransition","coords","rgbColor","alpha","_this$_canvas$current","_this$_canvas$current2","halfDivisor","_canvas","getContext","buttonPadding","paddingAdjustment","buttonWidth","measureText","width","fillStyle","parentElement","fillText","drawButton","_this$_canvas$current3","_this$_canvas$current4","buttonTextClor","buttonHeight","buttonPositionX","buttonPositionY","arcsize","beginPath","moveTo","lineTo","arcTo","stroke","closePath","fill","expandAnimation","_this$props$imageMapp","buttonText","imageMapperResources","animationStartWidth","expandAnimationStartWidth","pointPositionX","pointPositionY","animationEndWidth","expandAnimationEndWidth","radius","expandRadius","rotation","startAngle","endAngle","textFadeInValue","textFadeInStartValue","buttonTextClorInRgb","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","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","productSearchResult","shape","alt","initCanvas","_this$getActiveImageW","_this$getActiveImageH","_this$_canvas$current12","_backgroundImage","_container","onLoad","defaultHeight","canvasWidth","canvasHeight","shouldRender","_requestContext$gridS","imageData","useMap","ActiveImageConstants","ActiveImage","_defaultProductCardWidth","_defaultProdutCardHight","_activePoints","addActivePoints","_product$PrimaryImage","areaId","primaryImageUrl","updateClientWidth","viewport","variant","VariantType","Browser","renderImageMapper","_this$props$config$ac","activePoints","configProduct","_product$Name","_configProduct$xPosit","_configProduct$yPosit","_configProduct$radius","xPosition","yPosition","activePoint","mappedArea","_activeImageClass","enterArea","leaveArea","activeImage","_activeImageRefs","altTextForSeeMoreButtonWithProductName","seeMoreButtonText","overlayClass","open","resetState","renderProductComponent","_this$state$area","_this$state$area$prim","_product$ItemId","baseImageUrl","renderProductCard","_productCardDivRef","renderOverlay","getProductCardPositionX","_this$props$config$pr","_this$props$config$pr2","_defaultImageSettings","_area$center$","_area$center","getDefaultImageSettings","productImageSettingsWidth","productCardWidth","leftAllignPosition","position","getProductCardPositionY","_this$props$config$pr3","_this$props$config$pr4","_defaultImageSettings2","productImageSettingsHeight","produtCardHight","_area$center$2","_area$center2","keyDown","enterKey","nodeName","escKey","handleTextChange","handleParagraphChange","paragraph","renderActiveImageDetailsLinks","_telemetryContent","linkData","linkId","willOpenInNewTab","handleLinkTextChange","renderActiveImageDetailsHeading","_heading$tag","renderActiveImageDetailsParagraph","getActiveImageId","activeImageId","_activeImageIdPart$","activeImageSource","decrementOne","_handleOutsideClick","_this$_productCardDiv","timeoutInterval","images","getElementsByClassName","Array","from","removeAttribute","activePointContainer","activePointDetailsContainer","imageMapper","overlay","productCard","productCardleftPosition","productCardtopPosition","detailsContainer","detailsContainerCta","handleAdditionalParagraphChange","handleAdditionalText","handleAdditionalParagraph","handleAdditionalLinkText","_this$props$config$ad","activeImageView","left","CarouselModule","_handleDismissCarousel","cookies","dismissCarousel","_next","slots","nextIndex","activeIndex","content","animating","closeNow","_previous","_onExiting","_onExited","_goToIndex","newIndex","carouselContainer","closeAnimation","previous","onIndicatorsClickHandler","handleDismissCarousel","handleOnExited","handleOnExiting","retrieveItems","renderModuleAttributes","Carousel","pause","pauseOnHover","ride","autoplay","interval","transitionType","hideFlipper","dismissEnabled","dismissCarouselAriaText","ariaLabelForDismissButton","indicatorAriaText","ariaLabelForSlide","directionTextPrev","directionTextNext","keyboard","ProductComparisonPreview","_renderGreyPlaceHolders","productData","counts","greyPlaceHoldersCount","displayGreyPlaceHolders","elements","_removeProductFromList","_this$props$data$acco","ProductComparisonState","instance","accountInformation","removeItemById","previousState","_previousState$produc","productsData","_handleCollapseClick","_previousState$isExpa","_hasUserInteractedWithComparison","_clearAllProductsFromTheComparison","_this$props$data$acco2","_instanceId","Random","Guid","generateGuid","_displayedInstanceId","_this$props$data$acco3","_loadProducts","listModifiedEvent","subscribe","instanceId","handler","_this$props$data$acco4","unsubscribe","_this$state$productsD","_this$props$data$prod","collapseButton","_renderCollapseButton","isMainContentReady","hasUserInteractedWithComparison","_getProdutComparisonDataByCatalogId","productsLimit","_getProductsLimit","ObjectExtensions","isNullOrUndefined","subheaderText","productComparisonPreviewHeaderTextWithLimit","handleCollapseClick","productsMainInfo","_getProductsMainInfo","previewGreyPlaceHolders","productComparisonLink","clearAllProductsFromTheComparison","removeProductFromList","goToComparisonButton","_renderGoToComparisonButton","clearAllButton","_renderClearAllButton","_productData$filter","getCatalogId","validateCatalogId","_this$props$data$acco5","GetProductsInPreviewProductComparisonInput","getProductsInPreviewProductComparisonAction","productDataByCatalogId","_getGreyPlaceHoldersCount","limit","placeHolder","productImageContainerClassName","tableRowClassName","productImageClassName","productNameClassName","productNameLink","_product$Dimensions","isChannelTypeB2B","removeFromComparisonButton","RemoveFromComparisonButtonComponent","onClickHandler","productComparisonMobileProductsLimit","productComparisonDesktopProductsLimit","_getFallbackImageUrl","defaultImageSettingQ","OmniChannelMedia","_this$state$isExpande","shouldBeExpanded","headerContainerClassName","mainContainerClassName","collapseClassName","collapseButtonClassName","footerClassName","productComparisonCompareProductsButtonText","productComparisonClearAllProductsButtonText","containerClassName","headerClassName","headerLabelClassName","tableClassName","ProductComparisonPreviewViewFunctionalComponent","_props$isExpanded","_props$productsMainIn","_props$productsMainIn2","productComparisonPreviewHeaderText","info","SpecificationDataTypeValues","ProductSpecification","CurrencyValue","_product$DateTimeOffs","isFunction","DateTimeOffsetValue","toUTCString","FloatValue","_specification$DataTy","specification","none","_renderCurrencyCell","dateTime","_renderDateTimeCell","decimal","_renderDecimalCell","integer","_renderIntegerCell","_renderTextCell","boolean","_renderTrueFalseCell","video","BooleanValue","productComparisonProductItemSpecificationTrue","productComparisonProductItemSpecificationFalse","RemoveFromComparisonButtonFunctionalComponent","useCallback","productComparisonRemoveProductFromListAriaLabel","SelectionType","ProductClickerDirections","ProductComparison","_clearAllProductsFromComparison","_configureBoxShadowOnScroll","_this$_tableReference","_tableReference","comparisonProductCardHeader","tableHeaderClassName","tableHeaderLockedClassName","_handleScroll","_this$_tableHeaderRef","_tableHeaderReference","scrollTo","scrollLeft","_checkClickersState","_handleScrollClick","direction","_this$_tableBodyRefer","_this$_tableCellRefer","_document$body$parent","tableBody","_tableBodyReference","newLeftPosition","cellWidth","_tableCellReference","_getCellWidth","scrollPosition","ceil","minLeftPosition","maxScroll","scrollWidth","currentClickerPosition","change","hoverStateLastUpdate","now","hoveringCellItemId","_handlePreviousClick","_document$body$parent2","right","_handleNextClick","_document$body$parent3","_this$_tableBodyRefer2","floor","_this$_tableBodyRefer3","_document$body$parent4","_shouldShowNextClicker","forceUpdate","_shouldShowPreviousClicker","newClickerPosition","_handleHoverIn","_hoveringCellItemId","_handleHoverOut","_goBack","backToShoppingUrl","referrer","back","specifications","_product$specificatio","specificationsList","allSpecifications","flatten","specificationNames","validValues","AttributeValueId","uniqueSpecificationNames","unique","productInfo","allDimensions","dimensionIds","actionBarClassName","clearAllProductsFromComparison","isEmptyContent","loading","_renderLoading","actionBarContainerProps","_getActionBarContainerProps","previousClicker","_renderPreviousClicker","nextClicker","_renderNextClicker","backToShopping","_renderBackToShoppingButton","emptyComparison","emptyComparisonContentSlots","_getProductComparisonDataByCatalogId","isConsentGiven","productComparisonCountText","productsMainInfoData","allUniqueDimensionIds","getProductsDimensionsIds","updatedDimensionProps","getUpdatedDimensionsProps","tableReference","tableHeaderReference","tableBodyReference","tableCellReference","shouldShowPreviousClicker","shouldShowNextClicker","handlePreviousClick","handleNextClick","handleScroll","handleHoverIn","handleHoverOut","uniqueDimensionIds","_getProductsDimensions","dimensionsProps","uniqueSpecifications","_getProductsSpecifications","specificationsProps","_getSpecificationProps","GetProductsInProductComparisonInput","getProductsInProductComparisonAction","_renderQuickView","_product$productInfo$","quickViewSlot","quickViews","selectedDimensions","selectedProductId","defaultImageSettingsQ","_getTableHeaderProps","isHoverModeEnabled","tableHeaderCellClassName","_getTableCellProps","cellClassName","tableCellClassName","_renderProductRating","_ratingValue$reviewsC","averageRating","ratingValue","productComparisonProductItemRatingAriaLabel","reviewsCount","shouldShowFullRatingDescription","backToShoppingLabel","_getDimensionName","dimensionId","ProductDimensionType","Color","productComparisonProductItemColorDimension","Size","productComparisonProductItemSizeDimension","Style","productComparisonProductItemStyleDimension","dimensionClassName","dimensionsRowClassName","dimensionDescription","dimensionSelectionType","dimensionsAsSwatchConfiguration","dimensionsAsSwatchType","DimensionTypes","swatch","productDimensionValues","productMainInfo","_this$props$data$prod2","renderSwatch","textValue","productsDimension","_productsDimension$di","_productsDimension$di2","dimensionItems","dimensionItem","_dimensionItem$map","currentDimensionId","swatches","swatchItem","_productMainInfo$prod","_swatchItem$Dimension2","_swatchItem$Dimension3","_swatchItem$Dimension4","_swatchItem$Dimension5","_swatchItem$Dimension6","_swatchItem$Dimension7","_swatchItem$Dimension8","_swatchItem$Dimension9","isDefaultDimension","selectedDimension","_swatchItem$Dimension","DimensionId","colorHexCode","ColorHexCode","isDefault","SwatchComponent","list","isSelectionEnabled","_dimensionItem$Dimens","_dimensionItem$Dimens2","productDimensionSeperatorValue","productDimensionSeparator","dimensionProps","node","specificationClassName","specificationsRowClassName","specificationValues","_productMainInfo$prod2","productSpecification","productSpecifications","Heading","productComparisonTitle","productComparisonLoadingText","productComparisonClearAllButtonAriaLabel","productComparisonClearAllButtonText","tableClickerClassName","onKeyUp","productComparisonPreviousProduct","productComparisonNextProduct","_renderRemoveFromComparisonButton","productRowClassName","currentCatalogId","productUrlLink","_product$productInfo$2","_dimension$DimensionV2","isFromCurrentCatalog","productPriceClassName","cellNewWidth","minWidth","maxWidth","cellContainerProps","productComparisonProductItemFreePrice","productComparisonProductItemOriginalPrice","productComparisonProductItemCurrentPrice","quickView","goToProductDetailsButton","productComparisonGoToProductDetailsButtonText","tableCellProps","tableHeaderProps","productRating","productDescription","_renderProductDescription","tableBodyClassName","tableRowContentClassName","tableRowContentInformationClassName","renderDynamicHeaderCells","values","headerName","tabindex","renderDynamicCells","ProductComparisonViewFunctionalComponent","_props$productsMainIn5","_props$dimensionsProp","_props$specifications","_props$productsMainIn8","_props$productsMainIn9","actionsClassName","onScroll","_props$productsMainIn3","_props$productsMainIn4","productComparisonProductItemRating","_props$productsMainIn6","_props$productsMainIn7","productComparisonProductItemDescription","specificationProps","isNullOrEmpty","productComparisonProductItemSku","QuickOrderDrawer","_toggle","isManuallyToggled","collapseProps","drawerGlyphClass","toggleGlyphClassName","animateGlyph","drawerOpenGlyph","openGlyph","closeGlyph","drawerCloseGlyph","drawerClass","toggleButtonProps","block","_generateDrawerButtonInnerMarkup","collapseState","drawerButtonTextClass","toggleButtonClassName","moduleHeadingText","moduleDescriptionText","_generateGlyphMarkup","glyphClass","QuickOrderFormComponent","productTextInput","quantityTextInput","quickOrderState","maxQuantity","disableAddtoCart","ariaLabelQuantity","ariaLabelProduct","ariaLabelAddtoCart","addQuantityPlaceholderText","handleQuantityChange","handleAddToCartClick","onInputChangeFunction","onQuantityInputChange","onQuantityChangeFunction","productNode","quantityNode","pattern","quantity","addToCartBtn","stateMessage","messageText","QuickOrderProduct","cartLine","simpleProduct","isSelected","QuickOrderDesktopHeaderCellsComponent","columnWithNumberClassName","quickOrderProductNumberText","quickOrderProductText","quickOrderUnitPriceText","quickOrderUnitOfMeasureText","quickOrderQuantityText","quickOrderTotalText","quickOrderActionsText","QuickOrderMobileHeaderCellsComponent","QuickOrderTableHeaderComponent","rowClassName","headerCells","QuickOrderTableRowProductImageComponent","_props$context$reques","_props$data$product$P","_props$imageSettings","fallbackImageUrl","QuickOrderExtraActionsPopupComponent","QuickOrderDesktopTableRowCellComponent","_cartLine$LineId","quickOrderProductDimensionsSeparator","UnitOfMeasureSymbol","IncrementalQuantity","currentCount","inputQuantityAriaLabel","quickOrderInputQuantityAriaLabel","decrementButtonAriaLabel","quickOrderDecrementButtonAriaLabel","incrementButtonAriaLabel","quickOrderIncrementButtonAriaLabel","isGiftCard","TotalAmount","quickOrderRemoveItemButtonAriaLabel","QuickOrderMobileTableRowCellComponent","quickOrderQuantityMobileText","QuickOrderTableRowComponent","QuickOrderTableComponent","setIsMobile","isMobileView","quickOrderProducts","updateViewport","quickOrderProduct","QuickOrder","dimensionUpdateQueue","FinitePromiseQueue","initializedDimensions","Set","cssClassNameConfigure","quickOrderCallbacks","initializeDimension","initializedDimension","dimensionSelectedAsync","selectedDimensionId","selectedDimensionValueId","_this$state$productDi","size","enqueue","_updateDimensions","FinitePromiseQueueError","ProcessWasDiscardedFromTheQueue","getDropdownName","_getDropdownName","changeUpdatingDimension","isUpdatingDimension","productText","productResponse","inputQuantityText","quantityInput","HTMLInputElement","cancellableDebounce","isQuickOrderFormExpanded","getScanResult","GetScanResultInput","ProductDimensionFull","quickOrderAddedToCartSuccessMessage","quickOrderAddedToCartFailureMessage","_validateCart","defaultDeliveryOption","productAvailableQuantity","_updateAvailability","shouldValidateQuantityLimits","_shouldValidateQuantityLimits","deliveryMode","inputProductText","_getMaxQtyMessage","_featureStatuses$find","_featureStatuses$find2","_featureStatuses$find3","featureStatuses","_this$props$data$cart","_cartConfiguration$Ig","cartConfiguration","IgnoreOrderSettings","_getConcatenatedMaxQtyMessage","currentQuantity","quickOrderMaxQuantityLimitText","quickOrderAlreadyItemQuantityText","_handleQuantityChange","currentValue","inputElement","_updateDimensionValue","productDimensionFull","newValueId","DimensionValues","_this$state$productRe","productDimensionTypeConfiguration","dimensionsToUpdate","productDimensionErrorState","otherError","clearOtherErrorState","keys","configureErrors","errorState","mappedDimensions","selectedProduct","resolve","reject","newProduct","getSelectedVariant","SelectedVariantInput","MasterProductId","getDimensionsForSelectedVariant","GetDimensionsForSelectedVariantInput","variantProduct","newAvailableQuantity","getProductAvailabilitiesForSelectedVariant","ProductAvailabilitiesForSelectedVariantInput","productAvailable","_getDimensionErrorString","dimensionTypeValue","quickOrderproductDimensionTypeColorErrorMessage","quickOrderproductDimensionTypeConfigurationErrorMessage","quickOrderproductDimensionTypeSizeErrorMessage","quickOrderproductDimensionTypeAmountErrorMessage","quickOrderproductDimensionTypeStyleErrorMessage","_updateProductAvailability","_productResponse$Dime","missingDimensions","_getConfigureErrors","quickOrderWrongQuantityErrorMsg","quickOrderOutofStockErrorMsg","quickOrderFormClass","quickOrderFormProductContent","quickOrderFormMsgContent","quickOrderModuleHeading","quickOrderModuleDescription","quickOrderAddtobag","quickOrderProductQuantityInputLabel","quickOrderProductInputLabel","quickOrderProductDimensionTypeColor","quickOrderProductDimensionTypeConfiguration","quickOrderSelectDimensionFormatString","quickOrderProductDimensionTypeSize","quickOrderProductDimensionTypeStyle","quickOrderProductDimensionTypeAmount","quickAddQuantityPlaceholderText","productConfigureResources","selectDimensionFormatString","quickOrderProps","contentProps","isB2B","drawer","quickOrderForm","quickOrderList","_renderQuickOrderTable","configure","getProductConfigure","_initQuickOrderProducts","_cart$cart$CartLines","productInventoryInfo","_cart$result","addedQuantity","_item$ItemId","_this$state$productRe2","renderConfigure","containerProps","dropdowns","renderConfigureDropdown","dropdown","labelContainerProps","errors","select","renderForm","quickOrderProductContent","quickOrderMsgContent","tenantId","inputIsValid","serviceEndpoint","sendRequest","userReviewData","headers","Authorization","authorization","response","SubmitUserReviewInput","onClickSubmit","ReviewModal","TelemetryConstant","SubmitReview","submitButtonAttribute","Cancel","cancelButtonAttribute","modalCSS","cancelButton","discardReviewButtonText","submitButton","submitDisabled","submitReviewButtonText","ratingsInput","ratingsLabel","titleInput","titleLabel","textInput","textLabel","privacyPolicyUrl","privacyPolicyLink","inputRow","hasError","errorMessageText","userReview","reviewId","editReviewModalTitle","writeReviewModalTitle","stripWhiteSpacesFromString","reviewText","reviewTitle","selectRatingAriaLabel","initialRating","parentId","parentType","onRatingChange","selectRatingLabel","reviewTitleMaxLength","renderContextId","onTitleChange","reviewTitleAriaLabel","htmlFor","reviewTitleLabel","reviewTextMaxLength","rows","reviewAriaLabel","reviewTextLabel","policyTextBlocks","privacyPolicyTextFormat","isSeparatorAtStart","startsWith","isSeparatorAtEnd","endsWith","PrivacyPolicy","privacyPolicyAttribute","rel","privacyPolicyTitle","submitReview","onReviewComplete","onReviewSubmission","getRnrPartnerId","userEmail","emailAddress","userName","getRnrAuthEndpointId","submitUserReview","review","submittedDateTime","helpfulPositive","helpfulNegative","firstName","getReviewInput","GetUserReviewInput","TOGGLE_REVIEW_MODAL_BUTTON_ID","TOGGLE_EDIT_MODAL_BUTTON_CARD_ID","HistogramItems","ratingsSummary","totalRatingsCount","renderItem","star5Count","star4Count","star3Count","star2Count","star1Count","stars","totalCount","percentage","formattedPercent","barItemAriaLabel","starLabel","bar","Progress","buttonProps","AverageRatingNumber","summary","TotalReviews","RatingsHistogram","selectFilterBy","completeClass","classname","histogramItems","averageRatingAriaLabel","averageNumber","totalReviews","ratingsSummaryProps","histogramProps","filterKey","createRatingsReviewsStateInput","histogramItem","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","isNextPage","page","pageModifier","pageReviewCount","updateReviews","selectedFilterByOption","reportConcernDropdownOptions","radioPairs","pairs","inputId","checked","reportedKey","onRadioChange","reviewRatingNarratorText","voteHelpfulButton","isVoted","isVotedFor","votedReviews","approved","isUserReview","isOboRequest","yesButtonText","noButtonText","voteCount","onClickMethod","updateReviewHelpfulness","signInUrl","editButton","toggleWriteReviewModal","editReviewCardText","renderDate","date","DateTimeFormat","month","day","year","toggleReportReviewModal","reportToggle","reportConcernText","reportedReviews","reportedText","reportedReviewId","SubmitHelpfulnessVoteInput","ReviewsList","mostHelpfulSortOptionText","mostRecentSortOptionText","highestRatedSortOptionText","lowestRatedSortOptionText","filterByDropdownOptions","allRatinsFilterByOptionText","fiveStarFilterByOptionText","fourStarFilterByOptionText","threeStarFilterByOptionText","twoStarFilterByOptionText","oneStarFilterByOptionText","reviewsListCallbacks","updateReviewTitle","userReviewTitle","updateReviewText","userReviewText","updateRating","userReviewRating","onReviewSubmitted","isSuccessful","isReviewModalOpen","hasReviewError","_toggleReviewModal","updateReviewHelpfulnessVote","toggleReportModal","isReportModalOpen","_onReportModalOpen","_onReportModalClose","reportReview","_reportReviewCallback","updateFilterByDropdown","updateSortByDropdown","reviewsList","pagingInfo","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","header","headerSubmitted","feedbackThankYouText","cancelReportReviewText","reportReviewButtonText","succesfulButton","okReportReviewText","reportMessage","reportModalMessage","reportSubmittedMessage","radioButtons","ReportReviewModal","_onRadioChange","_reportReview","hasReportError","reported","reportReviewConcern","getUserToken","_value","reportedReview","skipItems","getSelectedProductIdFromActionInput","getReviewsForGivenProduct","GetProductReviewsInput","getRnrEndpointId","_updateVoteUi","alreadyExists","concat","submitHelpfulnessVote","showSpinner","reviewModal","reportReviewModal","filterByDropdown","filterByDropdownText","controlledByParent","sortByDropdown","sortByDropdownText","reviewCount","refineReviewsProps","reviewsListProps","reviewCards","pageControls","noReviewsMessage","noReviewsWithFilterMessage","noReviewsWithSelectedFilterMessage","filterByOptions","buildReviewCard","createReviewModal","createReportModal","SignInMessage","SignInButton","SignIn","WriteReview","writeReviewCallbacks","userInfo","signInMessage","signInButton","signInLabel","signInAriaLabel","editReviewButtonText","reviewButtonLabel","_buildUserReviewModal","channelInventoryConfigurationId","productListInventoryDisplay","ProductListInventoryFilteringOptions","HideOOS","choice","_rangeParentDisplay$","rangeParentDisplay","p","rangeDisplayType","closeAriaLabel","newIntRange","_parent","refinerValues","filterValue","getIntegerRangeName","_context$request$app","recommendation","featureSimilarDescriptionTitle","getInventoryLabel","inventoryAttribute","quickviewSlot","productComparisonButton","isPriceMinMaxEnabled","productsDimensionAvailabilities","priceResources","priceRangeSeparator","quickViewButton","inventoryLabel","swatchItemAriaLabel","dimensionAvailabilities","dimensionAvailability","masterProductId","RangeRefineItemInput","_changeMinInputRange","_changeMaxInputRange","_applyCustom","isCustomRangeTypeIntegerSelected","invalidData","previousProps","updateInputRangerProps","_this$props$selectedR2","_this$props$selectedR3","_this$props$selectedR4","_isUndefined","_selectedRefinementCr","_ref2","getLabels","getSliderThumbs","sliderKey","_this$props$minValueS","_this$props$maxValueS","String","minValue","maxValue","sliderKeyString","updateSliderProps","_ref3","_this$props$selectedR5","_this$props$selectedR6","_ref4","_this$props$selectedR7","_this$props$selectedR8","_this$props$parentPro","_this$props$parentPro2","productCountAriaLabel","singleProductCountAriaLabel","refineItemAriaLabel","refineItemsAriaLabel","productCount","refineMenuItemAriaLabel","shouldDisplayAsSwatch","_getShouldDisplayAsSwatch","hasColor","SwatchColorHexCode","hasImage","SwatchImageUrl","hasContentSwatch","rangeValue","isSingleSelectRangeTypeIntegerSelected","_renderSwatch","checkIfShouldDisplayAsSwatch","_productRefinerValue$2","swatchItems","isRefineItem","ratingUserCountAriaLabel","ratingSingleUserCountAriaLabel","_productRefinerValue$3","defaultChkProductCount","productCountAriaLabelValue","isRangeTypeForInteger","RightValueBoundLocalizedString","r","sortByOptionBestSelling","sortByOptionNewScore","sortByOptionTrendingScore","defaultPageNumber","isListPageStateUpdated","_isMounted","_updateVariantAvailability","dimensionsToDisplayOnProductCard","dimensionsInProductCard","dimensionsToDisplayAsSwatch","_getProductsDimensionsAvailabilities","_updateListPageState","_this$props$config$it","_this$props$config$it2","_this$props$context$r3","hydrateRefinersFromUrl","_this$props$data$list","_this$props$data$list2","getDimensionAvailabilitiesForProductSearchResultAction","DimensionAvailabilitiesForProductSearchResultInput","DimensionSwatchDisplayTypes","_this$props$data$list3","_this$props$data$list4","getPriceForProductSearchResult","PriceForProductSearchResultInput","_this$props$context$r4","_getAllSortByOptions","_renderPrev","_renderNext","updateRefinerPanel","_shouldHideFromRefiners","_this$props$data$prod3","_this$props$data$prod4","channelInventoryConfiguration","isInventorySortableAttribute","inventoryAwareSortableAttributeId","ProductAvailabilitySortableAttributeRecordId","isInventoryProductAttribute","InventoryProductAttributeRecordId","_this$props$data$refi","_getProducts","_this$props$slots","_this$props$data$prod5","shouldAllowBackNavigation","breadCrumbType","shouldAllowBack","quickview","isPriceMinMaxFeatureState","_getSortCriteriaColumn","_this$props$data$list5","queryColumns","mappedSearchConfiguration","_this$props$data$list6","paginationPreviousText","paginationNextText","_nameTranslation","_this$props$context$a2","StoreOperationsDataActions","_listPageState$active","_listPageState$sortin","_newListPageState$cur","_newListPageState$sor","_newListPageState$act","_this$props$context$r5","_this$props$context$r6","_this$props$context$r7","newListPageState","Recommendation","_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","productCollection","Viewport","isRecoSearchPage","renderSort","renderRefiner","renderTitleCount","_props$context$action","SearchState","SocialShareItem","_getSocialShareItem","viewprops","SocialShareItemElement","icon","socialMedia","SocialMediaComponent","SocialMedia","Facebook","postUrl","Twitter","Pinterest","Linkedin","Mail","SocialShareItemView","getAdditionalContentItems","additionalContentItemContainer","videoPlayerAdditionalContent","additionalContentItems","VideoPlayer","isMobileDevice","options","playerResources","playAriaLabel","playLabel","pauseAriaLabel","pauseLabel","playingAriaLabel","playingLabel","pausedAriaLabel","pausedLabel","muteAriaLabel","muteLabel","unMuteAriaLabel","unMuteLabel","fullScreenAriaLabel","fullScreenLabel","exitFullScreenAriaLabel","exitFullScreenLabel","seekBarLabel","videoTimeDurationLabel","closedCaptionLabel","videoMetaData","_video$_links","videoId","duration","playTime","thumbnail","posterframeUrl","_links","binaryReferences","videoBinaryReferences","videoPlayerData","metaData","player","Player","playerData","_getVideoDetailsHeading","_getVideoDetailsParagraph","_getVideoDetailsLinks","detailsContainerCTA","handleText","handleParagraph","handleLink","handleAdditionalLink"],"sourceRoot":""}