{"version":3,"file":"static/js/7.8a3d1d695042b69dede2.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/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.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/search/actions/get-auto-suggest-suggestions.ts?4735","webpack://Citta2.0/./src/modules/search/components/search.categorysuggest.tsx?c65d","webpack://Citta2.0/./src/modules/search/components/search.form.tsx?25a5","webpack://Citta2.0/./src/modules/search/components/search.keywordsuggest.tsx?297c","webpack://Citta2.0/./src/modules/search/components/search.label.tsx?0c17","webpack://Citta2.0/./src/modules/search/components/search.productsuggest.tsx?2af9","webpack://Citta2.0/./src/modules/search/search.tsx?72fb","webpack://Citta2.0/./src/modules/search/search.view.tsx?1505","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","webpack://Citta2.0/./src/modules/wishlist-items/components/wishlist-items-dimensions.tsx?15c5","webpack://Citta2.0/./src/modules/wishlist-items/components/wishlist-item.tsx?d2da","webpack://Citta2.0/./src/modules/wishlist-items/components/wishlist-items-status-message.tsx?cdb3","webpack://Citta2.0/./src/modules/wishlist-items/wishlist-items.tsx?df8b","webpack://Citta2.0/./src/modules/wishlist-items/wishlist-items.view.tsx?4d80"],"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\") {\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: \"black\"}: {}}>{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;","/*!\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 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 /**\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 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 * 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 const isOrderQuantityLimitsFeatureEnabledInHq =\n this.props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature'\n )?.IsEnabled || false;\n const isChannelQuantityLimitsFeatureEnabledInHq =\n this.props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.EcommerceQuantityLimitConfigurationsFeature'\n )?.IsEnabled || false;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- existing code.\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 // 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 const isQuantityLimitsFeatureEnabled =\n (isOrderQuantityLimitsFeatureEnabledInHq && isOrderQuantityLimitsFeatureEnabledInSiteSettings) ||\n isChannelQuantityLimitsFeatureEnabledInHq;\n if (this.state.productAvailableQuantity === undefined) {\n await this._updateAvailability();\n }\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: isQuantityLimitsFeatureEnabled },\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' && isQuantityLimitsFeatureEnabled) {\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 _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 } from './components';\nimport { IQuickOrderViewProps } from './quick-order';\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 { 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 { isMatchingRefinementCriterion, isRangeType } from './utilities';\n\ninterface IRefinerMap {\n key: string;\n value: ProductRefinerValue;\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 return {\n key: this._getKeyForRefinerValue(selectedRefiner, index.toString()),\n value: selectedRefiner\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\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 {item.value.LeftValueBoundString && item.value.LeftValueBoundLocalizedString === ''\n ? item.value.LeftValueBoundString\n : (item.value.LeftValueBoundLocalizedString ||\n item.value.LeftValueBoundLocalizedString === undefined) &&\n item.value.RefinerRecordId === 0\n ? item.key\n : item.value.LeftValueBoundString}\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 if (refinerHierarchy && refinerHierarchy.find) {\n const 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 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 { 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 { ProductRefinerSource, ProductRefinerValue, RefinerType } 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';\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\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 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 { DisplayTemplate, ProductRefinerSource, ProductRefinerValue, RefinerType } 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, isRangeType } from './utilities';\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 // If (this.props.productRefinerHierarchy.DataTypeValue === ProductRefinerValueDataTypeValue.Range) {\n // isExpanded = true;\n // }\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 (isRangeType(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 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 const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\n\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 </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, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\n\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\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 (\n dataTypeValue === AttributeDataType.Currency ||\n dataTypeValue === AttributeDataType.Decimal ||\n dataTypeValue === AttributeDataType.Integer\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(productRefinerValue: ProductRefinerValue, refinementCriterion: ProductRefinerValue): boolean {\n // If the value is a range, then match only on data type value; otherwise match on item string\n return (\n refinementCriterion.RefinerRecordId === productRefinerValue.RefinerRecordId &&\n refinementCriterion.RefinerSourceValue === productRefinerValue.RefinerSourceValue &&\n refinementCriterion.DataTypeValue === productRefinerValue.DataTypeValue &&\n (isRangeType(refinementCriterion.DataTypeValue) ||\n refinementCriterion.LeftValueBoundString === productRefinerValue.LeftValueBoundString)\n );\n}\n\nexport function getUpdatedRefinementCriteria(\n itemToggleNotification: IRefineItemToggleNotification,\n currentRefinementCriteria: ProductRefinerValue[]\n): ProductRefinerValue[] {\n const updatedRefinementCriteria: ProductRefinerValue[] = [];\n let toggledItemFound = false;\n currentRefinementCriteria.forEach((selectedCriterion: ProductRefinerValue) => {\n if (isMatchingRefinementCriterion(itemToggleNotification.productRefinerValue, selectedCriterion)) {\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)\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} 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 { 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 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 &&\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 = listPageState?.currentPageNumber\n ? listPageState.currentPageNumber * (this.props.config.itemsPerPage || 10)\n : (this.props.context.request.query && +this.props.context.request.query.skip) || 0;\n const totalItems = listPageState?.totalProductCount || 0;\n const previousText = resources.flipperPrevious;\n const nextText = resources.flipperNext;\n\n if (totalItems <= itemsPerPage) {\n return null;\n }\n return (\n <UncontrolledPagination\n className='ms-search-result-container__pagination'\n role='navigation'\n aria-label={resources.paginationAriaLabel}\n url={fullUrl.href}\n qsp='skip'\n items={totalItems}\n itemsPerPage={itemsPerPage}\n startingItem={skipCount}\n previousText={this._renderPrev(previousText)}\n nextText={this._renderNext(nextText)}\n previousAriaLabel={previousText}\n nextAriaLabel={nextText}\n telemetryContent={this.telemetryContent}\n />\n );\n };\n\n private readonly _getRefineMenu = (): IRefineMenuViewProps => {\n const { data, context, config } = this.props;\n const tempRangeTypeTODO = context.request.query && context.request.query.inputRange ? 'input' : 'slider';\n const validRefiners =\n this.props.config.updateRefinerPanel && ArrayExtensions.hasElements(this.state.refiners)\n ? this.state.refiners.filter(refiner => {\n return ArrayExtensions.hasElements(refiner.Values) && !this._shouldHideFromRefiners(refiner);\n })\n : data.refiners.result &&\n data.refiners.result.filter(refiner => {\n return ArrayExtensions.hasElements(refiner.Values) && !this._shouldHideFromRefiners(refiner);\n });\n\n const activeRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\n\n this._getexpandRefinerCount(validRefiners && validRefiners.length, config.expandRefinersCount);\n const expandedRefiners = this.expandrefinerCount;\n const subMenus =\n validRefiners &&\n validRefiners.map((productRefinerHierarchy: IProductRefinerHierarchy, index: number) => {\n return (\n <RefineSubmenu\n productRefinerHierarchy={productRefinerHierarchy}\n selectedRefinerValues={activeRefiners}\n refineItemCommonProps={this._refineItemCommonProps}\n minValueSliderThumbAriaLabel={this.props.resources.minValueSliderThumbAriaLabel}\n maxValueSliderThumbAriaLabel={this.props.resources.maxValueSliderThumbAriaLabel}\n key={index}\n onUpdateRefiners={this._onUpdateRefiners}\n urlBuilder={this._buildRefinerUrl}\n isDisabled={false}\n isExpandedOnInitialLoad={!!(expandedRefiners && expandedRefiners > index)}\n tempRangeTypeTODO={tempRangeTypeTODO}\n context={context}\n moduleId={this.props.id}\n moduleTypeName={this.props.typeName}\n telemetryContent={this.telemetryContent}\n productCountAriaLabel={this.props.resources.productCountAriaLabel}\n refineItemAriaLabel={this.props.resources.refineItemAriaLabel}\n refineItemsAriaLabel={this.props.resources.refineItemsAriaLabel}\n singleProductCountAriaLabel={this.props.resources.singleProductCountAriaLabel}\n isMobile={this.isMobile}\n />\n );\n });\n\n return {\n RefineMenuContainer: { className: 'ms-search-result-container__refine-menu' },\n RefinerSectionContainer: { className: 'ms-search-result-container__refiner-section' },\n refiners: subMenus\n };\n };\n\n /**\n * Should hide from refiners.\n * @param refiner - The refiner.\n * @returns ShouldHideFromRefiners.\n */\n private readonly _shouldHideFromRefiners = (refiner: IProductRefinerHierarchy): boolean => {\n const { channelInventoryConfiguration } = this.state;\n const isInventorySortableAttribute =\n (this.props.data.products.result?.inventoryAwareSortableAttributeId !== 0 &&\n refiner.RecordId === this.props.data.products.result?.inventoryAwareSortableAttributeId) ||\n (channelInventoryConfiguration?.ProductAvailabilitySortableAttributeRecordId !== 0 &&\n refiner.RecordId === channelInventoryConfiguration?.ProductAvailabilitySortableAttributeRecordId);\n\n const isInventoryProductAttribute =\n (this.props.data.products.result?.channelInventoryConfigurationId !== 0 &&\n refiner.RecordId === this.props.data.products.result?.channelInventoryConfigurationId) ||\n (channelInventoryConfiguration?.InventoryProductAttributeRecordId !== 0 &&\n refiner.RecordId === channelInventoryConfiguration?.InventoryProductAttributeRecordId);\n\n // Always hide sortable attribute since it's just for sorting products in Azure search, not for customers\n return (\n isInventorySortableAttribute ||\n (this.props.context.app.config.productListInventoryDisplay === ProductListInventoryFilteringOptions.HideOOS &&\n isInventoryProductAttribute)\n );\n };\n\n private readonly _getChoiceSummary = (): React.ReactNode => {\n const { resources, data, telemetry } = this.props;\n const { channelInventoryConfiguration } = this.state;\n const selectedRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\n const refinerValueName = this.props.data.refiners.result?.find(rating => rating.KeyName === 'Rating');\n return (\n <ChoiceSummary\n classNames='ms-choice-summary-by-category'\n clearAllText={resources.clearAllText}\n label={resources.choiceSummaryLabel}\n closeAriaLabel={resources.closeAriaLabel}\n selectedChoices={selectedRefiners}\n // @ts-expect-error: NOTE Type-unsafe line below, null refinersByCategoryHierarchy case not handled\n refinerHierarchy={data.refiners.result}\n choiceFormat={resources.choiceFormat}\n choiceRangeValueFormat={resources.choiceRangeValueFormat}\n telemetry={telemetry}\n onChoiceClicked={this._onChoiceClicked}\n urlBuilder={this._buildRefinerUrlForChoiceSummary}\n choiceAriaLabel={resources.choiceAriaLabel}\n telemetryContent={this.telemetryContent}\n context={this.props.context}\n channelInventoryConfigurationId={channelInventoryConfiguration?.InventoryProductAttributeRecordId}\n refinerValues={refinerValueName}\n />\n );\n };\n\n /**\n * Get Active products.\n * @returns - JSX Elements.\n */\n private readonly _getProducts = (): JSX.Element => {\n const {\n config: { imageSettings, allowBackNavigation: shouldAllowBackNavigation }\n } = this.props;\n const { resources } = this.props;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- Reading config value.\n const breadCrumbType: string = this.props.context.app.config.breadcrumbType;\n const shouldAllowBack = shouldAllowBackNavigation && (breadCrumbType === 'back' || breadCrumbType === 'categoryAndBack');\n\n const products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\n const quickviewSlot = this.props.slots?.quickview?.[0];\n const productComparisonButton = ArrayExtensions.hasElements(this.props.slots.productComparisonButton)\n ? this.props.slots.productComparisonButton[0]\n : null;\n\n const isPriceMinMaxFeatureState = this.props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailSearchPriceRangeFeature'\n );\n return (\n <ProductSearchResultItems\n products={products}\n context={this.props.context}\n imageSettings={imageSettings}\n resources={resources}\n moduleType={this.props.typeName}\n moduleId={this.props.id}\n allowBackNavigation={shouldAllowBack}\n telemetryContent={this.telemetryContent}\n quickviewSlot={quickviewSlot}\n productComparisonButton={productComparisonButton}\n channelInventoryConfigurationId={this.props.data.products.result?.channelInventoryConfigurationId}\n isPriceMinMaxEnabled={isPriceMinMaxFeatureState?.IsEnabled}\n productsDimensionAvailabilities={this.state.productsDimensionAvailabilities}\n />\n );\n };\n\n private readonly _updateSortByDropdown = (notification: ILabeledDropdownOnChangeNotification): void => {\n const {\n context: { request: requestContext, actionContext }\n } = this.props;\n\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\n // eslint-disable-next-line max-len -- existing code\n const error = `[sort-by-category] cannot sort without context: ${!requestContext ? 'requestContext ' : ''} ${\n !actionContext ? 'actionContext ' : ''\n } could not be found`;\n this.props.telemetry.warning(error);\n return;\n }\n\n window.history.pushState(\n {},\n '',\n buildListPageUrl(\n getCurrentUrl(this.props.context.request),\n undefined,\n [this._getSortColumnFromSelectedOption(notification.selectedOption)],\n undefined\n )\n );\n transaction(() => {\n this.props.data.listPageState.result!.currentPageNumber = 0;\n this.props.data.listPageState.result!.sortingCritera = {\n Columns: [this._getSortColumnFromSelectedOption(notification.selectedOption)]\n };\n });\n };\n\n private readonly _getSortColumnFromSelectedOption = (option: ILabeledDropdownOption): SortColumn => {\n const { data } = this.props;\n\n if (!data.searchConfiguration.result) {\n return {};\n }\n\n const mappedConfiguration = data.searchConfiguration.result.find(searchConfiguration => {\n return searchConfiguration.key === option.key;\n });\n\n if (mappedConfiguration) {\n return mappedConfiguration.sortColumn;\n }\n\n return {};\n };\n\n /**\n * Retrieves current sort criteria.\n * @returns Sort criteria column which is currently active or undefined if it's not specified.\n */\n private readonly _getSortCriteriaColumn = (): SortColumn | undefined => {\n const sortCriteria = this.props.data.listPageState.result?.sortingCritera;\n if (ArrayExtensions.hasElements(sortCriteria?.Columns)) {\n return sortCriteria!.Columns[0];\n }\n\n const queryColumns = parseQueryParam<SortColumn[]>('sorting', this.props.context.request);\n if (ArrayExtensions.hasElements(queryColumns)) {\n return queryColumns[0];\n }\n\n return undefined;\n };\n\n /**\n * Retrieves dropdown options.\n * @returns All dropdown options.\n */\n private readonly _getAllSortByOptions = (): ILabeledDropdownOption[] => {\n const searchConfiguration = this.props.data.searchConfiguration.result;\n\n if (!searchConfiguration) {\n return [];\n }\n\n const mappedSearchConfiguration = this.sortByDropdownOptions.filter(mappedSearchConfig =>\n searchConfiguration.find(item => mappedSearchConfig.key === item.key)\n );\n\n return ArrayExtensions.validValues(mappedSearchConfiguration);\n };\n\n /**\n * Retrieves current selected dropdown option based on the sort criteria.\n * @returns Current dropdown option.\n */\n private readonly _getCurrentlySelectedOption = (): ILabeledDropdownOption | undefined => {\n const activeSortColumn = this._getSortCriteriaColumn();\n\n const searchConfiguration = this.props.data.searchConfiguration.result;\n\n if (!activeSortColumn || !searchConfiguration) {\n return undefined;\n }\n\n const activeMappedConfig = searchConfiguration.find(\n mappedSearchConfig =>\n mappedSearchConfig.sortColumn.ColumnName === activeSortColumn.ColumnName &&\n mappedSearchConfig.sortColumn.IsDescending === activeSortColumn.IsDescending\n );\n if (!activeMappedConfig) {\n return undefined;\n }\n\n return this.sortByDropdownOptions.find(dropdownOption => dropdownOption.key === activeMappedConfig.key);\n };\n\n private readonly _onUpdateRefiners = (itemToggleNotification: IRefineItemToggleNotification): void => {\n const {\n context: { request: requestContext, actionContext }\n } = this.props;\n\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\n const error = `Refine menu cannot refine search criteria: \n ${!requestContext ? 'requestContext ' : ''} ${!actionContext ? 'actionContext ' : ''} could not be found`;\n this.props.telemetry.warning(error);\n return;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Server side the list PageState will not be called.\n const updatedRefinementCriteria = getUpdatedRefinementCriteria(\n itemToggleNotification,\n this.props.data.listPageState.result?.activeFilters || []\n );\n\n window.history.pushState({}, '', buildListPageUrl(getCurrentUrl(this.props.context.request), updatedRefinementCriteria));\n transaction(() => {\n this.props.data.listPageState.result!.currentPageNumber = 0;\n this.props.data.listPageState.result!.activeFilters = updatedRefinementCriteria;\n });\n };\n\n private readonly _buildRefinerUrl = (itemToggleNotification: IRefineItemToggleNotification): string => {\n if (this.props.data.listPageState.result) {\n const newRefinementCriteria = getUpdatedRefinementCriteria(\n itemToggleNotification,\n this.props.data.listPageState.result.activeFilters || []\n );\n\n return buildListPageUrl(getCurrentUrl(this.props.context.request), newRefinementCriteria);\n }\n this.props.telemetry.warning('[buildRefinerQueryString]List Page State Not available, unable to build refiner URL');\n return '';\n };\n\n private readonly _onChoiceClicked = (notification: IChoiceSummaryClickNotification): void => {\n const { data, telemetry } = this.props;\n\n if (!data.listPageState.result) {\n telemetry.warning('[choice-summary-by-category._onChoiceClicked]ListPageState unavailable, unable to update refiners.');\n return;\n }\n\n let currentRefinementCriteria = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\n\n if (!notification.clearAll) {\n const selectedChoice = notification.choiceClicked;\n if (!selectedChoice) {\n telemetry.warning('[choice-summary-by-category._onChoiceClicked] Choice could not be determined');\n return;\n }\n currentRefinementCriteria = currentRefinementCriteria.filter(\n (selectedCriterion: ProductRefinerValue) => !isMatchingRefinementCriterion(selectedChoice, selectedCriterion)\n );\n } else {\n currentRefinementCriteria = [];\n\n // Set focus to sort and filter\n const dropdownElementId = this._sortAndFilterContainerRef.current && this._sortAndFilterContainerRef.current.props.dropdownId;\n const dropdownElement = dropdownElementId && document.getElementById(dropdownElementId);\n setTimeout(() => {\n dropdownElement && dropdownElement.focus();\n }, 50);\n }\n\n const fullUrl = getCurrentUrl(this.props.context.request);\n window.history.pushState({}, '', buildListPageUrl(fullUrl, currentRefinementCriteria));\n data.listPageState.result.currentPageNumber = 0;\n data.listPageState.result.activeFilters = currentRefinementCriteria;\n };\n\n private readonly _buildRefinerUrlForChoiceSummary = (selectedRefiner: ProductRefinerValue, isClearAll: boolean): string => {\n const { data, telemetry } = this.props;\n const fullUrl = getCurrentUrl(this.props.context.request);\n\n if (!data.listPageState.result) {\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl]ListPageState unavailable, unable to create refiner URL.');\n return fullUrl.href;\n }\n\n let currentRefinementCriteria = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\n\n if (!isClearAll) {\n if (!selectedRefiner) {\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl] URL for Choice could not be determined');\n return fullUrl.href;\n }\n currentRefinementCriteria = currentRefinementCriteria.filter(\n (selectedCriterion: ProductRefinerValue) => !isMatchingRefinementCriterion(selectedRefiner, selectedCriterion)\n );\n } else {\n currentRefinementCriteria = [];\n }\n\n return buildListPageUrl(fullUrl, currentRefinementCriteria);\n };\n\n private _getViewport(): GridSize {\n if (MsDyn365.isBrowser) {\n return isMobile({ variant: VariantType.Browser, context: this.props.context.request });\n }\n return isMobile({ variant: VariantType.Viewport, context: this.props.context.request });\n }\n\n private _toggleModal(): void {\n this.setState({\n modalIsOpen: !this.state.modalIsOpen\n });\n }\n\n private _updateViewport(): void {\n this._viewport = this._getViewport();\n\n if (this.state.modalIsOpen && !this.isMobile) {\n this._toggleModal();\n }\n }\n\n private readonly _getexpandRefinerCount = (validRefiners?: number, refinerCount?: expandRefinersCount): void => {\n switch (refinerCount) {\n case expandRefinersCount.all:\n this.expandrefinerCount = validRefiners;\n break;\n case expandRefinersCount.one:\n this.expandrefinerCount = 1;\n break;\n case expandRefinersCount.two:\n this.expandrefinerCount = 2;\n break;\n case expandRefinersCount.three:\n this.expandrefinerCount = 3;\n break;\n case expandRefinersCount.four:\n this.expandrefinerCount = 4;\n break;\n default:\n this.expandrefinerCount = 0;\n }\n };\n\n /**\n * Renders a Pagination previous text.\n * @param paginationPreviousText - Pagination previous text from resources.\n * @returns Previous text and flipper icon.\n */\n private readonly _renderPrev = (paginationPreviousText: string) => {\n return (\n <div className='msc-pagination__prev'>\n <span className='ms-search-result__pagination-left' aria-hidden='true' />\n <span className='prev-text'>{paginationPreviousText}</span>\n </div>\n );\n };\n\n /**\n * Renders a Pagination next text.\n * @param paginationNextText - Pagination next text from resources.\n * @returns Next text and flipper icon.\n */\n private readonly _renderNext = (paginationNextText: string) => {\n return (\n <div className='msc-pagination__next'>\n <span className='next-text'>{paginationNextText}</span>\n <span className='ms-search-result__pagination-right' aria-hidden='true' />\n </div>\n );\n };\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISearchResultModalViewProps } from './components';\nimport {\n ICategoryHierarchyViewProps,\n IRefineMenuViewProps,\n ISearchResultContainerViewProps,\n ISortByViewProps,\n ITitleViewProps\n} from './search-result-container';\n\nconst SearchResultContainerView: React.FC<ISearchResultContainerViewProps> = props => {\n const {\n SearchResultContainer,\n products,\n pagination,\n ProductsContainer,\n ProductSectionContainer,\n choiceSummary,\n isMobile,\n modalToggle,\n searchResultModal,\n TitleViewProps,\n refineMenu,\n categoryHierarchy,\n sortByOptions,\n CategoryNavContainer,\n RefineAndProductSectionContainer,\n errorMessage,\n FeatureSearchContainer,\n similarLookProduct\n } = props;\n const isRecoSearchPage = props.context.actionContext.requestContext.query?.recommendation;\n if (isMobile) {\n return (\n <Module {...SearchResultContainer}>\n {renderCategoryHierarchy(categoryHierarchy)}\n {renderTitle(TitleViewProps)}\n {choiceSummary}\n {modalToggle}\n {createSearchResultModal(searchResultModal, refineMenu, sortByOptions, isRecoSearchPage)}\n <Node {...FeatureSearchContainer}>{similarLookProduct}</Node>\n <Node {...ProductsContainer}>\n {errorMessage}\n {products}\n </Node>\n {pagination}\n </Module>\n );\n }\n return (\n <Module {...SearchResultContainer}>\n <Node {...CategoryNavContainer}>\n {categoryHierarchy && renderCategoryHierarchy(categoryHierarchy)}\n {TitleViewProps && renderTitleCount(TitleViewProps)}\n </Node>\n <Node {...RefineAndProductSectionContainer}>\n {refineMenu && renderRefiner(refineMenu)}\n <Node {...ProductSectionContainer}>\n {TitleViewProps && renderTitle(TitleViewProps)}\n {choiceSummary}\n {sortByOptions && !isRecoSearchPage && renderSort(sortByOptions)}\n <Node {...FeatureSearchContainer}>{similarLookProduct}</Node>\n <Node {...ProductsContainer}>\n {errorMessage}\n {products}\n </Node>\n {pagination}\n </Node>\n </Node>\n </Module>\n );\n};\n\nconst createSearchResultModal = (\n modalProps: ISearchResultModalViewProps,\n refineMenu: IRefineMenuViewProps,\n sortByDropDown: ISortByViewProps,\n isRecoSearchPage?: string\n): JSX.Element => {\n return React.cloneElement(\n modalProps.modal,\n {},\n modalProps.modalHeader,\n createModalBody(modalProps, refineMenu, sortByDropDown, isRecoSearchPage),\n modalProps.modalFooter\n );\n};\n\nconst createModalBody = (\n props: ISearchResultModalViewProps,\n refineMenu: IRefineMenuViewProps,\n sortByDropDown: ISortByViewProps,\n isRecoSearchPage?: string\n): JSX.Element | null => {\n if (sortByDropDown) {\n return React.cloneElement(props.modalBody, {}, renderSort(sortByDropDown, isRecoSearchPage), renderRefiner(refineMenu));\n }\n return null;\n};\n\nconst renderRefiner = (props: IRefineMenuViewProps): JSX.Element | null => {\n const { refiners, RefineMenuContainer, RefinerSectionContainer } = props;\n if (refiners) {\n return (\n <Node {...RefinerSectionContainer}>\n <Node {...RefineMenuContainer}>\n {refiners.map((submenu, index) => (\n <React.Fragment key={index}>{submenu}</React.Fragment>\n ))}\n </Node>\n </Node>\n );\n }\n return null;\n};\n\nconst renderSort = (props: ISortByViewProps, isRecoSearchPage?: string): JSX.Element | null => {\n const { SortingContainer, sortByDropDown } = props;\n if (sortByDropDown && !isRecoSearchPage) {\n return <Node {...SortingContainer}>{sortByDropDown}</Node>;\n }\n return null;\n};\n\nconst renderCategoryHierarchy = (props: ICategoryHierarchyViewProps): JSX.Element | null => {\n const { CategoryHierarchyContainer, categoryHierarchyList, categoryHierarchySeparator } = props;\n if (categoryHierarchyList) {\n return (\n <Node {...CategoryHierarchyContainer}>\n {categoryHierarchyList.map((category, index) => (\n <React.Fragment key={index}>\n {category}\n {categoryHierarchyList && categoryHierarchyList[index + 1] && categoryHierarchySeparator}\n </React.Fragment>\n ))}\n </Node>\n );\n }\n\n return null;\n};\n\nconst renderTitle = (props: ITitleViewProps): JSX.Element | null => {\n const { title, TitleContainer } = props;\n if (title) {\n return (\n <Node {...TitleContainer}>\n <h2>\n {title.titlePrefix}\n {title.titleText}\n </h2>\n </Node>\n );\n }\n return null;\n};\n\nconst renderTitleCount = (props: ITitleViewProps): JSX.Element | null => {\n const { title, TitleContainer } = props;\n if (title) {\n return (\n <Node {...TitleContainer}>\n <h5>{title.titleCount}</h5>\n </Node>\n );\n }\n return null;\n};\n\nexport default SearchResultContainerView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { observable } from 'mobx';\n\n/**\n * State information related to what is needed to succesfully perform a autosuggest.\n */\nexport class SearchState {\n @observable public searchText?: string;\n\n @observable public defaultBasicSearchUrl?: string;\n\n @observable public searchQueryStringParameter?: string;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Autosuggestions } from '@msdyn365-commerce/commerce-entities';\nimport {\n CacheType,\n createObservableDataAction,\n getCatalogId,\n IAction,\n IActionContext,\n IActionInput,\n ICreateActionContext\n} from '@msdyn365-commerce/core';\nimport { SearchSuggestion, SearchSuggestionCriteria } from '@msdyn365-commerce/retail-proxy';\nimport { getSearchSuggestionsAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/StoreOperationsDataActions.g';\nimport { generateImageUrl } from '@msdyn365-commerce-modules/retail-actions';\n\nexport enum SuggestionType {\n Category = 'ScopedCategory',\n Keyword = 'Keyword',\n Product = 'Product',\n None = 'None'\n}\n\n/**\n * Input class for auto suggest search input.\n */\nexport class AutoSuggestInput implements IActionInput {\n public searchQuery?: string;\n\n public topResultsCount?: number;\n\n public suggestionType?: string;\n\n public hitPrefix?: string;\n\n public hitSuffix?: string;\n\n public constructor(searchText?: string, top?: number, suggestionType?: string, hitPrefix?: string, hitSuffix?: string) {\n this.searchQuery = searchText;\n this.topResultsCount = top;\n this.suggestionType = suggestionType;\n this.hitPrefix = hitPrefix;\n this.hitSuffix = hitSuffix;\n }\n\n public getCacheKey = () => 'AutoSuggestSearchSuggestions';\n\n public getCacheObjectType = () => 'AutoSuggestSearchSuggestions';\n\n public dataCacheType = (): CacheType => 'none';\n}\n\nconst createInput = (inputData: ICreateActionContext) => {\n return new AutoSuggestInput();\n};\n\n/**\n * Calls the Retail API and returns a auto-suggest suggestions.\n * @param input\n * @param ctx\n */\nexport async function getSearchSuggestionsAction(input: AutoSuggestInput, ctx: IActionContext): Promise<Autosuggestions | null> {\n // If no input is provided fail out\n if (!input || !input.searchQuery) {\n throw new Error('[getSearchSuggestionsAction]No valid Input was provided, failing');\n }\n\n const autosuggest: Autosuggestions = {};\n\n const autoSuggestPromises = [_getAutoSuggest(input, autosuggest, ctx)];\n return Promise.all(autoSuggestPromises).then(() => {\n return autosuggest;\n });\n}\n\nasync function _getAutoSuggest(input: AutoSuggestInput, autosuggest: Autosuggestions, ctx: IActionContext): Promise<void> {\n const catalogId = getCatalogId(ctx.requestContext);\n const searchCriteria: SearchSuggestionCriteria = {\n ProductSearchCriteria: {\n SearchCondition: input.searchQuery && input.searchQuery.length > 0 ? input.searchQuery : '',\n Context: {\n ChannelId: +ctx.requestContext.apiSettings.channelId,\n CatalogId: catalogId\n }\n },\n HitPrefix: input.hitPrefix,\n HitSuffix: input.hitSuffix,\n SuggestionType: input.suggestionType\n };\n\n const searchSuggestions = await getSearchSuggestionsAsync(\n { callerContext: ctx, queryResultSettings: { Paging: { Top: input.topResultsCount } } },\n searchCriteria\n );\n\n if (searchSuggestions && searchSuggestions.length > 0) {\n // Generate image url\n searchSuggestions.map(\n (item: SearchSuggestion) =>\n (item.ImageUrl = item.ImageUrl ? generateImageUrl(item.ImageUrl, ctx.requestContext.apiSettings) : '')\n );\n\n autosuggest.AllSearchResults = searchSuggestions;\n } else {\n ctx.telemetry.error(\n `[getSearchSuggestionsAction] unable to get availabilites for search with suggestion type ${searchCriteria.SuggestionType}`\n );\n }\n}\n\nexport const getSearchSuggestionsActionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/search/get-auto-suggest-suggestions',\n action: <IAction<Autosuggestions>>getSearchSuggestionsAction,\n input: createInput\n});\n\nexport default getSearchSuggestionsActionDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport MsDyn365, { getRichTextHtml } from '@msdyn365-commerce/core';\nimport { ProductRefiner, ProductRefinerSource, ProductRefinerValue, SearchSuggestion } from '@msdyn365-commerce/retail-proxy';\nimport { format, getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISearchData } from '../search.data';\nimport { ISearchProps } from '../search.props.autogenerated';\n\nexport interface ISearchCategorySuggestProps {\n searchCategorySuggestClass: string;\n searchPageURL: string;\n searchQsp: string | undefined;\n hitPrefix: string;\n hitSuffix: string;\n autoSuggestProps: ISearchProps<ISearchData>;\n searchText: string;\n searchRefiners: ProductRefiner[] | undefined;\n suggestions: SearchSuggestion[] | undefined;\n telemetryContent?: ITelemetryContent;\n shouldShowFullPath?: boolean;\n}\n\nexport interface ISearchCategoryViewProps {\n title: React.ReactNode;\n text: React.ReactNode[];\n}\n\nlet payLoad: IPayLoad;\n\n/**\n * CategorySuggestionsComponent.\n * @param props\n */\nexport const CategorySuggestionsComponent = (props: ISearchCategorySuggestProps): ISearchCategoryViewProps | undefined => {\n const {\n suggestions,\n searchText,\n autoSuggestProps: {\n resources: { categorySuggestionHeading }\n }\n } = props;\n\n const reactNodes: React.ReactNode[] = [];\n payLoad = getPayloadObject('click', props.telemetryContent!, '');\n\n suggestions?.map(item => {\n reactNodes.push(_assembleNode(item, props));\n });\n\n const titleNode = _renderTitle(categorySuggestionHeading, searchText);\n\n return { title: titleNode, text: reactNodes };\n};\n\nconst _renderTitle = (categorySuggestionHeading: string, searchText: string) => {\n const categoryAutoSuggestionHeading = categorySuggestionHeading\n ? format(categorySuggestionHeading, searchText)\n : `Search \"${searchText}\" in categories`;\n\n return <li className='msc-autoSuggest__categoryResults-title'>{categoryAutoSuggestionHeading}</li>;\n};\n\nconst _assembleNode = (item: SearchSuggestion, props: ISearchCategorySuggestProps) => {\n const { searchText, hitPrefix, hitSuffix, shouldShowFullPath } = props;\n\n const splitValue = shouldShowFullPath ? item.Value : item.Value && item.Value.split('|').pop();\n const ariaLabel = splitValue\n ? splitValue.replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '')\n : item.Value && item.Value.replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n payLoad.contentAction.etext = item.Value;\n const attribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n return (\n <li className='msc-autoSuggest__categoryResults-item' key={item.Id}>\n <a aria-label={ariaLabel} href={_generateLink(item, searchText, props)} {...attribute}>\n {_generateLink(item, searchText, props) && _getHighlightedText(splitValue ? splitValue : '', hitPrefix, hitSuffix)}\n </a>\n </li>\n );\n};\n\nconst _generateLink = (suggestion: SearchSuggestion, searchText: string, props: ISearchCategorySuggestProps): string => {\n return suggestion && suggestion.Id ? _getCategoryLink(suggestion.Id, searchText, props) : '';\n};\n\nconst _getCategoryLink = (id: string, searchText: string, props: ISearchCategorySuggestProps): string => {\n const { searchPageURL, searchQsp, searchRefiners } = props;\n\n if (!MsDyn365.isBrowser) {\n return '';\n }\n\n const queryUrl = new URL(searchPageURL, window.location.href);\n\n if (searchQsp && searchText) {\n queryUrl.searchParams.set(searchQsp, searchText);\n }\n\n const categoryRefiners = searchRefiners?.find(refiners => {\n return refiners.SourceValue === ProductRefinerSource.Category;\n });\n const refiner = categoryRefiners?.Values?.find(item => {\n return item.RefinerRecordId === Number.parseInt(id, 10);\n });\n\n const encodedRefiner = refiner && JSON.stringify(compressRefiners([refiner]));\n if (encodedRefiner) {\n queryUrl.searchParams.set('refiners', encodedRefiner);\n }\n\n return queryUrl.href;\n};\n\nconst _getHighlightedText = (suggestion: string, hitPrefix: string, hitSuffix: string): JSX.Element => {\n const formattedText = suggestion\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '<strong>')\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '</strong>');\n\n // eslint-disable-next-line react/no-danger\n return <span dangerouslySetInnerHTML={getRichTextHtml(formattedText)} />;\n};\n\n// TODO: This code is currently duplicated in categoryautosuggest need to either remove one of these files\n// or move this code to a common place\nconst compressedRefinerKeys = [\n 'DataTypeValue',\n 'LeftValueBoundString',\n 'RefinerRecordId',\n 'RefinerSourceValue',\n 'RightValueBoundString',\n 'UnitText'\n];\n\n/**\n * Compressed a list of refiners for use in URLs.\n * @param refiners The uncompressed refiners.\n */\nconst compressRefiners = (refiners: ProductRefinerValue[]) => {\n const compressedRefiners: (string | number)[][] = [];\n\n refiners.forEach(refiner => {\n const compressedRefiner: (string | number)[] = [];\n compressedRefinerKeys.forEach(refinerKey => {\n compressedRefiner.push(refiner[refinerKey]);\n });\n compressedRefiners.push(compressedRefiner);\n });\n\n return compressedRefiners;\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Button } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface ISearchFormProps {\n hideSearchLabel: boolean | undefined;\n isSearchFormExpanded?: boolean | undefined;\n disableSubmitSearch: boolean | undefined;\n searchTextInput: React.RefObject<HTMLInputElement>;\n maxChars: number;\n searchQsp: string;\n searchPlaceholder: string;\n query: string;\n ariaLabelCancel: string;\n ariaLabelSearch: string;\n ariaLabelSubmit: string;\n handleCancelSearchChange(): void;\n handleInputChange(query: string): void;\n}\n\nexport interface ISearchFormViewProps {\n input: React.ReactNode;\n submitBtn: React.ReactNode;\n cancelBtn: React.ReactNode;\n}\n\n/**\n * On Input Change functionality.\n * @param handleInputChange -Input change function.\n * @returns Set updated input value.\n */\nconst onInputChangeFunction = (handleInputChange: (query: string) => void) => (event: React.ChangeEvent<HTMLInputElement>) => {\n handleInputChange(event.target.value || '');\n};\nexport const FormComponent = (props: ISearchFormProps): ISearchFormViewProps => {\n const {\n searchQsp,\n searchPlaceholder,\n hideSearchLabel,\n searchTextInput,\n handleInputChange,\n maxChars,\n disableSubmitSearch,\n handleCancelSearchChange,\n query,\n ariaLabelCancel,\n ariaLabelSearch,\n ariaLabelSubmit\n } = props;\n\n const onInputChange = onInputChangeFunction(handleInputChange);\n\n const inputNode = !hideSearchLabel ? (\n <input\n className='ms-search__form-control'\n type='text'\n aria-label={ariaLabelSearch}\n name={searchQsp}\n placeholder={searchPlaceholder}\n ref={searchTextInput}\n onChange={onInputChange}\n maxLength={maxChars}\n value={query}\n />\n ) : (\n <input\n className='ms-search__form-control'\n type='text'\n aria-label={ariaLabelSearch}\n name={searchQsp}\n placeholder={searchPlaceholder}\n ref={searchTextInput}\n onChange={onInputChange}\n value={query}\n />\n );\n\n const submitBtnNode = !disableSubmitSearch && <Button className='ms-search__form-submitSearch' aria-label={ariaLabelSubmit} />;\n\n const cancelBtNoden = (\n <Button\n className={!disableSubmitSearch ? 'ms-search__form-cancelSearch' : 'ms-search__form-cancelSearchNoSumbit'}\n aria-label={ariaLabelCancel}\n onClick={handleCancelSearchChange}\n type='button'\n />\n );\n\n return { input: inputNode, cancelBtn: cancelBtNoden, submitBtn: submitBtnNode };\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport MsDyn365, { getRichTextHtml } from '@msdyn365-commerce/core';\nimport { SearchSuggestion } from '@msdyn365-commerce/retail-proxy';\nimport { getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISearchData } from '../search.data';\nimport { ISearchProps } from '../search.props.autogenerated';\n\nexport interface ISearchKeywordSuggestProps {\n searchKeywordSuggestClass: string;\n searchPageURL: string;\n searchQsp: string | undefined;\n hitPrefix: string;\n hitSuffix: string;\n autoSuggestProps: ISearchProps<ISearchData>;\n searchText: string;\n suggestions: SearchSuggestion[] | undefined;\n telemetryContent?: ITelemetryContent;\n}\n\nexport interface ISearchKeywordViewProps {\n text: React.ReactNode[];\n}\n\nlet payLoad: IPayLoad;\n\n/**\n * KeywordSuggestionsComponent.\n * @param props\n */\nexport const KeywordSuggestionsComponent = (props: ISearchKeywordSuggestProps): ISearchKeywordViewProps | undefined => {\n const { suggestions, hitPrefix, hitSuffix } = props;\n\n payLoad = getPayloadObject('click', props.telemetryContent!, '');\n\n const reactNodes: React.ReactNode[] = [];\n\n suggestions?.map(item => {\n reactNodes.push(_assembleNode(item, hitPrefix, hitSuffix, props));\n });\n\n return { text: reactNodes };\n};\n\nconst _assembleNode = (item: SearchSuggestion, hitPrefix: string, hitSuffix: string, props: ISearchKeywordSuggestProps) => {\n const ariaLabel =\n item.Value && item.Value.replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n payLoad.contentAction.etext = ariaLabel;\n const attribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n return (\n <li className='msc-autoSuggest__keywordResults-item' key={item.Id}>\n <a aria-label={ariaLabel} href={_generateLink(item, hitPrefix, hitSuffix, props)} {...attribute}>\n {_generateLink(item, hitPrefix, hitSuffix, props) &&\n _getHighlightedText(item.Value ? item.Value : '', hitPrefix, hitSuffix)}\n </a>\n </li>\n );\n};\n\nconst _generateLink = (suggestion: SearchSuggestion, hitPrefix: string, hitSuffix: string, props: ISearchKeywordSuggestProps): string => {\n const { searchPageURL, searchQsp } = props;\n\n const formattedLink = (suggestion.Value as string)\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '')\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n\n if (!MsDyn365.isBrowser) {\n return '';\n }\n\n const queryUrl = new URL(searchPageURL, window.location.href);\n if (searchQsp && formattedLink) {\n queryUrl.searchParams.set(searchQsp, formattedLink);\n }\n\n return queryUrl.href;\n};\n\nconst _getHighlightedText = (suggestion: string, hitPrefix: string, hitSuffix: string): JSX.Element => {\n const formattedText = suggestion\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '<strong>')\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '</strong>');\n\n // eslint-disable-next-line react/no-danger\n return <span dangerouslySetInnerHTML={getRichTextHtml(formattedText)} />;\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Button, getPayloadObject, getTelemetryAttributes, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface ISearchLabelProps {\n isSearchFormExpanded: boolean;\n searchLabelClass: string;\n searchLabelArialLabel: string;\n searchtext: string;\n searchCollapsedLabel: React.RefObject<HTMLButtonElement>;\n hideSearchLabel?: boolean;\n telemetryContent: ITelemetryContent;\n handleCancelSearchChange(): void;\n}\n\nexport const LabelComponent = (props: ISearchLabelProps) => {\n const {\n searchLabelClass,\n searchLabelArialLabel,\n isSearchFormExpanded,\n searchtext,\n searchCollapsedLabel,\n hideSearchLabel,\n handleCancelSearchChange,\n telemetryContent\n } = props;\n const payLoad = getPayloadObject('click', telemetryContent, searchtext, '');\n const attributes = getTelemetryAttributes(telemetryContent, payLoad);\n\n return (\n <div className={searchLabelClass}>\n <Button\n className='ms-search__icon'\n aria-expanded={isSearchFormExpanded}\n aria-label={searchLabelArialLabel}\n onClick={handleCancelSearchChange}\n innerRef={searchCollapsedLabel}\n {...attributes}\n >\n {!hideSearchLabel && (\n <span className='ms-search__icon-text' aria-hidden>\n {searchtext}\n </span>\n )}\n </Button>\n </div>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { PriceComponent } from '@msdyn365-commerce/components';\nimport { getRichTextHtml, IActionContext, IImageSettings, Image, ITelemetry } from '@msdyn365-commerce/core';\nimport { SearchSuggestion } from '@msdyn365-commerce/retail-proxy';\nimport { getProductPageUrlSync, ObjectExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n getPayloadObject,\n getTelemetryAttributes,\n INodeProps,\n IPayLoad,\n ITelemetryContent,\n NodeTag\n} from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISearchData } from '../search.data';\nimport { ISearchProps } from '../search.props.autogenerated';\n\n/**\n * Search product suggest resources.\n */\nexport interface ISearchProductSuggestResources {\n freePriceText: string;\n}\n\nexport interface ISearchProductSuggestProps {\n searchProductSuggestClass: string;\n searchPageURL: string;\n searchQsp: string | undefined;\n hitPrefix: string;\n hitSuffix: string;\n autoSuggestProps: ISearchProps<ISearchData>;\n searchText: string;\n suggestions: SearchSuggestion[] | undefined;\n telemetry: ITelemetry;\n moduleType: string;\n moduleId: string;\n telemetryContent?: ITelemetryContent;\n resources?: ISearchProductSuggestResources;\n}\n\nexport interface ISearchProductViewProps {\n title: React.ReactNode;\n items: ISearchProductItemViewProps[];\n}\n\nexport interface ISearchProductItemViewProps {\n text: React.ReactNode;\n thumbnail: React.ReactNode;\n price: React.ReactNode;\n LiProduct: INodeProps;\n AProduct: INodeProps;\n id: string | undefined;\n}\n\nlet payLoad: IPayLoad;\nlet telemetryContent: ITelemetryContent | undefined;\n\n/**\n * ProductSuggestionsComponent.\n * @param props\n */\nexport const ProductSuggestionsComponent = (props: ISearchProductSuggestProps): ISearchProductViewProps | undefined => {\n const {\n suggestions,\n hitSuffix,\n hitPrefix,\n autoSuggestProps: {\n context: { actionContext },\n resources: { productSuggestionHeading }\n },\n moduleType,\n moduleId\n } = props;\n const reactNodes: ISearchProductItemViewProps[] = [];\n telemetryContent = props.telemetryContent;\n payLoad = getPayloadObject('click', props.telemetryContent!, '');\n\n suggestions?.map(item => {\n reactNodes.push(_assembleNode(item, hitPrefix, hitSuffix, actionContext, props, moduleType, moduleId));\n });\n\n const titleNode = _renderTitle(productSuggestionHeading);\n\n return { title: titleNode, items: reactNodes };\n};\n\nconst _renderTitle = (productSuggestionHeading: string) => {\n const productAutoSuggestionHeading = productSuggestionHeading ? productSuggestionHeading : 'Go to products';\n\n return <li className='msc-autoSuggest__productResults-title'>{productAutoSuggestionHeading}</li>;\n};\n\nconst _assembleNode = (\n item: SearchSuggestion,\n hitPrefix: string,\n hitSuffix: string,\n actionContext: IActionContext,\n props: ISearchProductSuggestProps,\n moduleType: string,\n moduleId: string\n): ISearchProductItemViewProps => {\n const altText =\n item.Value && item.Value.replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n\n const price = item.Value3?.Value?.DecimalValue;\n return {\n text: _getHighlightedText(item.Value ? item.Value : '', hitPrefix, hitSuffix),\n thumbnail: _renderThumbnail(item, altText ? altText : '', props),\n price: !ObjectExtensions.isNullOrUndefined(price) && _renderPrice(price, price, moduleId, moduleType, props),\n LiProduct: _getLiWrapper(),\n AProduct: _getAWrapper(item, hitPrefix, hitSuffix, actionContext, props),\n id: item.Id\n };\n};\n\nconst _getLiWrapper = () => {\n return {\n className: 'msc-autoSuggest__productResults-item',\n tag: 'li' as NodeTag\n };\n};\n\nconst _getAWrapper = (\n item: SearchSuggestion,\n hitPrefix: string,\n hitSuffix: string,\n actionContext: IActionContext,\n props: ISearchProductSuggestProps\n) => {\n const {\n autoSuggestProps: { context }\n } = props;\n const ariaLabel =\n item.Value && item.Value.replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n\n payLoad.contentAction.recid = item.Id;\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\n const productPrice = context.cultureFormatter.formatCurrency(item.Value3!.Value!.DecimalValue!);\n\n return {\n className: 'msc-autoSuggest__productResults-item',\n tag: 'a' as NodeTag,\n 'aria-label': `${ariaLabel!} ${productPrice}`,\n href: _generateLink(item, hitPrefix, hitSuffix, actionContext),\n ...attribute\n };\n};\n\nconst _generateLink = (suggestion: SearchSuggestion, hitPrefix: string, hitSuffix: string, actionContext: IActionContext) => {\n const formattedLink = (suggestion.Value as string)\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '')\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n return suggestion.Value && suggestion.Id\n ? getProductPageUrlSync(formattedLink, (suggestion.Id as unknown) as number, actionContext, undefined)\n : '';\n};\n\nconst _getHighlightedText = (suggestion: string, hitPrefix: string, hitSuffix: string): JSX.Element => {\n const formattedText = suggestion\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '<strong>')\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '</strong>');\n\n return (\n // eslint-disable-next-line react/no-danger\n <span className='msc-price msc-autoSuggest__productResults-item-text' dangerouslySetInnerHTML={getRichTextHtml(formattedText)} />\n );\n};\n\nconst _renderPrice = (\n adjustedPrice: number,\n basePrice: number,\n moduleId: string,\n moduleType: string,\n props: ISearchProductSuggestProps\n): JSX.Element | null => {\n const {\n autoSuggestProps: { context }\n } = props;\n\n return (\n <PriceComponent\n id={moduleId}\n typeName={moduleType}\n context={context}\n data={{\n price: {\n CustomerContextualPrice: adjustedPrice,\n BasePrice: basePrice\n }\n }}\n className='msc-autoSuggest__productResults-item-price'\n freePriceText={props.resources?.freePriceText}\n />\n );\n};\n\nconst _renderThumbnail = (suggestion: SearchSuggestion, altText: string, props: ISearchProductSuggestProps): JSX.Element | null => {\n const {\n autoSuggestProps: {\n context: {\n request: { gridSettings }\n },\n config: { imageSettings }\n }\n } = props;\n if (imageSettings) {\n imageSettings.cropFocalRegion = true;\n }\n\n if (!suggestion || !suggestion.ImageUrl) {\n props.telemetry.error('Search suggestion content is empty, module wont render.');\n return null;\n }\n\n const defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=40&h=40&m=6', w: 0, h: 0 },\n lg: { q: 'w=40&h=40&m=6', w: 0, h: 0 },\n xl: { q: 'w=40&h=40&m=6', w: 0, h: 0 }\n },\n lazyload: true,\n cropFocalRegion: true\n };\n\n return (\n <Image\n requestContext={props.autoSuggestProps.context.actionContext.requestContext}\n altText={altText}\n className='msc-autoSuggest__productResults-item-img'\n src={suggestion.ImageUrl}\n gridSettings={gridSettings!}\n imageSettings={imageSettings ? imageSettings : defaultImageSettings}\n loadFailureBehavior='empty'\n />\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Autosuggestions } from '@msdyn365-commerce/commerce-entities';\nimport MsDyn365, { getCatalogId, getUrlSync } from '@msdyn365-commerce/core';\nimport { ProductRefiner, ProductRefinerSource, ProductsDataActions } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions, ObjectExtensions, Random, validateCatalogId } from '@msdyn365-commerce-modules/retail-actions';\nimport { createSearchStateInput } from '@msdyn365-commerce-modules/search-utilities';\nimport { getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent, KeyCodes } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { debounce } from 'lodash';\nimport { Spinner, SpinnerSize } from 'office-ui-fabric-react';\nimport * as React from 'react';\n\nimport getSearchSuggestionsAction, { AutoSuggestInput, SuggestionType } from './actions/get-auto-suggest-suggestions';\nimport {\n CategorySuggestionsComponent,\n FormComponent,\n ISearchCategoryViewProps,\n ISearchKeywordViewProps,\n ISearchProductViewProps,\n KeywordSuggestionsComponent,\n LabelComponent,\n ProductSuggestionsComponent\n} from './components';\nimport { ISearchData } from './search.data';\nimport { ISearchProps, ISuggestionTypeCriterionData, SuggestionTypeCriterionSuggestionType } from './search.props.autogenerated';\n\nexport interface ISearchState {\n isSearchFormExpanded: boolean;\n searchText: string;\n searchKeywordSuggestClass: string;\n searchProductSuggestClass: string;\n searchCategorySuggestClass: string;\n suggestions: Autosuggestions | undefined;\n searchRefiners?: ProductRefiner[] | undefined;\n autoSuggestAriaLabel: string;\n isInitialState: boolean;\n isLoadingAutoSuggest?: boolean;\n}\n\nexport interface ISearchViewProps extends ISearchProps<ISearchData> {\n Search: IModuleProps;\n AutoSuggestAriaLabel: INodeProps;\n AutoSuggestAriaLabelText: string;\n searchText: string;\n AutoSuggest: INodeProps;\n KeywordSuggest: INodeProps;\n ProductSuggest: INodeProps;\n CategorySuggest: INodeProps;\n SearchForm: INodeProps;\n FormWrapper: INodeProps;\n UlKeyword: INodeProps;\n UlProduct: INodeProps;\n UlCategory: INodeProps;\n label: React.ReactNode;\n form: React.ReactNode;\n autosuggestKeyword?: ISearchKeywordViewProps;\n autosuggestProduct?: ISearchProductViewProps;\n autosuggestCategory?: ISearchCategoryViewProps;\n callbacks: {\n handleCancelSearchChange(): void;\n handleCancelSearchFocused?(): void;\n };\n isSearchFormExpanded: boolean;\n isLoadingAutoSuggest?: boolean;\n isLoadingNode?: React.ReactNode;\n}\n\n/**\n *\n * Search module.\n * @extends {React.Component<ISearchProps<ISearchData>, ISearchState>}\n */\nclass Search extends React.Component<ISearchProps<ISearchData>, ISearchState> {\n private readonly searchTextInput: React.RefObject<HTMLInputElement>;\n\n private readonly searchCollapsedLabel: React.RefObject<HTMLButtonElement>;\n\n private readonly formReference: React.RefObject<HTMLButtonElement>;\n\n private readonly maxChars: number;\n\n private readonly topResultsCount?: number;\n\n private readonly hitPrefix: string = '{';\n\n private readonly hitSuffix: string = '}';\n\n private readonly waitTime: number = 500;\n\n private readonly autoSuggestResultScreenReaderDiv: React.RefObject<HTMLDivElement>;\n\n private readonly autoSuggestResultDiv: React.RefObject<HTMLDivElement>;\n\n private readonly searchFormClass: string;\n\n private readonly searchLabelClass: string;\n\n private readonly telemetryContent: ITelemetryContent;\n\n private loadSuggestionsRequestId?: string;\n\n private inputSuggestionType: ISuggestionTypeCriterionData[];\n\n // @ts-expect-error\n private cancellabelDebounce: debounce;\n\n public constructor(props: ISearchProps<ISearchData>) {\n super(props);\n this.searchTextInput = React.createRef();\n this.searchCollapsedLabel = React.createRef();\n this.autoSuggestResultScreenReaderDiv = React.createRef();\n this.autoSuggestResultDiv = React.createRef();\n this.formReference = React.createRef();\n this.state = {\n isSearchFormExpanded: false,\n searchText: '',\n searchKeywordSuggestClass: 'ms-search__autoSuggest__keyword',\n searchProductSuggestClass: 'ms-search__autoSuggest__product',\n searchCategorySuggestClass: 'ms-search__autoSuggest__category',\n suggestions: undefined,\n searchRefiners: undefined,\n autoSuggestAriaLabel: '',\n isInitialState: true,\n isLoadingAutoSuggest: false\n };\n this.maxChars =\n (this.props.context &&\n this.props.context.app &&\n this.props.context.app.config &&\n this.props.context.app.config.searchInputMaxLength) ||\n 50;\n\n this.inputSuggestionType = [];\n this.topResultsCount = this.props.config && this.props.config.topResultsCount ? this.props.config.topResultsCount : 5;\n this.searchFormClass = 'ms-search__form';\n this.searchLabelClass = 'ms-search__label';\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n\n this._initSuggestionTypes();\n }\n\n public async componentDidMount(): Promise<void> {\n document.body && document.body.addEventListener('mousedown', this._focusOutTarget);\n window && window.addEventListener('keyup', this._keyup);\n }\n\n public componentWillUnmount(): void {\n document.body && document.body.removeEventListener('mousedown', this._focusOutTarget, false);\n window && window.removeEventListener('keyup', this._keyup, false);\n }\n\n public componentDidUpdate(): void {\n const {\n config: { hideSearchLabel }\n } = this.props;\n const { isSearchFormExpanded, isInitialState } = this.state;\n\n if (!this.props.context.request.params.isEditor) {\n if (!hideSearchLabel && isSearchFormExpanded) {\n this.searchTextInput && this.searchTextInput.current && this.searchTextInput.current.focus();\n } else if (!isInitialState) {\n this.searchCollapsedLabel && this.searchCollapsedLabel.current && this.searchCollapsedLabel.current.focus();\n }\n }\n }\n\n public shouldComponentUpdate(nextProps: ISearchProps<ISearchData>, nextState: ISearchState): boolean {\n if (this.state === nextState && this.props === nextProps) {\n return false;\n }\n return true;\n }\n\n // eslint-disable-next-line complexity -- ignore complexity.\n public render(): JSX.Element {\n const {\n context,\n resources: { searchtext, searchLabelArialLabel, cancelBtnAriaLabel, searchBtnAriaLabel, submitBtnAriaLabel },\n config: { hideSearchLabel, disableSubmitSearch, searchplaceholderText, shouldShowFullCategoryPath, className = '' }\n } = this.props;\n\n const {\n isSearchFormExpanded,\n searchText,\n searchKeywordSuggestClass,\n searchProductSuggestClass,\n searchCategorySuggestClass,\n suggestions,\n searchRefiners,\n isLoadingAutoSuggest\n } = this.state;\n\n const searchQsp = (context && context.app && context.app.config && context.app.config.searchQueryStringParameter) || 'q';\n const searchPageURL = getUrlSync('search', context && context.actionContext) || '';\n const searchURL = this._appendQueryParams(searchPageURL, searchText, searchQsp);\n const searchPlaceholder = searchplaceholderText && searchplaceholderText.length > 0 ? searchplaceholderText : 'Search in Fabrikam';\n\n const keywordSuggestions = suggestions?.AllSearchResults?.filter(\n suggestion => suggestion.SuggestionType === SuggestionType.Keyword || suggestion.SuggestionType === SuggestionType.None\n );\n const productSuggestions = suggestions?.AllSearchResults?.filter(\n suggestion => suggestion.SuggestionType === SuggestionType.Product\n );\n const categoryRefiners = searchRefiners?.find(refiner => {\n return refiner.SourceValue === ProductRefinerSource.Category;\n });\n const categorySuggestions = suggestions?.AllSearchResults?.filter(suggestion => {\n if (suggestion.SuggestionType !== SuggestionType.Category) {\n return false;\n }\n const refiner = categoryRefiners?.Values?.find(item => {\n return `${item.RefinerRecordId ?? 0}` === suggestion.Id;\n });\n\n return !ObjectExtensions.isNullOrUndefined(refiner);\n });\n\n const viewProps: ISearchViewProps = {\n ...(this.props as ISearchProps<ISearchData>),\n\n Search: {\n moduleProps: this.props,\n className: `${classnames('ms-search', className)} ${disableSubmitSearch ? 'no-submit' : 'with-submit'}`\n },\n AutoSuggestAriaLabel: {\n tag: 'div',\n className: 'msc-autoSuggest__screen-reader',\n 'aria-live': 'assertive',\n ref: this.autoSuggestResultScreenReaderDiv\n },\n AutoSuggestAriaLabelText: this.state.autoSuggestAriaLabel,\n searchText: this.state.searchText,\n AutoSuggest: {\n ref: this.autoSuggestResultDiv,\n className: 'ms-search__autoSuggest'\n },\n KeywordSuggest: {\n className: searchKeywordSuggestClass\n },\n ProductSuggest: {\n className: searchProductSuggestClass\n },\n CategorySuggest: {\n className: searchCategorySuggestClass\n },\n SearchForm: {\n className: `${this.searchFormClass} ${isSearchFormExpanded ? 'bx-show' : 'bx-hide'}`\n },\n FormWrapper: {\n tag: 'form',\n ref: this.formReference,\n className: 'ms-search__searchForm',\n 'aria-label': 'Search',\n name: 'searchForm',\n role: 'search',\n action: searchURL,\n autoComplete: 'off',\n onSubmit: this._handleSubmit\n },\n UlKeyword: {\n tag: 'ul',\n className: classnames('msc-autoSuggest__keywordResults-items', className)\n },\n UlProduct: {\n tag: 'ul',\n className: classnames('msc-autoSuggest__productResults-items', className)\n },\n UlCategory: {\n tag: 'ul',\n className: classnames('msc-autoSuggest__categoryResults-items', className)\n },\n label: LabelComponent({\n isSearchFormExpanded,\n searchLabelClass: `${this.searchLabelClass} ${isSearchFormExpanded ? 'bx-hide' : 'bx-show'}`,\n searchtext,\n searchLabelArialLabel,\n searchCollapsedLabel: this.searchCollapsedLabel,\n hideSearchLabel,\n handleCancelSearchChange: this._handleCancelSearchChange,\n telemetryContent: this.telemetryContent\n }),\n form: FormComponent({\n ariaLabelCancel: cancelBtnAriaLabel,\n ariaLabelSearch: searchBtnAriaLabel,\n ariaLabelSubmit: submitBtnAriaLabel,\n hideSearchLabel,\n searchTextInput: this.searchTextInput,\n disableSubmitSearch,\n handleInputChange: this._handleInputChange,\n handleCancelSearchChange: this._handleCancelSearchChange,\n maxChars: this.maxChars,\n searchQsp,\n searchPlaceholder,\n query: searchText\n }),\n autosuggestKeyword:\n searchText &&\n searchText.length > 0 &&\n (isLoadingAutoSuggest || (keywordSuggestions && ArrayExtensions.hasElements(keywordSuggestions)))\n ? KeywordSuggestionsComponent({\n searchKeywordSuggestClass,\n searchPageURL,\n searchQsp,\n hitPrefix: this.hitPrefix,\n hitSuffix: this.hitSuffix,\n autoSuggestProps: this.props,\n searchText,\n suggestions: keywordSuggestions,\n telemetryContent: this.telemetryContent\n })\n : undefined,\n autosuggestProduct:\n searchText &&\n searchText.length > 0 &&\n (isLoadingAutoSuggest || (productSuggestions && ArrayExtensions.hasElements(productSuggestions)))\n ? ProductSuggestionsComponent({\n searchProductSuggestClass,\n searchPageURL,\n searchQsp,\n hitPrefix: this.hitPrefix,\n hitSuffix: this.hitSuffix,\n autoSuggestProps: this.props,\n searchText,\n suggestions: productSuggestions,\n telemetry: this.props.telemetry,\n moduleType: this.props.typeName,\n moduleId: this.props.id,\n telemetryContent: this.telemetryContent,\n resources: this.props.resources\n })\n : undefined,\n autosuggestCategory:\n searchText &&\n searchText.length > 0 &&\n (isLoadingAutoSuggest || (categorySuggestions && ArrayExtensions.hasElements(categorySuggestions)))\n ? CategorySuggestionsComponent({\n searchCategorySuggestClass,\n searchPageURL,\n searchQsp,\n hitPrefix: this.hitPrefix,\n hitSuffix: this.hitSuffix,\n autoSuggestProps: this.props,\n searchText,\n suggestions: categorySuggestions,\n searchRefiners,\n telemetryContent: this.telemetryContent,\n shouldShowFullPath: shouldShowFullCategoryPath\n })\n : undefined,\n callbacks: {\n handleCancelSearchChange: this._handleCancelSearchChange,\n handleCancelSearchFocused: this._handleCancelSearchFocused\n },\n isSearchFormExpanded: this.state.isSearchFormExpanded,\n isLoadingAutoSuggest,\n isLoadingNode: this._isLoadingNode()\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n private _initSuggestionTypes() {\n const suggestionTypes = this.props.config.suggestionTypeCriterion;\n\n const suggestions = ArrayExtensions.unique(ArrayExtensions.validValues(suggestionTypes));\n if (!ArrayExtensions.hasElements(suggestions)) {\n this.inputSuggestionType = [\n { SuggestionType: SuggestionTypeCriterionSuggestionType.keyword },\n { SuggestionType: SuggestionTypeCriterionSuggestionType.product },\n { SuggestionType: SuggestionTypeCriterionSuggestionType.scopedCategory }\n ];\n return;\n }\n\n const validSuggestions = suggestions.filter(suggestion => suggestion.SuggestionType);\n if (ArrayExtensions.hasElements(validSuggestions)) {\n this.inputSuggestionType = validSuggestions;\n return;\n }\n\n this.inputSuggestionType = [];\n }\n\n /**\n * Function to create the ReactNode for loading Autosuggest result.\n * @returns ReachNode for loading Autosuggest result.\n */\n private readonly _isLoadingNode = (): React.ReactNode => {\n const loadingText = this.props.resources.autoSuggestResultLoadingMessage;\n return <Spinner className='msc-autoSuggest__loadingResult' label={loadingText} size={SpinnerSize.medium} labelPosition='right' />;\n };\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private readonly _focusOutTarget = (e: any): void => {\n const { suggestions } = this.state;\n\n if (suggestions && suggestions.AllSearchResults && e.target.closest('.ms-search') === null) {\n this._clearAutoSuggestState();\n }\n };\n\n private readonly _keyup = (e: KeyboardEvent): void => {\n const { suggestions } = this.state;\n\n if (suggestions && suggestions.AllSearchResults && e.keyCode === KeyCodes.Escape) {\n this._clearAutoSuggestState();\n } else if (this.state.isSearchFormExpanded && e.keyCode === KeyCodes.Escape) {\n if (this.state.isSearchFormExpanded) {\n this.setState({ isSearchFormExpanded: false });\n }\n }\n\n if (\n !(\n (this.formReference.current && this.formReference.current.contains((e.target as unknown) as Node)) ||\n (this.autoSuggestResultDiv.current && this.autoSuggestResultDiv.current.contains((e.target as unknown) as Node))\n )\n ) {\n if (suggestions && suggestions.AllSearchResults) {\n this._clearAutoSuggestState();\n }\n\n if (this.state.isSearchFormExpanded) {\n this.setState({ isSearchFormExpanded: false });\n }\n }\n };\n\n private readonly _clearAutoSuggestState = (): void => {\n const {\n context: { actionContext },\n data: { searchState }\n } = this.props;\n\n if (this.searchTextInput.current && this.searchTextInput.current.value.length > 0) {\n searchState.searchText = '';\n searchState.defaultBasicSearchUrl = '';\n searchState.searchQueryStringParameter = '';\n actionContext ? actionContext.update(createSearchStateInput(searchState), searchState) : null;\n this.searchTextInput.current.value = '';\n }\n\n this.setState({ searchText: '', suggestions: undefined, searchRefiners: undefined });\n };\n\n private async _getSearchSuggestions(loadSuggestionsRequestId: string, query: string) {\n try {\n const searchSuggestions = await getSearchSuggestionsAction(\n new AutoSuggestInput(query, this.topResultsCount, this._getSuggestionType(), this.hitPrefix, this.hitSuffix),\n this.props.context.actionContext\n );\n if (loadSuggestionsRequestId !== this.loadSuggestionsRequestId) {\n return undefined;\n }\n return searchSuggestions;\n } catch (error) {\n if (loadSuggestionsRequestId !== this.loadSuggestionsRequestId) {\n return undefined;\n }\n this.setState({ suggestions: undefined, searchRefiners: undefined, autoSuggestAriaLabel: this._setAutoSuggestResultCount() });\n this.props.telemetry.exception(error);\n this.props.telemetry.debug('Unable to get auto suggest results');\n return undefined;\n }\n }\n\n private async _updateSearchRefiners(loadSuggestionsRequestId: string, query: string, suggestions: Autosuggestions | undefined) {\n try {\n const refiners = await this._getSearchRefiners(query);\n if (loadSuggestionsRequestId !== this.loadSuggestionsRequestId) {\n return;\n }\n this.setState({\n suggestions,\n searchRefiners: refiners,\n autoSuggestAriaLabel: this._setAutoSuggestResultCount(suggestions),\n isLoadingAutoSuggest: false\n });\n } catch (error) {\n if (loadSuggestionsRequestId !== this.loadSuggestionsRequestId) {\n return;\n }\n this.setState({ suggestions, searchRefiners: undefined, autoSuggestAriaLabel: this._setAutoSuggestResultCount(suggestions) });\n this.props.telemetry.exception(error);\n this.props.telemetry.debug('Unable to get refiners results');\n }\n }\n\n private _loadSuggestions(query: string) {\n this.cancellabelDebounce = debounce(async () => {\n this.setState({ isLoadingAutoSuggest: true });\n const loadSuggestionsRequestId = Random.Guid.generateGuid();\n this.loadSuggestionsRequestId = loadSuggestionsRequestId;\n const searchSuggestions = await this._getSearchSuggestions(loadSuggestionsRequestId, query);\n await this._updateSearchRefiners(loadSuggestionsRequestId, query, searchSuggestions);\n }, this.waitTime);\n\n setTimeout(() => {\n this.cancellabelDebounce();\n }, 0);\n }\n\n private readonly _handleInputChange = (query: string): void => {\n if (!query || query.length <= this.maxChars) {\n this.setState({ searchText: query });\n }\n\n if (this.cancellabelDebounce) {\n this.cancellabelDebounce.cancel();\n }\n\n const {\n context,\n data: { searchState }\n } = this.props;\n\n if (context) {\n if (query && query.length > 0) {\n if (query.length > this.maxChars) {\n return;\n }\n\n if (ArrayExtensions.hasElements(this.inputSuggestionType)) {\n this._loadSuggestions(query);\n }\n\n searchState.searchText = query;\n } else {\n this.setState({ suggestions: undefined, searchRefiners: undefined });\n searchState.searchText = '';\n }\n context.actionContext.update(createSearchStateInput(searchState), searchState);\n }\n };\n\n private _getSuggestionType(): string {\n const distinctSuggestionTypes: string[] = this.inputSuggestionType.map(\n suggestionTypeItem => suggestionTypeItem.SuggestionType!.charAt(0).toUpperCase() + suggestionTypeItem.SuggestionType!.slice(1)\n );\n return distinctSuggestionTypes.join(',');\n }\n\n private async _getSearchRefiners(searchText: string): Promise<ProductRefiner[]> {\n const { actionContext: ctx } = this.props.context;\n const catalogId = getCatalogId(ctx.requestContext);\n validateCatalogId(catalogId);\n return ProductsDataActions.getProductSearchRefinersAsync(\n { callerContext: ctx },\n {\n SearchCondition: searchText,\n Context: {\n ChannelId: +ctx.requestContext.apiSettings.channelId,\n CatalogId: catalogId\n }\n }\n );\n }\n\n private readonly _handleSubmit = (\n e: React.MouseEvent<HTMLElement> | React.KeyboardEvent<HTMLElement> | React.FormEvent<HTMLFormElement>\n ): void => {\n const {\n config: { disableSubmitSearch },\n context: {\n actionContext,\n app: {\n config: { searchQueryStringParameter }\n }\n }\n } = this.props;\n\n const query = this.searchTextInput.current && this.searchTextInput.current.value;\n e.preventDefault();\n\n if (!query || (query && query.length === 0) || disableSubmitSearch) {\n this.searchTextInput && this.searchTextInput.current && this.searchTextInput.current.focus();\n } else {\n const searchQsp = searchQueryStringParameter || 'q';\n const searchURL = this._appendQueryParams(getUrlSync('search', actionContext) || '', query, searchQsp);\n document.location.href = searchURL;\n }\n };\n\n private readonly _handleCancelSearchChange = (): void => {\n const { isSearchFormExpanded, suggestions } = this.state;\n\n if (!isSearchFormExpanded) {\n this.setState({\n isSearchFormExpanded: true,\n searchText: '',\n isInitialState: false\n });\n } else {\n if (suggestions && suggestions.AllSearchResults) {\n this._clearAutoSuggestState();\n }\n this.setState({ isSearchFormExpanded: false });\n }\n };\n\n private readonly _handleCancelSearchFocused = (): void => {\n const { suggestions } = this.state;\n if (!(suggestions && suggestions.AllSearchResults)) {\n this._clearAutoSuggestState();\n this.setState({ isSearchFormExpanded: false });\n }\n };\n\n private readonly _appendQueryParams = (route: string, query: string, qsp: string): string => {\n if (!MsDyn365.isBrowser) {\n return '';\n }\n\n const queryUrl = new URL(route, window.location.href);\n if (qsp && query) {\n queryUrl.searchParams.set(qsp, query);\n }\n\n return queryUrl.href;\n };\n\n private readonly _setAutoSuggestResultCount = (result?: Autosuggestions) => {\n if (this.autoSuggestResultScreenReaderDiv.current !== null) {\n const ariaLiveRegion = this.autoSuggestResultScreenReaderDiv.current;\n const suggestResultString = this.props.resources.autoSuggestFoundMessage;\n const emptyResultString = this.props.resources.noAutoSuggestionMessage;\n ariaLiveRegion.innerText =\n result && result.AllSearchResults && result.AllSearchResults.length > 0 ? suggestResultString : emptyResultString;\n ariaLiveRegion.setAttribute('aria-live', 'assertive');\n return ariaLiveRegion.innerText;\n }\n return '';\n };\n}\n\nexport default Search;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { INodeProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISearchCategoryViewProps, ISearchFormViewProps, ISearchKeywordViewProps, ISearchProductViewProps } from './components';\nimport { ISearchViewProps } from './search';\n\nconst SearchView: React.FC<ISearchViewProps> = props => {\n const {\n Search,\n AutoSuggestAriaLabel,\n AutoSuggestAriaLabelText,\n searchText,\n AutoSuggest,\n KeywordSuggest,\n ProductSuggest,\n CategorySuggest,\n UlKeyword,\n UlProduct,\n UlCategory,\n form,\n autosuggestCategory,\n autosuggestKeyword,\n autosuggestProduct,\n SearchForm,\n FormWrapper,\n label,\n isLoadingAutoSuggest,\n isLoadingNode\n } = props;\n\n return (\n <Module {...Search}>\n {label}\n {_renderForm(form as ISearchFormViewProps, SearchForm, FormWrapper)}\n <Node {...AutoSuggest}>\n {searchText && searchText.length > 0 ? <Node {...AutoSuggestAriaLabel}>{AutoSuggestAriaLabelText}</Node> : ''}\n {_renderKeywordSuggestions(KeywordSuggest, UlKeyword, autosuggestKeyword, isLoadingAutoSuggest, isLoadingNode)}\n {_renderProductSuggestions(ProductSuggest, UlProduct, autosuggestProduct, isLoadingAutoSuggest, isLoadingNode)}\n {_renderCategorySuggestions(CategorySuggest, UlCategory, autosuggestCategory, isLoadingAutoSuggest, isLoadingNode)}\n </Node>\n </Module>\n );\n};\n\nconst _renderForm = (form: ISearchFormViewProps, SearchForm: INodeProps, FormWrapper: INodeProps) => {\n return (\n <Node {...SearchForm}>\n <Node {...FormWrapper}>\n {form.input}\n {form.cancelBtn}\n {form.submitBtn}\n </Node>\n </Node>\n );\n};\n\nconst _renderKeywordSuggestions = (\n KeywordSuggest: INodeProps,\n UlKeyword: INodeProps,\n keywordSuggestions?: ISearchKeywordViewProps,\n isLoadingAutoSuggest?: boolean,\n isLoadingNode?: React.ReactNode\n) => {\n return (\n keywordSuggestions && (\n <Node {...KeywordSuggest}>\n <Node {...UlKeyword}>\n {isLoadingAutoSuggest && isLoadingNode}\n {!isLoadingAutoSuggest &&\n keywordSuggestions.text.map(text => {\n return text;\n })}\n </Node>\n </Node>\n )\n );\n};\n\nconst _renderProductSuggestions = (\n ProductSuggest: INodeProps,\n UlProduct: INodeProps,\n productSuggestions?: ISearchProductViewProps,\n isLoadingAutoSuggest?: boolean,\n isLoadingNode?: React.ReactNode\n) => {\n return (\n productSuggestions && (\n <Node {...ProductSuggest}>\n <Node {...UlProduct}>\n {productSuggestions.title}\n {isLoadingAutoSuggest && isLoadingNode}\n {!isLoadingAutoSuggest &&\n productSuggestions.items.map((item, index) => {\n return (\n <Node {...item.LiProduct} key={item.id || index}>\n <Node {...item.AProduct}>\n {item.thumbnail}\n {item.text}\n {item.price}\n </Node>\n </Node>\n );\n })}\n </Node>\n </Node>\n )\n );\n};\n\nconst _renderCategorySuggestions = (\n CategorySuggest: INodeProps,\n UlCategory: INodeProps,\n categorySuggestions?: ISearchCategoryViewProps,\n isLoadingAutoSuggest?: boolean,\n isLoadingNode?: React.ReactNode\n) => {\n return (\n categorySuggestions && (\n <Node {...CategorySuggest}>\n <Node {...UlCategory}>\n {categorySuggestions.title}\n {isLoadingAutoSuggest && isLoadingNode}\n {!isLoadingAutoSuggest &&\n categorySuggestions.text.map(text => {\n return text;\n })}\n </Node>\n </Node>\n )\n );\n};\n\nexport default SearchView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { SocialMedia, SocialMediaComponent } from '@msdyn365-commerce/components';\nimport MsDyn365 from '@msdyn365-commerce/core';\nimport { IModuleProps } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISocialShareItemConfig, ISocialShareItemProps, socialMedia } from './social-share-item.props.autogenerated';\n\nexport interface ISocialShareItemViewProps extends ISocialShareItemProps<ISocialShareItemConfig> {\n SocialShareItemElement: React.ReactNode | null;\n SocialShareItem: IModuleProps;\n}\n\n/**\n *\n * SocialShareItem component.\n * @extends {React.PureComponent<ISocialShareItemProps<ISocialShareItemConfig>>}\n */\nclass SocialShareItem extends React.PureComponent<ISocialShareItemProps<ISocialShareItemConfig>> {\n constructor(props: ISocialShareItemProps<ISocialShareItemConfig>) {\n super(props);\n\n this._getSocialShareItem = this._getSocialShareItem.bind(this);\n }\n\n public render(): JSX.Element | null {\n const viewprops = {\n ...this.props,\n SocialShareItem: {\n moduleProps: this.props,\n className: 'ms-social-share-item'\n },\n SocialShareItemElement: this._getSocialShareItem()\n };\n\n return this.props.renderView(viewprops) as React.ReactElement;\n }\n\n private _getSocialShareItem(): React.ReactNode | null {\n const src = this.props.config.icon;\n if (MsDyn365.isBrowser) {\n switch (this.props.config.socialMedia) {\n case socialMedia.facebook:\n return (\n <SocialMediaComponent\n socialMedia={SocialMedia.Facebook}\n postUrl={document.URL}\n context={this.context}\n id={`${this.props.id}_facebook`}\n typeName={this.props.typeName}\n data={{}}\n src={src}\n />\n );\n case socialMedia.twitter:\n return (\n <SocialMediaComponent\n socialMedia={SocialMedia.Twitter}\n postUrl={document.URL}\n context={this.context}\n id={`${this.props.id}_twitter`}\n typeName={this.props.typeName}\n data={{}}\n src={src}\n />\n );\n case socialMedia.pinterest:\n return (\n <SocialMediaComponent\n socialMedia={SocialMedia.Pinterest}\n postUrl={document.URL}\n context={this.context}\n id={`${this.props.id}_pinterest`}\n typeName={this.props.typeName}\n data={{}}\n src={src}\n />\n );\n case socialMedia.linkedin:\n return (\n <SocialMediaComponent\n socialMedia={SocialMedia.Linkedin}\n postUrl={document.URL}\n context={this.context}\n id={`${this.props.id}_linkedin`}\n typeName={this.props.typeName}\n data={{}}\n src={src}\n />\n );\n case socialMedia.mail:\n return (\n <SocialMediaComponent\n socialMedia={SocialMedia.Mail}\n postUrl={document.URL}\n context={this.context}\n id={`${this.props.id}_mail`}\n typeName={this.props.typeName}\n data={{}}\n src={src}\n />\n );\n default:\n return null;\n }\n }\n return null;\n }\n}\n\nexport default SocialShareItem;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Module } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nimport { ISocialShareItemViewProps } from './social-share-item';\n\nexport const SocialShareItemView: React.FC<ISocialShareItemViewProps> = props => {\n const { SocialShareItem, SocialShareItemElement } = props;\n\n if (!SocialShareItemElement) {\n props.context.telemetry.error('Social media is not valid, module wont render');\n return null;\n }\n return <Module {...SocialShareItem}>{SocialShareItemElement}</Module>;\n};\n\nexport default SocialShareItemView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IAdditionalContentData, ILinksData } from '../video-player.props.autogenerated';\n\n/**\n * IVideoPlayerAdditionalContentProps: Interface for\n * Video Player Additional Content Component props.\n */\nexport interface IVideoPlayerAdditionalContentProps {\n requestContext: Msdyn365.IRequestContext;\n additionalContent: IAdditionalContentData | undefined;\n handleAdditionalTextChange(event: Msdyn365.ContentEditableEvent): void;\n handleAdditionalParagraphChange(event: Msdyn365.ContentEditableEvent): void;\n handleAdditionalLinkTextChange(linkIndex: number, event: Msdyn365.ContentEditableEvent): void;\n}\n\n/**\n * IVideoPlayerAdditionalContentProps: Interface for\n * Video Player Additional Content view props.\n */\nexport interface IVideoPlayerAdditionalContentViewProps {\n additionalContentNode: INodeProps;\n additionalContentItems?: IVideoPlayerAdditionalContentItemViewProps;\n}\n\n/**\n * IVideoPlayerAdditionalContentProps: Interface for\n * Video Player Additional Content Item view props.\n */\nexport interface IVideoPlayerAdditionalContentItemViewProps {\n heading: React.ReactNode;\n text: React.ReactNode;\n links: React.ReactNode;\n additionalContentItemContainer: INodeProps;\n additionalContentItemLinks: INodeProps;\n}\n\n/**\n * Renders additional content heading.\n * @param additionalContentHeading - Additional content heading.\n * @param props - Video Player Additional content component props.\n * @returns Heading Node.\n */\nconst renderHeading = (additionalContentHeading: string, props: IVideoPlayerAdditionalContentProps) => {\n const requestContext = props.requestContext;\n return (\n <Msdyn365.Text\n text={additionalContentHeading}\n tag='p'\n className='ms-video-player__details__additional-content__text'\n editProps={{\n /**\n * On edit event for heading text change.\n * @param event - Change event.\n */\n onEdit: event => {\n props.handleAdditionalTextChange(event);\n },\n requestContext\n }}\n />\n );\n};\n\n/**\n * Renders additional content heading.\n * @param additionalContentParagraphText - Additional content paragraph text.\n * @param props - Video Player Additional content component props.\n * @returns Paragraph Node.\n */\nconst renderParagraph = (additionalContentParagraphText: string, props: IVideoPlayerAdditionalContentProps) => {\n const requestContext = props.requestContext;\n return (\n <Msdyn365.Text\n text={additionalContentParagraphText}\n tag='p'\n className='ms-video-player__details__additional-content__paragraph'\n editProps={{\n /**\n * On edit event for heading text change.\n * @param event - Change event.\n */\n onEdit: event => {\n props.handleAdditionalParagraphChange(event);\n },\n requestContext\n }}\n />\n );\n};\n\n/**\n * Renders additional content heading.\n * @param ctaLink - Additional content link.\n * @param props - Video Player Additional content component props.\n * @param linkIndex - Additional content link index.\n * @returns Link Node.\n */\nconst renderLinks = (ctaLink: ILinksData, props: IVideoPlayerAdditionalContentProps, linkIndex: number) => {\n const editableLink: Msdyn365.ILinksData = {\n ariaLabel: ctaLink.ariaLabel,\n className: 'ms-video-player__details__additional-content__cta__links',\n linkText: ctaLink.linkText,\n linkUrl: ctaLink.linkUrl.destinationUrl,\n openInNewTab: ctaLink.openInNewTab,\n role: 'link'\n };\n const requestContext = props.requestContext;\n return (\n <Msdyn365.Link\n key={linkIndex}\n link={editableLink}\n editProps={{\n /**\n * Handle additional Link Text change.\n * @param event - The keyboard event.\n */\n onTextChange: event => {\n props.handleAdditionalLinkTextChange(linkIndex, event);\n },\n requestContext\n }}\n />\n );\n};\n\n/**\n * Create node for each additonal content item.\n * @param item - Video Player additonal content item props.\n * @param props - Video Player Additional content component props.\n * @returns IVideoPlayerAdditionalContentItemViewProps.\n */\nconst getAdditionalContentItems = (\n item: IAdditionalContentData,\n props: IVideoPlayerAdditionalContentProps\n): IVideoPlayerAdditionalContentItemViewProps => {\n const headingNode = item.heading && renderHeading(item.heading, props);\n const paragraphNode = item.subtext && renderParagraph(item.subtext, props);\n const linksNode = item.links?.map((ctaLink: ILinksData, index: number) => {\n return renderLinks(ctaLink, props, index);\n });\n\n return {\n heading: headingNode,\n text: paragraphNode,\n links: linksNode,\n additionalContentItemContainer: { className: 'ms-video-player__details__additional-content__container' },\n additionalContentItemLinks: { className: 'ms-video-player__details__additional-content__cta' }\n };\n};\n\n/**\n * VideoPlayerAdditionalContent component.\n * @param props - Video Player Additional content component props.\n * @returns Video Player Additional content view props.\n */\nexport const videoPlayerAdditionalContent = (\n props: IVideoPlayerAdditionalContentProps\n): IVideoPlayerAdditionalContentViewProps | undefined => {\n const { additionalContent } = props;\n if (!additionalContent) {\n return undefined;\n }\n\n const reactNodes: IVideoPlayerAdditionalContentItemViewProps = getAdditionalContentItems(additionalContent, props);\n return {\n additionalContentNode: { className: 'ms-video-player__details__additional-content' },\n additionalContentItems: reactNodes\n };\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IPlayerData, IPlayerOptions, IPlayerResources, IVideoMetadata, Player } from '@msdyn365-commerce/components';\nimport * as MsDyn365 from '@msdyn365-commerce/core';\nimport {\n getPayloadObject,\n getTelemetryAttributes,\n getTelemetryObject,\n INodeProps,\n isMobile,\n ITelemetryContent,\n VariantType\n} from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IVideoPlayerAdditionalContentViewProps, videoPlayerAdditionalContent } from './components/additional-content';\nimport { ILinksData, IVideoPlayerConfig, IVideoPlayerProps } from './video-player.props.autogenerated';\n\nexport interface IVideoPlayerViewProps extends IVideoPlayerProps<{}> {\n player: React.ReactNode;\n title?: React.ReactNode;\n text?: React.ReactNode;\n links?: React.ReactNode;\n detailsContainer?: INodeProps;\n detailsContainerCta?: INodeProps;\n additionalContent?: IVideoPlayerAdditionalContentViewProps;\n handleText?(): void;\n handleParagraph?(): void;\n handleAdditionalText?(): void;\n handleAdditionalParagraph?(): void;\n handleLink?(): void;\n handleAdditionalLink?(): void;\n}\n\n/**\n *\n * VideoPlayer component.\n * @extends {React.PureComponent<IVideoPlayerProps<IVideoPlayerData>>}\n */\nclass VideoPlayer extends React.PureComponent<IVideoPlayerProps<IVideoPlayerConfig>> {\n private readonly telemetryContent: ITelemetryContent;\n\n private readonly isMobileDevice: boolean;\n\n public constructor(props: IVideoPlayerProps<IVideoPlayerConfig>) {\n super(props);\n this.isMobileDevice = isMobile({ variant: VariantType.Viewport, context: this.props.context.request }) === 'xs';\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n }\n\n public render(): JSX.Element {\n const options = {\n ...this.props.config,\n isMobileDevice: this.isMobileDevice\n };\n const video: MsDyn365.IVideoData = this.props.config.video;\n const playerResources: IPlayerResources = {\n playAriaLabel: this.props.resources.playLabel,\n pauseAriaLabel: this.props.resources.pauseLabel,\n playingAriaLabel: this.props.resources.playingLabel,\n pausedAriaLabel: this.props.resources.pausedLabel,\n muteAriaLabel: this.props.resources.muteLabel,\n unMuteAriaLabel: this.props.resources.unMuteLabel,\n fullScreenAriaLabel: this.props.resources.fullScreenLabel,\n exitFullScreenAriaLabel: this.props.resources.exitFullScreenLabel,\n seekBarLabel: this.props.resources.seekBarLabel,\n videoTimeDurationLabel: this.props.resources.videoTimeDurationLabel,\n closedCaptionLabel: this.props.resources.closedCaptionLabel\n };\n const videoMetaData: IVideoMetadata = {};\n\n if (video) {\n videoMetaData.videoId = video.id;\n videoMetaData.title = video.title;\n videoMetaData.duration = video.playTime;\n\n if (video.thumbnail) {\n videoMetaData.posterframeUrl = video.thumbnail.src;\n }\n\n if (video._links?.binaryReferences) {\n videoMetaData.videoBinaryReferences = video._links.binaryReferences;\n }\n }\n const videoPlayerData: IPlayerData = { options: options as IPlayerOptions, metaData: videoMetaData };\n const viewProps = {\n // Context for telemetry and raw data for C1 to do customization\n // Including computed data, state data and methods\n ...this.props,\n\n player: (\n <MsDyn365.Video className='' editProps={{ key: this.props.config.video, requestContext: this.props.context.request }}>\n <Player\n playerData={videoPlayerData}\n playerResources={playerResources}\n telemetryContent={this.telemetryContent}\n isEditor={this.props.context.request.params.isEditor}\n />\n </MsDyn365.Video>\n ),\n title: this._getVideoDetailsHeading(),\n text: this._getVideoDetailsParagraph(),\n links: this._getVideoDetailsLinks(),\n detailsContainer: { className: 'ms-video-player__details' },\n detailsContainerCTA: { className: 'ms-video-player__details__cta' },\n additionalContent: videoPlayerAdditionalContent({\n requestContext: this.props.context.request,\n additionalContent: this.props.config.additionalContent,\n handleAdditionalTextChange: this.handleAdditionalTextChange,\n handleAdditionalParagraphChange: this.handleAdditionalParagraphChange,\n handleAdditionalLinkTextChange: this.handleAdditionalLinkTextChange\n }),\n handleText: this.handleTextChange,\n handleParagraph: this.handleParagraphChange,\n handleAdditionalText: this.handleAdditionalTextChange,\n handleAdditionalParagraph: this.handleAdditionalParagraphChange,\n handleLink: this.handleLinkTextChange,\n handleAdditionalLink: this.handleAdditionalTextChange\n };\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n /**\n * Handle link text change.\n * @param linkIndex - The link index.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleLinkTextChange(linkIndex: number, event: MsDyn365.ContentEditableEvent): void {\n if (this.props.config.links && this.props.config.links[Number(linkIndex)]) {\n this.props.config.links[Number(linkIndex)].linkText = event.target.value;\n }\n }\n\n /**\n * Handle text change.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleTextChange = (event: MsDyn365.ContentEditableEvent): void => {\n this.props.config.heading!.text = event.target.value;\n };\n\n /**\n * Handle paragraph change.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleParagraphChange = (event: MsDyn365.ContentEditableEvent): void => {\n this.props.config.paragraph = event.target.value;\n };\n\n /**\n * Handle additional text change.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleAdditionalTextChange(event: MsDyn365.ContentEditableEvent): void {\n if (this.props.config.additionalContent) {\n this.props.config.additionalContent.heading = event.target.value;\n }\n }\n\n /**\n * Handle additional link text change.\n * @param linkIndex - The link index.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleAdditionalLinkTextChange(linkIndex: number, event: MsDyn365.ContentEditableEvent): void {\n const additionalContent = this.props.config.additionalContent ?? {};\n if (additionalContent.links) {\n additionalContent.links[Number(linkIndex)].linkText = event.target.value;\n }\n }\n\n /**\n * Handle additional paragraph change.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleAdditionalParagraphChange(event: MsDyn365.ContentEditableEvent): void {\n if (this.props.config.additionalContent) {\n this.props.config.additionalContent.subtext = event.target.value;\n }\n }\n\n /**\n * Get video details links.\n * @returns - React node.\n */\n private _getVideoDetailsLinks(): React.ReactNode[] | undefined {\n const { links } = this.props.config;\n const payLoad = getPayloadObject('click', this.telemetryContent, '');\n\n return links?.map((linkData: ILinksData, index: number) => {\n payLoad.contentAction.etext = linkData.linkText;\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\n const linkId = index;\n const editableLink: MsDyn365.ILinksData = {\n ariaLabel: linkData.ariaLabel,\n className: 'ms-video-player__details__cta__link',\n linkText: linkData.linkText,\n linkUrl: linkData.linkUrl.destinationUrl,\n openInNewTab: linkData.openInNewTab,\n role: 'button',\n additionalProperties: attributes\n };\n\n return (\n <MsDyn365.Link\n key={linkId}\n link={editableLink}\n editProps={{\n /**\n * Handle additional paragraph change.\n * @param event - The keyboard event.\n */\n onTextChange: event => {\n this.handleLinkTextChange(index, event);\n },\n requestContext: this.props.context.request\n }}\n />\n );\n });\n }\n\n private _getVideoDetailsHeading(): React.ReactNode | undefined {\n const { heading } = this.props.config;\n\n return (\n heading && (\n <MsDyn365.Text\n className='ms-video-player__details__title'\n tag={heading.tag ?? 'h1'}\n text={heading.text}\n editProps={{ onEdit: this.handleTextChange, requestContext: this.props.context.request }}\n />\n )\n );\n }\n\n private _getVideoDetailsParagraph(): React.ReactNode | undefined {\n const { paragraph } = this.props.config;\n\n return (\n paragraph && (\n <MsDyn365.RichTextComponent\n text={paragraph}\n className='ms-video-player__details__text'\n editProps={{ onEdit: this.handleParagraphChange, requestContext: this.props.context.request }}\n />\n )\n );\n }\n}\n\nexport default VideoPlayer;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IVideoPlayerAdditionalContentViewProps } from './components/additional-content';\nimport { IVideoPlayerViewProps } from './video-player';\n\n/**\n * Render Additional Content.\n * @param additionalContent - Additional content view props.\n * @returns JSX Element.\n */\nconst renderAdditionalContent = (additionalContent: IVideoPlayerAdditionalContentViewProps) => {\n if (additionalContent.additionalContentItems) {\n return (\n <Node {...additionalContent.additionalContentNode}>\n <>\n {additionalContent.additionalContentItems.heading}\n <Node {...additionalContent.additionalContentItems.additionalContentItemContainer}>\n {additionalContent.additionalContentItems.text}\n <Node {...additionalContent.additionalContentItems.additionalContentItemLinks}>\n {additionalContent.additionalContentItems.links}\n </Node>\n </Node>\n </>\n </Node>\n );\n }\n\n return null;\n};\n\nconst VideoPlayerView: React.FC<IVideoPlayerViewProps> = props => {\n return (\n <div id={props.id} className='ms-video-player' {...props.renderModuleAttributes(props)}>\n {props.player}\n <Node {...props.detailsContainer} className={props.detailsContainer ? props.detailsContainer.className : ''}>\n {props.title}\n {props.text}\n {props.additionalContent && renderAdditionalContent(props.additionalContent)}\n <Node {...props.detailsContainerCta} className={props.detailsContainerCta ? props.detailsContainerCta.className : ''}>\n {props.links}\n </Node>\n </Node>\n </div>\n );\n};\n\nexport default VideoPlayerView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\nexport interface IWishlistItemDimension {\n key: string;\n className?: string;\n dimensionType: string;\n dimensionValue: string;\n}\n\nexport const WishlistItemDimension: React.FC<IWishlistItemDimension> = ({ key, className, dimensionType, dimensionValue }) => (\n <div key={key} className={className}>\n <span className='msc-wishlist-dimension__label'>{dimensionType}:</span>\n <span className='msc-wishlist-dimension__value'>{dimensionValue}</span>\n </div>\n);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { PriceComponent } from '@msdyn365-commerce/components';\nimport { IAny, ICoreContext, IGeneric, IImageSettings, Image, ITelemetry, msdyn365Commerce } from '@msdyn365-commerce/core';\nimport {\n CommerceListLine,\n ProductPrice,\n ReleasedProductType,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport {\n convertProductDimensionTypeToDimensionTypes,\n getFallbackImageUrl,\n StringExtensions\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { Alert, Button, getPayloadObject, getTelemetryAttributes, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IWishlistItemActionMessageState } from '../wishlist-items';\nimport { WishlistItemDimension } from './wishlist-items-dimensions';\n\nexport interface IWishlistItemProps extends CommerceListLine {\n product: SimpleProduct;\n wishlistState: IWishlistItemActionMessageState;\n price?: ProductPrice;\n context: ICoreContext<IGeneric<IAny>>;\n productUrl: string;\n imageSettings?: IImageSettings;\n removeFromWishlistText: string;\n isInStock: boolean;\n addToCartText: string;\n outOfStockText: string;\n index: number;\n itemKey: string;\n telemetry: ITelemetry;\n moduleId: string;\n moduleTypeName: string;\n enableImageProductLink?: boolean;\n inventoryInformationLabel?: string;\n inventoryLabelClassName?: string;\n telemetryContent?: ITelemetryContent;\n handlers: {\n onAddToCart(product: SimpleProduct, itemKey: string): void;\n onRemoveItem(productId: number): void | undefined;\n onDismiss(): void;\n };\n resources: {\n productDimensionTypeColor: string;\n productDimensionTypeSize: string;\n productDimensionTypeStyle: string;\n originalPriceText: string;\n currentPriceText: string;\n freePriceText: string;\n };\n}\n\nexport interface IWishlistItemViewProps {\n key: string;\n productImage: React.ReactNode;\n productLink: React.ReactNode;\n productDimensions?: React.ReactNode[];\n productPrice?: React.ReactNode;\n addToCartButton?: React.ReactNode;\n removeButton?: React.ReactNode;\n productStatusMessage?: React.ReactNode;\n productName?: React.ReactNode;\n productAriaLabel?: string;\n entireProductLink?: string;\n inventoryInformation?: React.ReactNode;\n productUnitOfMeasure?: React.ReactNode;\n}\n\nconst _addItemToCart = (props: IWishlistItemProps): void => {\n const { product, itemKey, handlers } = props;\n const { onAddToCart } = handlers;\n\n onAddToCart && product && itemKey && onAddToCart(product, itemKey);\n};\n\nconst _removeItemFromWishlist = (props: IWishlistItemProps): void => {\n const { onRemoveItem } = props.handlers;\n const { RecordId } = props.product;\n\n onRemoveItem && RecordId && onRemoveItem(RecordId);\n};\n\nconst WishListItemActions = {\n addToCart: _addItemToCart,\n removeItem: _removeItemFromWishlist\n};\n\nconst _getFullProductLink = (props: IWishlistItemProps): string => {\n if (!msdyn365Commerce.isBrowser) {\n return '';\n }\n\n const fullUrl = new URL(props.productUrl, window.location.href);\n for (const dimension of props.product.Dimensions ?? []) {\n const dimensionValue = dimension.DimensionValue?.Value;\n if (!StringExtensions.isNullOrWhitespace(dimensionValue)) {\n const dimensionName = convertProductDimensionTypeToDimensionTypes(dimension.DimensionTypeValue);\n fullUrl.searchParams.set(dimensionName, dimensionValue!);\n }\n }\n return fullUrl.href;\n // return updateProductUrl(productUrl, context, swatch);\n};\n\nconst _renderAriaLabel = (props: IWishlistItemProps): string => {\n const { product, price, context, resources } = props;\n\n const { Name, Dimensions } = product;\n const { productDimensionTypeColor, productDimensionTypeSize, productDimensionTypeStyle } = resources;\n\n let formattedPrice = 'Free';\n let dimensions = null;\n\n if (price) {\n formattedPrice =\n price.BasePrice === 0 ? resources.freePriceText : context.cultureFormatter.formatCurrency(price.BasePrice!, price.CurrencyCode);\n }\n\n if (Dimensions) {\n dimensions = Dimensions.map(productDimension => {\n switch (productDimension.DimensionTypeValue) {\n case 1:\n return `${productDimensionTypeColor}${productDimension.DimensionValue && productDimension.DimensionValue.Value}`;\n case 3:\n return `${productDimensionTypeSize}${productDimension.DimensionValue && productDimension.DimensionValue.Value}`;\n case 4:\n return `${productDimensionTypeStyle}${productDimension.DimensionValue && productDimension.DimensionValue.Value}`;\n default:\n return '';\n }\n });\n }\n\n return `${Name} ${formattedPrice} ${(dimensions && dimensions.join('')) || ''}`;\n};\n\n/**\n * Renders a link to a product based on the given props.\n * @param input - Wishlist item props with the info about the product.\n * @param productUrl - The url to the product.\n * @returns React component with a link to a product.\n */\nconst renderProductLink = (input: IWishlistItemProps, productUrl: string) => {\n const { telemetryContent } = input;\n const { RecordId: recordId, Name: productName } = input.product;\n const payLoad = getPayloadObject('click', telemetryContent!, '', recordId.toString());\n const productAttributes = getTelemetryAttributes(telemetryContent!, payLoad);\n const productPageUrlWithSwatch = productUrl;\n return (\n !StringExtensions.isNullOrWhitespace(productPageUrlWithSwatch) && (\n <a\n href={productPageUrlWithSwatch}\n className='ms-wishlist-items__product-link'\n {...productAttributes}\n aria-label={_renderAriaLabel(input)}\n >\n {productName}\n </a>\n )\n );\n};\n\n/**\n * Renders a product name box.\n * @param productName - The text to display.\n * @returns React component with a name of a product.\n */\nconst renderProductName = (productName: string) => {\n return <div className='ms-wishlist-items__product-title'>{productName}</div>;\n};\n\n/**\n * Renders inventory information.\n * @param inventoryInformationLabel - The text to display.\n * @param inventoryLabelClassName - The component class name.\n * @returns React component.\n */\nconst renderInventoryInformationLabel = (inventoryInformationLabel: string | undefined, inventoryLabelClassName: string | undefined) => {\n const inventoryCssName = inventoryLabelClassName\n ? `ms-wishlist-items__inventory-label ${inventoryLabelClassName}`\n : 'ms-wishlist-items__inventory-label';\n return (\n !StringExtensions.isNullOrWhitespace(inventoryInformationLabel) && (\n <span className={inventoryCssName}>{inventoryInformationLabel}</span>\n )\n );\n};\n\n/**\n * Renders add to cart button.\n * @param input - Wishlist item props with the configuration.\n * @returns React component.\n */\nconst WishlistItemAddToCartButtonComponent = (input: IWishlistItemProps) => {\n const { isInStock, addToCartText, outOfStockText } = input;\n\n // Check if the product is service or not by product type.\n const isServiceItem = input.product.ItemTypeValue === ReleasedProductType.Service;\n\n const addItemAction = React.useCallback(() => {\n WishListItemActions.addToCart(input);\n }, [input]);\n\n return (\n <Button\n className='ms-wishlist-items__product-add-button'\n title={((isServiceItem || isInStock) && addToCartText) || outOfStockText}\n onClick={addItemAction}\n disabled={!(isServiceItem || isInStock)}\n >\n {((isServiceItem || isInStock) && addToCartText) || outOfStockText}\n </Button>\n );\n};\n\n/**\n * Renders remove from wishlist button.\n * @param input - Wishlist item props with the configuration.\n * @returns React component.\n */\nconst WishlistItemRemoveFromWishlistButtonComponent = (input: IWishlistItemProps) => {\n const { removeFromWishlistText } = input;\n\n const removeItemAction = React.useCallback(() => {\n WishListItemActions.removeItem(input);\n }, [input]);\n\n return <button className='ms-wishlist-items__product-remove-button' aria-label={removeFromWishlistText} onClick={removeItemAction} />;\n};\n\n/**\n * Gets the react node for product unit of measure display.\n * @param context - Module context.\n * @param unitOfMeasure - Product unit of measure.\n * @returns The node representing markup for unit of measure component.\n */\nconst renderUnitOfMeasure = (context: ICoreContext<IGeneric<IAny>>, unitOfMeasure?: string) => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Do not need type check for appsettings\n if (context.app.config && (!context.app.config.unitOfMeasureDisplayType || context.app.config.unitOfMeasureDisplayType === 'none')) {\n return undefined;\n }\n\n if (!unitOfMeasure) {\n return undefined;\n }\n\n return (\n <div className='msc-wishlistitems__product-unit-of-measure'>\n <span>{unitOfMeasure}</span>\n </div>\n );\n};\n\nexport const WishlistItem = (input: IWishlistItemProps): IWishlistItemViewProps | null => {\n const {\n product,\n price,\n context,\n imageSettings,\n wishlistState,\n itemKey,\n handlers,\n inventoryInformationLabel,\n enableImageProductLink,\n inventoryLabelClassName\n } = input;\n\n if (!product) {\n return null;\n }\n\n const { RecordId, Name, PrimaryImageUrl, Dimensions } = product;\n if (product.RecordId) {\n const fallbackImage = getFallbackImageUrl(\n product.ItemId,\n context.actionContext.requestContext.apiSettings,\n context.request.app?.config?.OmniChannelMedia\n );\n const productUrl = _getFullProductLink(input);\n return {\n key: `${RecordId}-item`,\n productImage:\n PrimaryImageUrl && Name && _renderProductImage(context, product.Name!, PrimaryImageUrl, fallbackImage, imageSettings),\n productLink: renderProductLink(input, productUrl),\n productDimensions: Dimensions && _renderProductDimensions(input),\n productPrice: price && _renderPrice(input),\n productUnitOfMeasure: product.DefaultUnitOfMeasure && renderUnitOfMeasure(context, product.DefaultUnitOfMeasure),\n entireProductLink: enableImageProductLink ? productUrl : undefined,\n productAriaLabel: enableImageProductLink ? _renderAriaLabel(input) : undefined,\n productName: enableImageProductLink && Name && renderProductName(Name),\n\n addToCartButton: <WishlistItemAddToCartButtonComponent {...input} />,\n inventoryInformation: renderInventoryInformationLabel(inventoryInformationLabel, inventoryLabelClassName),\n removeButton: <WishlistItemRemoveFromWishlistButtonComponent {...input} />,\n productStatusMessage: wishlistState &&\n wishlistState.isOpen &&\n wishlistState.productId === RecordId &&\n wishlistState.itemKey === itemKey && (\n <div className='ms-wishlist-items__product-status'>\n <Alert color={wishlistState.statusCssString} isOpen={wishlistState.isOpen} toggle={handlers.onDismiss}>\n <span>{wishlistState.userMessage}</span>\n </Alert>\n </div>\n )\n };\n }\n return null;\n};\n\nconst _renderProductImage = (\n context: ICoreContext,\n heading: string,\n image?: string,\n fallbackImage?: string,\n imageSettings?: IImageSettings\n): JSX.Element | null => {\n const defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=315&h=315&m=6', w: 0, h: 0 },\n lg: { q: 'w=315&h=315&m=6', w: 0, h: 0 },\n xl: { q: 'w=315&h=315&m=6', w: 0, h: 0 }\n },\n lazyload: true,\n cropFocalRegion: true\n };\n\n if (imageSettings) {\n imageSettings.cropFocalRegion = true;\n }\n\n if (image) {\n return (\n <Image\n requestContext={context.actionContext.requestContext}\n className='ms-wishlist-items__product-image'\n altText={heading}\n title={heading}\n src={image}\n fallBackSrc={fallbackImage}\n gridSettings={context.request.gridSettings!}\n imageSettings={imageSettings || defaultImageSettings}\n loadFailureBehavior='empty'\n />\n );\n }\n return null;\n};\n\nconst _renderPrice = (props: IWishlistItemProps): JSX.Element | null => {\n const { price, context, moduleId, moduleTypeName, resources } = props;\n\n if (price) {\n return (\n <PriceComponent\n id={moduleId}\n typeName={moduleTypeName}\n data={{ price }}\n className='ms-wishlist-items__product-price'\n freePriceText={resources.freePriceText}\n originalPriceText={resources.originalPriceText}\n currentPriceText={resources.currentPriceText}\n context={context}\n />\n );\n }\n return null;\n};\n\nconst _renderProductDimensions = (props: IWishlistItemProps): (React.ReactNode | undefined)[] => {\n const { product, resources } = props;\n\n if (!product || !product.Dimensions) {\n return [];\n }\n\n return product.Dimensions.map((dimension, index) => {\n if (!dimension.DimensionValue || !dimension.DimensionValue.Value) {\n return undefined;\n }\n\n let type = '';\n\n switch (dimension.DimensionTypeValue) {\n case 1: {\n type = resources.productDimensionTypeColor;\n break;\n }\n case 3: {\n type = resources.productDimensionTypeSize;\n break;\n }\n case 4: {\n type = resources.productDimensionTypeStyle;\n break;\n }\n default:\n return undefined;\n }\n\n return (\n <WishlistItemDimension\n key={`${product.RecordId}-dimensions-${index}`}\n className='msc-price ms-wishlist-items__product-dimension'\n dimensionType={type}\n dimensionValue={dimension.DimensionValue.Value}\n />\n );\n });\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { wishlistStatus } from '../wishlist-items';\n\nexport interface IWishlistItemsStatusMessageProps {\n className?: string;\n errorType: wishlistStatus;\n text?: string;\n}\n\nexport const WishlistItemsStatusMessage: React.FC<IWishlistItemsStatusMessageProps> = ({ className, errorType, text }) => {\n switch (errorType) {\n case 'EMPTY':\n return <p className={classnames('ms-wishlist-items__message-empty', className)}>{text}</p>;\n case 'FAILED':\n return <p className={classnames('ms-wishlist-items__message-failed', className)}>{text}</p>;\n case 'LOADING':\n default:\n return <p className={className ? 'ms-wishlist-items__message-exists-product' : 'ms-wishlist-items__message-waiting'}>{text}</p>;\n }\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { FullProduct } from '@msdyn365-commerce/commerce-entities';\nimport * as MsDyn365 from '@msdyn365-commerce/core';\nimport { AsyncResult, CommerceList, CommerceListLine, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { createGetByCustomerInput, removeLinesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CommerceListsDataActions.g';\nimport { getDeliveryOptionsAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\nimport {\n ArrayExtensions,\n getProductUrlSync,\n IProductInventoryInformation,\n QueryResultSettingsProxy\n} from '@msdyn365-commerce-modules/retail-actions';\nimport {\n getTelemetryObject,\n IModuleProps,\n INodeProps,\n ITelemetryContent,\n updateMaxQuantityForCartLineItem\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport getItemsInWishlists, { ActiveWishlistInput } from './actions/get-items-in-wishlists';\nimport { IWishlistItemViewProps, WishlistItem, WishlistItemsStatusMessage } from './components';\nimport { IWishlistItemsData } from './wishlist-items.data';\nimport { IHeadingData, IWishlistItemsProps } from './wishlist-items.props.autogenerated';\n\nexport interface IWishlistItemActionMessageState {\n productId: number;\n itemKey: string;\n userMessage: string;\n statusCssString: string;\n messageGlyph: string;\n isOpen: boolean;\n isError: boolean;\n}\n\nexport type wishlistStatus = 'LOADING' | 'SUCCESS' | 'FAILED' | 'EMPTY';\n\nexport interface IWishlistItemsViewProps extends IWishlistItemsProps<IWishlistItemsData> {\n WishlistItems: IModuleProps;\n status?: wishlistStatus;\n statusMessage?: React.ReactNode;\n heading?: React.ReactNode;\n Products?: INodeProps;\n Product?: INodeProps;\n ProductDetails?: INodeProps;\n ProductDimensions?: INodeProps;\n products?: IWishlistItemViewProps[];\n telemetryContent?: ITelemetryContent;\n statusNotExistsMessage?: React.ReactNode;\n}\n\n/**\n *\n * WishlistItems component.\n * @extends {React.PureComponent<IWishlistItemsProps<IWishlistItemsData>, IWishlistItemActionMessageState>}\n */\n@observer\nclass WishlistItems extends React.Component<IWishlistItemsProps<IWishlistItemsData>, IWishlistItemActionMessageState> {\n private readonly telemetryContent: ITelemetryContent;\n constructor(props: IWishlistItemsProps<IWishlistItemsData>) {\n super(props);\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n }\n\n public async componentDidMount(): Promise<void> {\n this.setState({ isError: false });\n }\n\n public shouldComponentUpdate(nextProps: IWishlistItemsProps<IWishlistItemsData>, nextState: IWishlistItemActionMessageState): boolean {\n if (this.state === nextState && this.props.data === nextProps.data) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element | null {\n const { heading, className } = this.props.config;\n const { emptyWishlistText, wishlistErrorGettingWishlist, noLongerExitsWishlistItemText } = this.props.resources;\n const { cart, productAvailability, wishlists, products } = this.props.data;\n\n if (cart.status === 'LOADING' || productAvailability.status === 'LOADING' || wishlists.status === 'LOADING') {\n const errorProps: IWishlistItemsViewProps = {\n ...(this.props as IWishlistItemsProps<IWishlistItemsData>),\n WishlistItems: {\n moduleProps: this.props,\n className: classnames('ms-wishlist-items', className)\n },\n status: 'LOADING',\n\n statusMessage: <WishlistItemsStatusMessage errorType='LOADING' text='Loading...' />,\n heading: this._renderHeading(heading)\n };\n return this.props.renderView(errorProps);\n }\n\n if (cart.status === 'FAILED' || productAvailability.status === 'FAILED' || wishlists.status === 'FAILED') {\n const errorProps: IWishlistItemsViewProps = {\n ...(this.props as IWishlistItemsProps<IWishlistItemsData>),\n WishlistItems: {\n moduleProps: this.props,\n className: classnames('ms-wishlist-items', className)\n },\n status: 'FAILED',\n statusMessage: <WishlistItemsStatusMessage errorType='FAILED' text={wishlistErrorGettingWishlist} />,\n heading: this._renderHeading(heading)\n };\n\n return this.props.renderView(errorProps);\n }\n\n const productsList = products && (products as AsyncResult<FullProduct[]>).result;\n\n if (productsList && productsList.length === 0) {\n const emptyViewProps: IWishlistItemsViewProps = {\n ...(this.props as IWishlistItemsProps<IWishlistItemsData>),\n WishlistItems: {\n moduleProps: this.props,\n className: classnames('ms-wishlist-items', className)\n },\n status: 'EMPTY',\n statusMessage: <WishlistItemsStatusMessage errorType='EMPTY' text={emptyWishlistText} />,\n heading: this._renderHeading(heading)\n };\n\n return this.props.renderView(emptyViewProps);\n }\n\n const viewProps: IWishlistItemsViewProps = {\n ...(this.props as IWishlistItemsProps<IWishlistItemsData>),\n WishlistItems: {\n moduleProps: this.props,\n className: classnames('ms-wishlist-items', className)\n },\n status: 'SUCCESS',\n heading: this._renderHeading(heading),\n Products: {\n className: 'ms-wishlist-items__products',\n tag: 'ul'\n },\n Product: {\n className: 'ms-wishlist-items__product',\n tag: 'li'\n },\n ProductDetails: {\n className: 'ms-wishlist-items__product-link',\n tag: 'a'\n },\n telemetryContent: this.telemetryContent,\n ProductDimensions: {\n className: 'ms-wishlist-items__product-dimensions'\n },\n products: productsList && this._renderProductList(productsList),\n statusNotExistsMessage:\n productsList && this._getProductNotExists(productsList, emptyWishlistText, noLongerExitsWishlistItemText)\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n public handleHeadingChange = (event: MsDyn365.ContentEditableEvent) => (this.props.config.heading!.text = event.target.value);\n\n private _getProductNotExists(products: FullProduct[], emptytext: string, noLongerExisttext: string): JSX.Element | null {\n if (this.state && this.state.isError) {\n if (products.length === 0) {\n return <WishlistItemsStatusMessage errorType='SUCCESS' text={emptytext} />;\n }\n return (\n <WishlistItemsStatusMessage\n className={'ms-wishlist-items__message-exists-product'}\n errorType='SUCCESS'\n text={noLongerExisttext}\n />\n );\n }\n return null;\n }\n private _renderProductList(products: FullProduct[]): IWishlistItemViewProps[] {\n const {\n priceFree,\n originalPriceText,\n currentPriceText,\n addToCartButtonText,\n outOfStockText,\n removeButtonText,\n productDimensionTypeColor,\n productDimensionTypeSize,\n productDimensionTypeStyle,\n productDimensionTypeAmount\n } = this.props.resources;\n const { context, telemetry } = this.props;\n const { imageSettings, enableImageProductLink } = this.props.config;\n\n return products.map((product: FullProduct, index) => {\n const currentProductProps = {\n product: product.ProductDetails,\n price: product.ProductPrice,\n context,\n wishlistState: this.state,\n productUrl: getProductUrlSync(product.ProductDetails, context.actionContext, undefined),\n imageSettings,\n removeFromWishlistText: removeButtonText,\n isInStock: this._isProductInStock(product),\n addToCartText: addToCartButtonText,\n outOfStockText,\n index,\n itemKey: `${product.ProductDetails.RecordId}-${product.ProductDetails.ItemId}-${index}`,\n telemetry,\n moduleId: this.props.id,\n moduleTypeName: this.props.typeName,\n enableImageProductLink,\n inventoryInformationLabel: this._inventoryLabel(product),\n inventoryLabelClassName: this._inventoryClassName(product),\n telemetryContent: this.telemetryContent,\n handlers: {\n onAddToCart: this._addItemToCart,\n onRemoveItem: this._removeItemFromWishlist,\n onDismiss: this._onDismiss\n },\n resources: {\n productDimensionTypeColor,\n productDimensionTypeSize,\n productDimensionTypeStyle: product.ProductDetails.IsGiftCard ? productDimensionTypeAmount : productDimensionTypeStyle,\n freePriceText: priceFree,\n originalPriceText,\n currentPriceText\n }\n };\n return WishlistItem(currentProductProps)!;\n });\n }\n\n // Dismiss alert when addingToCart/removeItem\n private readonly _onDismiss = () => {\n this.setState({\n isOpen: false\n });\n };\n\n private readonly _renderHeading = (heading?: IHeadingData): JSX.Element | undefined => {\n if (!heading) {\n return undefined;\n }\n return (\n <MsDyn365.Text\n className='ms-wishlist-items__heading'\n tag={heading.tag || 'h2'}\n text={heading.text}\n editProps={{ onEdit: this.handleHeadingChange, requestContext: this.props.context.request }}\n />\n );\n };\n\n private readonly _addItemToCart = async (product: SimpleProduct, itemKey: string): Promise<void> => {\n const { context, data, resources, telemetry } = this.props;\n const { cart, productAvailability } = data;\n const { addedToCartSuccessMessage, addedToCartFailureMessage, invoiceInCartErrorMessage } = resources;\n\n const productInventoryInformation = this._getProductInventory({ ProductDetails: product }, productAvailability.result);\n\n if (context) {\n if (cart.result) {\n // Check if the product delivery mode is electronic\n const emailDeliveryModeCode = this.props.context.actionContext.requestContext.channel?.EmailDeliveryModeCode;\n\n const deliveryOptions = await getDeliveryOptionsAsync(\n {\n callerContext: this.props.context.actionContext,\n queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(this.props.context.actionContext)\n },\n [product.RecordId]\n );\n const validateQuantity = this.isQuantityValidationRequired();\n const quantity = this.respectQuantityLimits() ? product?.Behavior?.MinimumQuantity ?? 1 : 1;\n\n const addProductToCartInput = {\n product,\n count: quantity,\n enableStockCheck: context.app.config.enableStockCheck,\n availableQuantity: productInventoryInformation\n ? productInventoryInformation.ProductAvailableQuantity.AvailableQuantity\n : 0,\n additionalProperties: { validateQuantity: validateQuantity },\n isAddEmailDeliveryItemToCart:\n ArrayExtensions.hasElements(deliveryOptions) &&\n ArrayExtensions.hasElements(deliveryOptions[0].DeliveryOptions) &&\n deliveryOptions[0].DeliveryOptions[0].Code === emailDeliveryModeCode\n };\n\n cart.result\n .addProductToCart(addProductToCartInput)\n .then(async result => {\n if (result.status === 'SUCCESS') {\n this.setState({\n productId: product.RecordId,\n itemKey,\n userMessage: addedToCartSuccessMessage,\n statusCssString: 'success',\n messageGlyph: 'fas fa-check',\n isOpen: true\n });\n } else if (result.substatus === 'MAXQUANTITY') {\n const curQuantity =\n (await cart).cart?.CartLines?.find(item => item.ProductId === product.RecordId)?.Quantity || 0;\n const maxQtyLimitReachedMessage = this._getInventoryValueMessage(productInventoryInformation, curQuantity);\n\n this.setState({\n productId: product.RecordId,\n itemKey,\n userMessage: maxQtyLimitReachedMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n } else if (result.substatus === 'QUANTITYLIMITS' && validateQuantity) {\n const maxQtyLimitReachedMessage = result.errorDetails?.LocalizedMessage!;\n\n this.setState({\n productId: product.RecordId,\n itemKey,\n userMessage: maxQtyLimitReachedMessage || addedToCartFailureMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n } else if (result.substatus === 'INVOICEINCART') {\n this.setState({\n productId: product.RecordId,\n itemKey,\n userMessage: result.errorDetails?.LocalizedMessage || invoiceInCartErrorMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n } else {\n this.props.telemetry.debug('[wishlist-items] Unable to Update Cart Line from the wishlist');\n this.setState({\n productId: product.RecordId,\n itemKey,\n userMessage: addedToCartFailureMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n }\n })\n .catch(error => {\n telemetry.warning(error);\n telemetry.debug('[wishlist-items] Error trying to Update Cart Line from the wishlist');\n this.setState({\n productId: product.RecordId,\n itemKey,\n userMessage: addedToCartFailureMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n });\n }\n }\n };\n\n private isQuantityValidationRequired = (): boolean => {\n const isChannelQuantityLimitsFeatureEnabledInHq =\n this.props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.EcommerceQuantityLimitConfigurationsFeature'\n )?.IsEnabled || false;\n\n const isOrderQuantityLimitsFeatureEnabled = this.isOrderQuantityLimitsFeatureEnabled();\n return isOrderQuantityLimitsFeatureEnabled || isChannelQuantityLimitsFeatureEnabledInHq;\n };\n\n private respectQuantityLimits = (): boolean => {\n const isOrderQuantityLimitsFeatureEnabled = this.isOrderQuantityLimitsFeatureEnabled();\n const validateLimitsPerLine = this.props.data.cartConfiguration?.result?.ValidateDefaultOrderSettingsPerLine ?? false;\n return isOrderQuantityLimitsFeatureEnabled && validateLimitsPerLine;\n };\n\n private isOrderQuantityLimitsFeatureEnabled = (): boolean => {\n const isOrderQuantityLimitsFeatureEnabledInHq =\n this.props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature'\n )?.IsEnabled || false;\n const defaultOrderQuantityLimitsFeatureConfig = this.props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits;\n\n const customerInfo = this.props.data.customerInformation.result;\n\n const isOrderQuantityLimitsFeatureEnabledInSiteSettings =\n defaultOrderQuantityLimitsFeatureConfig === 'all' ||\n ((customerInfo &&\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b))) ??\n false);\n\n return isOrderQuantityLimitsFeatureEnabledInHq && isOrderQuantityLimitsFeatureEnabledInSiteSettings;\n };\n\n private readonly _removeItemFromWishlist = (productId: number): void => {\n const { context, data, telemetry } = this.props;\n const { wishlists } = data;\n let noLongerLineExist: CommerceListLine[] | undefined = [];\n if (context && context.actionContext) {\n const userToken = context.request.user.isAuthenticated && context.request.user.token;\n const wishlistLineId = this._getWishlistLineIdFromProductId(productId);\n if (userToken && wishlists.result && wishlists.result[0] && wishlistLineId) {\n removeLinesAsync({ callerContext: context.actionContext }, wishlists.result[0].Id, [{ LineId: wishlistLineId }])\n .then(commerceList => {\n const castCommerceList: CommerceList | null = commerceList as CommerceList | null;\n\n if (castCommerceList && castCommerceList.Id && context.request.user.isAuthenticated) {\n noLongerLineExist = this._getProductsNoLongerExists(castCommerceList);\n if (noLongerLineExist && noLongerLineExist.length > 0) {\n this._removeNoLongerExistsLines(noLongerLineExist);\n } else {\n context.actionContext.update(createGetByCustomerInput({}, null), [castCommerceList]);\n getItemsInWishlists(new ActiveWishlistInput(), context.actionContext)\n .then(products => {\n const castSimpleProducts: FullProduct[] | null = products as FullProduct[] | null;\n if (castSimpleProducts && castSimpleProducts.length > 0) {\n this.setState({ isError: false });\n context.actionContext.update(new ActiveWishlistInput(), castSimpleProducts);\n }\n })\n .catch(error => {\n telemetry.warning('[wishlist-items] Unable to hyderate the wishlist with product information');\n telemetry.error(error);\n });\n }\n }\n })\n .catch(error => {\n telemetry.warning('[wishlist-items] Unable remove items from the wishlist');\n telemetry.error(error);\n });\n } else {\n telemetry.warning(\"[wishlist-items] Unable remove items from the wishlist user token or lineItemID wasn't found\");\n }\n }\n };\n\n private _getInventoryValueMessage(product: IProductInventoryInformation | undefined, curQuantity: number): string {\n const { context, resources } = this.props;\n const { maxQuantityLimitText } = resources;\n\n const maxQuantityForLineItem = updateMaxQuantityForCartLineItem(context.app.config.maxQuantityForCartLineItem);\n\n if (!product || !product.ProductAvailableQuantity.AvailableQuantity || !context.app.config.enableStockCheck) {\n return maxQuantityLimitText\n .replace('{maxQuantity}', maxQuantityForLineItem.toString())\n .replace('{curQuantity}', curQuantity.toString());\n }\n\n const minInventory = Math.min(maxQuantityForLineItem, product.ProductAvailableQuantity.AvailableQuantity);\n\n return maxQuantityLimitText.replace('{maxQuantity}', minInventory.toString()).replace('{curQuantity}', curQuantity.toString());\n }\n\n private _getProductInventory(\n product: FullProduct,\n productInventoryCollection: IProductInventoryInformation[] | undefined\n ): IProductInventoryInformation | undefined {\n if (productInventoryCollection && productInventoryCollection.length > 0) {\n for (const productResult of productInventoryCollection) {\n if (product.ProductDetails.RecordId === productResult.ProductAvailableQuantity.ProductId) {\n return productResult;\n }\n }\n }\n return undefined;\n }\n\n private readonly _inventoryLabel = (product: FullProduct): string | undefined => {\n const { productAvailability } = this.props.data;\n if (productAvailability && productAvailability.result) {\n const productInventoryInformation = this._getProductInventory(product, productAvailability.result);\n if (productInventoryInformation) {\n return productInventoryInformation.StockLevelLabel;\n }\n }\n\n return undefined;\n };\n\n private readonly _inventoryClassName = (product: FullProduct): string | undefined => {\n const { productAvailability } = this.props.data;\n if (productAvailability && productAvailability.result) {\n const productInventoryInformation = this._getProductInventory(product, productAvailability.result);\n if (productInventoryInformation && productInventoryInformation.StockLevelCode) {\n return `ms-wishlist-items__${productInventoryInformation.StockLevelCode.toLowerCase()}`;\n }\n }\n\n return undefined;\n };\n\n private readonly _isProductInStock = (product: FullProduct): boolean => {\n const { data, context } = this.props;\n const { productAvailability } = data;\n\n if (!context.app.config.enableStockCheck) {\n return true;\n }\n\n if (!productAvailability.result || !product.ProductDetails) {\n return false;\n }\n\n for (const productResult of productAvailability.result) {\n if (\n productResult.ProductAvailableQuantity &&\n productResult.ProductAvailableQuantity.ProductId &&\n productResult.ProductAvailableQuantity.ProductId === product.ProductDetails.RecordId\n ) {\n return productResult.IsProductAvailable;\n }\n }\n\n return false;\n };\n\n private readonly _getWishlistLineIdFromProductId = (productId: number): number | null => {\n const { wishlists } = this.props.data;\n\n if (\n !wishlists.result ||\n wishlists.result.length === 0 ||\n !wishlists.result[0].CommerceListLines ||\n wishlists.result[0].CommerceListLines.length === 0\n ) {\n this.props.telemetry.error('Wishlist content is empty, module wont render.');\n return null;\n }\n\n const foundWishlistItem = wishlists.result[0].CommerceListLines.filter(commerceListLine => {\n return commerceListLine.ProductId === productId;\n });\n\n if (foundWishlistItem && foundWishlistItem[0].LineId) {\n return foundWishlistItem[0].LineId;\n }\n return null;\n };\n\n private readonly _getProductsNoLongerExists = (castCommerceList: CommerceList): CommerceListLine[] | undefined => {\n const noLongerExist: CommerceListLine[] | undefined = [];\n castCommerceList.CommerceListLines?.map(line => {\n const { products } = this.props.data;\n const productsList = products && (products as AsyncResult<FullProduct[]>).result!;\n\n const skipRemove = productsList.filter(product => product.ProductDetails.RecordId === line.ProductId);\n if (skipRemove.length === 0) {\n noLongerExist?.push({ LineId: line.LineId });\n }\n });\n return noLongerExist;\n };\n\n private readonly _removeNoLongerExistsLines = (noLongerLineExist: CommerceListLine[]) => {\n const { context, data, telemetry } = this.props;\n const { wishlists } = data;\n if (context && context.actionContext) {\n const userToken = context.request.user.isAuthenticated && context.request.user.token;\n if (userToken && wishlists.result && wishlists.result[0]) {\n removeLinesAsync({ callerContext: context.actionContext }, wishlists.result[0].Id, noLongerLineExist)\n .then(commerceList => {\n const castCommerceList: CommerceList | null = commerceList as CommerceList | null;\n if (castCommerceList && castCommerceList.Id && context.request.user.isAuthenticated) {\n context.actionContext.update(createGetByCustomerInput({}, null), [castCommerceList]);\n getItemsInWishlists(new ActiveWishlistInput(), context.actionContext)\n .then(products => {\n const castSimpleProducts: FullProduct[] | null = products as FullProduct[] | null;\n if (castSimpleProducts && castSimpleProducts.length > 0) {\n this.setState({ isError: true });\n context.actionContext.update(new ActiveWishlistInput(), castSimpleProducts);\n }\n })\n .catch(error => {\n telemetry.warning('[wishlist-items] Unable to hyderate the wishlist with product information');\n telemetry.error(error);\n });\n }\n })\n .catch(error => {\n telemetry.warning('[wishlist-items] Unable remove items from the wishlist');\n telemetry.error(error);\n });\n } else {\n telemetry.warning(\"[wishlist-items] Unable remove items from the wishlist user token or lineItemID wasn't found\");\n }\n }\n };\n}\n\nexport default WishlistItems;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n getPayloadObject,\n getTelemetryAttributes,\n INodeProps,\n ITelemetryContent,\n Module,\n Node\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { IWishlistItemViewProps } from '../..';\nimport { IWishlistItemsViewProps } from './wishlist-items';\n\nconst WishlistItemsView: React.FC<IWishlistItemsViewProps> = props => {\n const {\n WishlistItems,\n status,\n statusMessage,\n heading,\n Products,\n products,\n Product,\n ProductDetails,\n ProductDimensions,\n telemetryContent,\n statusNotExistsMessage\n } = props;\n\n return (\n <Module {...WishlistItems}>\n {heading}\n {statusNotExistsMessage}\n {status !== 'SUCCESS' && statusMessage}\n {Products && products && products.length > 0 && (\n <Node {...Products}>\n {products &&\n products.map(product => {\n return product && _renderItem(product, Product, ProductDimensions, ProductDetails, telemetryContent);\n })}\n </Node>\n )}\n </Module>\n );\n};\n\nconst _renderItem = (\n product: IWishlistItemViewProps,\n Product?: INodeProps,\n ProductDimensions?: INodeProps,\n ProductDetails?: INodeProps,\n telemetryContent?: ITelemetryContent\n): JSX.Element | null => {\n const {\n key,\n productImage,\n productLink,\n productPrice,\n productDimensions,\n addToCartButton,\n removeButton,\n productStatusMessage,\n entireProductLink,\n productName,\n productAriaLabel,\n inventoryInformation,\n productUnitOfMeasure\n } = product;\n const payLoad = getPayloadObject('click', telemetryContent!, '', key);\n const productAttributes = getTelemetryAttributes(telemetryContent!, payLoad);\n if (entireProductLink) {\n return (\n <Node key={key} className={Product!.className} {...Product}>\n <Node\n href={entireProductLink}\n className={classnames('entire-product-link ', ProductDetails!.className)}\n {...productAttributes}\n aria-label={productAriaLabel}\n tag={ProductDetails!.tag}\n >\n {productImage}\n {productName}\n {productDimensions && ProductDimensions && (\n <Node {...ProductDimensions}>\n {productDimensions.map(dimension => {\n return dimension;\n })}\n </Node>\n )}\n {productPrice}\n {productUnitOfMeasure}\n </Node>\n {inventoryInformation}\n {addToCartButton}\n {removeButton}\n {productStatusMessage}\n </Node>\n );\n }\n return (\n <Node key={key} className={Product!.className} {...Product}>\n {productImage}\n {productLink}\n {productDimensions && ProductDimensions && (\n <Node {...ProductDimensions}>\n {productDimensions.map(dimension => {\n return dimension;\n })}\n </Node>\n )}\n {productPrice}\n {addToCartButton}\n {removeButton}\n {productStatusMessage}\n </Node>\n );\n};\n\nexport default WishlistItemsView;\n"],"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","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","getUrlSync","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","viewport","variant","VariantType","Browser","productComparisonMobileProductsLimit","productComparisonDesktopProductsLimit","_product$PrimaryImage","_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","dangerouslySetInnerHTML","getRichTextHtml","_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","getElementsByClassName","tableHeaderClassName","Array","from","documentElement","scrollTop","classList","add","tableHeaderLockedClassName","remove","_handleScroll","_this$_tableHeaderRef","_tableHeaderReference","scrollTo","top","left","scrollLeft","_checkClickersState","_handleScrollClick","direction","_this$_tableBodyRefer","_this$_tableCellRefer","_document$body$parent","tableBody","_tableBodyReference","newLeftPosition","cellWidth","_tableCellReference","clientWidth","_getCellWidth","scrollPosition","ceil","minLeftPosition","maxScroll","scrollWidth","body","parentElement","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","_debounce","_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","onMouseEnter","onMouseLeave","_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","ImageUrl","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","width","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","maxChars","maxQuantity","disableAddtoCart","ariaLabelQuantity","ariaLabelProduct","ariaLabelAddtoCart","addQuantityPlaceholderText","handleQuantityChange","handleInputChange","handleAddToCartClick","onInputChange","onInputChangeFunction","onQuantityInputChange","onQuantityChangeFunction","productNode","quantityNode","pattern","maxLength","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","waitTime","dimensionUpdateQueue","FinitePromiseQueue","cssClassNameConfigure","quickOrderCallbacks","dimensionSelectedAsync","selectedDimensionId","selectedDimensionValueId","enqueue","_updateDimensions","FinitePromiseQueueError","ProcessWasDiscardedFromTheQueue","getDropdownName","_getDropdownName","changeUpdatingDimension","isUpdatingDimension","_handleInputChange","productText","productResponse","inputQuantityText","quantityInput","HTMLInputElement","cancellableDebounce","cancel","isQuickOrderFormExpanded","getScanResult","GetScanResultInput","results","ProductDimensionFull","quickOrderAddedToCartSuccessMessage","quickOrderAddedToCartFailureMessage","_validateCart","_this$props$data$feat2","isChannelQuantityLimitsFeatureEnabledInHq","defaultDeliveryOption","isQuantityLimitsFeatureEnabled","productAvailableQuantity","_updateAvailability","deliveryMode","inputProductText","_getMaxQtyMessage","_getConcatenatedMaxQtyMessage","currentQuantity","quickOrderMaxQuantityLimitText","quickOrderAlreadyItemQuantityText","_handleQuantityChange","currentValue","inputElement","setAttribute","_updateDimensionValue","productDimensionFull","newValueId","DimensionValues","_this$state$productRe","productDimensionTypeConfiguration","dimensionsToUpdate","productDimensionErrorState","otherError","clearOtherErrorState","keys","configureErrors","errorState","mappedDimensions","selectedProduct","Promise","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","form","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","createObservableDataAction","action","ctx","tenantId","inputIsValid","serviceEndpoint","sendRequest","userReviewData","headers","Authorization","authorization","response","SubmitUserReviewInput","getCacheKey","getCacheObjectType","dataCacheType","onClickSubmit","onSubmit","ReviewModal","TelemetryConstant","SubmitReview","submitButtonAttribute","Cancel","cancelButtonAttribute","modalCSS","cancelButton","discardReviewButtonText","submitButton","submitDisabled","submitReviewButtonText","ratingsInput","ratingsLabel","titleInput","titleLabel","textInput","textLabel","privacyPolicyUrl","privacyPolicyLink","autoComplete","inputRow","hasError","errorMessageText","userReview","reviewId","editReviewModalTitle","writeReviewModalTitle","stripWhiteSpacesFromString","reviewText","reviewTitle","selectRatingAriaLabel","initialRating","parentId","parentType","onRatingChange","selectRatingLabel","reviewTitleMaxLength","renderContextId","onTitleChange","reviewTitleAriaLabel","htmlFor","reviewTitleLabel","reviewTextMaxLength","onTextChange","rows","reviewAriaLabel","reviewTextLabel","policyTextBlocks","privacyPolicyTextFormat","isSeparatorAtStart","startsWith","isSeparatorAtEnd","endsWith","PrivacyPolicy","privacyPolicyAttribute","rel","privacyPolicyTitle","submitReview","onReviewComplete","RegExp","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","callbacks","histogramItems","averageRatingAriaLabel","averageNumber","totalReviews","ratingsSummaryProps","Msdyn365","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","i","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","attributes","WriteReview","writeReviewCallbacks","userInfo","signInMessage","signInButton","signInLabel","signInAriaLabel","editReviewButtonText","reviewButtonLabel","_buildUserReviewModal","channelInventoryConfigurationId","productListInventoryDisplay","ProductListInventoryFilteringOptions","HideOOS","choice","closeAriaLabel","refinerValues","filterValue","_context$request$app","recommendation","featureSimilarDescriptionTitle","getInventoryLabel","inventoryAttribute","quickviewSlot","productComparisonButton","isPriceMinMaxEnabled","productsDimensionAvailabilities","priceResources","priceRangeSeparator","quickViewButton","inventoryLabel","swatchItemAriaLabel","dimensionAvailabilities","dimensionAvailability","masterProductId","_selectedRefinementCr","_this$props$selectedR2","_ref2","_this$props$selectedR3","_this$props$selectedR4","getLabels","getSliderThumbs","sliderKey","_this$props$minValueS","_this$props$maxValueS","String","minValue","maxValue","sliderKeyString","componentDidUpdate","previousProps","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","_renderSwatch","checkIfShouldDisplayAsSwatch","_productRefinerValue$2","swatchItems","isRefineItem","ratingUserCountAriaLabel","ratingSingleUserCountAriaLabel","_productRefinerValue$3","defaultChkProductCount","productCountAriaLabelValue","sortByOptionBestSelling","sortByOptionNewScore","sortByOptionTrendingScore","defaultPageNumber","isListPageStateUpdated","_isMounted","_updateVariantAvailability","dimensionsToDisplayOnProductCard","dimensionsInProductCard","dimensionsToDisplayAsSwatch","_getProductsDimensionsAvailabilities","_updateListPageState","_this$props$config$it","_this$props$config$it2","hydrateRefinersFromUrl","_this$props$data$list","_this$props$data$list2","getDimensionAvailabilitiesForProductSearchResultAction","DimensionAvailabilitiesForProductSearchResultInput","DimensionSwatchDisplayTypes","productCard","_this$props$data$list3","_this$props$data$list4","getPriceForProductSearchResult","PriceForProductSearchResultInput","_this$props$context$r3","_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$r4","_this$props$context$r5","_this$props$context$r6","newListPageState","Recommendation","_newListPageState$cur2","_newListPageState$sor2","_newListPageState$act2","_this$props$context$r7","_this$props$context$r8","refinerInput","RefinersByCollectionInput","getCollectionRefinersAction","_listPageState$result","_listPageState$result2","_this$props$context$r9","_this$props$data$list7","_this$props$data$list8","productCollection","Viewport","isRecoSearchPage","renderSort","renderRefiner","renderTitleCount","_props$context$action","SearchState","SuggestionType","AutoSuggestInput","searchText","suggestionType","hitPrefix","hitSuffix","searchQuery","topResultsCount","_getAutoSuggest","autosuggest","searchCriteria","ProductSearchCriteria","SearchCondition","Context","HitPrefix","HitSuffix","searchSuggestions","getSearchSuggestionsAsync","AllSearchResults","autoSuggestPromises","inputData","CategorySuggestionsComponent","suggestions","autoSuggestProps","categorySuggestionHeading","reactNodes","_assembleNode","_renderTitle","categoryAutoSuggestionHeading","shouldShowFullPath","splitValue","pop","_generateLink","_getHighlightedText","suggestion","_getCategoryLink","_categoryRefiners$Val","searchPageURL","searchQsp","searchRefiners","queryUrl","categoryRefiners","Category","encodedRefiner","formattedText","FormComponent","searchPlaceholder","hideSearchLabel","searchTextInput","disableSubmitSearch","handleCancelSearchChange","ariaLabelCancel","ariaLabelSearch","ariaLabelSubmit","inputNode","submitBtnNode","cancelBtn","submitBtn","KeywordSuggestionsComponent","formattedLink","LabelComponent","searchLabelClass","searchLabelArialLabel","isSearchFormExpanded","searchtext","searchCollapsedLabel","ProductSuggestionsComponent","productSuggestionHeading","productAutoSuggestionHeading","_item$Value","Value3","DecimalValue","thumbnail","_renderThumbnail","LiProduct","_getLiWrapper","AProduct","_getAWrapper","recid","_props$resources","Search","_isLoadingNode","loadingText","autoSuggestResultLoadingMessage","Spinner","size","SpinnerSize","medium","labelPosition","_focusOutTarget","closest","_clearAutoSuggestState","_keyup","keyCode","KeyCodes","Escape","formReference","contains","autoSuggestResultDiv","searchState","defaultBasicSearchUrl","searchQueryStringParameter","createSearchStateInput","cancellabelDebounce","inputSuggestionType","_loadSuggestions","_handleSubmit","searchURL","_appendQueryParams","_handleCancelSearchChange","isInitialState","_handleCancelSearchFocused","route","_setAutoSuggestResultCount","autoSuggestResultScreenReaderDiv","ariaLiveRegion","suggestResultString","autoSuggestFoundMessage","emptyResultString","noAutoSuggestionMessage","searchKeywordSuggestClass","searchProductSuggestClass","searchCategorySuggestClass","autoSuggestAriaLabel","isLoadingAutoSuggest","searchInputMaxLength","searchFormClass","_initSuggestionTypes","params","isEditor","_suggestions$AllSearc","_suggestions$AllSearc2","_suggestions$AllSearc3","cancelBtnAriaLabel","searchBtnAriaLabel","submitBtnAriaLabel","searchplaceholderText","shouldShowFullCategoryPath","keywordSuggestions","Keyword","None","productSuggestions","categorySuggestions","_item$RefinerRecordId","AutoSuggestAriaLabel","AutoSuggestAriaLabelText","AutoSuggest","KeywordSuggest","ProductSuggest","CategorySuggest","SearchForm","FormWrapper","UlKeyword","UlProduct","UlCategory","autosuggestKeyword","autosuggestProduct","autosuggestCategory","handleCancelSearchFocused","isLoadingNode","suggestionTypes","suggestionTypeCriterion","validSuggestions","loadSuggestionsRequestId","getSearchSuggestionsAction","_getSuggestionType","_getSearchRefiners","_getSearchSuggestions","_updateSearchRefiners","suggestionTypeItem","charAt","toUpperCase","ProductsDataActions","_renderForm","_renderKeywordSuggestions","_renderProductSuggestions","_renderCategorySuggestions","SocialShareItem","_getSocialShareItem","viewprops","SocialShareItemElement","icon","socialMedia","SocialMediaComponent","SocialMedia","Facebook","postUrl","Twitter","Pinterest","Linkedin","Mail","SocialShareItemView","getAdditionalContentItems","_item$links","headingNode","renderHeading","additionalContentHeading","handleAdditionalTextChange","paragraphNode","subtext","renderParagraph","additionalContentParagraphText","handleAdditionalParagraphChange","linksNode","links","ctaLink","renderLinks","linkIndex","editableLink","linkText","linkUrl","destinationUrl","openInNewTab","link","handleAdditionalLinkTextChange","additionalContentItemContainer","additionalContentItemLinks","videoPlayerAdditionalContent","additionalContent","additionalContentNode","additionalContentItems","VideoPlayer","handleTextChange","handleParagraphChange","paragraph","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","posterframeUrl","_links","binaryReferences","videoBinaryReferences","videoPlayerData","metaData","player","Player","playerData","_getVideoDetailsHeading","_getVideoDetailsParagraph","_getVideoDetailsLinks","detailsContainer","detailsContainerCTA","handleText","handleParagraph","handleAdditionalText","handleAdditionalParagraph","handleLink","handleLinkTextChange","handleAdditionalLink","_this$props$config$ad","linkData","linkId","_heading$tag","detailsContainerCta","_product$Behavior$Min","validateQuantity","isQuantityValidationRequired","respectQuantityLimits","MinimumQuantity","_this$props$data$cart","_this$props$data$cart2","validateLimitsPerLine","cartConfiguration","ValidateDefaultOrderSettingsPerLine"],"sourceRoot":""}