{"version":3,"file":"static/js/16.8bdb4918e964ad9f8710.chunk.js","mappings":"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","sources":["webpack://Msdyn365.Commerce.Online/./src/components/LoginToViewPricing.component.tsx?4d0c","webpack://Msdyn365.Commerce.Online/./src/modules/eve-search-result-container/components/utilities.ts?71e1","webpack://Msdyn365.Commerce.Online/./src/modules/eve-search-result-container/components/choice-summary.tsx?92a7","webpack://Msdyn365.Commerce.Online/./src/modules/eve-search-result-container/components/error-message.tsx?5da8","webpack://Msdyn365.Commerce.Online/./src/modules/eve-search-result-container/components/feature-search-result-item.tsx?5dcb","webpack://Msdyn365.Commerce.Online/./src/modules/eve-search-result-container/components/link.tsx?3ec2","webpack://Msdyn365.Commerce.Online/./src/modules/eve-search-result-container/components/modal.tsx?793f","webpack://Msdyn365.Commerce.Online/./src/modules/eve-search-result-container/components/product-search-result-items.tsx?7848","webpack://Msdyn365.Commerce.Online/./src/modules/eve-search-result-container/components/range-refine-item.tsx?cc5e","webpack://Msdyn365.Commerce.Online/./src/modules/eve-search-result-container/components/refine-item.tsx?ac45","webpack://Msdyn365.Commerce.Online/./src/modules/eve-search-result-container/components/refine-submenu.tsx?49ea","webpack://Msdyn365.Commerce.Online/./src/modules/eve-search-result-container/components/separator.tsx?fa0e","webpack://Msdyn365.Commerce.Online/./src/modules/eve-search-result-container/components/title.tsx?1fda","webpack://Msdyn365.Commerce.Online/./src/modules/eve-search-result-container/eve-search-result-container.props.autogenerated.ts?22c3","webpack://Msdyn365.Commerce.Online/./src/modules/eve-search-result-container/eve-search-result-container.tsx?578c","webpack://Msdyn365.Commerce.Online/./src/modules/eve-search-result-container/eve-search-result-container.view.tsx?c38c","webpack://Msdyn365.Commerce.Online/./src/themes/gardner-theme-b2c/views/cart-icon.view.tsx?3413","webpack://Msdyn365.Commerce.Online/./src/themes/gardner-theme-b2c/views/components/addToCart.component.tsx?25ed","webpack://Msdyn365.Commerce.Online/./src/themes/gardner-theme-b2c/views/components/create-order-template.component.tsx?f930","webpack://Msdyn365.Commerce.Online/./src/themes/gardner-theme-b2c/views/components/product.component.tsx?7a8d","webpack://Msdyn365.Commerce.Online/./src/themes/gardner-theme-b2c/views/order-template-list.view.tsx?212c","webpack://Msdyn365.Commerce.Online/./src/themes/gardner-theme-b2c/views/search-result-container.view.tsx?87ee","webpack://Msdyn365.Commerce.Online/./src/themes/gardner-theme/models/getProductSupersessionProperty.ts?8b55","webpack://Msdyn365.Commerce.Online/./src/themes/gardner-theme/models/SupersessionKey.ts?818f","webpack://Msdyn365.Commerce.Online/./src/themes/gardner-theme/views/cart-icon.view.tsx?be14","webpack://Msdyn365.Commerce.Online/./src/themes/gardner-theme/views/components/addToCart.component.tsx?89c0","webpack://Msdyn365.Commerce.Online/./src/themes/gardner-theme/views/components/create-order-template.component.tsx?d950","webpack://Msdyn365.Commerce.Online/./src/themes/gardner-theme/views/components/product.component.tsx?a667","webpack://Msdyn365.Commerce.Online/./src/themes/gardner-theme/views/order-template-list.view.tsx?3b52","webpack://Msdyn365.Commerce.Online/./src/themes/gardner-theme/views/search-result-container.view.tsx?c8d6","webpack://Msdyn365.Commerce.Online/./src/modules/carousel/carousel.tsx?80d4","webpack://Msdyn365.Commerce.Online/./src/modules/carousel/carousel.view.tsx?d82f","webpack://Msdyn365.Commerce.Online/./src/validate-cart.ts?cd50","webpack://Msdyn365.Commerce.Online/./src/Common/get-product.ts?0a21","webpack://Msdyn365.Commerce.Online/./src/modules/cart-icon/components/flyout-cart-line-items.tsx?f2c4","webpack://Msdyn365.Commerce.Online/./src/modules/cart-icon/utils/get-products-in-mini-cart.ts?3c15","webpack://Msdyn365.Commerce.Online/./src/modules/cart-icon/cart-icon.tsx?4ae8","webpack://Msdyn365.Commerce.Online/./src/modules/cart-icon/cart-icon.view.tsx?f9dd","webpack://Msdyn365.Commerce.Online/./src/modules/fabrikam/views/components/cartlineitem.component.tsx?eb8c","webpack://Msdyn365.Commerce.Online/./src/modules/product-comparison-preview/product-comparison-preview.tsx?39f6","webpack://Msdyn365.Commerce.Online/./src/modules/product-comparison-preview/product-comparison-preview.view.tsx?28cb","webpack://Msdyn365.Commerce.Online/./src/modules/product-comparison/base/product-specification.tsx?75ed","webpack://Msdyn365.Commerce.Online/./src/modules/product-comparison/base/remove-from-comparison-button.tsx?1d8c","webpack://Msdyn365.Commerce.Online/./src/modules/product-comparison/product-comparison.tsx?4f74","webpack://Msdyn365.Commerce.Online/./src/modules/product-comparison/product-comparison.view.tsx?a0a9","webpack://Msdyn365.Commerce.Online/./src/modules/quick-order-grid/components/add-to-list/add-to-cart-selected-items.tsx?de21","webpack://Msdyn365.Commerce.Online/./src/modules/quick-order-grid/components/quick-order-grid-actions.tsx?ca97","webpack://Msdyn365.Commerce.Online/./src/modules/quick-order-grid/components/quick-order-grid-drawer.tsx?8701","webpack://Msdyn365.Commerce.Online/./src/modules/quick-order-grid/components/quick-order-grid-form.tsx?5cbb","webpack://Msdyn365.Commerce.Online/./src/modules/quick-order-grid/components/quick-order-grid-product.ts?187e","webpack://Msdyn365.Commerce.Online/./src/modules/quick-order-grid/components/quick-order-grid-table/components/quick-order-grid-table-header-component.tsx?69b3","webpack://Msdyn365.Commerce.Online/./src/modules/quick-order-grid/components/quick-order-grid-table/components/quick-order-grid-table-row-component.tsx?cd92","webpack://Msdyn365.Commerce.Online/./src/modules/quick-order-grid/components/quick-order-grid-table/quick-order-grid-table-component.tsx?7cbc","webpack://Msdyn365.Commerce.Online/./src/modules/quick-order-grid/quick-order-grid.tsx?fddf","webpack://Msdyn365.Commerce.Online/./src/modules/quick-order-grid/components/utilities.ts?1806","webpack://Msdyn365.Commerce.Online/./src/modules/quick-order-grid/quick-order-grid.view.tsx?f941","webpack://Msdyn365.Commerce.Online/./src/modules/adventureworks/views/components/product.component.tsx?fd23","webpack://Msdyn365.Commerce.Online/./src/modules/adventureworks/views/search-result-container.view.tsx?6e86"],"sourcesContent":["import React from 'react';\r\nimport { IRequestContext } from '@msdyn365-commerce/core';\r\nexport const LoginToViewPricingComponent = (\r\n context: IRequestContext,\r\n loginText: string,\r\n priceComponent: JSX.Element,\r\n shouldBlockPricing: boolean,\r\n className: string = 'login-to-view-pricing'\r\n): JSX.Element => {\r\n const {\r\n user: { signInUrl, isAuthenticated }\r\n } = context;\r\n\r\n if (isAuthenticated) {\r\n return priceComponent;\r\n } else if (!isAuthenticated && !shouldBlockPricing) {\r\n return priceComponent;\r\n } else {\r\n return (\r\n
\r\n {loginText}\r\n
\r\n );\r\n }\r\n};\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { ITelemetry } from '@msdyn365-commerce/core';\r\nimport { AttributeDataType, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\r\n\r\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\r\n\r\n/**\r\n * Types of product refiner values.\r\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\nexport enum ProductRefinerValueDataTypeValue {\r\n /**\r\n * Range slider is used for selections like price.\r\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\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 * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\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 * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n List = 5,\r\n\r\n /**\r\n * Boolean types allows only single-select.\r\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Boolean = 6\r\n}\r\n\r\n/**\r\n * Types of product refiners.\r\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\nexport enum ProductRefinerTypeValue {\r\n /**\r\n * Refiner values are single-select.\r\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Single = 0,\r\n\r\n /**\r\n * Refiner values are multi-select.\r\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Multi = 1\r\n}\r\n\r\n/**\r\n * ProductRefinerSource enum type.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\nexport enum ProductRefinerSource {\r\n /**\r\n * The None member.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n None = 0,\r\n\r\n /**\r\n * The Attribute member.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Attribute = 1,\r\n\r\n /**\r\n * The Category member.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Category = 2,\r\n\r\n /**\r\n * The Price member.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Price = 3,\r\n\r\n /**\r\n * The Rating member.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Rating = 4\r\n}\r\n\r\n/**\r\n * Checks if the data type value corresponds to a slider.\r\n * @param dataTypeValue\r\n */\r\nexport function isRangeType(dataTypeValue: number | undefined): boolean {\r\n return (\r\n dataTypeValue === AttributeDataType.Currency ||\r\n dataTypeValue === AttributeDataType.Decimal ||\r\n dataTypeValue === AttributeDataType.Integer\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 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((refinementCriterion: ProductRefinerValue) =>\r\n 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 * @param refinementCriterion\r\n */\r\nexport function isMatchingRefinementCriterion(productRefinerValue: ProductRefinerValue, refinementCriterion: ProductRefinerValue): 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 (isRangeType(refinementCriterion.DataTypeValue) ||\r\n refinementCriterion.LeftValueBoundString === productRefinerValue.LeftValueBoundString)\r\n );\r\n}\r\n\r\nexport function getUpdatedRefinementCriteria(\r\n itemToggleNotification: IRefineItemToggleNotification,\r\n currentRefinementCriteria: ProductRefinerValue[]\r\n): 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:\r\n (itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}`) ||\r\n selectedCriterion.LeftValueBoundString,\r\n RightValueBoundString:\r\n (itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}`) ||\r\n selectedCriterion.RightValueBoundString\r\n };\r\n updatedRefinementCriteria.push(next);\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:\r\n (itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}`) ||\r\n itemToggleNotification.productRefinerValue.LeftValueBoundString,\r\n RightValueBoundString:\r\n (itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}`) ||\r\n 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 (\r\n (itemToggleNotification.productRefinerValue.DataTypeValue === AttributeDataType.Text ||\r\n itemToggleNotification.productRefinerValue.DataTypeValue === AttributeDataType.TrueFalse) &&\r\n itemToggleNotification.parentProductRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect\r\n ) {\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) =>\r\n isMatchingRefinementCriterion(child, criterion)\r\n );\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\r\n): 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,\r\n minimumFractionDigits: 0\r\n }).format(priceAmount);\r\n } catch (error) {\r\n result = `${priceAmount} ${currency}`;\r\n telemetry.warning(`[refine-menu.utilities.formatPrice] Failed to format price for ${result}: ${error}`);\r\n }\r\n\r\n return result;\r\n}\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\r\nimport { getPayloadObject, getTelemetryAttributes, IPayLoad } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport { computed } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\n\r\nimport { ProductListInventoryFilteringOptions } from '../actions';\r\nimport { IChoiceSummaryProps } from './choice-summary.props';\r\nimport { isMatchingRefinementCriterion, isRangeType } from './utilities';\r\n\r\ninterface IRefinerMap {\r\n key: string;\r\n value: ProductRefinerValue;\r\n}\r\n\r\n/**\r\n * ChoiceSummary component.\r\n */\r\n@observer\r\nexport default class ChoiceSummary extends React.PureComponent {\r\n private readonly closeButtonGlyph: string = 'msi-close-btn';\r\n\r\n private readonly payLoad: IPayLoad;\r\n\r\n @computed get selectedRefinersMap(): IRefinerMap[] {\r\n let { selectedChoices } = this.props;\r\n const { channelInventoryConfigurationId, refinerHierarchy } = this.props;\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app configs are of generic type\r\n if (this.props.context?.app.config.productListInventoryDisplay === ProductListInventoryFilteringOptions.HideOOS) {\r\n selectedChoices = selectedChoices.filter(choice => {\r\n const parent = refinerHierarchy.find(\r\n (hierarchy: IProductRefinerHierarchy) =>\r\n !!hierarchy.Values.find((value: ProductRefinerValue) => isMatchingRefinementCriterion(value, choice))\r\n );\r\n return parent && parent.RecordId !== channelInventoryConfigurationId;\r\n });\r\n }\r\n return selectedChoices.map((selectedRefiner: ProductRefinerValue) => {\r\n return {\r\n key: this._getKeyForRefinerValue(selectedRefiner),\r\n value: selectedRefiner\r\n } as IRefinerMap;\r\n });\r\n }\r\n\r\n constructor(props: Readonly) {\r\n super(props);\r\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, '');\r\n }\r\n\r\n public render(): JSX.Element {\r\n const { clearAllText, label, classNames, choiceAriaLabel, closeAriaLabel } = this.props;\r\n const items = this.selectedRefinersMap;\r\n this.payLoad.contentAction.etext = clearAllText;\r\n const clearAllAttributes = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\r\n return (\r\n
\r\n {items.length > 0 && label && {label}}\r\n
    \r\n {items.map((item: IRefinerMap) => {\r\n this.payLoad.contentAction.etext = item.key;\r\n const attribute = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\r\n\r\n return (\r\n
  • \r\n \r\n {item.key}\r\n \r\n \r\n
  • \r\n );\r\n })}\r\n
\r\n {items.length > 0 && clearAllText && (\r\n \r\n {clearAllText}\r\n \r\n )}\r\n
\r\n );\r\n }\r\n\r\n private _getKeyForRefinerValue(productRefinerValue: ProductRefinerValue): string {\r\n const { choiceFormat, choiceRangeValueFormat, refinerHierarchy, telemetry } = this.props;\r\n const overallFormat = choiceFormat || '{1}';\r\n const rangeFormat = choiceRangeValueFormat;\r\n let refinerName = '';\r\n if (refinerHierarchy && refinerHierarchy.find) {\r\n const parent = refinerHierarchy.find(\r\n (hierarchy: IProductRefinerHierarchy) =>\r\n !!hierarchy.Values.find((value: ProductRefinerValue) => isMatchingRefinementCriterion(value, productRefinerValue))\r\n );\r\n\r\n if (!parent) {\r\n telemetry.warning('[choice-summary] could not find parent of selected refiner value');\r\n } else {\r\n refinerName = parent.KeyName || '';\r\n }\r\n }\r\n\r\n let refinerValueName: string;\r\n if (isRangeType(productRefinerValue.DataTypeValue)) {\r\n refinerValueName = rangeFormat\r\n .replace('{0}', this._formatPrice(productRefinerValue.LeftValueBoundString, productRefinerValue.UnitText))\r\n .replace('{1}', this._formatPrice(productRefinerValue.RightValueBoundString, productRefinerValue.UnitText));\r\n } else {\r\n refinerValueName = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\r\n }\r\n\r\n return overallFormat.replace('{0}', refinerName).replace('{1}', refinerValueName);\r\n }\r\n\r\n private _formatPrice(amount: string | undefined, currency: string | undefined): string {\r\n if (!amount || !currency) {\r\n this.props.telemetry.trace('[choice-summary] could not format price');\r\n return amount || '';\r\n }\r\n let result = amount;\r\n\r\n try {\r\n result = this.props.context!.cultureFormatter.formatCurrency(Number(amount), currency);\r\n } catch (error) {\r\n this.props.telemetry.warning(`Failed to format price for ${result}: ${error}`);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private readonly _onClick = (e: React.MouseEvent): void => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n const target = e.currentTarget as HTMLElement;\r\n const clearAll = target.getAttribute('class')!.includes('choice-summary__clear-all');\r\n const selectedRefiner = clearAll ? undefined : this._getSelectedRefinerChoice(target);\r\n\r\n if (this.props.onChoiceClicked) {\r\n this.props.onChoiceClicked({\r\n clearAll,\r\n itemClicked: target,\r\n choiceClicked: selectedRefiner,\r\n nextItemToFocus: target.nextSibling as HTMLElement\r\n });\r\n }\r\n };\r\n\r\n private _getSelectedRefinerChoice(itemClicked: HTMLElement): ProductRefinerValue | undefined {\r\n const result = this.selectedRefinersMap.find(\r\n selected => (itemClicked.textContent && itemClicked.textContent.trim()) === selected.key\r\n );\r\n return (result && result.value) || undefined;\r\n }\r\n}\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport * as React from 'react';\r\n\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","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { ICoreContext, IGridSettings, IImageData, IImageSettings, Image, IRequestContext } from '@msdyn365-commerce/core';\r\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport { getFallbackImageUrl, getProductPageUrlSync } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, onTelemetryClick } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { IEveSearchResultContainerResources } from '../eve-search-result-container.props.autogenerated';\r\n\r\n// Import { IComponent, IComponentProps, ICoreContext, IGridSettings, IImageData, IImageSettings, Image, msdyn365Commerce } from '@msdyn365-commerce/core';\r\n\r\ninterface IFeatureSearchResultItem {\r\n product: SimpleProduct | null;\r\n context: ICoreContext;\r\n resources: IEveSearchResultContainerResources;\r\n imageSettings?: IImageSettings;\r\n moduleType: string;\r\n moduleId: string;\r\n telemetryContent?: ITelemetryContent;\r\n recommendation?: string;\r\n}\r\n\r\nexport const FeatureSearchResultItem: React.FC = ({\r\n product,\r\n context,\r\n imageSettings,\r\n resources,\r\n telemetryContent,\r\n recommendation\r\n}) => {\r\n if (product === null) {\r\n return null;\r\n }\r\n\r\n const productName = product.Name;\r\n const productRecordId = product && product.RecordId ? product.RecordId : 0;\r\n const productUrl = getProductPageUrlSync(product.Name || '', productRecordId, context && context.actionContext, undefined);\r\n const fallbackImage = getFallbackImageUrl(product.ItemId, context.actionContext.requestContext.apiSettings);\r\n const heading =\r\n recommendation && recommendation === 'descriptions' ? resources.featureSimilarDescriptionTitle : resources.featureSimilarLooksTitle;\r\n\r\n // Construct telemetry attribute to render\r\n const payLoad = getPayloadObject('click', telemetryContent!, productName!, productRecordId.toString());\r\n\r\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\r\n return (\r\n
\r\n \r\n
\r\n {renderProductPlacementImage(\r\n imageSettings,\r\n context.request.gridSettings,\r\n product.PrimaryImageUrl,\r\n product.Name,\r\n fallbackImage,\r\n context.actionContext.requestContext\r\n )}\r\n
\r\n \r\n
\r\n

{heading}

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

{title}

;\r\n}\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport * as React from 'react';\r\n\r\ninterface ILink {\r\n className?: string;\r\n text?: string;\r\n href?: string;\r\n ariaLabel?: string;\r\n}\r\n\r\nexport const Link: React.FC = ({ text, className, href, ariaLabel }) => (\r\n \r\n {' '}\r\n {text}{' '}\r\n \r\n);\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { Button, Modal, ModalBody, ModalFooter, ModalHeader } from '@msdyn365-commerce-modules/utilities';\r\nimport React from 'react';\r\n\r\nexport interface ISearchResultModalViewProps {\r\n modal: React.ReactElement;\r\n modalHeader: React.ReactElement;\r\n modalFooter: React.ReactElement;\r\n modalBody: React.ReactElement;\r\n}\r\n\r\ninterface IModalToggleProps {\r\n innerRef: React.RefObject | undefined;\r\n id: string;\r\n text: string;\r\n ariaLabel: string;\r\n onClick(): void;\r\n}\r\n\r\nexport interface ISearchResultModalResources {\r\n modalTitle: string;\r\n modalCloseButtonText: string;\r\n}\r\n\r\nexport interface ISearchResultModalProps {\r\n resources: ISearchResultModalResources;\r\n isOpen: boolean;\r\n returnRef: React.RefObject | undefined;\r\n onModalToggle(): void;\r\n}\r\n\r\nexport const ModalToggle: React.FC = (props: IModalToggleProps) => {\r\n const { text, onClick, ariaLabel, innerRef, id } = props;\r\n return (\r\n \r\n );\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 {props.resources.modalTitle};\r\n};\r\n\r\nconst modalFooterNode = (props: ISearchResultModalProps) => {\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\r\nimport { IPriceComponentResources, ProductComponent } from '@msdyn365-commerce/components';\r\nimport { ICoreContext, IImageSettings } from '@msdyn365-commerce/core';\r\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { IEveSearchResultContainerResources } from '../eve-search-result-container.props.autogenerated';\r\n\r\ninterface IProductSearchResultItems {\r\n products: ProductSearchResult[];\r\n context: ICoreContext;\r\n resources: IEveSearchResultContainerResources;\r\n imageSettings?: IImageSettings;\r\n moduleType: string;\r\n moduleId: string;\r\n allowBackNavigation?: boolean;\r\n telemetryContent: ITelemetryContent;\r\n quickviewSlot?: {} | null | undefined;\r\n channelInventoryConfigurationId?: number;\r\n isPriceMinMaxEnabled?: boolean;\r\n productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\r\n}\r\n\r\n/**\r\n * Returns the product inventory label.\r\n * @param channelInventoryConfigurationId - The channel configuration Id.\r\n * @param product - The product.\r\n * @returns The inventory label.\r\n */\r\nexport function getInventoryLabel(channelInventoryConfigurationId: number | undefined, product: ProductSearchResult): string | undefined {\r\n if (!channelInventoryConfigurationId || !ArrayExtensions.hasElements(product.AttributeValues)) {\r\n return undefined;\r\n }\r\n const inventoryAttribute = product.AttributeValues.find(attribute => attribute.RecordId === channelInventoryConfigurationId);\r\n if (inventoryAttribute) {\r\n return inventoryAttribute.TextValue;\r\n }\r\n return undefined;\r\n}\r\n\r\nexport const ProductSearchResultItems: React.FC = ({\r\n products,\r\n context,\r\n imageSettings,\r\n resources,\r\n moduleType,\r\n moduleId,\r\n allowBackNavigation,\r\n telemetryContent,\r\n quickviewSlot,\r\n channelInventoryConfigurationId,\r\n isPriceMinMaxEnabled,\r\n productsDimensionAvailabilities\r\n}) => {\r\n const priceResources: IPriceComponentResources = {\r\n priceRangeSeparator: resources.priceRangeSeparator\r\n };\r\n return (\r\n
    \r\n {products.map((product: ProductSearchResult, index: number) => (\r\n
  • \r\n \r\n ArrayExtensions.hasElements(dimensionAvailability) &&\r\n dimensionAvailability[0].masterProductId === product.MasterProductId\r\n )}\r\n />\r\n
  • \r\n ))}\r\n
\r\n );\r\n};\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { ISliderLabel, ISliderThumbProps, 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\n\r\nimport { IRefineItemProps, IRefineItemState } from './refine-item';\r\n\r\ntype InputType = 'Min' | 'Max';\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 sliderKey?: 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 sliderId: string;\r\n minValue: string | undefined;\r\n maxValue: string | undefined;\r\n labels: ISliderLabel[];\r\n sliderThumbs: ISliderThumbProps[];\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 {\r\n private readonly _formattedPriceReverseLookup: Map = new Map();\r\n\r\n private readonly minInput: React.RefObject;\r\n\r\n private readonly maxInput: React.RefObject;\r\n\r\n @computed get currencyCode(): string {\r\n return this.props.productRefinerValue.UnitText || '';\r\n }\r\n\r\n public 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();\r\n this.maxInput = React.createRef();\r\n\r\n const { selectedRefinementCriterion } = this.props;\r\n const initialMin = selectedRefinementCriterion?.LeftValueBoundString ?? '0';\r\n const initialMax = selectedRefinementCriterion?.RightValueBoundString;\r\n const sliderId = `slider_${String(this.props.parentProductRefinerHierarchy.RecordId)}_${String(\r\n this.props.productRefinerValue.RefinerRecordId\r\n )}`;\r\n const minValue = this.props.productRefinerValue.LeftValueBoundString;\r\n const maxValue = this.props.productRefinerValue.RightValueBoundString;\r\n const minPrice = this._formatPrice(minValue);\r\n const maxPrice = this._formatPrice(maxValue);\r\n const labels: ISliderLabel[] = this.getLabels(sliderId, minPrice, maxPrice);\r\n const selectedMin =\r\n this.props.selectedRefinementCriterion?.LeftValueBoundString ?? this.props.productRefinerValue.LeftValueBoundString ?? '0';\r\n const selectedMax =\r\n this.props.selectedRefinementCriterion?.RightValueBoundString ??\r\n this.props.productRefinerValue.RightValueBoundString ??\r\n maxValue;\r\n const selectedMinPrice = this._formatPrice(selectedMin);\r\n const selectedMaxPrice = this._formatPrice(selectedMax);\r\n const sliderKeyString = this.props.sliderKey ? `_${String(this.props.sliderKey)}` : '';\r\n const sliderThumbs: ISliderThumbProps[] = this.getSliderThumbs(\r\n sliderId,\r\n sliderKeyString,\r\n selectedMin,\r\n selectedMinPrice,\r\n selectedMax,\r\n selectedMaxPrice,\r\n maxPrice\r\n );\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 sliderId,\r\n minValue,\r\n maxValue,\r\n labels,\r\n sliderThumbs\r\n };\r\n }\r\n\r\n public shouldComponentUpdate(nextProps: IRangeRefineItemProps, nextState: IRangeRefineItemState): boolean {\r\n if (this.state === nextState && this.props === nextProps) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n public componentDidUpdate(previousProps: IRangeRefineItemProps): void {\r\n if (previousProps !== this.props) {\r\n this.updateSliderProps();\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(\r\n 'Cannot render refine value range without productRefinerValue and parentProductRefinerHierarchy'\r\n );\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 /**\r\n * Function to update slider props.\r\n */\r\n private updateSliderProps(): void {\r\n const sliderId = `slider_${String(this.props.parentProductRefinerHierarchy.RecordId)}_${String(\r\n this.props.productRefinerValue.RefinerRecordId\r\n )}`;\r\n const minValue = this.props.productRefinerValue.LeftValueBoundString;\r\n const maxValue = this.props.productRefinerValue.RightValueBoundString;\r\n const minPrice = this._formatPrice(minValue);\r\n const maxPrice = this._formatPrice(maxValue);\r\n const labels: ISliderLabel[] = this.getLabels(sliderId, minPrice, maxPrice);\r\n const selectedMin =\r\n this.props.selectedRefinementCriterion?.LeftValueBoundString ?? this.props.productRefinerValue.LeftValueBoundString ?? '0';\r\n const selectedMax =\r\n this.props.selectedRefinementCriterion?.RightValueBoundString ??\r\n this.props.productRefinerValue.RightValueBoundString ??\r\n maxValue;\r\n const selectedMinPrice = this._formatPrice(selectedMin);\r\n const selectedMaxPrice = this._formatPrice(selectedMax);\r\n const sliderKeyString = this.props.sliderKey ? `_${String(this.props.sliderKey)}` : '';\r\n const sliderThumbs: ISliderThumbProps[] = this.getSliderThumbs(\r\n sliderId,\r\n sliderKeyString,\r\n selectedMin,\r\n selectedMinPrice,\r\n selectedMax,\r\n selectedMaxPrice,\r\n maxPrice\r\n );\r\n this.setState({ sliderId, minValue, maxValue, labels, sliderThumbs });\r\n }\r\n\r\n /**\r\n * Function to create the labels for slider.\r\n * @param sliderId - Slider element id for the DOM.\r\n * @param minPrice - Slider min value.\r\n * @param maxPrice - Slider max value.\r\n * @returns Array labels.\r\n */\r\n private readonly getLabels = (sliderId: string, minPrice: string, maxPrice: string): ISliderLabel[] => {\r\n return [\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 };\r\n\r\n /**\r\n * Function to create the slider thumbs for slider.\r\n * @param sliderId - Slider element id for the DOM.\r\n * @param sliderKey - Unique key for slider.\r\n * @param selectedMin - Slider selected min value.\r\n * @param selectedMinPrice - Slider selected min price.\r\n * @param selectedMax - Slider selected max value.\r\n * @param selectedMaxPrice - Slider selected max price..\r\n * @param maxPrice - Slider max price..\r\n * @returns Slider Thumb Props.\r\n */\r\n private readonly getSliderThumbs = (\r\n sliderId: string,\r\n sliderKey: string,\r\n selectedMin: string,\r\n selectedMinPrice: string,\r\n selectedMax: string | undefined,\r\n selectedMaxPrice: string,\r\n maxPrice: string\r\n ): ISliderThumbProps[] => {\r\n const sliderThumbDefaultValue = 0;\r\n return [\r\n {\r\n id: `${sliderId}${sliderKey}_slider_thumb_start`,\r\n value: (selectedMin && Number(selectedMin)) || sliderThumbDefaultValue,\r\n ariaLabel: `${this.props.minValueSliderThumbAriaLabel ?? ''} ${this.currencyCode}`,\r\n ariaValueText: `${selectedMinPrice}`\r\n },\r\n {\r\n id: `${sliderId}${sliderKey}_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 };\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 ${\r\n validationErrorMin ? 'refine-submenu__input-range--error' : ''\r\n }`;\r\n const maxInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-max ${\r\n validationErrorMax ? 'refine-submenu__input-range--error' : ''\r\n }`;\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
\r\n \r\n \r\n {validationErrorMin && (\r\n \r\n {validationErrorMin}\r\n \r\n )}\r\n {validationErrorMax && validationErrorMin !== validationErrorMax && (\r\n \r\n {validationErrorMax}\r\n \r\n )}\r\n
\r\n );\r\n }\r\n\r\n private _renderSlider(): JSX.Element | undefined {\r\n const { isDisabled, sliderKey } = this.props;\r\n const ariaAttributes = {\r\n 'aria-disabled': isDisabled\r\n };\r\n\r\n return (\r\n \r\n );\r\n }\r\n\r\n private _changeMin(event: React.FocusEvent): void {\r\n this._changeValue(event, 'Min');\r\n }\r\n\r\n private _changeMax(event: React.FocusEvent): void {\r\n this._changeValue(event, 'Max');\r\n }\r\n\r\n private _changeValue(event: React.FocusEvent, 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): 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 {\r\n onToggle,\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n refineItemCommonProps,\r\n selectedRefinementCriterion\r\n } = 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,\r\n productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: minInput,\r\n rangeEnd: maxNum\r\n });\r\n return true;\r\n }\r\n this._focus('Min');\r\n\r\n return false;\r\n }\r\n\r\n private _finishChangeMax(event: React.FocusEvent): 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 {\r\n onToggle,\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n refineItemCommonProps,\r\n selectedRefinementCriterion\r\n } = 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,\r\n 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(\r\n selected: string | undefined,\r\n touched: boolean,\r\n validationError: string | undefined\r\n ): 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 result = this.props.context.cultureFormatter.formatCurrency(Number(amount), this.currencyCode);\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 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,\r\n 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 private _onRangeUpdateEnd(sliderChangeNotification: any): void {\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\r\n if (productRefinerValue && sliderChangeNotification) {\r\n onToggle({\r\n parentProductRefinerHierarchy,\r\n 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 private _focusOnSliderThumb(sliderChangeNotification: any): void {\r\n if (sliderChangeNotification.id) {\r\n const element = document.getElementById(`${sliderChangeNotification.id}range`);\r\n if (element) {\r\n setTimeout(() => {\r\n element.focus();\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}\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { RatingComponent, SwatchComponent } from '@msdyn365-commerce/components';\r\nimport { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\r\nimport { ProductRefinerSource, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\r\nimport { checkIfShouldDisplayAsSwatch, DimensionTypes, IDimensionsApp, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { format, getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { IRefineItemCommonProps } from './refine-item.props.common';\r\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\r\n\r\n/**\r\n * RefineItem properties.\r\n */\r\nexport interface IRefineItemProps {\r\n parentProductRefinerHierarchy: IProductRefinerHierarchy;\r\n productRefinerValue: ProductRefinerValue;\r\n selectedRefinementCriterion: ProductRefinerValue | undefined;\r\n selectedRefinerValues?: ProductRefinerValue[];\r\n refineItemCommonProps: IRefineItemCommonProps;\r\n isDisabled: boolean;\r\n context: ICoreContext>;\r\n moduleId: string;\r\n moduleTypeName: string;\r\n index?: number;\r\n productCountAriaLabel?: string;\r\n singleProductCountAriaLabel?: string;\r\n refineItemAriaLabel?: string;\r\n refineItemsAriaLabel?: string;\r\n isMobileView?: boolean;\r\n\r\n /**\r\n * The telemetry content\r\n */\r\n telemetryContent?: ITelemetryContent;\r\n onToggle(notfication: Readonly): 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 {\r\n private readonly anchorType: React.RefObject;\r\n\r\n private readonly payLoad: IPayLoad;\r\n\r\n public 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 this.payLoad = getPayloadObject('click', this.props.telemetryContent!, '');\r\n }\r\n\r\n public shouldComponentUpdate(nextProps: IRefineItemProps, nextState: IRefineItemState): boolean {\r\n if (this.state === nextState && this.props === nextProps) {\r\n return false;\r\n }\r\n return true;\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 productCountAriaLabel,\r\n singleProductCountAriaLabel,\r\n index,\r\n children,\r\n onToggle,\r\n context,\r\n telemetryContent,\r\n refineItemAriaLabel,\r\n refineItemsAriaLabel,\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(\r\n `[refine-item] RefineItem without LeftValueBoundString: ${JSON.stringify(productRefinerValue)}`\r\n );\r\n }\r\n const isSingleSelect = parentProductRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect;\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 isChecked = !!selectedRefinementCriterion;\r\n itemTypeClassName = isChecked ? `${itemTypeClassName}-checked` : itemTypeClassName;\r\n if (parentProductRefinerHierarchy.SourceValue === ProductRefinerSource.Rating) {\r\n return this._renderRating(\r\n productRefinerValue,\r\n parentProductRefinerHierarchy,\r\n isChecked,\r\n context,\r\n index,\r\n telemetryContent,\r\n productCountAriaLabel,\r\n singleProductCountAriaLabel\r\n );\r\n }\r\n this.payLoad.contentAction.etext = productRefinerValue.LeftValueBoundLocalizedString ?? productRefinerValue.LeftValueBoundString;\r\n const attribute = getTelemetryAttributes(telemetryContent!, this.payLoad);\r\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\r\n const productText = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\r\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\r\n const productCount = productRefinerValue.Count || 0;\r\n let refineMenuItemAriaLabel;\r\n if (productCount === 1) {\r\n refineMenuItemAriaLabel = refineItemAriaLabel\r\n ? format(refineItemAriaLabel, parentProductRefinerHierarchy.KeyName, productText)\r\n : '';\r\n } else {\r\n refineMenuItemAriaLabel = refineItemsAriaLabel\r\n ? format(refineItemsAriaLabel, parentProductRefinerHierarchy.KeyName, productText, productCount)\r\n : '';\r\n }\r\n return (\r\n
  • \r\n \r\n {this._renderSwatch()}\r\n \r\n \r\n
  • \r\n );\r\n }\r\n\r\n private _renderSwatch(): JSX.Element | null {\r\n const productRefinerValue = this.props.productRefinerValue;\r\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\r\n const text = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\r\n\r\n const dimensionType = (this.props.parentProductRefinerHierarchy.KeyName?.toLocaleLowerCase() ?? '') as DimensionTypes;\r\n const hasColor = !StringExtensions.isNullOrWhitespace(productRefinerValue.SwatchColorHexCode);\r\n const hasImage = !StringExtensions.isNullOrWhitespace(productRefinerValue.SwatchImageUrl);\r\n const hasValidSwatch = hasColor || hasImage;\r\n const shouldDisplayAsSwatch =\r\n hasValidSwatch && checkIfShouldDisplayAsSwatch(dimensionType, this.props.context as ICoreContext);\r\n const swatchItems = shouldDisplayAsSwatch\r\n ? [\r\n {\r\n itemId: `${productRefinerValue.RefinerRecordId ?? ''}-${dimensionType}-${text}`,\r\n value: text,\r\n dimensionType,\r\n colorHexCode: productRefinerValue.SwatchColorHexCode,\r\n imageUrl: productRefinerValue.SwatchImageUrl\r\n }\r\n ]\r\n : undefined;\r\n\r\n if (!swatchItems) {\r\n return null;\r\n }\r\n\r\n return (\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,\r\n productRefinerValue,\r\n isSelecting: !selectedRefinementCriterion\r\n });\r\n }\r\n\r\n return '';\r\n }\r\n\r\n private readonly _onClick = (e: React.MouseEvent): 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,\r\n productRefinerValue,\r\n isSelecting: !selectedRefinementCriterion\r\n });\r\n\r\n setTimeout(() => {\r\n this.anchorType.current && this.anchorType.current.focus();\r\n }, 0);\r\n }\r\n };\r\n\r\n private _renderRating(\r\n productRefinerValue: ProductRefinerValue,\r\n parentProductRefinerHierarchy: IProductRefinerHierarchy,\r\n isChecked: boolean,\r\n context: ICoreContext,\r\n index?: number,\r\n telemetryContent?: ITelemetryContent,\r\n ratingUserCountAriaLabel?: string,\r\n ratingSingleUserCountAriaLabel?: string\r\n ): JSX.Element | undefined {\r\n if (productRefinerValue.LeftValueBoundString) {\r\n this.payLoad.contentAction.etext = productRefinerValue.LeftValueBoundLocalizedString;\r\n const attribute = getTelemetryAttributes(telemetryContent!, this.payLoad);\r\n const refinerRating = Number.parseInt(productRefinerValue.LeftValueBoundString, 10);\r\n const ratingRefiner = this.props.selectedRefinerValues?.find(\r\n value => value.DataTypeValue === productRefinerValue.DataTypeValue\r\n );\r\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\r\n const selectedRating = Number.parseInt(ratingRefiner?.LeftValueBoundString || '0', 10);\r\n const defaultChkProductCount = 1;\r\n let ratingComponentClass: string = 'ms-rating-component';\r\n if (refinerRating > selectedRating) {\r\n ratingComponentClass = `${ratingComponentClass}__up`;\r\n } else if (refinerRating < selectedRating) {\r\n ratingComponentClass = `${ratingComponentClass}__down`;\r\n } else {\r\n ratingComponentClass = `${ratingComponentClass}__current`;\r\n }\r\n const productCountAriaLabelValue =\r\n productRefinerValue.Count !== undefined && productRefinerValue.Count === defaultChkProductCount\r\n ? ratingSingleUserCountAriaLabel && format(ratingSingleUserCountAriaLabel, productRefinerValue.Count)\r\n : ratingUserCountAriaLabel && format(ratingUserCountAriaLabel, productRefinerValue.Count);\r\n return (\r\n \r\n \r\n \r\n \r\n {productRefinerValue.Count !== undefined && `(${productRefinerValue.Count})`}\r\n \r\n \r\n \r\n );\r\n }\r\n return undefined;\r\n }\r\n}\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\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 { Button, Collapse, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport RangeRefineItem, { RangeRefineItemType } from './range-refine-item';\r\nimport RefineItem from './refine-item';\r\nimport { IRefineItemCommonProps } from './refine-item.props.common';\r\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\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 productCountAriaLabel?: string;\r\n singleProductCountAriaLabel?: string;\r\n refineItemAriaLabel?: string;\r\n refineItemsAriaLabel?: string;\r\n isMobile?: boolean;\r\n\r\n /**\r\n * The telemetry content\r\n */\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\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 shouldComponentUpdate(nextProps: IRefineSubmenuProps, nextState: IRefineSubmenuState): boolean {\r\n if (this.state === nextState && this.props === nextProps) {\r\n return false;\r\n }\r\n return true;\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 {\r\n isDisabled,\r\n refineItemCommonProps,\r\n selectedRefinerValues,\r\n context,\r\n productCountAriaLabel,\r\n singleProductCountAriaLabel,\r\n refineItemAriaLabel,\r\n refineItemsAriaLabel,\r\n isMobile\r\n } = this.props;\r\n const isSingleSelect =\r\n productRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect &&\r\n productRefinerHierarchy.SourceValue === ProductRefinerSource.Rating;\r\n const role = isSingleSelect ? { role: 'listbox' } : 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 \r\n refinerValuesList.find(value => value.RefinerRecordId === selectedValue.RefinerRecordId)\r\n )}\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 productCountAriaLabel={productCountAriaLabel}\r\n refineItemAriaLabel={refineItemAriaLabel}\r\n refineItemsAriaLabel={refineItemsAriaLabel}\r\n singleProductCountAriaLabel={singleProductCountAriaLabel}\r\n isMobileView={isMobile}\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 (\r\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Range ||\r\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Slider ||\r\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.SliderWithBars\r\n ) {\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 {\r\n isDisabled,\r\n refineItemCommonProps,\r\n selectedRefinerValues,\r\n context,\r\n minValueSliderThumbAriaLabel,\r\n maxValueSliderThumbAriaLabel\r\n } = 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\r\n ? `${selectedRefinementCriterion.LeftValueBoundString}-${selectedRefinementCriterion.RightValueBoundString}`\r\n : `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;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport * as React from 'react';\r\n\r\ninterface ISeparator {\r\n separator: string;\r\n}\r\n\r\nexport const Separator: React.FC = ({ separator }) => {separator} ;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport * as React from 'react';\r\n\r\ninterface ITitle {\r\n className: string;\r\n text: string;\r\n}\r\n\r\nexport const Title: React.FC = ({ text, className }) => {text} ;\r\n","/**\r\n * Copyright (c) Microsoft Corporation\r\n * All rights reserved. See License.txt in the project root for license information.\r\n * IEveSearchResultContainer containerModule Interface Properties\r\n * THIS FILE IS AUTO-GENERATED - MANUAL MODIFICATIONS WILL BE LOST\r\n */\r\n\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport * as React from 'react';\r\n\r\nexport const enum expandRefinersCount {\r\n all = 'all',\r\n one = 'one',\r\n two = 'two',\r\n three = 'three',\r\n four = 'four'\r\n}\r\n\r\nexport interface IEveSearchResultContainerConfig extends Msdyn365.IModuleConfig {\r\n itemsPerPage?: number;\r\n allowBackNavigation?: boolean;\r\n imageSettings?: Msdyn365.IImageSettings;\r\n expandRefinersCount?: expandRefinersCount;\r\n disableHierarchy?: boolean;\r\n includeAttributes?: boolean;\r\n enableAffiliationBasedPricing?: boolean;\r\n updateRefinerPanel?: boolean;\r\n className?: string;\r\n clientRender?: boolean;\r\n enableProdutDescription?: boolean;\r\n listView?: boolean;\r\n onlyShowPriceWhenAuthenticated?: boolean;\r\n}\r\n\r\nexport interface IEveSearchResultContainerResources {\r\n noResultsForRefinersText: string;\r\n resultCategoryNotFoundText: string;\r\n resultSearchNotFoundText: string;\r\n paginationAriaLabel: string;\r\n priceFree: string;\r\n priceRangeSeparator: string;\r\n originalPriceText: string;\r\n currentPriceText: string;\r\n ratingAriaLabel: string;\r\n flipperNext: string;\r\n flipperPrevious: string;\r\n searchTextPrefix: string;\r\n numberOfProducts: string;\r\n oneProduct: string;\r\n categoryLinkAriaLabel: string;\r\n sortByDropdownLabel: string;\r\n sortByOptionNameAsc: string;\r\n sortByOptionNameDesc: string;\r\n sortByOptionPriceAsc: string;\r\n sortByOptionPriceDesc: string;\r\n sortByOptionRatingDesc: string;\r\n sortByOptionBestSelling: string;\r\n sortByOptionNewScore: string;\r\n sortByOptionTrendingScore: string;\r\n sortByOptionRelevanceDesc: string;\r\n placeholderTextMax: string;\r\n minLabel: string;\r\n maxLabel: string;\r\n rangeNameFormat: string;\r\n validationErrorNotNumber: string;\r\n validationErrorNotRange: string;\r\n clearAllText: string;\r\n choiceSummaryLabel: string;\r\n choiceFormat: string;\r\n choiceRangeValueFormat: string;\r\n choiceAriaLabel: string;\r\n closeAriaLabel: string;\r\n modalTitle: string;\r\n modalCloseButtonText: string;\r\n minValueSliderThumbAriaLabel: string;\r\n maxValueSliderThumbAriaLabel: string;\r\n featureSimilarLooksTitle: string;\r\n featureSimilarDescriptionTitle: string;\r\n productCountAriaLabel: string;\r\n singleProductCountAriaLabel: string;\r\n swatchItemAriaLabel: string;\r\n refineItemsAriaLabel: string;\r\n refineItemAriaLabel: string;\r\n filterText: string;\r\n partNoHeading: string;\r\n descriptionHeading: string;\r\n availabilityHeading: string;\r\n listPriceHeading: string;\r\n yourPriceHeading: string;\r\n loginToViewPricing: string;\r\n goToCartText: string;\r\n continueShoppingText: string;\r\n addToCartModalHeading: string;\r\n addToCartText: string;\r\n courseInCartText: string;\r\n invoiceInCartText: string;\r\n productEligibilityText: string;\r\n}\r\n\r\nexport interface IEveSearchResultContainerProps extends Msdyn365.IModule {\r\n resources: IEveSearchResultContainerResources;\r\n config: IEveSearchResultContainerConfig;\r\n slots: {\r\n quickview: React.ReactNode[];\r\n };\r\n}\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport {\r\n CategoryHierarchy as CategoryHierarchyData,\r\n IProductRefinerHierarchy,\r\n IProductsDimensionsAvailabilities\r\n} from '@msdyn365-commerce/commerce-entities';\r\nimport MsDyn365, { getCatalogId, ICoreContext } from '@msdyn365-commerce/core';\r\nimport { format, ProductPrice, ProductRefinerValue, SortColumn, TextValueTranslation } from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n ArrayExtensions,\r\n DimensionAvailabilitiesForProductSearchResultInput,\r\n DimensionTypes,\r\n getDimensionAvailabilitiesForProductSearchResultAction,\r\n getPriceForProductSearchResult,\r\n IDimensionsApp,\r\n PriceForProductSearchResultInput\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n getTelemetryObject,\r\n ILabeledDropdownOnChangeNotification,\r\n ILabeledDropdownOption,\r\n IModuleProps,\r\n INodeProps,\r\n isMobile,\r\n ITelemetryContent,\r\n LabeledDropdown,\r\n UncontrolledPagination,\r\n VariantType\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport { computed, observable, reaction, transaction, action } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\n\r\nimport {\r\n buildListPageUrl,\r\n getCollectionProducts,\r\n getCollectionRefinersAction,\r\n getCurrentUrl,\r\n GetFullProductsByCollectionInput,\r\n IFullProductsSearchResultsWithCount,\r\n parseQueryParam,\r\n ProductListInventoryFilteringOptions,\r\n RefinersByCollectionInput,\r\n sortOptions\r\n} from './actions';\r\nimport { hydrateRefinersFromUrl } from './actions/url-utils';\r\nimport {\r\n ErrorMessage,\r\n FeatureSearchResultItem,\r\n getUpdatedRefinementCriteria,\r\n IChoiceSummaryClickNotification,\r\n IRefineItemCommonProps,\r\n IRefineItemToggleNotification,\r\n ISearchResultModalViewProps,\r\n isMatchingRefinementCriterion,\r\n Link,\r\n ModalToggle,\r\n ProductSearchResultItems,\r\n SearchResultModal,\r\n Separator,\r\n Title\r\n} from './components';\r\nimport ChoiceSummary from './components/choice-summary';\r\nimport RefineSubmenu from './components/refine-submenu';\r\nimport { ListPageState } from './list-page-state';\r\nimport { IEveSearchResultContainerData } from './eve-search-result-container.data';\r\nimport { expandRefinersCount, IEveSearchResultContainerProps } from './eve-search-result-container.props.autogenerated';\r\n\r\nexport interface ISearchResultContainerViewProps extends IEveSearchResultContainerProps {\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 searchResultModal: ISearchResultModalViewProps;\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}\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 refiners: IProductRefinerHierarchy[];\r\n productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\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<\r\n IEveSearchResultContainerProps,\r\n 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 readonly 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 { key: sortOptions.sortByOptionBestSelling, value: this.props.resources.sortByOptionBestSelling },\r\n { key: sortOptions.sortByOptionNewScore, value: this.props.resources.sortByOptionNewScore },\r\n { key: sortOptions.sortByOptionTrendingScore, value: this.props.resources.sortByOptionTrendingScore }\r\n ];\r\n\r\n private readonly _refineItemCommonProps: IRefineItemCommonProps;\r\n\r\n private readonly _pageType: string | undefined = this.props.context.request.urlTokens.pageType;\r\n\r\n @observable\r\n private _viewport: GridSize = 'lg';\r\n\r\n private readonly _modalToggleRef: React.RefObject;\r\n\r\n private readonly _sortAndFilterContainerRef: React.RefObject;\r\n\r\n private expandrefinerCount: number | undefined = 0;\r\n\r\n private readonly telemetryContent: ITelemetryContent;\r\n\r\n private readonly productPrices: ProductPrice[];\r\n\r\n private readonly defaultPageNumber = 0;\r\n\r\n private readonly catalogId = getCatalogId(this.props.context.request);\r\n\r\n private isListPageStateUpdated: boolean = false;\r\n\r\n public constructor(props: IEveSearchResultContainerProps, state: ISearchResultContainerState) {\r\n super(props);\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Check required.\r\n this._viewport = 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 refiners: []\r\n };\r\n const { placeholderTextMax, minLabel, maxLabel, rangeNameFormat } = 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(\r\n this.props.context.request.telemetryPageName!,\r\n this.props.friendlyName,\r\n this.props.telemetry\r\n );\r\n this._updateViewport();\r\n }\r\n\r\n public static getFriendlyName(locale: string, nameTranslations?: TextValueTranslation[]): string | undefined {\r\n let nameTranslation: TextValueTranslation | undefined;\r\n if (locale && nameTranslations && ArrayExtensions.hasElements(nameTranslations)) {\r\n nameTranslation = nameTranslations.find(item => item.Language!.toLowerCase() === locale.toLowerCase());\r\n }\r\n\r\n return nameTranslation?.Text;\r\n }\r\n\r\n public async componentDidMount(): Promise {\r\n if (MsDyn365.isBrowser && window.addEventListener) {\r\n window.addEventListener('resize', this._updateViewport);\r\n this._updateViewport();\r\n }\r\n\r\n const listPageState = await this.props.data.listPageState;\r\n const products = await this.props.data.products;\r\n\r\n this._updateListPageState(listPageState, products);\r\n\r\n // Initialize reaction based on listPageState properties\r\n reaction(\r\n () => {\r\n return [\r\n listPageState.activeFilters?.length,\r\n listPageState.currentPageNumber,\r\n ArrayExtensions.hasElements(listPageState.sortingCritera?.Columns)\r\n ];\r\n },\r\n async () => {\r\n const newListPageState = await this.props.data.listPageState;\r\n const input = new GetFullProductsByCollectionInput(\r\n newListPageState.pageType,\r\n this.props.context.request.apiSettings,\r\n {\r\n Paging: {\r\n Top: this.props.config.itemsPerPage,\r\n Skip: Math.max(newListPageState.pageSize * (newListPageState.currentPageNumber ?? 0), 0)\r\n },\r\n count: true,\r\n Sorting: newListPageState.sortingCritera ?? {}\r\n },\r\n newListPageState.activeFilters ?? [],\r\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- RecordId is string. Check required.\r\n +(this.props.context.request.urlTokens.recordId || 0),\r\n\r\n // eslint-disable-next-line max-len -- existing code\r\n this.props.context.request.query?.q\r\n ? this.props.context.request.query.q\r\n : JSON.stringify({\r\n ProductId: this.props.context.request.query?.productId,\r\n Recommendation: this.props.context.request.query?.recommendation\r\n }),\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Required check.\r\n !!this.props?.config?.includeAttributes,\r\n this.props.config.updateRefinerPanel,\r\n this.props.context.request.locale,\r\n this.catalogId\r\n );\r\n\r\n const productResults = await getCollectionProducts(input, this.props.context.actionContext);\r\n\r\n newListPageState.totalProductCount = productResults.count;\r\n newListPageState.activeProducts = productResults.products;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- check is required.\r\n if (\r\n this.props.config.enableAffiliationBasedPricing &&\r\n this.props.context.actionContext.requestContext?.user?.isAuthenticated\r\n ) {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Call api to retrieve the availabilities data without blocking the UI.\r\n this._getActivePrice();\r\n }\r\n\r\n if (this.props.config.updateRefinerPanel) {\r\n const refinerInput = new RefinersByCollectionInput(\r\n newListPageState.pageType,\r\n this.props.context.request.apiSettings,\r\n {\r\n Paging: {\r\n Top: this.props.config.itemsPerPage,\r\n Skip: Math.max(\r\n newListPageState.pageSize * (newListPageState.currentPageNumber ?? this.defaultPageNumber),\r\n this.defaultPageNumber\r\n )\r\n },\r\n count: true,\r\n Sorting: newListPageState.sortingCritera ?? {}\r\n },\r\n newListPageState.activeFilters ?? [],\r\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- RecordId is string. Check required.\r\n +(this.props.context.request.urlTokens.recordId || 0),\r\n this.props.context.request.query?.q\r\n ? this.props.context.request.query.q\r\n : this.props.context.request.query?.productId,\r\n false,\r\n this.props.config.updateRefinerPanel,\r\n undefined,\r\n this.catalogId\r\n );\r\n\r\n const refiners = await getCollectionRefinersAction(refinerInput, this.props.context.actionContext);\r\n this.setState({ refiners });\r\n }\r\n }\r\n );\r\n\r\n if (\r\n this.props.config.enableAffiliationBasedPricing &&\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Condition required.\r\n this.props.context.actionContext.requestContext?.user?.isAuthenticated\r\n ) {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Call api to retrieve the availabilities data without blocking the UI.\r\n this._getActivePrice();\r\n }\r\n\r\n const context = this.props.context as ICoreContext;\r\n const dimensionsToDisplayOnProductCard = context.app.config.dimensionsInProductCard;\r\n const dimensionsToDisplayAsSwatch = context.app.config.dimensionsAsSwatchType;\r\n if (\r\n ArrayExtensions.hasElements(dimensionsToDisplayOnProductCard) &&\r\n !dimensionsToDisplayOnProductCard.includes(DimensionTypes.none) &&\r\n ArrayExtensions.hasElements(dimensionsToDisplayAsSwatch) &&\r\n !dimensionsToDisplayAsSwatch.includes(DimensionTypes.none) &&\r\n this.props.config.includeAttributes\r\n ) {\r\n await this._getProductsDimensionsAvailabilities();\r\n }\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 {\r\n config: { imageSettings, className },\r\n resources,\r\n data: { listPageState, products: productCollection, featureProduct }\r\n } = this.props;\r\n\r\n if (!this.isListPageStateUpdated && listPageState.result && productCollection.result) {\r\n this._updateListPageState(listPageState.result, productCollection.result);\r\n this.isListPageStateUpdated = true;\r\n }\r\n\r\n const products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\r\n const searchProduct = listPageState.result?.featureProduct ?? featureProduct.result ?? null;\r\n let errorText = '';\r\n if (!ArrayExtensions.hasElements(products)) {\r\n errorText = this._pageType === 'Category' ? resources.resultCategoryNotFoundText : resources.resultSearchNotFoundText;\r\n }\r\n const productsComponent = this._getProducts();\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?.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:\r\n this.props.data.listPageState.result?.totalProductCount !== 0 ? (\r\n \r\n ) : null,\r\n searchResultModal: this._getSearchResultModal(),\r\n isMobile: this.isMobile,\r\n errorMessage: errorText && ,\r\n FeatureSearchContainer: { className: 'ms-feature-search-result' },\r\n similarLookProduct: searchProduct ? featureComponent : null,\r\n productPrices: this.productPrices\r\n };\r\n return this.props.renderView(searchResultContainerViewProps) as React.ReactElement;\r\n }\r\n\r\n /**\r\n * Update the list page state with initial data.\r\n * @param listPageState -- List page State.\r\n * @param products -- Products.\r\n */\r\n @action\r\n private readonly _updateListPageState = (listPageState: ListPageState, products: IFullProductsSearchResultsWithCount): void => {\r\n let querySorting: SortColumn[] = [];\r\n const defaultPageNumber: number = 10;\r\n\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 if (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 =\r\n (this.props.context.request.query &&\r\n +this.props.context.request.query.skip / (this.props.config.itemsPerPage ?? defaultPageNumber)) ||\r\n 0;\r\n listPageState.sortingCritera = { Columns: querySorting };\r\n listPageState.pageSize = this.props.config.itemsPerPage ?? defaultPageNumber;\r\n\r\n // let didSetActiveProductsInSearch = false;\r\n // if (listPageState.pageType === 'Search') {\r\n // const searchTerm = this.props.context.request.query && this.props.context.request.query['search'];\r\n\r\n // if (searchTerm) {\r\n // const match = products.products.find(pr => pr.ItemId?.toLowerCase() === searchTerm.toLowerCase());\r\n // if (match) {\r\n // listPageState.activeProducts = [\r\n // match,\r\n // ...products.products.filter(pr => pr.ItemId?.toLowerCase() !== searchTerm.toLowerCase())\r\n // ];\r\n // didSetActiveProductsInSearch = true;\r\n // }\r\n // }\r\n // }\r\n // if (!didSetActiveProductsInSearch) {\r\n // listPageState.activeProducts = products.products;\r\n // }\r\n\r\n listPageState.totalProductCount = products.count;\r\n listPageState.activeFilters = hydrateRefinersFromUrl(this.props.context.request);\r\n if (this.props.context.request.query?.productId) {\r\n const featureProduct = this.props.data.featureProduct.result;\r\n if (featureProduct) {\r\n listPageState.featureProduct = featureProduct;\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * Get products dimension availabilities.\r\n * @returns Void.\r\n */\r\n private readonly _getProductsDimensionsAvailabilities = async (): Promise => {\r\n const productsList = this.props.data.listPageState.result?.activeProducts ?? [];\r\n\r\n const productsDimensionAvailabilities = await getDimensionAvailabilitiesForProductSearchResultAction(\r\n new DimensionAvailabilitiesForProductSearchResultInput(productsList, this.props.context as ICoreContext),\r\n this.props.context.actionContext\r\n );\r\n\r\n if (ArrayExtensions.hasElements(productsDimensionAvailabilities)) {\r\n this.setState({ productsDimensionAvailabilities });\r\n }\r\n };\r\n\r\n /**\r\n * Get the active price for the products.\r\n */\r\n private readonly _getActivePrice = async (): Promise => {\r\n const productsList = this.props.data.listPageState.result?.activeProducts ?? [];\r\n const products = await getPriceForProductSearchResult(\r\n new PriceForProductSearchResultInput(productsList),\r\n this.props.context.actionContext\r\n );\r\n\r\n const listPageState = await this.props.data.listPageState;\r\n listPageState.activeProducts = products;\r\n };\r\n\r\n private readonly _getSearchResultModal = (): ISearchResultModalViewProps => {\r\n const { resources } = this.props;\r\n return SearchResultModal({\r\n resources: {\r\n modalCloseButtonText: resources.modalCloseButtonText,\r\n modalTitle: resources.modalTitle\r\n },\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 readonly _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 =\r\n (data.category.result &&\r\n 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 =\r\n productCountNumber !== 1\r\n ? format(this.props.resources.numberOfProducts, productCountNumber)\r\n : this.props.resources.oneProduct;\r\n } else {\r\n productCountText = format(this.props.resources.numberOfProducts, 0);\r\n }\r\n const pageName = context.request.telemetryPageName ? `result-count-${context.request.telemetryPageName.toLowerCase()}` : '';\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 ${pageName}` },\r\n title: {\r\n titlePrefix,\r\n titleText,\r\n titleCount\r\n }\r\n };\r\n };\r\n\r\n private readonly _getCategoryHierarchy = (): ICategoryHierarchyViewProps => {\r\n const { data } = this.props;\r\n const categoryHierarchy = data.categoryHierarchy.result;\r\n const categoryLinks =\r\n categoryHierarchy &&\r\n categoryHierarchy.map((value: CategoryHierarchyData, index: number) => {\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 private readonly _getSortingDropDown = (): ISortByViewProps => {\r\n const { resources } = this.props;\r\n const activeDropdown = this._getCurrentlySelectedOption() || this.state.sortingState.selectedSortByOption;\r\n let dropdownOptions = this._getAllSortByOptions();\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- App config settings are of \"any\" value.\r\n if (this.props.context.app.config.hideRating) {\r\n dropdownOptions = dropdownOptions.filter(dropdownOption => dropdownOption.key !== sortOptions.sortByOptionRatingDesc);\r\n }\r\n\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={dropdownOptions}\r\n selectedOption={activeDropdown}\r\n onSelectOption={this._updateSortByDropdown}\r\n ref={this._sortAndFilterContainerRef}\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 readonly _getPagination = (): React.ReactNode => {\r\n const { config, context, data, resources } = this.props;\r\n const listPageState = data.listPageState.result;\r\n const fullUrl = getCurrentUrl(context.request);\r\n const itemsPerPage = config.itemsPerPage || 10;\r\n // eslint-disable-next-line max-len -- existing code\r\n const skipCount = listPageState?.currentPageNumber\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?.totalProductCount || 0;\r\n const previousText = resources.flipperPrevious;\r\n const nextText = resources.flipperNext;\r\n\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={this._renderPrev(previousText)}\r\n nextText={this._renderNext(nextText)}\r\n previousAriaLabel={previousText}\r\n nextAriaLabel={nextText}\r\n telemetryContent={this.telemetryContent}\r\n />\r\n );\r\n };\r\n\r\n private readonly _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 =\r\n this.props.config.updateRefinerPanel && ArrayExtensions.hasElements(this.state.refiners)\r\n ? this.state.refiners.filter(refiner => {\r\n return ArrayExtensions.hasElements(refiner.Values) && !this._shouldHideFromRefiners(refiner);\r\n })\r\n : data.refiners.result &&\r\n data.refiners.result.filter(refiner => {\r\n return ArrayExtensions.hasElements(refiner.Values) && !this._shouldHideFromRefiners(refiner);\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 =\r\n validRefiners &&\r\n 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)}\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 productCountAriaLabel={this.props.resources.productCountAriaLabel}\r\n refineItemAriaLabel={this.props.resources.refineItemAriaLabel}\r\n refineItemsAriaLabel={this.props.resources.refineItemsAriaLabel}\r\n singleProductCountAriaLabel={this.props.resources.singleProductCountAriaLabel}\r\n isMobile={this.isMobile}\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 * Should hide from refiners.\r\n * @param refiner - The refiner.\r\n * @returns ShouldHideFromRefiners.\r\n */\r\n private readonly _shouldHideFromRefiners = (refiner: IProductRefinerHierarchy): boolean => {\r\n // Always hide sortable attribute since it's just for sorting products in Azure search, not for customers\r\n return (\r\n refiner.RecordId === this.props.data.products.result?.inventoryAwareSortableAttributeId ||\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app configs are of generic type\r\n (this.props.context.app.config.productListInventoryDisplay === ProductListInventoryFilteringOptions.HideOOS &&\r\n refiner.RecordId === this.props.data.products.result?.channelInventoryConfigurationId)\r\n );\r\n };\r\n\r\n private readonly _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 closeAriaLabel={resources.closeAriaLabel}\r\n selectedChoices={selectedRefiners}\r\n // @ts-expect-error: 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 context={this.props.context}\r\n channelInventoryConfigurationId={this.props.data.products.result?.channelInventoryConfigurationId}\r\n />\r\n );\r\n };\r\n\r\n /**\r\n * Get Active products.\r\n * @returns - JSX Elements.\r\n */\r\n private readonly _getProducts = (): JSX.Element => {\r\n const {\r\n config: { imageSettings, allowBackNavigation: shouldAllowBackNavigation }\r\n } = this.props;\r\n const { resources } = this.props;\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- Reading config value.\r\n const breadCrumbType: string = this.props.context.app.config.breadcrumbType;\r\n const shouldAllowBack = shouldAllowBackNavigation && (breadCrumbType === 'back' || breadCrumbType === 'categoryAndBack');\r\n\r\n const products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\r\n const quickviewSlot = this.props.slots?.quickview?.[0];\r\n\r\n const isPriceMinMaxFeatureState = this.props.data.featureState.result?.find(\r\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailSearchPriceRangeFeature'\r\n );\r\n return (\r\n <ProductSearchResultItems\r\n products={products}\r\n context={this.props.context}\r\n imageSettings={imageSettings}\r\n resources={resources}\r\n moduleType={this.props.typeName}\r\n moduleId={this.props.id}\r\n allowBackNavigation={shouldAllowBack}\r\n telemetryContent={this.telemetryContent}\r\n quickviewSlot={quickviewSlot}\r\n channelInventoryConfigurationId={this.props.data.products.result?.channelInventoryConfigurationId}\r\n isPriceMinMaxEnabled={isPriceMinMaxFeatureState?.IsEnabled}\r\n productsDimensionAvailabilities={this.state.productsDimensionAvailabilities}\r\n />\r\n );\r\n };\r\n\r\n private readonly _updateSortByDropdown = (notification: ILabeledDropdownOnChangeNotification): void => {\r\n const {\r\n context: { request: requestContext, actionContext }\r\n } = this.props;\r\n\r\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\r\n // eslint-disable-next-line max-len -- existing code\r\n const error = `[sort-by-category] cannot sort without context: ${!requestContext ? 'requestContext ' : ''} ${\r\n !actionContext ? 'actionContext ' : ''\r\n } could not be found`;\r\n this.props.telemetry.warning(error);\r\n return;\r\n }\r\n\r\n window.history.pushState(\r\n {},\r\n '',\r\n buildListPageUrl(\r\n getCurrentUrl(this.props.context.request),\r\n undefined,\r\n [this._getSortColumnFromSelectedOption(notification.selectedOption)],\r\n undefined\r\n )\r\n );\r\n transaction(() => {\r\n this.props.data.listPageState.result!.currentPageNumber = 0;\r\n this.props.data.listPageState.result!.sortingCritera = {\r\n Columns: [this._getSortColumnFromSelectedOption(notification.selectedOption)]\r\n };\r\n });\r\n };\r\n\r\n private readonly _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 => {\r\n return searchConfiguration.key === option.key;\r\n });\r\n\r\n if (mappedConfiguration) {\r\n return mappedConfiguration.sortColumn;\r\n }\r\n\r\n return {};\r\n };\r\n\r\n /**\r\n * Retrieves current sort criteria.\r\n * @returns Sort criteria column which is currently active or undefined if it's not specified.\r\n */\r\n private readonly _getSortCriteriaColumn = (): SortColumn | undefined => {\r\n const sortCriteria = this.props.data.listPageState.result?.sortingCritera;\r\n if (ArrayExtensions.hasElements(sortCriteria?.Columns)) {\r\n return sortCriteria!.Columns[0];\r\n }\r\n\r\n const queryColumns = parseQueryParam<SortColumn[]>('sorting', this.props.context.request);\r\n if (ArrayExtensions.hasElements(queryColumns)) {\r\n return queryColumns[0];\r\n }\r\n\r\n return undefined;\r\n };\r\n\r\n /**\r\n * Retrieves dropdown options.\r\n * @returns All dropdown options.\r\n */\r\n private readonly _getAllSortByOptions = (): ILabeledDropdownOption[] => {\r\n const searchConfiguration = this.props.data.searchConfiguration.result;\r\n\r\n if (!searchConfiguration) {\r\n return [];\r\n }\r\n\r\n const mappedSearchConfiguration = this.sortByDropdownOptions.filter(mappedSearchConfig =>\r\n searchConfiguration.find(item => mappedSearchConfig.key === item.key)\r\n );\r\n\r\n return ArrayExtensions.validValues(mappedSearchConfiguration);\r\n };\r\n\r\n /**\r\n * Retrieves current selected dropdown option based on the sort criteria.\r\n * @returns Current dropdown option.\r\n */\r\n private readonly _getCurrentlySelectedOption = (): ILabeledDropdownOption | undefined => {\r\n const activeSortColumn = this._getSortCriteriaColumn();\r\n\r\n const searchConfiguration = this.props.data.searchConfiguration.result;\r\n\r\n if (!activeSortColumn || !searchConfiguration) {\r\n return undefined;\r\n }\r\n\r\n const activeMappedConfig = searchConfiguration.find(\r\n mappedSearchConfig =>\r\n mappedSearchConfig.sortColumn.ColumnName === activeSortColumn.ColumnName &&\r\n mappedSearchConfig.sortColumn.IsDescending === activeSortColumn.IsDescending\r\n );\r\n if (!activeMappedConfig) {\r\n return undefined;\r\n }\r\n\r\n return this.sortByDropdownOptions.find(dropdownOption => dropdownOption.key === activeMappedConfig.key);\r\n };\r\n\r\n private readonly _onUpdateRefiners = (itemToggleNotification: IRefineItemToggleNotification): void => {\r\n const {\r\n context: { request: requestContext, actionContext }\r\n } = this.props;\r\n\r\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\r\n const error = `Refine menu cannot refine search criteria: \r\n ${!requestContext ? 'requestContext ' : ''} ${!actionContext ? 'actionContext ' : ''} could not be found`;\r\n this.props.telemetry.warning(error);\r\n return;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Server side the list PageState will not be called.\r\n const updatedRefinementCriteria = getUpdatedRefinementCriteria(\r\n itemToggleNotification,\r\n this.props.data.listPageState.result?.activeFilters || []\r\n );\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 readonly _buildRefinerUrl = (itemToggleNotification: IRefineItemToggleNotification): string => {\r\n if (this.props.data.listPageState.result) {\r\n const newRefinementCriteria = getUpdatedRefinementCriteria(\r\n itemToggleNotification,\r\n this.props.data.listPageState.result.activeFilters || []\r\n );\r\n\r\n return buildListPageUrl(getCurrentUrl(this.props.context.request), newRefinementCriteria);\r\n }\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 private readonly _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 }, 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 readonly _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 if (MsDyn365.isBrowser) {\r\n return isMobile({ variant: VariantType.Browser, context: this.props.context.request });\r\n }\r\n return isMobile({ variant: VariantType.Viewport, context: this.props.context.request });\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 readonly _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 * Renders a Pagination previous text.\r\n * @param paginationPreviousText - Pagination previous text from resources.\r\n * @returns Previous text and flipper icon.\r\n */\r\n private readonly _renderPrev = (paginationPreviousText: string) => {\r\n return (\r\n <div className='msc-pagination__prev'>\r\n <span className='ms-search-result__pagination-left' aria-hidden='true' />\r\n <span className='prev-text'>{paginationPreviousText}</span>\r\n </div>\r\n );\r\n };\r\n\r\n /**\r\n * Renders a Pagination next text.\r\n * @param paginationNextText - Pagination next text from resources.\r\n * @returns Next text and flipper icon.\r\n */\r\n private readonly _renderNext = (paginationNextText: string) => {\r\n return (\r\n <div className='msc-pagination__next'>\r\n <span className='next-text'>{paginationNextText}</span>\r\n <span className='ms-search-result__pagination-right' aria-hidden='true' />\r\n </div>\r\n );\r\n };\r\n}\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { IPriceComponentResources } from '../../themes/gardner-theme/views/components/price.component';\r\nimport { ProductPrice, ProductSearchResult, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport { ArrayExtensions, getProductPageUrlSync } from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n ICategoryHierarchyViewProps,\r\n IRefineMenuViewProps,\r\n ISearchResultContainerViewProps,\r\n ISearchResultModalViewProps,\r\n ISortByViewProps,\r\n ITitleViewProps\r\n} from '@msdyn365-commerce-modules/search-result-container';\r\nimport { Button, getTelemetryObject, IPopupProps, Module, Node, Popup } from '@msdyn365-commerce-modules/utilities';\r\nimport React, { PropsWithChildren, useState } from 'react';\r\nimport { ISearchResultContainerProps } from '../../themes/gardner-theme/definition-extensions/search-result-container.ext.props.autogenerated';\r\nimport { ProductComponent } from '../../themes/gardner-theme/views/components/product.component';\r\nimport { getUrlSync, IGridSettings, IImageData, IImageProps, IImageSettings, Image, IRequestContext } from '@msdyn365-commerce/core';\r\nimport { AddToCartListComponent } from '../../themes/gardner-theme/views/components/addToCart.component';\r\nimport { IProductSearchResultExtensionData } from '../../themes/gardner-theme/views/product-result-container.data';\r\nimport Table from 'reactstrap/lib/Table';\r\nimport { LoginToViewPricingComponent } from '../../components/LoginToViewPricing.component';\r\nimport { SupersessionKey } from '../../themes/gardner-theme/models/SupersessionKey';\r\nimport { CommercePropertyValueEnum } from '../../modules/allowable-freight/utils/CommercePropertyValueEnum';\r\nimport getExtensionPropertyValueByKey from '../../utils/getExtensionPropertyValueByKey';\r\nimport { EligibleItems } from '../../modules/eve-quick-order/eve-quick-order';\r\nimport GetProductEligibilityAction, { GetProductEligibilityInput } from '../../actions/get-product-eligibility.action';\r\n/**\r\n * DescriptionInterval.\r\n */\r\nenum DescriptionInterval {\r\n productDescriptionInterval = 14,\r\n productDescriptionIntervalRemainder0 = 0,\r\n productDescriptionIntervalRemainder9 = 9\r\n}\r\n\r\n/**\r\n * Render Clear button for mobile viewport.\r\n * @param props - The view props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderProductCards = (\r\n props: PropsWithChildren<ISearchResultContainerViewProps & ISearchResultContainerProps<{}>>\r\n): JSX.Element | null => {\r\n const products = props.data.listPageState.result?.activeProducts;\r\n if (!products || !ArrayExtensions.hasElements(products)) {\r\n return null;\r\n }\r\n return (\r\n <Node {...props.ProductsContainer}>\r\n {props.errorMessage}\r\n <ul className='list-unstyled'>\r\n {products.map((product: ProductSearchResult, index: number) => renderProductCardsDescription(props, product, index, false))}\r\n </ul>\r\n </Node>\r\n );\r\n};\r\n\r\n/**\r\n * Returns the product inventory label.\r\n * @param channelInventoryConfigurationId - The channel configuration Id.\r\n * @param product - The product.\r\n * @returns The inventory label.\r\n */\r\nfunction getInventoryLabel(channelInventoryConfigurationId: number | undefined, product: ProductSearchResult): string | undefined {\r\n if (!channelInventoryConfigurationId || !ArrayExtensions.hasElements(product.AttributeValues)) {\r\n return undefined;\r\n }\r\n const inventoryAttribute = product.AttributeValues.find(attribute => attribute.RecordId === channelInventoryConfigurationId);\r\n if (inventoryAttribute) {\r\n return inventoryAttribute.TextValue;\r\n }\r\n return undefined;\r\n}\r\n\r\n/**\r\n * Render Clear button for mobile viewport.\r\n * @param props - The view props.\r\n * @param product - The product item data.\r\n * @param index - The index of each product item.\r\n * @param isEnabledProductDescription - The flag for showing Product desription tile.\r\n * @returns The JSX Element.\r\n */\r\nconst renderProductCardsDescription = (\r\n props: PropsWithChildren<ISearchResultContainerViewProps & ISearchResultContainerProps<{}>>,\r\n product: ProductSearchResult,\r\n index: number,\r\n isEnabledProductDescription?: boolean\r\n): JSX.Element | null => {\r\n const { config, context, resources } = props;\r\n const telemetryContent = getTelemetryObject(props.context.request.telemetryPageName!, props.friendlyName, props.telemetry);\r\n const breadCrumbType = props.context.app.config.breadcrumbType;\r\n const isAllowBack = props.config.allowBackNavigation && (breadCrumbType === 'back' || breadCrumbType === 'categoryAndBack');\r\n const classname = isEnabledProductDescription\r\n ? 'ms-product-search-result__item product__description'\r\n : 'ms-product-search-result__item';\r\n const quickviewslot = ArrayExtensions.hasElements(props.slots.quickview) ? props.slots.quickview[0] : undefined;\r\n const channelInventoryConfigurationId = props.data.products.result?.channelInventoryConfigurationId;\r\n // @ts-ignore\r\n const isPriceMinMaxFeatureState = props.data.featureState.result?.find(\r\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailSearchPriceRangeFeature'\r\n );\r\n const priceResources: IPriceComponentResources = {\r\n priceRangeSeparator: resources.priceRangeSeparator,\r\n loginToViewPricingText: resources.loginToViewPricing\r\n };\r\n return (\r\n <li className={classname} key={index}>\r\n <ProductComponent\r\n context={context}\r\n telemetryContent={telemetryContent}\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 allowBack={isAllowBack}\r\n id={props.id}\r\n typeName={props.typeName}\r\n data={{ product }}\r\n quickViewButton={quickviewslot}\r\n isEnabledProductDescription={isEnabledProductDescription}\r\n inventoryLabel={getInventoryLabel(channelInventoryConfigurationId, product)}\r\n isPriceMinMaxEnabled={isPriceMinMaxFeatureState?.IsEnabled}\r\n priceResources={priceResources}\r\n />\r\n </li>\r\n );\r\n};\r\n\r\n/**\r\n * Render Clear button for mobile viewport.\r\n * @param props - The view props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderProducts = (\r\n props: PropsWithChildren<ISearchResultContainerViewProps & ISearchResultContainerProps<{}>>\r\n): JSX.Element | null => {\r\n const products = props.data.listPageState.result?.activeProducts;\r\n if (!products || !ArrayExtensions.hasElements(products)) {\r\n return null;\r\n }\r\n const productDescriptionInterval: number = DescriptionInterval.productDescriptionInterval;\r\n const productDescriptionIntervalRemainder0: number = DescriptionInterval.productDescriptionIntervalRemainder0;\r\n const productDescriptionIntervalRemainder9: number = DescriptionInterval.productDescriptionIntervalRemainder9;\r\n return (\r\n <Node {...props.ProductsContainer}>\r\n {props.errorMessage}\r\n <ul className='list-unstyled'>\r\n {products.map((product: ProductSearchResult, index: number) =>\r\n index % productDescriptionInterval === productDescriptionIntervalRemainder0 ||\r\n index % productDescriptionInterval === productDescriptionIntervalRemainder9\r\n ? renderProductCardsDescription(props, product, index, true)\r\n : renderProductCardsDescription(props, product, index, false)\r\n )}\r\n </ul>\r\n </Node>\r\n );\r\n};\r\n\r\n/**\r\n * Render Title Count.\r\n * @param props - The title view props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderTitleCount = (props: ITitleViewProps): JSX.Element | null => {\r\n const { title, TitleContainer } = props;\r\n return <Node {...TitleContainer}>{title.titleCount}</Node>;\r\n};\r\n\r\n/**\r\n * Render Category Hierarchy.\r\n * @param props - The category hierarchy view props.\r\n * @returns The JSX Element.\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\n/**\r\n * Render the category page items.\r\n * @param props - The view props.\r\n * @returns The search Result container module view.\r\n */\r\nconst SearchResultContainerView: React.FC<ISearchResultContainerViewProps &\r\n ISearchResultContainerProps<IProductSearchResultExtensionData>> = props => {\r\n const {\r\n SearchResultContainer,\r\n pagination,\r\n ProductSectionContainer,\r\n choiceSummary,\r\n isMobile,\r\n modalToggle,\r\n searchResultModal,\r\n TitleViewProps,\r\n refineMenu,\r\n categoryHierarchy,\r\n sortByOptions,\r\n CategoryNavContainer,\r\n RefineAndProductSectionContainer,\r\n FeatureSearchContainer,\r\n similarLookProduct,\r\n errorMessage,\r\n productPrices,\r\n context: {\r\n request,\r\n cultureFormatter,\r\n actionContext,\r\n actionContext: {\r\n requestContext: {\r\n gridSettings,\r\n user: { isAuthenticated }\r\n }\r\n }\r\n },\r\n resources: {\r\n filterText,\r\n partNoHeading,\r\n descriptionHeading,\r\n availabilityHeading,\r\n listPriceHeading,\r\n yourPriceHeading,\r\n loginToViewPricing,\r\n goToCartText,\r\n continueShoppingText,\r\n addToCartModalHeading,\r\n addToCartText\r\n },\r\n data: { cart, listPageState: productSearchResults },\r\n config: { enableProdutDescription, listView, imageSettings }\r\n } = props;\r\n\r\n const [eligbilityList, setEligbilityList] = useState<EligibleItems>([]);\r\n\r\n const getProductEligibility = async (): Promise<void> => {\r\n const itemIds = props.data.products?.result?.products.map(p => p.ItemId!) || [];\r\n if (!itemIds.length) {\r\n return;\r\n }\r\n\r\n // const addressId: string = props.context.request.cookies.getCheckoutCartCookie();\r\n const input = new GetProductEligibilityInput(itemIds, false, cart?.result?.cart?.Id || '', null, null, null);\r\n const eligibilityData = await GetProductEligibilityAction(input, props.context.actionContext);\r\n const list: EligibleItems = [];\r\n\r\n eligibilityData.forEach((i: any) => {\r\n const id = getExtensionPropertyValueByKey(i.ExtensionProperties, 'ItemId', CommercePropertyValueEnum.string);\r\n list.push({\r\n ItemId: String(id),\r\n IsEligible: i.IsEligible\r\n });\r\n });\r\n setEligbilityList(list);\r\n // getProductEligibilityAsync({ callerContext: props.context.actionContext }, itemIds, 0, addressId?.split(':')[1] || '').then(\r\n // (result: any) => {\r\n // const list: EligibleItems = [];\r\n //\r\n // result.forEach((i: any) => {\r\n // const id = getExtensionPropertyValueByKey(i.ExtensionProperties, 'ItemId', CommercePropertyValueEnum.string);\r\n // list.push({\r\n // ItemId: String(id),\r\n // IsEligible: i.IsEligible\r\n // });\r\n // });\r\n // setEligbilityList(list);\r\n // }\r\n // );\r\n };\r\n\r\n React.useEffect(() => {\r\n if (isAuthenticated) {\r\n void getProductEligibility();\r\n }\r\n }, [props.data]);\r\n\r\n const [isExpanded, setIsExpanded] = useState<boolean>(false);\r\n const [modalOpen, setModalOpen] = React.useState<boolean>(false);\r\n const [addedProduct, setAddedProduct] = React.useState<SimpleProduct | undefined>(undefined);\r\n const [productPricing, setProductPricing] = React.useState<ProductPrice | undefined>(undefined);\r\n const toggle = () => {\r\n setIsExpanded(!isExpanded);\r\n };\r\n\r\n const isRecoSearchPage = props.context.actionContext.requestContext.query?.recommendation;\r\n\r\n const setModalProps = (product: SimpleProduct, price: ProductPrice): IPopupProps => {\r\n return {\r\n modalOpen: modalOpen,\r\n context: props.context,\r\n className: 'list-view__modal',\r\n gridSettings,\r\n imageSettings,\r\n priceComponent: props.component,\r\n id: '1',\r\n productQuantity: 1,\r\n navigationUrl: getUrlSync('cart', actionContext),\r\n setModalOpen: value => setModalOpen(value),\r\n typeName: 'Add To Cart',\r\n data: { product, price },\r\n dialogStrings: {\r\n goToCartText: goToCartText,\r\n currentPriceText: '',\r\n continueShoppingText: continueShoppingText,\r\n freePriceText: '',\r\n headerItemOneText: addToCartModalHeading,\r\n headerItemFormatText: '',\r\n originalPriceText: '',\r\n headerMessageText: ''\r\n }\r\n };\r\n };\r\n\r\n const handleAddToCart = (productId: number, quantity: number) => {\r\n const foundProduct = productSearchResults.result?.activeProducts.find(pr => pr.RecordId === productId);\r\n if (!foundProduct) {\r\n return;\r\n }\r\n const product: SimpleProduct = {\r\n BasePrice: foundProduct.BasePrice || foundProduct.Price,\r\n AdjustedPrice: foundProduct.Price,\r\n Name: foundProduct.Name,\r\n RecordId: foundProduct.RecordId,\r\n ItemId: foundProduct.ItemId,\r\n ProductTypeValue: 1,\r\n Price: foundProduct.Price\r\n };\r\n setAddedProduct(product);\r\n setProductPricing(getProductPrice(productPrices, product.RecordId));\r\n cart.result\r\n ?.addProductToCart({\r\n product,\r\n count: quantity,\r\n catalogId: 0\r\n })\r\n .then(response => {\r\n if (response.status === 'SUCCESS' && props.app.config.addToCartBehavior === 'showModal') {\r\n setModalOpen(true);\r\n }\r\n });\r\n };\r\n\r\n const getProductSupersessionProperty = (product: ProductSearchResult, extensionKey: SupersessionKey) => {\r\n const properties = product.ExtensionProperties;\r\n if (properties) {\r\n return properties.find(pr => pr.Key === extensionKey)?.Value?.StringValue || null;\r\n }\r\n return null;\r\n };\r\n\r\n const renderAddtoCartButton = (pr: ProductSearchResult, courseId: any, courseInCartText: string) => {\r\n if (isAuthenticated) {\r\n if (courseId) {\r\n return (\r\n <td>\r\n <div className='eduerrors'>{courseInCartText}</div>\r\n </td>\r\n );\r\n }\r\n\r\n if (props.data.cart.result?.hasInvoiceLine) {\r\n return (\r\n <td>\r\n <div className='eduerrors'>{props.resources.invoiceInCartText}</div>\r\n </td>\r\n );\r\n } else {\r\n const item: any = eligbilityList.find(i => i.ItemId === pr.ItemId);\r\n\r\n return item?.IsEligible ? (\r\n <AddToCartListComponent productId={pr.RecordId} onAddToCart={handleAddToCart} addToCartButtonText={addToCartText} />\r\n ) : (\r\n <td colSpan={2} style={{ textAlign: 'right' }}>\r\n {item?.ItemId ? props.resources.productEligibilityText : ' '}\r\n </td>\r\n );\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n const _renderProductsListView = () => {\r\n const { courseInCartText } = props.resources;\r\n let courseId: string | number | boolean | null | undefined;\r\n const cart = props.data.cart.result?.cart;\r\n const cartlines = cart?.CartLines;\r\n if (cartlines && cartlines.length) {\r\n courseId = getExtensionPropertyValueByKey(cartlines[0].ExtensionProperties, 'CourseId', CommercePropertyValueEnum.string);\r\n }\r\n return (\r\n <Table className={'list-view__table'}>\r\n <thead>\r\n <tr>\r\n <th />\r\n <th>{partNoHeading}</th>\r\n <th>{descriptionHeading}</th>\r\n <th>{availabilityHeading}</th>\r\n <th>{listPriceHeading}</th>\r\n <th>{yourPriceHeading}</th>\r\n {isAuthenticated ? (\r\n <>\r\n <th>Quantity</th>\r\n <th />\r\n </>\r\n ) : null}\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {productSearchResults.result?.activeProducts.map(pr => {\r\n // const pricing = getProductPrice(productPrices, pr.RecordId);\r\n // const inventoryLabel = getInventoryLabel(configurationObject?.result?.channelInventoryConfigurationId, pr);\r\n const priceComponent = <span>{cultureFormatter.formatCurrency(pr.Price)}</span>;\r\n return (\r\n <tr key={pr.RecordId}>\r\n <td>\r\n {renderProductPlacementImage(\r\n imageSettings,\r\n gridSettings,\r\n `/Products/${pr.ItemId}_000_001.png`,\r\n pr.PrimaryImageUrl,\r\n pr.Name,\r\n request\r\n )}\r\n </td>\r\n <td>\r\n <a href={getProductPageUrlSync(pr.Name!, pr.RecordId, actionContext)}>{pr.ItemId}</a>\r\n <br />\r\n {getProductSupersessionProperty(pr, SupersessionKey.SupersededId) ? (\r\n <p className={'supersession-text'}>\r\n Superseded From: {getProductSupersessionProperty(pr, SupersessionKey.SupersededId)}\r\n </p>\r\n ) : null}\r\n </td>\r\n <td>\r\n {pr.Name}\r\n <br />\r\n {getProductSupersessionProperty(pr, SupersessionKey.SupersededName) ? (\r\n <p className={'supersession-text'}>\r\n Superseded From: {getProductSupersessionProperty(pr, SupersessionKey.SupersededName)}\r\n </p>\r\n ) : null}\r\n </td>\r\n <td>{getProductSupersessionProperty(pr, SupersessionKey.Inventory)}</td>\r\n <td>{LoginToViewPricingComponent(props.context.request, loginToViewPricing, priceComponent, true)}</td>\r\n <td>{!isAuthenticated ? null : cultureFormatter.formatCurrency(pr.Price)}</td>\r\n {renderAddtoCartButton(pr, courseId, courseInCartText)}\r\n </tr>\r\n );\r\n })}\r\n </tbody>\r\n </Table>\r\n );\r\n };\r\n\r\n if (isMobile) {\r\n return (\r\n <Module {...SearchResultContainer}>\r\n {similarLookProduct ? null : (\r\n <Node {...CategoryNavContainer}>\r\n {renderCategoryHierarchy(categoryHierarchy)}\r\n {renderTitle(TitleViewProps)}\r\n {renderTitleCount(TitleViewProps)}\r\n </Node>\r\n )}\r\n {choiceSummary}\r\n <Node className='msc-sort-filter-wrapper'>{modalToggle}</Node>\r\n {createSearchResultModal(searchResultModal, refineMenu, sortByOptions, isRecoSearchPage)}\r\n <Node {...FeatureSearchContainer}>{similarLookProduct}</Node>\r\n {errorMessage}\r\n {enableProdutDescription ? renderProducts(props) : renderProductCards(props)}\r\n {pagination}\r\n </Module>\r\n );\r\n }\r\n return (\r\n <Module {...SearchResultContainer}>\r\n {/* @ts-ignore */}\r\n {modalOpen && addedProduct ? <Popup {...setModalProps(addedProduct, productPricing)} /> : null}\r\n {similarLookProduct ? null : (\r\n <Node {...CategoryNavContainer}>\r\n {categoryHierarchy && renderCategoryHierarchy(categoryHierarchy)}\r\n {TitleViewProps && renderTitle(TitleViewProps)}\r\n {TitleViewProps && renderTitleCount(TitleViewProps)}\r\n </Node>\r\n )}\r\n <Node {...FeatureSearchContainer}>{similarLookProduct}</Node>\r\n <Node {...RefineAndProductSectionContainer}>\r\n <Node className='ms-refiner-heading'>\r\n <Node className='ms-refiner-heading_title'>\r\n <Button\r\n className={isExpanded ? 'ms-refine-filter__toggle_expanded' : 'ms-refine-filter__toggle_collapsed'}\r\n aria-label='Filter'\r\n onClick={toggle}\r\n aria-expanded={isExpanded}\r\n tabIndex={0}\r\n >\r\n {filterText}\r\n </Button>\r\n <div className='ms-search-result-wrapper-title-choice-summary'>{choiceSummary}</div>\r\n <div className='ms-search-result-wrapper-sort-by-category'>\r\n {sortByOptions && !isRecoSearchPage && renderSort(sortByOptions)}\r\n </div>\r\n </Node>\r\n {refineMenu && isExpanded && renderRefiner(refineMenu)}\r\n </Node>\r\n <Node {...ProductSectionContainer}>\r\n {errorMessage}\r\n {/*{enableProdutDescription ? renderProducts(props) : renderProductCards(props)}*/}\r\n {listView ? _renderProductsListView() : enableProdutDescription ? renderProducts(props) : renderProductCards(props)}\r\n {pagination}\r\n </Node>\r\n </Node>\r\n </Module>\r\n );\r\n};\r\n\r\n/**\r\n * Render Search result Modal.\r\n * @param modalProps - The Search Result Modal view props.\r\n * @param refineMenu - The Refine Menu view props.\r\n * @param sortByDropDown - The Sort by view props.\r\n * @param isRecoSearchPage - The recomandation search page flag.\r\n * @returns The JSX Element.\r\n */\r\nconst createSearchResultModal = (\r\n modalProps: ISearchResultModalViewProps,\r\n refineMenu: IRefineMenuViewProps,\r\n sortByDropDown: ISortByViewProps,\r\n isRecoSearchPage?: string\r\n): JSX.Element => {\r\n return React.cloneElement(\r\n modalProps.modal,\r\n {},\r\n modalProps.modalHeader,\r\n createModalBody(modalProps, refineMenu, sortByDropDown, isRecoSearchPage),\r\n modalProps.modalFooter\r\n );\r\n};\r\n\r\n/**\r\n * Render Refiner Mobile.\r\n * @param props - The Refine Menu view props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderRefinerMobile = (props: IRefineMenuViewProps): JSX.Element | null => {\r\n const { refiners, RefineMenuContainer, RefinerSectionContainer } = props;\r\n if (refiners) {\r\n return (\r\n <Node {...RefinerSectionContainer}>\r\n <Node {...RefineMenuContainer}>\r\n {refiners.map((submenu, index) => (\r\n <React.Fragment key={index}>{submenu}</React.Fragment>\r\n ))}\r\n </Node>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\n/**\r\n * Render Search result Body.\r\n * @param props - The Search Result Modal view props.\r\n * @param refineMenu - The Refine Menu view props.\r\n * @param sortByDropDown - The Sort by view props.\r\n * @param isRecoSearchPage - The recomandation search page flag.\r\n * @returns The JSX Element.\r\n */\r\nconst createModalBody = (\r\n props: ISearchResultModalViewProps,\r\n refineMenu: IRefineMenuViewProps,\r\n sortByDropDown: ISortByViewProps,\r\n isRecoSearchPage?: string\r\n): JSX.Element | null => {\r\n if (sortByDropDown) {\r\n return React.cloneElement(props.modalBody, {}, renderSort(sortByDropDown, isRecoSearchPage), renderRefinerMobile(refineMenu));\r\n }\r\n return null;\r\n};\r\n\r\n/**\r\n * Render Refiner.\r\n * @param props - The Refine Menu view props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderRefiner = (props: IRefineMenuViewProps): JSX.Element | null => {\r\n const { refiners, RefineMenuContainer, RefinerSectionContainer } = props;\r\n if (refiners) {\r\n return (\r\n <Node {...RefinerSectionContainer}>\r\n <Node {...RefineMenuContainer}>\r\n {refiners.map((submenu, index) => (\r\n <React.Fragment key={index}>{submenu}</React.Fragment>\r\n ))}\r\n </Node>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\n/**\r\n * Render sort by drop down.\r\n * @param props - The sort by view props.\r\n * @param isRecoSearchPage - The recomandation search page flag.\r\n * @returns The JSX Element.\r\n */\r\nconst renderSort = (props: ISortByViewProps, isRecoSearchPage?: string): JSX.Element | null => {\r\n const { SortingContainer, sortByDropDown } = props;\r\n if (sortByDropDown && !isRecoSearchPage) {\r\n return <Node {...SortingContainer}>{sortByDropDown}</Node>;\r\n }\r\n return null;\r\n};\r\n\r\n/**\r\n * Render Title.\r\n * @param props - The title view props.\r\n * @returns The JSX Element.\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 <Node tag='h1' className=''>\r\n {title.titlePrefix}\r\n {title.titleText}\r\n </Node>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst renderProductPlacementImage = (\r\n productCardimageSettings?: IImageSettings,\r\n gridSettings?: IGridSettings,\r\n imageUrl?: string,\r\n fallbackImageUrl?: string,\r\n altText?: string,\r\n requestContext?: IRequestContext\r\n): JSX.Element | null => {\r\n if (!imageUrl || !gridSettings || !productCardimageSettings) {\r\n return null;\r\n }\r\n if (productCardimageSettings) {\r\n productCardimageSettings.viewports = {\r\n lg: { h: 100, w: 100, q: '80' },\r\n md: { h: 100, w: 100, q: '80' },\r\n sm: { h: 100, w: 100, q: '80' },\r\n xs: { h: 100, w: 100, q: '80' }\r\n };\r\n }\r\n const image: IImageData = {\r\n src: imageUrl,\r\n altText: altText ? altText : '',\r\n fallBackSrc: fallbackImageUrl\r\n };\r\n const imageProps: IImageProps = { gridSettings };\r\n\r\n imageProps.gridSettings = gridSettings;\r\n imageProps.imageSettings = productCardimageSettings;\r\n imageProps.imageSettings.cropFocalRegion = true;\r\n return <Image {...image} {...imageProps} loadFailureBehavior='empty' requestContext={requestContext} className={'eve-listview__img'} />;\r\n};\r\n\r\nconst getProductPrice = (pricing: ProductPrice[] | undefined, productRecId: number): ProductPrice | undefined => {\r\n if (!pricing) {\r\n return undefined;\r\n }\r\n return pricing.find(pr => pr.ProductId === productRecId);\r\n};\r\n\r\nexport default SearchResultContainerView;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { AddToCartBehavior } from '@msdyn365-commerce/components';\r\nimport MsDyn365, { getUrlSync, IDictionary, TelemetryEvent } from '@msdyn365-commerce/core';\r\n// @ts-ignore\r\nimport { ICartIconViewProps, ICartViewProps, IFlyoutCartLineItemViewProps } from '@msdyn365-commerce-modules/cart';\r\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { Button, getPayloadObject, INodeProps, KeyCodes, Modal, Node, onTelemetryClick,getTelemetryAttributes, getTelemetryObject,\r\n ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport React from 'react';\r\nimport { validateCartAsync } from '@msdyn365-commerce-modules/cart-utilities';\r\n\r\nimport { ICartIconProps as ICartIconExtensionProps } from '../definition-extensions/cart-icon.ext.props.autogenerated';\r\n\r\n/**\r\n * ICartIconViewState: Interface for Cart Icon View State.\r\n */\r\ninterface ICartIconViewState {\r\n isModalOpen: boolean;\r\n isCartValid: boolean;\r\n isQuantityLimitsFeatureEnabled: boolean;\r\n}\r\n\r\n/**\r\n * Render Cart lines.\r\n * @param cartLines - Flyout cart line view props.\r\n * @param props - Cart icon view props.\r\n * @returns JSX Element.\r\n */\r\nconst renderCartlines = (cartLines: IFlyoutCartLineItemViewProps[] | undefined, props: ICartIconViewProps): JSX.Element[] | null => {\r\n if (!cartLines) {\r\n props.context.telemetry.error('Cartlines content is empty, module wont render');\r\n return null;\r\n }\r\n return cartLines.map((cartLine, index) => {\r\n const cartLineIndex = index;\r\n return (\r\n <Node {...props.miniCartItemWrapper} key={cartLineIndex}>\r\n <Node className={classnames(cartLine.storeLocation ? 'msc-cart-line__set-net-price' : '')} >\r\n {cartLine.cartline}\r\n </Node>\r\n {cartLine.remove}\r\n {cartLine.storeLocation}\r\n </Node>\r\n );\r\n });\r\n};\r\n\r\n/**\r\n * Initiate total price.\r\n * @param props - Cart icon view props.\r\n * @returns JSX Element.\r\n */\r\nconst renderTotalPrice = (props: ICartIconViewProps & ICartIconExtensionProps<{}>): JSX.Element | null => {\r\n const cart = props.data.cart.result ?? undefined;\r\n const price = cart && !cart.hasInvoiceLine && (cart.cart.TotalAmount || undefined);\r\n const totalPrice = price ? props.context.cultureFormatter.formatCurrency(price) : props.context.cultureFormatter.formatCurrency(props.resources.emptyPrice);\r\n return (\r\n <div className='ms-cart-icon__subTotalText'>\r\n <span className='ms-cart-icon__subTotalPriceText'>\r\n {props.resources.totalPriceFormatString?.replace('{price}' , '')}\r\n <span className='ms-cart-icon__subTotalPrice'>\r\n {totalPrice}\r\n </span>\r\n </span>\r\n </div>\r\n );\r\n};\r\n\r\n/**\r\n *\r\n * CartIconView component.\r\n * @extends {React.PureComponent<ICartIconViewProps>}\r\n */\r\nexport class CartIconView extends React.PureComponent<ICartViewProps & ICartIconViewProps & ICartIconExtensionProps<{}>, ICartIconViewState> {\r\n\r\n private isAutoDisplayTriggered: boolean;\r\n private readonly checkoutByGuestAttributes: IDictionary<string> | undefined;\r\n private lastValidatedCartVersion: number | undefined;\r\n private readonly telemetryContent: ITelemetryContent;\r\n\r\n public constructor(props: ICartViewProps & ICartIconViewState & ICartIconViewProps & ICartIconExtensionProps<{}>) {\r\n super(props);\r\n this.isAutoDisplayTriggered = false;\r\n this.state = {\r\n isModalOpen: false,\r\n isCartValid: true,\r\n isQuantityLimitsFeatureEnabled: false\r\n };\r\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!, this.props.friendlyName, this.props.telemetry);\r\n const payload = getPayloadObject(TelemetryEvent.CheckOut, this.telemetryContent, TelemetryConstant.Checkout);\r\n payload.contentAction.etext = TelemetryConstant.GuestCheckout;\r\n this.checkoutByGuestAttributes = getTelemetryAttributes(this.telemetryContent, payload);\r\n }\r\n\r\n public componentDidMount(): void {\r\n if (MsDyn365.isBrowser) {\r\n window.addEventListener('keydown', this._escFunction, false);\r\n }\r\n this._validateCart();\r\n }\r\n\r\n public componentDidUpdate(): void {\r\n this._validateCart();\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n if (MsDyn365.isBrowser) {\r\n window.removeEventListener('keydown', this._escFunction, false);\r\n }\r\n }\r\n\r\n private _removeCommentFromCartLine(): void {\r\n const cartState = this.props.data.cart.result || undefined;\r\n\r\n if (cartState) {\r\n if ((!cartState.cart.CartLines || cartState.cart.CartLines?.length === 0) && cartState.cart.Comment) {\r\n const _clonedCart = { ...cartState.cart };\r\n _clonedCart.Comment = \"\";\r\n\r\n void cartState.updateCart({newCartObject: _clonedCart});\r\n }\r\n }\r\n }\r\n\r\n private _renderGuestCheckout(hasError: boolean,guestCheckoutUrl: string) {\r\n return(\r\n <Button\r\n disabled={hasError} className='ms-cart-icon__btn-checkout' href={guestCheckoutUrl}\r\n title={this.props.resources.guestCheckoutButtonTitle} {...this.checkoutByGuestAttributes}>\r\n {this.props.resources.guestCheckoutButtonTitle}\r\n </Button>\r\n );\r\n }\r\n\r\n private _validateCart(): void {\r\n const {\r\n data: { cart }\r\n } = this.props;\r\n const cartVersion = cart.result?.cart?.Version ?? undefined;\r\n if (this.lastValidatedCartVersion === cartVersion) {\r\n return;\r\n }\r\n\r\n this.lastValidatedCartVersion = cartVersion; // This field is populated to block concurrent requests\r\n validateCartAsync(cart, this.props.telemetry, this.props.context)\r\n .then((result) => {\r\n this.setState({ isCartValid: !ArrayExtensions.hasElements(result?.ValidationResultsPairs) });\r\n })\r\n .catch(() => {\r\n this.setState({ isCartValid: false });\r\n });\r\n }\r\n\r\n /**\r\n * Render Cart Item count.\r\n * @returns JSX Element.\r\n */\r\n public render(): JSX.Element | null {\r\n this._removeCommentFromCartLine();\r\n const cart = this.props.data.cart.result ?? undefined;\r\n const cartlines = this.props.cartlines;\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- check config.\r\n const shouldShowMiniCart = cart?.isProductAddedToCart && this.props.context.app.config.addToCartBehavior === AddToCartBehavior.showMiniCart;\r\n const guestCheckoutUrl = getUrlSync('checkout', this.props.context.actionContext) || '';\r\n const hasError = !this.state.isCartValid || (cartlines ? cartlines.some(cartline => cartline.hasError) : false);\r\n if (shouldShowMiniCart) {\r\n if (!this.isAutoDisplayTriggered) {\r\n // First time trigger auto mini cart.\r\n this.setState({ isModalOpen: true });\r\n this.isAutoDisplayTriggered = true;\r\n } else if (!this.state.isModalOpen) {\r\n // If modal is closed, reset the flag.\r\n this.isAutoDisplayTriggered = false;\r\n }\r\n }\r\n return (\r\n <Node{...this.props.miniCartWrapper} {...this.props.renderModuleAttributes(this.props)}>\r\n <button\r\n onClick={this._openModal} className='ms-cart-icon-wrapper msc-btn'>\r\n {this.props.cartIcon}\r\n </button>\r\n <Node{...this._modalContainer()}>\r\n <Node className='ms-cart-icon__header msc-modal__header'>\r\n {this.props.flyoutTitle}\r\n {this._renderCartItemCount(this.props)}\r\n {this._renderCartCloseIcon()}\r\n </Node>\r\n <Node className='ms-cart-icon__body msc-modal__body'>\r\n {this.props.data.cart.result?.isEmpty ? this.props.slots.emptyCart : null}\r\n <Node {...this.props.CartlinesWrapper}>\r\n {renderCartlines(cartlines, this.props)}\r\n </Node>\r\n </Node>\r\n <Node className='ms-cart-icon__footer msc-modal__footer'>\r\n {this.props.slots.promoContentItem}\r\n {renderTotalPrice(this.props)}\r\n <p className='ms-cart-icon__subtotal-message'>\r\n {this.props.resources.subTotalMessage}\r\n </p>\r\n {/* {this.props.checkoutAsSignInUserButton} */}\r\n {/* {this.props.checkoutAsGuestButton} */}\r\n {cartlines && cartlines.length > 0 ? this._renderGuestCheckout(hasError, guestCheckoutUrl) : null}\r\n\r\n {this.props.data.cart.result?.isEmpty ? null : this.props.goToCartButton}\r\n <Node className='ms-cart-icon__btn-section'>\r\n {\r\n this.props.data.cart.result?.isEmpty ? <Button\r\n className='ms-cart-icon__btn-backtoshopping'\r\n href={getUrlSync('home', this.props.context.actionContext)}\r\n >\r\n {this.props.resources.continueShoppingButtonTitle}\r\n </Button> : null\r\n }\r\n </Node>\r\n </Node>\r\n </Node>\r\n </Node>\r\n );\r\n }\r\n\r\n /**\r\n * Initiate modal container.\r\n * @returns Inode props.\r\n */\r\n private readonly _modalContainer = (): INodeProps => {\r\n return {\r\n tag: Modal,\r\n placement: 'bottom-end',\r\n hideArrow: true,\r\n className: 'ms-cart-icon__minicartmodal-container',\r\n wrapClassName: 'ms-cart-icon__minicartmodal',\r\n isOpen: this.state.isModalOpen,\r\n toggle: this.closeModal\r\n };\r\n };\r\n\r\n /**\r\n * Initiate open modal.\r\n */\r\n private readonly _openModal = (): void => {\r\n const payLoad = getPayloadObject('click', this.props.telemetryContent!, 'cart-icon', '');\r\n onTelemetryClick(this.props.telemetryContent!, payLoad, 'cart-icon');\r\n this.setState({\r\n isModalOpen: true\r\n });\r\n };\r\n\r\n /**\r\n * Initiate close modal.\r\n */\r\n private readonly closeModal = (): void => {\r\n this.setState({\r\n isModalOpen: false\r\n });\r\n\r\n };\r\n\r\n /**\r\n * Initiate cart close Icon.\r\n * @returns JSX Element.\r\n */\r\n private readonly _renderCartCloseIcon = (): JSX.Element | null => {\r\n return (\r\n <Button\r\n className='ms-cart-icon__btn-close'\r\n aria-label='Close' onClick={this.closeModal} />\r\n );\r\n };\r\n\r\n /**\r\n * Render Cart Item count.\r\n * @param props - Cart icon view props.\r\n * @returns JSX Element.\r\n */\r\n private readonly _renderCartItemCount = (props: ICartIconViewProps & ICartIconExtensionProps<{}>): JSX.Element | null => {\r\n let cartItemCount;\r\n const defaultCartItemCount: number = 0;\r\n const defaultCartItemCountOne: number = 1;\r\n\r\n if (ArrayExtensions.hasElements(props.cartlines)) {\r\n if (props.cartlines.length === defaultCartItemCountOne) {\r\n cartItemCount = `${defaultCartItemCountOne} ${props.resources.item}`;\r\n } else {\r\n cartItemCount = `${props.cartlines.length} ${props.resources.items}`;\r\n }\r\n } else {\r\n cartItemCount = `${defaultCartItemCount} ${props.resources.items}`;\r\n }\r\n return (\r\n <Node className='ms-cart-icon__count' tabIndex='0'>\r\n {cartItemCount}\r\n </Node>\r\n );\r\n };\r\n\r\n /**\r\n * Handle escape click to close modal.\r\n * @param event - On press of any key.\r\n */\r\n private readonly _escFunction = (event: KeyboardEvent) => {\r\n if (event.keyCode === KeyCodes.Escape && this.state.isModalOpen) {\r\n this.closeModal();\r\n }\r\n };\r\n\r\n}\r\n\r\nexport default CartIconView;\r\n","import React from 'react';\r\n\r\ninterface IAddToCartListComponentProps {\r\n productId: number\r\n onAddToCart(id: number, quantity: number): void;\r\n addToCartButtonText: string\r\n}\r\n\r\nexport const AddToCartListComponent: React.FC<IAddToCartListComponentProps> = ({productId, onAddToCart, addToCartButtonText}) => {\r\n\r\n const [ quantity , setQuantity ] = React.useState<number>(1);\r\n\r\n const handleQuantityChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n setQuantity(e.target.valueAsNumber);\r\n }\r\n const handleAddToCart = () => onAddToCart(productId, quantity);\r\n\r\n return (\r\n <>\r\n <td>\r\n <input type=\"number\" min={\"1\"} max={\"10\"} value={quantity} aria-label={'Change Quantity'} onChange={handleQuantityChange}/>\r\n </td>\r\n <td><button type={'button'} className={'list-view__add-to-cart-btn msc-button'} onClick={handleAddToCart}>{addToCartButtonText}</button></td>\r\n </>\r\n )\r\n}","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { IOrderTemplateNameDialogResources, OrderTemplateNameDialog } from '@msdyn365-commerce/components';\r\nimport { IComponentProps } from '@msdyn365-commerce/core';\r\nimport React, { useState } from 'react';\r\n\r\nconst modalCloseButtonReference: React.RefObject<HTMLButtonElement> = React.createRef();\r\n\r\n/**\r\n * The Create Order Template Button Props.\r\n */\r\nexport interface ICreateOrderTemplateButtonProps extends IComponentProps {\r\n\r\n /**\r\n * The label for create order template.\r\n */\r\n createOrderTemplateText: string;\r\n\r\n /**\r\n * The create order template dialog resources.\r\n */\r\n createOrderTemplateDialogResources: IOrderTemplateNameDialogResources;\r\n\r\n /**\r\n * The delegate to fire when dialog captured any user entry.\r\n */\r\n onOrderTemplateCreated(): Promise<void>;\r\n}\r\n\r\nconst CreateOrderTemplateButton: React.FC<ICreateOrderTemplateButtonProps> = (props) => {\r\n const onCancelHandler = React.useCallback(() => {\r\n return;\r\n }, []);\r\n const [isCreateOrderTemplateDialogOpen, setOrderTemplateNameDialogOpen] = useState(false);\r\n const onCreateButtonClick = React.useCallback(() => {\r\n setOrderTemplateNameDialogOpen(true);\r\n }, []);\r\n\r\n return (\r\n <>\r\n <button\r\n className='ms-order-template__add-template-button msc-btn btn-primary'\r\n color='primary'\r\n onClick={onCreateButtonClick}\r\n ref={modalCloseButtonReference}\r\n aria-label={props.createOrderTemplateText}\r\n >\r\n {props.createOrderTemplateText}\r\n </button>\r\n <OrderTemplateNameDialog\r\n className='msc-order-template-name-dialog'\r\n modalOpen={isCreateOrderTemplateDialogOpen}\r\n isUpdateDialog={false}\r\n setModalOpen={setOrderTemplateNameDialogOpen}\r\n context={props.context}\r\n id={props.id}\r\n data={{}}\r\n typeName={props.typeName}\r\n dialogStrings={props.createOrderTemplateDialogResources}\r\n onCancel={onCancelHandler}\r\n onSuccess={props.onOrderTemplateCreated}\r\n parentElementRef={modalCloseButtonReference}\r\n />\r\n </>\r\n );\r\n};\r\n\r\nexport default CreateOrderTemplateButton;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\r\nimport { ISwatchItem, PriceComponent, ProductComponentSwatchComponent, RatingComponent } from '@msdyn365-commerce/components';\r\nimport { IPriceComponentResources } from './price.component'\r\nimport { IComponent, IComponentProps, ICoreContext, IGridSettings, IImageData, IImageSettings, Image, msdyn365Commerce } from '@msdyn365-commerce/core';\r\nimport { AttributeSwatch, AttributeValue, ProductDimension, ProductPrice, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n ArrayExtensions, convertDimensionTypeToProductDimensionType, Dictionary, DimensionTypes, generateImageUrl,\r\n getProductPageUrlSync, IDimensionsApp, StringExtensions\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\nimport { format, getPayloadObject, getTelemetryAttributes, ITelemetryContent, onTelemetryClick } from '@msdyn365-commerce-modules/utilities';\r\nimport React, { useState } from 'react';\r\n// import { LoginToViewPricingComponent } from \"../../../../components/LoginToViewPricing.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 ratingCountAriaLabel?: string;\r\n allowBack?: boolean;\r\n telemetryContent?: ITelemetryContent;\r\n quickViewButton?: React.ReactNode;\r\n isEnabledProductDescription?: boolean;\r\n isPriceMinMaxEnabled?: boolean;\r\n priceResources?: IPriceComponentResources;\r\n inventoryLabel?: string;\r\n dimensionAvailabilities?: IProductsDimensionsAvailabilities[];\r\n}\r\n\r\nexport interface IProductComponent extends IComponent<IProductComponentProps> { }\r\n\r\nconst PriceComponentActions = {};\r\n\r\n/**\r\n * Gets the product page url from the default swatch selected.\r\n * @param productData - Product card to be rendered.\r\n * @returns The default color swatch selected if any.\r\n */\r\nfunction getDefaultColorSwatchSelected(productData?: ProductSearchResult): AttributeSwatch | null {\r\n if (!productData || !productData.AttributeValues) {\r\n return null;\r\n }\r\n\r\n const colorAttribute = productData.AttributeValues.find(attributeValue => attributeValue.KeyName?.toLocaleLowerCase() === DimensionTypes.color);\r\n if (!colorAttribute) {\r\n return null;\r\n }\r\n\r\n const defaultSwatch = colorAttribute.Swatches?.find(item => item.IsDefault === true) ?? colorAttribute.Swatches?.[0];\r\n return defaultSwatch ?? null;\r\n}\r\n\r\n/**\r\n * Gets the product image from the default swatch selected.\r\n * @param coreContext - Context of the module using the component.\r\n * @param productData - Product card to be rendered.\r\n * @returns The product card image url.\r\n */\r\nfunction getProductImageUrlFromDefaultColorSwatch(coreContext: ICoreContext, productData?: ProductSearchResult): string | undefined {\r\n const siteContext = coreContext as ICoreContext<IDimensionsApp>;\r\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\r\n if (dimensionToPreSelectInProductCard === DimensionTypes.none) {\r\n return productData?.PrimaryImageUrl;\r\n }\r\n const defaultSwatch = getDefaultColorSwatchSelected(productData);\r\n return defaultSwatch && ArrayExtensions.hasElements(defaultSwatch.ProductImageUrls) ? generateImageUrl(\r\n defaultSwatch.ProductImageUrls[0], coreContext.request.apiSettings) : productData?.PrimaryImageUrl;\r\n}\r\n\r\n/**\r\n * Updates the product url link to product details page.\r\n * @param productDetailsPageUrl - Product page url.\r\n * @param coreContext - Context of the module using the component.\r\n * @param queryString - Querystring to be added to the URL.\r\n * @returns The update product page url.\r\n */\r\nfunction updateProductUrl(productDetailsPageUrl: string, coreContext: ICoreContext, queryString: string): string {\r\n const sourceUrl = new URL(productDetailsPageUrl, coreContext.request.apiSettings.baseUrl);\r\n if (sourceUrl.search) {\r\n sourceUrl.search += `&${queryString}`;\r\n } else {\r\n sourceUrl.search += queryString;\r\n }\r\n\r\n const updatedUrl = new URL(sourceUrl.href);\r\n return updatedUrl.pathname + sourceUrl.search;\r\n}\r\n\r\n/**\r\n * Gets the react node for product unit of measure display.\r\n * @param unitOfMeasure - DefaultUnitOfMeasure property from product.\r\n * @returns The node representing markup for unit of measure component.\r\n */\r\nfunction renderProductUnitOfMeasure(unitOfMeasure?: string): JSX.Element | null {\r\n if (!unitOfMeasure) {\r\n return null;\r\n }\r\n return (\r\n <div className='msc-product__unit-of-measure'>\r\n <span>\r\n {unitOfMeasure}\r\n </span>\r\n </div>\r\n );\r\n}\r\n\r\n/**\r\n * Gets the react node for product availability.\r\n * @param inventoryAvailabilityLabel - The product information.\r\n * @returns The node representing markup for product availability.\r\n */\r\nfunction renderProductAvailability(inventoryAvailabilityLabel: string | undefined): JSX.Element | null {\r\n if (!inventoryAvailabilityLabel || inventoryAvailabilityLabel === '') {\r\n return null;\r\n }\r\n\r\n return (\r\n <div className='msc-product__availability'>\r\n <span>\r\n {inventoryAvailabilityLabel}\r\n </span>\r\n </div>\r\n );\r\n}\r\n\r\n/**\r\n * Gets the product page url from the default swatch selected.\r\n * @param coreContext - Context of the module using the component.\r\n * @param productUrl - Product page url for the product card.\r\n * @param productData - Product card to be rendered.\r\n * @returns The product card image url.\r\n */\r\nfunction getProductPageUrlFromDefaultSwatch(coreContext: ICoreContext, productUrl: string, productData?: ProductSearchResult): string | undefined {\r\n const siteContext = coreContext as ICoreContext<IDimensionsApp>;\r\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\r\n if (dimensionToPreSelectInProductCard === DimensionTypes.none) {\r\n return productUrl;\r\n }\r\n\r\n const defaultSwatch = getDefaultColorSwatchSelected(productData);\r\n if (!defaultSwatch || !defaultSwatch.SwatchValue) {\r\n return productUrl;\r\n }\r\n\r\n const queryString = `color=${defaultSwatch.SwatchValue}`;\r\n return updateProductUrl(productUrl, coreContext, queryString);\r\n}\r\n\r\nconst ProductCard: React.FC<IProductComponentProps> = ({\r\n data,\r\n context,\r\n imageSettings,\r\n savingsText,\r\n freePriceText,\r\n originalPriceText,\r\n currentPriceText,\r\n ratingAriaLabel,\r\n ratingCountAriaLabel,\r\n allowBack,\r\n typeName,\r\n id,\r\n telemetryContent,\r\n quickViewButton,\r\n isEnabledProductDescription,\r\n isPriceMinMaxEnabled,\r\n priceResources,\r\n inventoryLabel,\r\n dimensionAvailabilities\r\n}) => {\r\n const product = data.product;\r\n let productUrl = getProductPageUrlSync(product?.Name ?? '', product?.RecordId ?? Number.MIN_VALUE, context.actionContext, undefined);\r\n if (allowBack) {\r\n productUrl = updateProductUrl(productUrl, context, 'back=true');\r\n }\r\n const productImageUrlFromSwatch = getProductImageUrlFromDefaultColorSwatch(context, product) ?? product?.PrimaryImageUrl;\r\n const productPageUrlFromSwatch = getProductPageUrlFromDefaultSwatch(context, productUrl, product) ?? productUrl;\r\n const [productPageUrl = productPageUrlFromSwatch, setProductPageUrl] = useState<string | undefined>();\r\n const [productImageUrl = productImageUrlFromSwatch, setProductImageUrl] = useState<string | undefined>();\r\n const [selectedSwatchItems] = useState(new Dictionary<DimensionTypes, ISwatchItem>());\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-member-access -- app context is generic\r\n const enableStockCheck = context.app.config.enableStockCheck;\r\n\r\n /**\r\n * Updates the product page and Image url based on swatch selected.\r\n * @param coreContext - Context of the caller.\r\n * @param swatchItem - Dimension swatch selected.\r\n */\r\n const updatePageAndImageUrl = React.useCallback((coreContext: ICoreContext, swatchItem: ISwatchItem) => {\r\n const dimensionType = swatchItem.dimensionType;\r\n selectedSwatchItems.setValue(dimensionType, swatchItem);\r\n if (StringExtensions.isNullOrWhitespace(swatchItem.value)) {\r\n return;\r\n }\r\n const queryString = `${dimensionType}=${swatchItem.value}`;\r\n let productPageUrlWithSwatch = '';\r\n if (productPageUrl.includes(dimensionType)) {\r\n const newUrl = new URL(productPageUrl, coreContext.request.apiSettings.baseUrl);\r\n newUrl.searchParams.delete(dimensionType);\r\n productPageUrlWithSwatch = updateProductUrl(newUrl.toString(), context, queryString);\r\n } else {\r\n productPageUrlWithSwatch = updateProductUrl(productPageUrl, context, queryString);\r\n }\r\n setProductPageUrl(productPageUrlWithSwatch);\r\n if (dimensionType === DimensionTypes.color) {\r\n const swatchProductImageUrl = ArrayExtensions.hasElements(swatchItem.productImageUrls) ? swatchItem.productImageUrls[0] : undefined;\r\n const newImageUrl = generateImageUrl(swatchProductImageUrl, coreContext.request.apiSettings);\r\n setProductImageUrl(newImageUrl);\r\n }\r\n }, [selectedSwatchItems, context, productPageUrl]);\r\n\r\n if (!product) {\r\n return null;\r\n }\r\n\r\n /**\r\n * Checks if rendering the particular dimensions is allowed for product card.\r\n * @param dimensionType - Dimension to be displayed.\r\n * @returns Updates the state with new product page url.\r\n */\r\n function shouldDisplayDimension(dimensionType: string): boolean {\r\n const dimensionsContext = context as ICoreContext<IDimensionsApp>;\r\n const dimensionsToDisplayOnProductCard = dimensionsContext.app.config.dimensionsInProductCard;\r\n return ArrayExtensions.hasElements(dimensionsToDisplayOnProductCard) &&\r\n !dimensionsToDisplayOnProductCard.includes(DimensionTypes.none) &&\r\n dimensionsToDisplayOnProductCard.includes(dimensionType.toLocaleLowerCase() as DimensionTypes);\r\n }\r\n\r\n /**\r\n * Gets the react node for product dimension as swatch.\r\n * @param attributeValues - Attribute value property from product.\r\n * @returns The node representing markup for unit of measure component.\r\n */\r\n function renderProductDimensions(attributeValues?: AttributeValue[]): JSX.Element | null {\r\n if (!attributeValues) {\r\n return null;\r\n }\r\n\r\n return (\r\n <div className='msc-product__dimensions'>\r\n {\r\n attributeValues.map((item: AttributeValue) => {\r\n const dimensionTypeValue = item.KeyName?.toLocaleLowerCase() ?? '';\r\n if (!shouldDisplayDimension(dimensionTypeValue)) {\r\n return null;\r\n }\r\n\r\n const siteContext = context as ICoreContext<IDimensionsApp>;\r\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\r\n const dimensionType = dimensionTypeValue as DimensionTypes;\r\n const swatches = item.Swatches?.map<ISwatchItem>(swatchItem => {\r\n return {\r\n itemId: `${item.RecordId ?? ''}-${dimensionTypeValue}-${swatchItem.SwatchValue ?? ''}`,\r\n value: swatchItem.SwatchValue ?? '',\r\n dimensionType,\r\n colorHexCode: swatchItem.SwatchColorHexCode,\r\n imageUrl: swatchItem.SwatchImageUrl,\r\n productImageUrls: swatchItem.ProductImageUrls,\r\n isDefault: swatchItem.IsDefault,\r\n isDisabled: enableStockCheck && dimensionAvailabilities?.find(\r\n dimensionAvailability => dimensionAvailability.value === (swatchItem.SwatchValue ?? ''))?.isDisabled\r\n };\r\n }) ?? [];\r\n if (dimensionToPreSelectInProductCard !== DimensionTypes.none && ArrayExtensions.hasElements(swatches) &&\r\n !swatches.some(swatch => swatch.isDefault) && dimensionType === DimensionTypes.color) {\r\n swatches[0].isDefault = true;\r\n }\r\n return (\r\n <ProductComponentSwatchComponent\r\n context={context}\r\n swatches={swatches}\r\n onSelectDimension={updatePageAndImageUrl}\r\n key={item.RecordId}\r\n />\r\n );\r\n })\r\n }\r\n </div>\r\n );\r\n }\r\n\r\n function renderQuickView(quickview: React.ReactNode, item?: number): JSX.Element | undefined {\r\n if (quickview === null) {\r\n return undefined;\r\n }\r\n const selectedDimensions: ProductDimension[] = selectedSwatchItems.getValues().map<ProductDimension>(swatches => {\r\n return {\r\n DimensionTypeValue: convertDimensionTypeToProductDimensionType(swatches.dimensionType),\r\n DimensionValue: {\r\n RecordId: 0,\r\n Value: swatches.value\r\n }\r\n };\r\n });\r\n return React.cloneElement(quickview as React.ReactElement, { selectedProductId: item, selectedDimensions });\r\n }\r\n\r\n // Construct telemetry attribute to render\r\n const payLoad = getPayloadObject('click', telemetryContent!, '', product.RecordId.toString());\r\n\r\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- -- Do not need type check for appsettings\r\n const isUnitOfMeasureEnabled = context.app.config && context.app.config.unitOfMeasureDisplayType === 'buyboxAndBrowse';\r\n return (\r\n <>\r\n {isEnabledProductDescription ? <a\r\n href={productPageUrl}\r\n onClick={onTelemetryClick(telemetryContent!, payLoad, product.Name!)}\r\n aria-label={renderLabel(\r\n product.Name,\r\n context.cultureFormatter.formatCurrency(product.Price),\r\n product.AverageRating, ratingAriaLabel,\r\n product.TotalRatings, ratingCountAriaLabel)}\r\n className='msc-product' {...attribute}>\r\n <div className='msc-product__image__description'>\r\n <div className='msc-product__image'>\r\n {renderProductPlacementImage(imageSettings, context.request.gridSettings, productImageUrl,\r\n product.PrimaryImageUrl, product.Name, context)}\r\n </div>\r\n <div className='msc-product__title_description'>\r\n <h5 className='msc-product__title__text'>\r\n {product.Name}\r\n </h5>\r\n {renderPrice(context, typeName, id, product.BasePrice, product.Price, savingsText, freePriceText, originalPriceText, currentPriceText, isPriceMinMaxEnabled, priceResources)}\r\n {isUnitOfMeasureEnabled && renderProductUnitOfMeasure(product.DefaultUnitOfMeasure)}\r\n {renderDescription(product.Description)}\r\n </div>\r\n </div>\r\n </a> : <a\r\n href={productPageUrl}\r\n onClick={onTelemetryClick(telemetryContent!, payLoad, product.Name!)}\r\n aria-label={renderLabel(product.Name, context.cultureFormatter.formatCurrency(product.Price),\r\n product.AverageRating, ratingAriaLabel)}\r\n className='msc-product' {...attribute}>\r\n <div className='msc-product__image'>\r\n {renderProductPlacementImage(imageSettings, context.request.gridSettings, productImageUrl, product.PrimaryImageUrl, product.Name, context)}\r\n </div>\r\n <div className='msc-product__details'>\r\n <h5 className='msc-product__title'>\r\n {product.Name}\r\n </h5>\r\n {renderPrice(context, typeName, id, product.BasePrice, product.Price, savingsText, freePriceText, originalPriceText, currentPriceText, isPriceMinMaxEnabled, priceResources)}\r\n {isUnitOfMeasureEnabled && renderProductUnitOfMeasure(product.DefaultUnitOfMeasure)}\r\n </div>\r\n </a>}\r\n {renderProductDimensions(product.AttributeValues)}\r\n {!context.app.config.hideRating && renderRating(context, typeName, id, product.AverageRating, product.TotalRatings, ratingAriaLabel, ratingCountAriaLabel)}\r\n {renderProductAvailability(inventoryLabel)}\r\n {quickViewButton && renderQuickView(quickViewButton, product.RecordId)}\r\n </>\r\n );\r\n};\r\n\r\nfunction renderLabel(\r\n name?: string,\r\n price?: string,\r\n rating?: number,\r\n ratingAriaLabelText?: string,\r\n reviewCount?: number,\r\n ratingCountAriaLabelText?: string): string {\r\n const reviewCountArialableText = getReviewAriaLabel(reviewCount, ratingCountAriaLabelText ?? '');\r\n return (\r\n `${name ?? ''} ${price ?? ''} ${getRatingAriaLabel(rating, ratingAriaLabelText)}${reviewCountArialableText ? ` ${reviewCountArialableText}` : ''}`\r\n );\r\n}\r\n\r\nfunction renderDescription(description?: string): JSX.Element | null {\r\n return (<p className='msc-product__text'>\r\n {description}\r\n </p>);\r\n}\r\n\r\nfunction getRatingAriaLabel(rating?: number, ratingAriaLabel?: string): string {\r\n if (rating && ratingAriaLabel) {\r\n const roundedRating = rating.toFixed(2);\r\n return format(ratingAriaLabel || '', roundedRating, '5');\r\n }\r\n return '';\r\n}\r\n\r\nfunction getReviewAriaLabel(reviewCount?: number, ratingCountAriaLabelText?: string): string {\r\n if (reviewCount && ratingCountAriaLabelText) {\r\n return format(ratingCountAriaLabelText || '', reviewCount);\r\n }\r\n return '';\r\n}\r\n\r\nfunction renderRating(coreContext: ICoreContext, moduleTypeName: string, moduleId: string, avgRating?: number,\r\n totalRatings?: number, ariaLabel?: string, ratingCountAriaLabel?: string): JSX.Element | null {\r\n if (!avgRating) {\r\n return null;\r\n }\r\n\r\n const numberRatings = totalRatings?.toString() || undefined;\r\n const ratingAriaLabelText = getRatingAriaLabel(avgRating, ariaLabel);\r\n const ratingCountAriaLabelText = getReviewAriaLabel(Number(numberRatings), ratingCountAriaLabel);\r\n\r\n return (\r\n <RatingComponent\r\n context={coreContext}\r\n id={moduleId}\r\n typeName={moduleTypeName}\r\n avgRating={avgRating}\r\n ratingCount={numberRatings}\r\n readOnly\r\n ariaLabel={ratingAriaLabelText}\r\n ratingCountAriaLabel={ratingCountAriaLabelText}\r\n data={{}}\r\n />\r\n );\r\n}\r\n\r\nfunction renderPrice(context: ICoreContext, typeName: string, id: string, basePrice?: number, adjustedPrice?: number, savingsText?: string, freePriceText?: string, originalPriceText?: string, currentPriceText?: string, isPriceMinMaxEnabled?: boolean, priceResources?: IPriceComponentResources): JSX.Element | null {\r\n const price: ProductPrice = {\r\n BasePrice: basePrice,\r\n AdjustedPrice: adjustedPrice,\r\n CustomerContextualPrice: adjustedPrice\r\n };\r\n const priceComponent = (\r\n <PriceComponent\r\n context={context}\r\n id={id}\r\n typeName={typeName}\r\n data={{ price }}\r\n savingsText={savingsText}\r\n freePriceText={freePriceText}\r\n originalPriceText={originalPriceText}\r\n isPriceMinMaxEnabled={isPriceMinMaxEnabled}\r\n priceResources={priceResources}\r\n />\r\n );\r\n console.log(priceResources);\r\n return priceComponent;\r\n // return (\r\n // LoginToViewPricingComponent(\r\n // context.request,\r\n // priceResources?.loginToViewPricingText || '',\r\n // priceComponent,\r\n // true\r\n // )\r\n // );\r\n}\r\n\r\nfunction renderProductPlacementImage(imageSettings?: IImageSettings, gridSettings?: IGridSettings,\r\n imageUrl?: string, fallbackImageUrl?: string, altText?: string,\r\n context?: ICoreContext): JSX.Element | null {\r\n if (!imageUrl || !gridSettings || !imageSettings) {\r\n return null;\r\n }\r\n const img: IImageData = {\r\n src: imageUrl,\r\n altText: altText ? altText : '',\r\n fallBackSrc: fallbackImageUrl\r\n };\r\n const imageProps = {\r\n gridSettings,\r\n imageSettings\r\n };\r\n imageProps.imageSettings.cropFocalRegion = true;\r\n return (\r\n <Image\r\n requestContext={context?.actionContext.requestContext} {...img} {...imageProps}\r\n loadFailureBehavior='empty' />\r\n );\r\n}\r\n\r\nexport const ProductComponent: React.FunctionComponent<IProductComponentProps> = msdyn365Commerce.createComponentOverride<IProductComponent>(\r\n 'Product',\r\n { component: ProductCard, ...PriceComponentActions }\r\n);\r\n\r\nexport default ProductComponent;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { IOrderTemplateListViewProps, ISingleOrderTemplateViewProps } from '@msdyn365-commerce-modules/order-template';\r\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { INodeProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport CreateNewTemplateButtonComponent from './components/create-order-template.component';\r\nimport * as React from 'react';\r\n\r\nimport { IOrderTemplateListProps, IOrderTemplateListResources } from '../definition-extensions/order-template-list.ext.props.autogenerated';\r\nimport { IOrderTemplateNameDialogResources } from \"@msdyn365-commerce/components\";\r\n\r\n/**\r\n * Interface for OrderTemplateImage.\r\n */\r\ninterface IOrderTemplateImage {\r\n props: {\r\n children: React.ReactElement[];\r\n };\r\n}\r\n\r\n/**\r\n * To render order template.\r\n * @param orderTemplate - The order template view props.\r\n * @param orderTemplateNodeProps - The order template node props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderOrderTemplate = (orderTemplate: ISingleOrderTemplateViewProps, orderTemplateNodeProps?: INodeProps): JSX.Element | null => {\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from module file\r\n const { key, addToCartButton, orderTemplateImage, orderTemplateStatusMessage, removeButton, orderTemplateName } = orderTemplate;\r\n\r\n const orderTemplateImageElement: IOrderTemplateImage = orderTemplateImage as React.ReactElement;\r\n const currentImageListLength = orderTemplateImageElement.props.children.length;\r\n const defaultNumberImagesInTile = 4;\r\n\r\n if (currentImageListLength < defaultNumberImagesInTile) {\r\n for (let index = 0; index < defaultNumberImagesInTile - currentImageListLength; index++) {\r\n orderTemplateImageElement.props.children.push(<picture />);\r\n }\r\n }\r\n\r\n return (\r\n <Node key={key} className={orderTemplateNodeProps!.className} {...orderTemplateNodeProps}>\r\n {orderTemplateName}\r\n {orderTemplateImage}\r\n {addToCartButton}\r\n {removeButton}\r\n {orderTemplateStatusMessage}\r\n </Node>\r\n );\r\n};\r\n\r\nconst _reloadPage = async () => {\r\n window.location.reload();\r\n};\r\n\r\nconst _generateOrderTemplateNameDialogResources = (resources: IOrderTemplateListResources): IOrderTemplateNameDialogResources => {\r\n return {\r\n orderTemplateHeaderLabel: resources.createOrderTemplateHeader,\r\n orderTemplateTitleLabel: resources.orderTemplateTitle,\r\n orderTemplateNameAriaLabel: resources.orderTemplateNameAriaLabel,\r\n orderTemplateDescription: resources.createOrderTemplateDescription,\r\n\r\n defaultOrderTemplateName: resources.defaultOrderTemplateName,\r\n\r\n orderTemplateButtonLabel: resources.createOrderTemplateButtonText,\r\n orderTemplateCancelButtonLabel: resources.cancelNewOrderTemplateCreationButtonText\r\n };\r\n}\r\n\r\n/**\r\n * Order Template List View.\r\n * @param props - The view props.\r\n * @returns The JSX Element.\r\n */\r\nexport const OrderTemplateListViewComponent: React.FC<IOrderTemplateListViewProps & IOrderTemplateListProps<IOrderTemplateListResources>> = props => {\r\n const {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from module file\r\n OrderTemplateList, OrderTemplates, OrderTemplate,\r\n status,\r\n statusMessage,\r\n heading,\r\n orderTemplates,\r\n createOrderTemplateButton,\r\n templateHeaderStatusMessage\r\n } = props;\r\n console.log(createOrderTemplateButton)\r\n return (\r\n <Module {...OrderTemplateList}>\r\n {heading}\r\n {status !== 'SUCCESS' && statusMessage}\r\n {status === 'EMPTY' && (\r\n <CreateNewTemplateButtonComponent\r\n context={props.context}\r\n id={props.id}\r\n typeName={props.typeName}\r\n data={{}}\r\n createOrderTemplateText={props.resources.createNewTemplateButtonText}\r\n onOrderTemplateCreated={_reloadPage}\r\n createOrderTemplateDialogResources={_generateOrderTemplateNameDialogResources(props.resources)}\r\n />\r\n )}\r\n <Node className=''>\r\n {status === 'SUCCESS' &&\r\n (!OrderTemplates || !orderTemplates ||\r\n !ArrayExtensions.hasElements(orderTemplates)) ? (\r\n <div className='ms-order-template__empty-list'>\r\n <h2 className='ms-order-template__empty-list-heading'>\r\n {props.resources.headingForEmptyOrderTemplateList}\r\n </h2>\r\n <p className='ms-order-template__empty-list-text'>\r\n {props.resources.textForEmptyOrderTemplateList}\r\n </p>\r\n {createOrderTemplateButton}\r\n </div>\r\n ) : createOrderTemplateButton}\r\n {templateHeaderStatusMessage}\r\n </Node>\r\n { OrderTemplates && orderTemplates && ArrayExtensions.hasElements(orderTemplates) &&\r\n <Node {...OrderTemplates}>\r\n {orderTemplates.map((orderTemplate) => {\r\n return renderOrderTemplate(orderTemplate, OrderTemplate);\r\n })}\r\n </Node>}\r\n </Module>\r\n );\r\n};\r\n\r\nexport default OrderTemplateListViewComponent;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { IPriceComponentResources } from \"./components/price.component\";\r\nimport { ProductPrice, ProductSearchResult, SimpleProduct } from \"@msdyn365-commerce/retail-proxy\";\r\nimport { ArrayExtensions, getProductPageUrlSync } from \"@msdyn365-commerce-modules/retail-actions\";\r\nimport {\r\n ICategoryHierarchyViewProps,\r\n IRefineMenuViewProps,\r\n ISearchResultContainerViewProps,\r\n ISearchResultModalViewProps,\r\n ISortByViewProps,\r\n ITitleViewProps\r\n} from \"@msdyn365-commerce-modules/search-result-container\";\r\nimport {\r\n Button,\r\n getTelemetryObject,\r\n IPopupProps,\r\n Module,\r\n Node,\r\n Popup\r\n} from \"@msdyn365-commerce-modules/utilities\";\r\nimport React, { PropsWithChildren, useState } from \"react\";\r\nimport { _getGlobalState, } from \"mobx\"\r\nimport { ISearchResultContainerProps } from \"../definition-extensions/search-result-container.ext.props.autogenerated\";\r\nimport { ProductComponent } from \"./components/product.component\";\r\nimport {\r\n getUrlSync,\r\n IGridSettings,\r\n IImageData,\r\n IImageProps,\r\n IImageSettings,\r\n Image,\r\n IRequestContext\r\n} from \"@msdyn365-commerce/core\";\r\nimport { AddToCartListComponent } from \"./components/addToCart.component\";\r\nimport { IProductSearchResultExtensionData } from \"./product-result-container.data\";\r\nimport { getInventoryLevelRangesAsync } from \"../../../actions/DataActionExtension.g\";\r\nimport { SupersessionKey } from \"../../gardner-theme/models/SupersessionKey\";\r\nimport getProductSupersessionProperty from \"../../gardner-theme/models/getProductSupersessionProperty\";\r\nimport { IItemInventoryLevelProfileEntity, IProfileDataMap } from \"../../../actions/DataServiceEntities.g\";\r\nimport Table from \"reactstrap/lib/Table\";\r\n// import { LoginToViewPricingComponent } from \"../../../components/LoginToViewPricing.component\";\r\n/**\r\n * DescriptionInterval.\r\n */\r\nenum DescriptionInterval {\r\n productDescriptionInterval = 14,\r\n productDescriptionIntervalRemainder0 = 0,\r\n productDescriptionIntervalRemainder9 = 9\r\n}\r\n\r\n/**\r\n * Render Clear button for mobile viewport.\r\n * @param props - The view props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderProductCards = (props: PropsWithChildren<ISearchResultContainerViewProps & ISearchResultContainerProps<{}>>): JSX.Element | null => {\r\n const products = props.data.listPageState.result?.activeProducts;\r\n if (!products || !ArrayExtensions.hasElements(products)) {\r\n return null;\r\n }\r\n return (\r\n <Node {...props.ProductsContainer}>\r\n {props.errorMessage}\r\n <ul className=\"list-unstyled\">\r\n {products.map((product: ProductSearchResult, index: number) => renderProductCardsDescription(props, product, index, false))}\r\n </ul>\r\n </Node>\r\n );\r\n};\r\n\r\n\r\n/**\r\n * Returns the product inventory label.\r\n * @param channelInventoryConfigurationId - The channel configuration Id.\r\n * @param product - The product.\r\n * @returns The inventory label.\r\n */\r\nfunction getInventoryLabel(channelInventoryConfigurationId: number | undefined, product: ProductSearchResult): string | undefined {\r\n if (!channelInventoryConfigurationId || !ArrayExtensions.hasElements(product.AttributeValues)) {\r\n return undefined;\r\n }\r\n const inventoryAttribute = product.AttributeValues.find(attribute => attribute.RecordId === channelInventoryConfigurationId);\r\n if (inventoryAttribute) {\r\n return inventoryAttribute.TextValue;\r\n }\r\n return undefined;\r\n}\r\n\r\n/**\r\n * Render Clear button for mobile viewport.\r\n * @param props - The view props.\r\n * @param product - The product item data.\r\n * @param index - The index of each product item.\r\n * @param isEnabledProductDescription - The flag for showing Product desription tile.\r\n * @returns The JSX Element.\r\n */\r\nconst renderProductCardsDescription = (\r\n props: PropsWithChildren<ISearchResultContainerViewProps & ISearchResultContainerProps<{}>>,\r\n product: ProductSearchResult,\r\n index: number,\r\n isEnabledProductDescription?: boolean): JSX.Element | null => {\r\n const {\r\n config,\r\n context,\r\n resources\r\n } = props;\r\n const telemetryContent = getTelemetryObject(props.context.request.telemetryPageName!, props.friendlyName, props.telemetry);\r\n const breadCrumbType = props.context.app.config.breadcrumbType;\r\n const isAllowBack = props.config.allowBackNavigation && (breadCrumbType === \"back\" || breadCrumbType === \"categoryAndBack\");\r\n const classname = isEnabledProductDescription ? \"ms-product-search-result__item product__description\" : \"ms-product-search-result__item\";\r\n const quickviewslot = ArrayExtensions.hasElements(props.slots.quickview) ? props.slots.quickview[0] : undefined;\r\n const channelInventoryConfigurationId = props.data.products.result?.channelInventoryConfigurationId;\r\n // @ts-ignore\r\n const isPriceMinMaxFeatureState = props.data.featureState.result?.find(\r\n featureState => featureState.Name === \"Dynamics.AX.Application.RetailSearchPriceRangeFeature\");\r\n const priceResources: IPriceComponentResources = {\r\n priceRangeSeparator: resources.priceRangeSeparator,\r\n loginToViewPricingText: resources.loginToViewPricing\r\n };\r\n return (\r\n <li className={classname} key={index}>\r\n <ProductComponent\r\n context={context}\r\n telemetryContent={telemetryContent}\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 allowBack={isAllowBack}\r\n id={props.id}\r\n typeName={props.typeName}\r\n data={{ product }}\r\n quickViewButton={quickviewslot}\r\n isEnabledProductDescription={isEnabledProductDescription}\r\n inventoryLabel={getInventoryLabel(channelInventoryConfigurationId, product)}\r\n isPriceMinMaxEnabled={isPriceMinMaxFeatureState?.IsEnabled}\r\n priceResources={priceResources}\r\n />\r\n </li>\r\n );\r\n};\r\n\r\n/**\r\n * Render Clear button for mobile viewport.\r\n * @param props - The view props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderProducts = (props: PropsWithChildren<ISearchResultContainerViewProps & ISearchResultContainerProps<{}>>): JSX.Element | null => {\r\n const products = props.data.listPageState.result?.activeProducts;\r\n if (!products || !ArrayExtensions.hasElements(products)) {\r\n return null;\r\n }\r\n const productDescriptionInterval: number = DescriptionInterval.productDescriptionInterval;\r\n const productDescriptionIntervalRemainder0: number = DescriptionInterval.productDescriptionIntervalRemainder0;\r\n const productDescriptionIntervalRemainder9: number = DescriptionInterval.productDescriptionIntervalRemainder9;\r\n return (\r\n <Node {...props.ProductsContainer}>\r\n {props.errorMessage}\r\n <ul className=\"list-unstyled\">\r\n {products.map((product: ProductSearchResult, index: number) => (\r\n (index % productDescriptionInterval === productDescriptionIntervalRemainder0) ||\r\n (index % productDescriptionInterval === productDescriptionIntervalRemainder9) ? renderProductCardsDescription(props, product,\r\n index, true) : renderProductCardsDescription(props, product, index, false)\r\n ))}\r\n </ul>\r\n </Node>\r\n );\r\n};\r\n\r\n/**\r\n * Render Title Count.\r\n * @param props - The title view props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderTitleCount = (props: ITitleViewProps): JSX.Element | null => {\r\n const { title, TitleContainer } = props;\r\n return (\r\n <Node {...TitleContainer}>\r\n {title.titleCount}\r\n </Node>\r\n );\r\n};\r\n\r\n/**\r\n * Render Category Hierarchy.\r\n * @param props - The category hierarchy view props.\r\n * @returns The JSX Element.\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\n/**\r\n * Render the category page items.\r\n * @param props - The view props.\r\n * @returns The search Result container module view.\r\n */\r\nconst SearchResultContainerView: React.FC<ISearchResultContainerViewProps & ISearchResultContainerProps<IProductSearchResultExtensionData>> = props => {\r\n const {\r\n SearchResultContainer,\r\n pagination,\r\n ProductSectionContainer,\r\n choiceSummary,\r\n isMobile,\r\n modalToggle,\r\n searchResultModal,\r\n TitleViewProps,\r\n refineMenu,\r\n categoryHierarchy,\r\n sortByOptions,\r\n CategoryNavContainer,\r\n RefineAndProductSectionContainer,\r\n FeatureSearchContainer,\r\n similarLookProduct,\r\n errorMessage,\r\n productPrices,\r\n context: {\r\n request,\r\n cultureFormatter,\r\n actionContext,\r\n actionContext: {\r\n requestContext: {\r\n gridSettings,\r\n user: { isAuthenticated }\r\n }\r\n }\r\n },\r\n resources: {\r\n filterText, partNoHeading,\r\n descriptionHeading,\r\n availabilityHeading,\r\n quantityHeading,\r\n // listPriceHeading,\r\n yourPriceHeading,\r\n // loginToViewPricing,\r\n goToCartText,\r\n continueShoppingText,\r\n addToCartModalHeading,\r\n addToCartText\r\n },\r\n data: { cart, listPageState: productSearchResults, products: configurationObject },\r\n config: { enableProdutDescription, listView, imageSettings }\r\n } = props;\r\n\r\n const [areInventoryRangesChecked, setAreInventoryRangesChecked] = useState<boolean>(false);\r\n const [inventoryRangesList, setInventoryRangesList] = useState<IProfileDataMap[]>([]);\r\n\r\n const getInvProfs = async (): Promise<void> => {\r\n if (areInventoryRangesChecked) {\r\n return;\r\n }\r\n const itemIds = props.data.products?.result?.products.map(p => p.ItemId!) || [];\r\n const resp = await getInventoryLevelRangesAsync({ callerContext: props.context.actionContext }, itemIds);\r\n setAreInventoryRangesChecked(true);\r\n setInventoryRangesList(resp);\r\n }\r\n\r\n React.useEffect(() => {\r\n if (isAuthenticated || !props.config.onlyShowPriceWhenAuthenticated) {\r\n void getInvProfs();\r\n }\r\n }, [props.data.products]);\r\n\r\n const [isExpanded, setIsExpanded] = useState<boolean>(false);\r\n const [modalOpen, setModalOpen] = React.useState<boolean>(false);\r\n const [addedProduct, setAddedProduct] = React.useState<SimpleProduct | undefined>(undefined);\r\n const [productPricing, setProductPricing] = React.useState<ProductPrice | undefined>(undefined);\r\n const toggle = () => {\r\n setIsExpanded(!isExpanded);\r\n };\r\n const isRecoSearchPage = props.context.actionContext.requestContext.query?.recommendation;\r\n \r\n const setModalProps = (product: SimpleProduct, price: ProductPrice): IPopupProps => {\r\n return {\r\n modalOpen: modalOpen,\r\n context: props.context,\r\n className: 'list-view__modal',\r\n gridSettings,\r\n imageSettings,\r\n priceComponent: props.component,\r\n id: \"1\",\r\n productQuantity: 1,\r\n navigationUrl: getUrlSync('cart', actionContext),\r\n setModalOpen: (value) => setModalOpen(value),\r\n typeName: \"Add To Cart\",\r\n data: { product, price },\r\n dialogStrings: {\r\n goToCartText: goToCartText,\r\n currentPriceText: '',\r\n continueShoppingText: continueShoppingText,\r\n freePriceText: '',\r\n headerItemOneText: addToCartModalHeading,\r\n headerItemFormatText: '',\r\n originalPriceText: '',\r\n headerMessageText: ''\r\n }\r\n }\r\n }\r\n\r\n const handleAddToCart = (productId: number, quantity: number) => {\r\n const foundProduct = productSearchResults.result?.activeProducts.find(pr => pr.RecordId === productId);\r\n if (!foundProduct) {\r\n return;\r\n }\r\n const product: SimpleProduct = {\r\n BasePrice: foundProduct.BasePrice || foundProduct.Price,\r\n AdjustedPrice: foundProduct.Price,\r\n Name: foundProduct.Name,\r\n RecordId: foundProduct.RecordId,\r\n ItemId: foundProduct.ItemId,\r\n ProductTypeValue: 1,\r\n Price: foundProduct.Price\r\n }\r\n setAddedProduct(product);\r\n setProductPricing(getProductPrice(productPrices, product.RecordId))\r\n cart.result?.addProductToCart({\r\n product,\r\n count: quantity,\r\n catalogId: 0\r\n }).then((response) => {\r\n if (response.status === \"SUCCESS\" && props.app.config.addToCartBehavior === 'showModal') {\r\n setModalOpen(true);\r\n }\r\n });\r\n }\r\n\r\n // const getProductSupersessionProperty = (product: ProductSearchResult, extensionKey: SupersessionKey) => {\r\n // const properties = product.ExtensionProperties;\r\n // if (properties) {\r\n // return properties.find(pr => pr.Key === extensionKey)?.Value?.StringValue || null;\r\n // }\r\n // return null;\r\n // }\r\n\r\n const renderAddtoCartButton = (pr: ProductSearchResult) => {\r\n if (isAuthenticated || !props.config.onlyShowPriceWhenAuthenticated) {\r\n const currentInvString = getProductSupersessionProperty(pr, SupersessionKey.Inventory) || '0';\r\n const currentInventory = parseInt(currentInvString, 10);\r\n let invProfOos: IItemInventoryLevelProfileEntity | undefined;\r\n inventoryRangesList.map(ir => {\r\n const tempInvRange = ir.Profile?.find(p => p.ItemId === pr.ItemId && p.Code === 'OOS');\r\n if (tempInvRange) {\r\n invProfOos = tempInvRange;\r\n }\r\n });\r\n\r\n const OosUpperBound = invProfOos?.hasOwnProperty('UpperBoundInclusive') && invProfOos?.UpperBoundInclusive !== undefined ? invProfOos.UpperBoundInclusive : 0;\r\n const isOutOfStock = currentInventory <= OosUpperBound;\r\n\r\n return !isOutOfStock ? (\r\n <AddToCartListComponent\r\n productId={pr.RecordId}\r\n onAddToCart={handleAddToCart}\r\n addToCartButtonText={addToCartText} />\r\n ) : (\r\n <>\r\n <td></td>\r\n <td>\r\n <div className=\"list-view__prod-unavail\">{props.resources.productUnavailableText}</div>\r\n </td>\r\n </>\r\n )\r\n }\r\n return null;\r\n }\r\n\r\n const _renderProductsListView = () => {\r\n\r\n return (\r\n <Table className={\"list-view__table\"}>\r\n <thead>\r\n <tr>\r\n <th />\r\n <th>{partNoHeading}</th>\r\n <th>{descriptionHeading}</th>\r\n <th>{availabilityHeading}</th>\r\n {/* <th>{listPriceHeading}</th> */}\r\n <th>{yourPriceHeading}</th>\r\n {(isAuthenticated || !props.config.onlyShowPriceWhenAuthenticated) ? (\r\n <>\r\n <th>{quantityHeading}</th>\r\n <th />\r\n </>\r\n ) : null}\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {productSearchResults.result?.activeProducts.map(pr => {\r\n // const pricing = getProductPrice(productPrices, pr.RecordId);\r\n const inventoryLabel = getInventoryLabel(configurationObject?.result?.channelInventoryConfigurationId, pr);\r\n // const priceComponent = <span>{cultureFormatter.formatCurrency(pr.Price)}</span>;\r\n return (\r\n <tr key={pr.RecordId}>\r\n <td>{renderProductPlacementImage(\r\n imageSettings, gridSettings, pr.PrimaryImageUrl,\r\n pr.PrimaryImageUrl, pr.Name, request)}</td>\r\n <td><a href={getProductPageUrlSync(pr.Name!, pr.RecordId, actionContext)}>{pr.ItemId}</a></td>\r\n <td>{pr.Name}</td>\r\n <td>{inventoryLabel}</td>\r\n {/* <td>\r\n {LoginToViewPricingComponent(props.context.request, loginToViewPricing,\r\n priceComponent, props.config.onlyShowPriceWhenAuthenticated ?? false)}</td> */}\r\n <td>{(isAuthenticated || !props.config.onlyShowPriceWhenAuthenticated) ? cultureFormatter.formatCurrency(pr.Price) : null}</td>\r\n {renderAddtoCartButton(pr)}\r\n {/* {isAuthenticated || !props.config.onlyShowPriceWhenAuthenticated ? (<AddToCartListComponent productId={pr.RecordId} onAddToCart={handleAddToCart}\r\n addToCartButtonText={addToCartText} />) : null} */}\r\n </tr>\r\n );\r\n })}\r\n </tbody>\r\n </Table>\r\n );\r\n };\r\n\r\n if (isMobile) {\r\n return (\r\n <Module {...SearchResultContainer}>\r\n {similarLookProduct ? null : <Node {...CategoryNavContainer}>\r\n {renderCategoryHierarchy(categoryHierarchy)}\r\n {renderTitle(TitleViewProps)}\r\n {renderTitleCount(TitleViewProps)}\r\n </Node>}\r\n {choiceSummary}\r\n <Node className=\"msc-sort-filter-wrapper\">\r\n {modalToggle}\r\n </Node>\r\n {createSearchResultModal(searchResultModal, refineMenu, sortByOptions, isRecoSearchPage)}\r\n <Node {...FeatureSearchContainer}>\r\n {similarLookProduct}\r\n </Node>\r\n {errorMessage}\r\n {enableProdutDescription ? renderProducts(props) : renderProductCards(props)}\r\n {pagination}\r\n </Module>\r\n );\r\n }\r\n return (\r\n <Module {...SearchResultContainer}>\r\n {/* @ts-ignore */}\r\n {modalOpen && addedProduct ? <Popup {...setModalProps(addedProduct, productPricing)} /> : null}\r\n {similarLookProduct ? null : <Node {...CategoryNavContainer}>\r\n {categoryHierarchy && renderCategoryHierarchy(categoryHierarchy)}\r\n {TitleViewProps && renderTitle(TitleViewProps)}\r\n {TitleViewProps && renderTitleCount(TitleViewProps)}\r\n </Node>}\r\n <Node {...FeatureSearchContainer}>\r\n {similarLookProduct}\r\n </Node>\r\n <Node {...RefineAndProductSectionContainer}>\r\n <Node className=\"ms-refiner-heading\">\r\n <Node className=\"ms-refiner-heading_title\">\r\n <Button\r\n className={isExpanded ? \"ms-refine-filter__toggle_expanded\" : \"ms-refine-filter__toggle_collapsed\"}\r\n aria-label=\"Filter\"\r\n onClick={toggle}\r\n aria-expanded={isExpanded}\r\n tabIndex={0}\r\n >\r\n {filterText}\r\n </Button>\r\n <div className=\"ms-search-result-wrapper-title-choice-summary\">\r\n {choiceSummary}\r\n </div>\r\n <div className=\"ms-search-result-wrapper-sort-by-category\">\r\n {sortByOptions && !isRecoSearchPage && renderSort(sortByOptions)}\r\n </div>\r\n </Node>\r\n {refineMenu && isExpanded && renderRefiner(refineMenu)}\r\n </Node>\r\n <Node {...ProductSectionContainer}>\r\n {errorMessage}\r\n {/*{enableProdutDescription ? renderProducts(props) : renderProductCards(props)}*/}\r\n {listView ? _renderProductsListView() : enableProdutDescription ? renderProducts(props) : renderProductCards(props)}\r\n {pagination}\r\n </Node>\r\n </Node>\r\n </Module>\r\n );\r\n};\r\n\r\n/**\r\n * Render Search result Modal.\r\n * @param modalProps - The Search Result Modal view props.\r\n * @param refineMenu - The Refine Menu view props.\r\n * @param sortByDropDown - The Sort by view props.\r\n * @param isRecoSearchPage - The recomandation search page flag.\r\n * @returns The JSX Element.\r\n */\r\nconst createSearchResultModal = (modalProps: ISearchResultModalViewProps, refineMenu: IRefineMenuViewProps, sortByDropDown: ISortByViewProps,\r\n isRecoSearchPage?: string): JSX.Element => {\r\n return React.cloneElement(modalProps.modal, {}, modalProps.modalHeader, createModalBody(modalProps, refineMenu, sortByDropDown,\r\n isRecoSearchPage), modalProps.modalFooter);\r\n};\r\n\r\n/**\r\n * Render Refiner Mobile.\r\n * @param props - The Refine Menu view props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderRefinerMobile = (props: IRefineMenuViewProps): JSX.Element | null => {\r\n const { refiners, RefineMenuContainer, RefinerSectionContainer } = props;\r\n if (refiners) {\r\n return (\r\n <Node {...RefinerSectionContainer}>\r\n <Node {...RefineMenuContainer}>\r\n {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/**\r\n * Render Search result Body.\r\n * @param props - The Search Result Modal view props.\r\n * @param refineMenu - The Refine Menu view props.\r\n * @param sortByDropDown - The Sort by view props.\r\n * @param isRecoSearchPage - The recomandation search page flag.\r\n * @returns The JSX Element.\r\n */\r\nconst createModalBody = (props: ISearchResultModalViewProps, refineMenu: IRefineMenuViewProps,\r\n sortByDropDown: ISortByViewProps, isRecoSearchPage?: string): JSX.Element | null => {\r\n if (sortByDropDown) {\r\n return React.cloneElement(props.modalBody, {}, renderSort(sortByDropDown, isRecoSearchPage), renderRefinerMobile(refineMenu));\r\n }\r\n return null;\r\n};\r\n\r\n/**\r\n * Render Refiner.\r\n * @param props - The Refine Menu view props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderRefiner = (props: IRefineMenuViewProps): JSX.Element | null => {\r\n const { refiners, RefineMenuContainer, RefinerSectionContainer } = props;\r\n if (refiners) {\r\n return (\r\n <Node {...RefinerSectionContainer}>\r\n <Node {...RefineMenuContainer}>\r\n {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/**\r\n * Render sort by drop down.\r\n * @param props - The sort by view props.\r\n * @param isRecoSearchPage - The recomandation search page flag.\r\n * @returns The JSX Element.\r\n */\r\nconst renderSort = (props: ISortByViewProps, isRecoSearchPage?: string): JSX.Element | null => {\r\n const { SortingContainer, sortByDropDown } = props;\r\n if (sortByDropDown && !isRecoSearchPage) {\r\n return (\r\n <Node {...SortingContainer}>\r\n {sortByDropDown}\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\n/**\r\n * Render Title.\r\n * @param props - The title view props.\r\n * @returns The JSX Element.\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 <Node tag=\"h1\" className=\"\">\r\n {title.titlePrefix}\r\n {title.titleText}\r\n </Node>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst renderProductPlacementImage = (\r\n productCardimageSettings?: IImageSettings, gridSettings?: IGridSettings,\r\n imageUrl?: string, fallbackImageUrl?: string, altText?: string, requestContext?: IRequestContext): JSX.Element | null => {\r\n\r\n if (!imageUrl || !gridSettings || !productCardimageSettings) {\r\n return null;\r\n }\r\n if (productCardimageSettings) {\r\n productCardimageSettings.viewports = {\r\n lg: { h: 100, w: 100, q: \"80\" },\r\n md: { h: 100, w: 100, q: \"80\" },\r\n sm: { h: 100, w: 100, q: \"80\" },\r\n xs: { h: 100, w: 100, q: \"80\" }\r\n };\r\n }\r\n const image: IImageData = {\r\n src: imageUrl,\r\n altText: altText ? altText : \"\",\r\n fallBackSrc: fallbackImageUrl\r\n };\r\n const imageProps: IImageProps = { gridSettings };\r\n\r\n imageProps.gridSettings = gridSettings;\r\n imageProps.imageSettings = productCardimageSettings;\r\n imageProps.imageSettings.cropFocalRegion = true;\r\n return (\r\n <Image\r\n {...image} {...imageProps} loadFailureBehavior=\"empty\"\r\n requestContext={requestContext}\r\n className={\"eve-listview__img\"}\r\n />\r\n );\r\n};\r\n\r\nconst getProductPrice = (pricing: ProductPrice[] | undefined, productRecId: number): ProductPrice | undefined => {\r\n if (!pricing) {\r\n return undefined;\r\n }\r\n return pricing.find(pr => pr.ProductId === productRecId);\r\n};\r\n\r\nexport default SearchResultContainerView;\r\n","import { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport { SupersessionKey } from './SupersessionKey';\r\n\r\nexport default function getProductSupersessionProperty(product: ProductSearchResult, extensionKey: SupersessionKey) {\r\n const properties = product.ExtensionProperties;\r\n if (properties) {\r\n return properties.find(pr => pr.Key === extensionKey)?.Value?.StringValue || null;\r\n }\r\n return null;\r\n}\r\n","export enum SupersessionKey {\r\n SupersededId = 'superseded-from-id',\r\n SupersededName = 'superseded-from-name',\r\n Inventory = 'inventory'\r\n}\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { AddToCartBehavior } from '@msdyn365-commerce/components';\r\nimport MsDyn365, { getUrlSync } from '@msdyn365-commerce/core';\r\n// @ts-ignore\r\nimport { ICartIconViewProps, ICartViewProps, IFlyoutCartLineItemViewProps } from '@mdsdyn365-commerce-modules/cart';\r\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { Button, getPayloadObject, INodeProps, KeyCodes, Modal, Node, onTelemetryClick } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport React from 'react';\r\n\r\n\r\nimport { ICartIconProps as ICartIconExtensionProps, ICartIconResources } from '../definition-extensions/cart-icon.ext.props.autogenerated';\r\nimport { readAsync } from \"@msdyn365-commerce/retail-proxy/dist/DataActions/CustomersDataActions.g\";\r\nimport { Address } from \"@msdyn365-commerce/retail-proxy\";\r\nimport { CartLine, CommerceProperty } from '@msdyn365-commerce/retail-proxy';\r\nimport { CommercePropertyValueEnum } from '../../../modules/allowable-freight/utils/CommercePropertyValueEnum';\r\n\r\n/**\r\n * ICartIconViewState: Interface for Cart Icon View State.\r\n */\r\ninterface ICartIconViewState {\r\n isModalOpen: boolean;\r\n isAddressCheckComplete: boolean;\r\n isErrModalOpen: boolean;\r\n iProductsPresentVersion: number;\r\n}\r\n\r\nconst renderInvoiceInCartMsg = (resources: ICartIconResources): JSX.Element | null => {\r\n\r\n return (\r\n \r\n <Node className={classnames('msc-cart-line__set-net-price')} >\r\n {resources.invoiceInCartMessage}\r\n </Node>\r\n ) \r\n\r\n}\r\n\r\n/**\r\n * Render Cart lines.\r\n * @param cartLines - Flyout cart line view props.\r\n * @param props - Cart icon view props.\r\n * @returns JSX Element.\r\n */\r\nconst renderCartlines = (cartLines: IFlyoutCartLineItemViewProps[] | undefined, props: ICartIconViewProps & ICartIconExtensionProps<{}>): JSX.Element[] | null => {\r\n if (props.data.cart.result?.hasInvoiceLine) {\r\n\r\n return (\r\n [<Node {...props.miniCartItemWrapper}>\r\n {renderInvoiceInCartMsg(props.resources)}\r\n </Node>\r\n ]);\r\n }\r\n\r\n if (!cartLines ) {\r\n props.context.telemetry.error('Cartlines content is empty, module wont render');\r\n return null;\r\n }\r\n \r\n if (MsDyn365.isBrowser) {\r\n document.addEventListener('UPDATE_CART', (data: any) => {\r\n if (data.detail.Products?.length) {\r\n const cartState = props.data.cart.result;\r\n cartState?.removeCartLines({ cartLineIds: data.detail.Products.map((p: any) => p.LineId) });\r\n }\r\n });\r\n }\r\n\r\n return cartLines.map((cartLine, index) => {\r\n const cartLineIndex = index;\r\n return (\r\n <Node {...props.miniCartItemWrapper} key={cartLineIndex}>\r\n <Node className={classnames(cartLine.storeLocation ? 'msc-cart-line__set-net-price' : '')} >\r\n {cartLine.cartline}\r\n </Node>\r\n {cartLine.remove}\r\n {cartLine.storeLocation}\r\n </Node>\r\n );\r\n });\r\n};\r\n\r\n/**\r\n * Initiate total price.\r\n * @param props - Cart icon view props.\r\n * @returns JSX Element.\r\n */\r\nconst renderTotalPrice = (props: ICartIconViewProps & ICartIconExtensionProps<{}>): JSX.Element | null => {\r\n const cart = props.data.cart.result ?? undefined;\r\n const price = cart && !cart.hasInvoiceLine && (cart.cart.TotalAmount || undefined);\r\n const totalPrice = price ? props.context.cultureFormatter.formatCurrency(price) : props.context.cultureFormatter.formatCurrency(props.resources.emptyPrice);\r\n return (\r\n <div className='ms-cart-icon__subTotalText'>\r\n <span className='ms-cart-icon__subTotalPriceText'>\r\n {props.resources.totalPriceFormatString?.replace('{price}', '')}\r\n <span className='ms-cart-icon__subTotalPrice'>\r\n {totalPrice}\r\n </span>\r\n </span>\r\n </div>\r\n );\r\n};\r\n\r\n/**\r\n *\r\n * CartIconView component.\r\n * @extends {React.PureComponent<ICartIconViewProps>}\r\n */\r\nexport class CartIconView extends React.PureComponent<ICartViewProps & ICartIconViewProps & ICartIconExtensionProps<{}>, ICartIconViewState> {\r\n\r\n private isAutoDisplayTriggered: boolean;\r\n private isErrAutoDisplayTriggered: boolean;\r\n\r\n public constructor(props: ICartViewProps & ICartIconViewState & ICartIconViewProps & ICartIconExtensionProps<{}>) {\r\n super(props);\r\n this.isAutoDisplayTriggered = false;\r\n this.isErrAutoDisplayTriggered = false;\r\n this.state = {\r\n isModalOpen: false,\r\n isAddressCheckComplete: false,\r\n isErrModalOpen: false,\r\n iProductsPresentVersion: 0\r\n };\r\n\r\n }\r\n\r\n public componentDidMount(): void {\r\n if (MsDyn365.isBrowser) {\r\n window.addEventListener('keydown', this._escFunction, false);\r\n }\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n if (MsDyn365.isBrowser) {\r\n window.removeEventListener('keydown', this._escFunction, false);\r\n }\r\n }\r\n\r\n private _removeCommentFromCartLine(): void {\r\n const cartState = this.props.data.cart.result || undefined;\r\n\r\n if (cartState) {\r\n if ((!cartState.cart.CartLines || cartState.cart.CartLines?.length === 0) && cartState.cart.Comment) {\r\n const _clonedCart = { ...cartState.cart };\r\n _clonedCart.Comment = \"\";\r\n\r\n void cartState.updateCart({ newCartObject: _clonedCart });\r\n }\r\n }\r\n }\r\n\r\n private async getAddresses(): Promise<Address | undefined> {\r\n if (this.props.context.request.user.isAuthenticated) {\r\n const customer = await readAsync({ callerContext: this.props.context.actionContext }, this.props.context.request.user.customerAccountNumber!)\r\n if (customer) {\r\n return customer.Addresses?.find(add => add.IsPrimary)\r\n }\r\n }\r\n return undefined;\r\n }\r\n\r\n private async handleCartAddress(): Promise<void> {\r\n const cartState = this.props.data.cart.result;\r\n if (cartState) {\r\n this.setState({ isAddressCheckComplete: true })\r\n const hasAddress = !!cartState.cart.ShippingAddress\r\n // console.log(hasAddress, 'has address')\r\n if (!hasAddress) {\r\n const primaryAddress = await this.getAddresses()\r\n // console.log(primaryAddress, 'primary address')\r\n\r\n if (!!primaryAddress) {\r\n void await cartState.updateShippingAddress({ newShippingAddress: primaryAddress });\r\n }\r\n }\r\n }\r\n }\r\n\r\n private getExtensionPropertyValueByKey = (\r\n properties: CommerceProperty[] | undefined,\r\n key: string,\r\n valueType: CommercePropertyValueEnum\r\n ) => {\r\n const property = properties?.find(p => p.Key === key)?.Value;\r\n\r\n // eslint-disable-next-line security/detect-object-injection\r\n const val = property ? property[valueType] : null;\r\n return val;\r\n };\r\n\r\n\r\n /**\r\n * Render Cart Item count.\r\n * @returns JSX Element.\r\n */\r\n public render(): JSX.Element | null {\r\n this._removeCommentFromCartLine();\r\n const cart = this.props.data.cart.result ?? undefined;\r\n\r\n\r\n let iProductsPresent = this.getExtensionPropertyValueByKey(cart?.cart?.ExtensionProperties, \"not-eligible\", CommercePropertyValueEnum.string);\r\n // console.log(iProductsPresent)\r\n // console.log(this.state.iProductsPresentVersion, !!this.state.iProductsPresentVersion)\r\n if (!this.isErrAutoDisplayTriggered && typeof iProductsPresent === \"string\" && iProductsPresent !== \"[]\") {\r\n\r\n this.setState({ isErrModalOpen: true, iProductsPresentVersion: cart?.cart.Version || 0 })\r\n this.isErrAutoDisplayTriggered = true;\r\n }\r\n else if (!this.state.isErrModalOpen && cart?.cart.Version !== this.state.iProductsPresentVersion) {\r\n this.isErrAutoDisplayTriggered = false;\r\n\r\n }\r\n\r\n if (this.state.isErrModalOpen) {\r\n this.isAutoDisplayTriggered = true;\r\n }\r\n\r\n let ippContent;\r\n\r\n if (!!iProductsPresent) {\r\n try {\r\n ippContent =\r\n <>\r\n <p>{this.props.resources.ineligibleProductsText}</p>\r\n {(JSON.parse(iProductsPresent as string) as CartLine[]).map(r => <li>{r.Barcode}: {r.Description}</li>)}\r\n </>;\r\n } catch (err) {\r\n\r\n }\r\n }\r\n\r\n if (cart && !this.state.isAddressCheckComplete) {\r\n this.handleCartAddress();\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- check config.\r\n const shouldShowMiniCart = cart?.isProductAddedToCart && this.props.context.app.config.addToCartBehavior === AddToCartBehavior.showMiniCart;\r\n\r\n if (shouldShowMiniCart) {\r\n if (!this.isAutoDisplayTriggered) {\r\n // First time trigger auto mini cart.\r\n this.setState({ isModalOpen: true });\r\n this.isAutoDisplayTriggered = true;\r\n }\r\n else if (!this.state.isModalOpen) {\r\n // If modal is closed, reset the flag.\r\n this.isAutoDisplayTriggered = false;\r\n }\r\n }\r\n return (\r\n <Node{...this.props.miniCartWrapper} {...this.props.renderModuleAttributes(this.props)}>\r\n <button\r\n onClick={this._openModal} className='ms-cart-icon-wrapper msc-btn'>\r\n {this.props.cartIcon}\r\n </button>\r\n <Node{...this._modalErrContainer()}>\r\n {ippContent && ippContent}\r\n </Node>\r\n <Node{...this._modalContainer()}>\r\n <Node className='ms-cart-icon__header msc-modal__header'>\r\n {this.props.flyoutTitle}\r\n {this._renderCartItemCount(this.props)}\r\n {this._renderCartCloseIcon()}\r\n </Node>\r\n <Node className='ms-cart-icon__body msc-modal__body'>\r\n {this.props.slots.allowableFreight}\r\n {this.props.data.cart.result?.isEmpty ? this.props.slots.emptyCart : null}\r\n <Node {...this.props.CartlinesWrapper}>\r\n {renderCartlines(this.props.cartlines, this.props)}\r\n </Node>\r\n </Node>\r\n <Node className='ms-cart-icon__footer msc-modal__footer'>\r\n {this.props.slots.promoContentItem}\r\n {renderTotalPrice(this.props)}\r\n <p className='ms-cart-icon__subtotal-message'>\r\n {this.props.resources.subTotalMessage}\r\n </p>\r\n {this.props.checkoutAsSignInUserButton}\r\n {this.props.checkoutAsGuestButton}\r\n {this.props.data.cart.result?.isEmpty ? null : this.props.goToCartButton}\r\n <Node className='ms-cart-icon__btn-section'>\r\n {\r\n this.props.data.cart.result?.isEmpty ? <Button\r\n className='ms-cart-icon__btn-backtoshopping'\r\n href={getUrlSync('home', this.props.context.actionContext)}\r\n >\r\n {this.props.resources.continueShoppingButtonTitle}\r\n </Button> : null\r\n }\r\n </Node>\r\n </Node>\r\n </Node>\r\n </Node>\r\n );\r\n }\r\n\r\n /**\r\n * Initiate modal container.\r\n * @returns Inode props.\r\n */\r\n private readonly _modalContainer = (): INodeProps => {\r\n return {\r\n tag: Modal,\r\n placement: 'bottom-end',\r\n hideArrow: true,\r\n className: 'ms-cart-icon__minicartmodal-container',\r\n wrapClassName: 'ms-cart-icon__minicartmodal',\r\n isOpen: this.state.isModalOpen,\r\n toggle: this.closeModal\r\n };\r\n };\r\n\r\n /**\r\n * Initiate open modal.\r\n */\r\n private readonly _openModal = (): void => {\r\n const payLoad = getPayloadObject('click', this.props.telemetryContent!, 'cart-icon', '');\r\n onTelemetryClick(this.props.telemetryContent!, payLoad, 'cart-icon');\r\n this.setState({\r\n isModalOpen: true\r\n });\r\n };\r\n\r\n\r\n private readonly _modalErrContainer = (): INodeProps => {\r\n return {\r\n tag: Modal,\r\n placement: 'bottom-end',\r\n hideArrow: true,\r\n className: 'ms-cart-icon__minicarterrmodal-container',\r\n wrapClassName: 'ms-cart-icon__minicarterrmodal',\r\n isOpen: this.state.isErrModalOpen,\r\n toggle: this.closeErrModal\r\n };\r\n };\r\n\r\n private readonly closeErrModal = (): void => {\r\n this.setState({\r\n isErrModalOpen: false\r\n });\r\n\r\n this.isAutoDisplayTriggered = true;\r\n\r\n };\r\n\r\n /**\r\n * Initiate close modal.\r\n */\r\n private readonly closeModal = (): void => {\r\n this.setState({\r\n isModalOpen: false\r\n });\r\n\r\n };\r\n\r\n /**\r\n * Initiate cart close Icon.\r\n * @returns JSX Element.\r\n */\r\n private readonly _renderCartCloseIcon = (): JSX.Element | null => {\r\n return (\r\n <Button\r\n className='ms-cart-icon__btn-close'\r\n aria-label='Close' onClick={this.closeModal} />\r\n );\r\n };\r\n\r\n /**\r\n * Render Cart Item count.\r\n * @param props - Cart icon view props.\r\n * @returns JSX Element.\r\n */\r\n private readonly _renderCartItemCount = (props: ICartIconViewProps & ICartIconExtensionProps<{}>): JSX.Element | null => {\r\n let cartItemCount;\r\n const defaultCartItemCount: number = 0;\r\n const defaultCartItemCountOne: number = 1;\r\n\r\n if (ArrayExtensions.hasElements(props.cartlines)) {\r\n if (props.cartlines.length === defaultCartItemCountOne) {\r\n cartItemCount = `${defaultCartItemCountOne} ${props.resources.item}`;\r\n } else {\r\n cartItemCount = `${props.cartlines.length} ${props.resources.items}`;\r\n }\r\n } else {\r\n cartItemCount = `${defaultCartItemCount} ${props.resources.items}`;\r\n }\r\n return (\r\n <Node className='ms-cart-icon__count' tabIndex='0'>\r\n {cartItemCount}\r\n </Node>\r\n );\r\n };\r\n\r\n /**\r\n * Handle escape click to close modal.\r\n * @param event - On press of any key.\r\n */\r\n private readonly _escFunction = (event: KeyboardEvent) => {\r\n if (event.keyCode === KeyCodes.Escape && this.state.isModalOpen) {\r\n this.closeModal();\r\n }\r\n };\r\n\r\n}\r\n\r\nexport default CartIconView;\r\n","import React from 'react';\r\n\r\ninterface IAddToCartListComponentProps {\r\n productId: number\r\n onAddToCart(id: number, quantity: number): void;\r\n addToCartButtonText: string\r\n}\r\n\r\nexport const AddToCartListComponent: React.FC<IAddToCartListComponentProps> = ({productId, onAddToCart, addToCartButtonText}) => {\r\n\r\n const [ quantity , setQuantity ] = React.useState<number>(1);\r\n\r\n const handleQuantityChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n setQuantity(e.target.valueAsNumber);\r\n }\r\n const handleAddToCart = () => onAddToCart(productId, quantity);\r\n\r\n return (\r\n <>\r\n <td>\r\n <input type=\"number\" min={\"1\"} max={\"10\"} value={quantity} aria-label={'Change Quantity'} onChange={handleQuantityChange}/>\r\n </td>\r\n <td><button type={'button'} className={'list-view__add-to-cart-btn msc-button'} onClick={handleAddToCart}>{addToCartButtonText}</button></td>\r\n </>\r\n )\r\n}","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { IOrderTemplateNameDialogResources, OrderTemplateNameDialog } from '@msdyn365-commerce/components';\r\nimport { IComponentProps } from '@msdyn365-commerce/core';\r\nimport React, { useState } from 'react';\r\n\r\nconst modalCloseButtonReference: React.RefObject<HTMLButtonElement> = React.createRef();\r\n\r\n/**\r\n * The Create Order Template Button Props.\r\n */\r\nexport interface ICreateOrderTemplateButtonProps extends IComponentProps {\r\n\r\n /**\r\n * The label for create order template.\r\n */\r\n createOrderTemplateText: string;\r\n\r\n /**\r\n * The create order template dialog resources.\r\n */\r\n createOrderTemplateDialogResources: IOrderTemplateNameDialogResources;\r\n\r\n /**\r\n * The delegate to fire when dialog captured any user entry.\r\n */\r\n onOrderTemplateCreated(): Promise<void>;\r\n}\r\n\r\nconst CreateOrderTemplateButton: React.FC<ICreateOrderTemplateButtonProps> = (props) => {\r\n const onCancelHandler = React.useCallback(() => {\r\n return;\r\n }, []);\r\n const [isCreateOrderTemplateDialogOpen, setOrderTemplateNameDialogOpen] = useState(false);\r\n const onCreateButtonClick = React.useCallback(() => {\r\n setOrderTemplateNameDialogOpen(true);\r\n }, []);\r\n\r\n return (\r\n <>\r\n <button\r\n className='ms-order-template__add-template-button msc-btn btn-primary'\r\n color='primary'\r\n onClick={onCreateButtonClick}\r\n ref={modalCloseButtonReference}\r\n aria-label={props.createOrderTemplateText}\r\n >\r\n {props.createOrderTemplateText}\r\n </button>\r\n <OrderTemplateNameDialog\r\n className='msc-order-template-name-dialog'\r\n modalOpen={isCreateOrderTemplateDialogOpen}\r\n isUpdateDialog={false}\r\n setModalOpen={setOrderTemplateNameDialogOpen}\r\n context={props.context}\r\n id={props.id}\r\n data={{}}\r\n typeName={props.typeName}\r\n dialogStrings={props.createOrderTemplateDialogResources}\r\n onCancel={onCancelHandler}\r\n onSuccess={props.onOrderTemplateCreated}\r\n parentElementRef={modalCloseButtonReference}\r\n />\r\n </>\r\n );\r\n};\r\n\r\nexport default CreateOrderTemplateButton;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\r\nimport { ISwatchItem, PriceComponent, ProductComponentSwatchComponent, RatingComponent } from '@msdyn365-commerce/components';\r\nimport { IPriceComponentResources } from './price.component'\r\nimport { IComponent, IComponentProps, ICoreContext, IGridSettings, IImageData, IImageSettings, Image, msdyn365Commerce } from '@msdyn365-commerce/core';\r\nimport { AttributeSwatch, AttributeValue, ProductDimension, ProductPrice, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n ArrayExtensions, convertDimensionTypeToProductDimensionType, Dictionary, DimensionTypes, generateImageUrl,\r\n getProductPageUrlSync, IDimensionsApp, StringExtensions\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\nimport { format, getPayloadObject, getTelemetryAttributes, ITelemetryContent, onTelemetryClick } from '@msdyn365-commerce-modules/utilities';\r\nimport React, { useState } from 'react';\r\nimport { LoginToViewPricingComponent } from \"../../../../components/LoginToViewPricing.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 ratingCountAriaLabel?: string;\r\n allowBack?: boolean;\r\n telemetryContent?: ITelemetryContent;\r\n quickViewButton?: React.ReactNode;\r\n isEnabledProductDescription?: boolean;\r\n isPriceMinMaxEnabled?: boolean;\r\n priceResources?: IPriceComponentResources;\r\n inventoryLabel?: string;\r\n dimensionAvailabilities?: IProductsDimensionsAvailabilities[];\r\n}\r\n\r\nexport interface IProductComponent extends IComponent<IProductComponentProps> { }\r\n\r\nconst PriceComponentActions = {};\r\n\r\n/**\r\n * Gets the product page url from the default swatch selected.\r\n * @param productData - Product card to be rendered.\r\n * @returns The default color swatch selected if any.\r\n */\r\nfunction getDefaultColorSwatchSelected(productData?: ProductSearchResult): AttributeSwatch | null {\r\n if (!productData || !productData.AttributeValues) {\r\n return null;\r\n }\r\n\r\n const colorAttribute = productData.AttributeValues.find(attributeValue => attributeValue.KeyName?.toLocaleLowerCase() === DimensionTypes.color);\r\n if (!colorAttribute) {\r\n return null;\r\n }\r\n\r\n const defaultSwatch = colorAttribute.Swatches?.find(item => item.IsDefault === true) ?? colorAttribute.Swatches?.[0];\r\n return defaultSwatch ?? null;\r\n}\r\n\r\n/**\r\n * Gets the product image from the default swatch selected.\r\n * @param coreContext - Context of the module using the component.\r\n * @param productData - Product card to be rendered.\r\n * @returns The product card image url.\r\n */\r\nfunction getProductImageUrlFromDefaultColorSwatch(coreContext: ICoreContext, productData?: ProductSearchResult): string | undefined {\r\n const siteContext = coreContext as ICoreContext<IDimensionsApp>;\r\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\r\n if (dimensionToPreSelectInProductCard === DimensionTypes.none) {\r\n return productData?.PrimaryImageUrl;\r\n }\r\n const defaultSwatch = getDefaultColorSwatchSelected(productData);\r\n return defaultSwatch && ArrayExtensions.hasElements(defaultSwatch.ProductImageUrls) ? generateImageUrl(\r\n defaultSwatch.ProductImageUrls[0], coreContext.request.apiSettings) : productData?.PrimaryImageUrl;\r\n}\r\n\r\n/**\r\n * Updates the product url link to product details page.\r\n * @param productDetailsPageUrl - Product page url.\r\n * @param coreContext - Context of the module using the component.\r\n * @param queryString - Querystring to be added to the URL.\r\n * @returns The update product page url.\r\n */\r\nfunction updateProductUrl(productDetailsPageUrl: string, coreContext: ICoreContext, queryString: string): string {\r\n const sourceUrl = new URL(productDetailsPageUrl, coreContext.request.apiSettings.baseUrl);\r\n if (sourceUrl.search) {\r\n sourceUrl.search += `&${queryString}`;\r\n } else {\r\n sourceUrl.search += queryString;\r\n }\r\n\r\n const updatedUrl = new URL(sourceUrl.href);\r\n return updatedUrl.pathname + sourceUrl.search;\r\n}\r\n\r\n/**\r\n * Gets the react node for product unit of measure display.\r\n * @param unitOfMeasure - DefaultUnitOfMeasure property from product.\r\n * @returns The node representing markup for unit of measure component.\r\n */\r\nfunction renderProductUnitOfMeasure(unitOfMeasure?: string): JSX.Element | null {\r\n if (!unitOfMeasure) {\r\n return null;\r\n }\r\n return (\r\n <div className='msc-product__unit-of-measure'>\r\n <span>\r\n {unitOfMeasure}\r\n </span>\r\n </div>\r\n );\r\n}\r\n\r\n/**\r\n * Gets the react node for product availability.\r\n * @param inventoryAvailabilityLabel - The product information.\r\n * @returns The node representing markup for product availability.\r\n */\r\nfunction renderProductAvailability(inventoryAvailabilityLabel: string | undefined): JSX.Element | null {\r\n if (!inventoryAvailabilityLabel || inventoryAvailabilityLabel === '') {\r\n return null;\r\n }\r\n\r\n return (\r\n <div className='msc-product__availability'>\r\n <span>\r\n {inventoryAvailabilityLabel}\r\n </span>\r\n </div>\r\n );\r\n}\r\n\r\n/**\r\n * Gets the product page url from the default swatch selected.\r\n * @param coreContext - Context of the module using the component.\r\n * @param productUrl - Product page url for the product card.\r\n * @param productData - Product card to be rendered.\r\n * @returns The product card image url.\r\n */\r\nfunction getProductPageUrlFromDefaultSwatch(coreContext: ICoreContext, productUrl: string, productData?: ProductSearchResult): string | undefined {\r\n const siteContext = coreContext as ICoreContext<IDimensionsApp>;\r\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\r\n if (dimensionToPreSelectInProductCard === DimensionTypes.none) {\r\n return productUrl;\r\n }\r\n\r\n const defaultSwatch = getDefaultColorSwatchSelected(productData);\r\n if (!defaultSwatch || !defaultSwatch.SwatchValue) {\r\n return productUrl;\r\n }\r\n\r\n const queryString = `color=${defaultSwatch.SwatchValue}`;\r\n return updateProductUrl(productUrl, coreContext, queryString);\r\n}\r\n\r\nconst ProductCard: React.FC<IProductComponentProps> = ({\r\n data,\r\n context,\r\n imageSettings,\r\n savingsText,\r\n freePriceText,\r\n originalPriceText,\r\n currentPriceText,\r\n ratingAriaLabel,\r\n ratingCountAriaLabel,\r\n allowBack,\r\n typeName,\r\n id,\r\n telemetryContent,\r\n quickViewButton,\r\n isEnabledProductDescription,\r\n isPriceMinMaxEnabled,\r\n priceResources,\r\n inventoryLabel,\r\n dimensionAvailabilities\r\n}) => {\r\n const product = data.product;\r\n let productUrl = getProductPageUrlSync(product?.Name ?? '', product?.RecordId ?? Number.MIN_VALUE, context.actionContext, undefined);\r\n if (allowBack) {\r\n productUrl = updateProductUrl(productUrl, context, 'back=true');\r\n }\r\n const productImageUrlFromSwatch = getProductImageUrlFromDefaultColorSwatch(context, product) ?? product?.PrimaryImageUrl;\r\n const productPageUrlFromSwatch = getProductPageUrlFromDefaultSwatch(context, productUrl, product) ?? productUrl;\r\n const [productPageUrl = productPageUrlFromSwatch, setProductPageUrl] = useState<string | undefined>();\r\n const [productImageUrl = productImageUrlFromSwatch, setProductImageUrl] = useState<string | undefined>();\r\n const [selectedSwatchItems] = useState(new Dictionary<DimensionTypes, ISwatchItem>());\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-member-access -- app context is generic\r\n const enableStockCheck = context.app.config.enableStockCheck;\r\n\r\n /**\r\n * Updates the product page and Image url based on swatch selected.\r\n * @param coreContext - Context of the caller.\r\n * @param swatchItem - Dimension swatch selected.\r\n */\r\n const updatePageAndImageUrl = React.useCallback((coreContext: ICoreContext, swatchItem: ISwatchItem) => {\r\n const dimensionType = swatchItem.dimensionType;\r\n selectedSwatchItems.setValue(dimensionType, swatchItem);\r\n if (StringExtensions.isNullOrWhitespace(swatchItem.value)) {\r\n return;\r\n }\r\n const queryString = `${dimensionType}=${swatchItem.value}`;\r\n let productPageUrlWithSwatch = '';\r\n if (productPageUrl.includes(dimensionType)) {\r\n const newUrl = new URL(productPageUrl, coreContext.request.apiSettings.baseUrl);\r\n newUrl.searchParams.delete(dimensionType);\r\n productPageUrlWithSwatch = updateProductUrl(newUrl.toString(), context, queryString);\r\n } else {\r\n productPageUrlWithSwatch = updateProductUrl(productPageUrl, context, queryString);\r\n }\r\n setProductPageUrl(productPageUrlWithSwatch);\r\n if (dimensionType === DimensionTypes.color) {\r\n const swatchProductImageUrl = ArrayExtensions.hasElements(swatchItem.productImageUrls) ? swatchItem.productImageUrls[0] : undefined;\r\n const newImageUrl = generateImageUrl(swatchProductImageUrl, coreContext.request.apiSettings);\r\n setProductImageUrl(newImageUrl);\r\n }\r\n }, [selectedSwatchItems, context, productPageUrl]);\r\n\r\n if (!product) {\r\n return null;\r\n }\r\n\r\n /**\r\n * Checks if rendering the particular dimensions is allowed for product card.\r\n * @param dimensionType - Dimension to be displayed.\r\n * @returns Updates the state with new product page url.\r\n */\r\n function shouldDisplayDimension(dimensionType: string): boolean {\r\n const dimensionsContext = context as ICoreContext<IDimensionsApp>;\r\n const dimensionsToDisplayOnProductCard = dimensionsContext.app.config.dimensionsInProductCard;\r\n return ArrayExtensions.hasElements(dimensionsToDisplayOnProductCard) &&\r\n !dimensionsToDisplayOnProductCard.includes(DimensionTypes.none) &&\r\n dimensionsToDisplayOnProductCard.includes(dimensionType.toLocaleLowerCase() as DimensionTypes);\r\n }\r\n\r\n /**\r\n * Gets the react node for product dimension as swatch.\r\n * @param attributeValues - Attribute value property from product.\r\n * @returns The node representing markup for unit of measure component.\r\n */\r\n function renderProductDimensions(attributeValues?: AttributeValue[]): JSX.Element | null {\r\n if (!attributeValues) {\r\n return null;\r\n }\r\n\r\n return (\r\n <div className='msc-product__dimensions'>\r\n {\r\n attributeValues.map((item: AttributeValue) => {\r\n const dimensionTypeValue = item.KeyName?.toLocaleLowerCase() ?? '';\r\n if (!shouldDisplayDimension(dimensionTypeValue)) {\r\n return null;\r\n }\r\n\r\n const siteContext = context as ICoreContext<IDimensionsApp>;\r\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\r\n const dimensionType = dimensionTypeValue as DimensionTypes;\r\n const swatches = item.Swatches?.map<ISwatchItem>(swatchItem => {\r\n return {\r\n itemId: `${item.RecordId ?? ''}-${dimensionTypeValue}-${swatchItem.SwatchValue ?? ''}`,\r\n value: swatchItem.SwatchValue ?? '',\r\n dimensionType,\r\n colorHexCode: swatchItem.SwatchColorHexCode,\r\n imageUrl: swatchItem.SwatchImageUrl,\r\n productImageUrls: swatchItem.ProductImageUrls,\r\n isDefault: swatchItem.IsDefault,\r\n isDisabled: enableStockCheck && dimensionAvailabilities?.find(\r\n dimensionAvailability => dimensionAvailability.value === (swatchItem.SwatchValue ?? ''))?.isDisabled\r\n };\r\n }) ?? [];\r\n if (dimensionToPreSelectInProductCard !== DimensionTypes.none && ArrayExtensions.hasElements(swatches) &&\r\n !swatches.some(swatch => swatch.isDefault) && dimensionType === DimensionTypes.color) {\r\n swatches[0].isDefault = true;\r\n }\r\n return (\r\n <ProductComponentSwatchComponent\r\n context={context}\r\n swatches={swatches}\r\n onSelectDimension={updatePageAndImageUrl}\r\n key={item.RecordId}\r\n />\r\n );\r\n })\r\n }\r\n </div>\r\n );\r\n }\r\n\r\n function renderQuickView(quickview: React.ReactNode, item?: number): JSX.Element | undefined {\r\n if (quickview === null) {\r\n return undefined;\r\n }\r\n const selectedDimensions: ProductDimension[] = selectedSwatchItems.getValues().map<ProductDimension>(swatches => {\r\n return {\r\n DimensionTypeValue: convertDimensionTypeToProductDimensionType(swatches.dimensionType),\r\n DimensionValue: {\r\n RecordId: 0,\r\n Value: swatches.value\r\n }\r\n };\r\n });\r\n return React.cloneElement(quickview as React.ReactElement, { selectedProductId: item, selectedDimensions });\r\n }\r\n\r\n // Construct telemetry attribute to render\r\n const payLoad = getPayloadObject('click', telemetryContent!, '', product.RecordId.toString());\r\n\r\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- -- Do not need type check for appsettings\r\n const isUnitOfMeasureEnabled = context.app.config && context.app.config.unitOfMeasureDisplayType === 'buyboxAndBrowse';\r\n return (\r\n <>\r\n {isEnabledProductDescription ? <a\r\n href={productPageUrl}\r\n onClick={onTelemetryClick(telemetryContent!, payLoad, product.Name!)}\r\n aria-label={renderLabel(\r\n product.Name,\r\n context.cultureFormatter.formatCurrency(product.Price),\r\n product.AverageRating, ratingAriaLabel,\r\n product.TotalRatings, ratingCountAriaLabel)}\r\n className='msc-product' {...attribute}>\r\n <div className='msc-product__image__description'>\r\n <div className='msc-product__image'>\r\n {renderProductPlacementImage(imageSettings, context.request.gridSettings, productImageUrl,\r\n product.PrimaryImageUrl, product.Name, context)}\r\n </div>\r\n <div className='msc-product__title_description'>\r\n <h5 className='msc-product__title__text'>\r\n {product.Name}\r\n </h5>\r\n {renderPrice(context, typeName, id, product.BasePrice, product.Price, savingsText, freePriceText, originalPriceText, currentPriceText, isPriceMinMaxEnabled, priceResources)}\r\n {isUnitOfMeasureEnabled && renderProductUnitOfMeasure(product.DefaultUnitOfMeasure)}\r\n {renderDescription(product.Description)}\r\n </div>\r\n </div>\r\n </a> : <a\r\n href={productPageUrl}\r\n onClick={onTelemetryClick(telemetryContent!, payLoad, product.Name!)}\r\n aria-label={renderLabel(product.Name, context.cultureFormatter.formatCurrency(product.Price),\r\n product.AverageRating, ratingAriaLabel)}\r\n className='msc-product' {...attribute}>\r\n <div className='msc-product__image'>\r\n {renderProductPlacementImage(imageSettings, context.request.gridSettings, productImageUrl, product.PrimaryImageUrl, product.Name, context)}\r\n </div>\r\n <div className='msc-product__details'>\r\n <h5 className='msc-product__title'>\r\n {product.Name}\r\n </h5>\r\n {renderPrice(context, typeName, id, product.BasePrice, product.Price, savingsText, freePriceText, originalPriceText, currentPriceText, isPriceMinMaxEnabled, priceResources)}\r\n {isUnitOfMeasureEnabled && renderProductUnitOfMeasure(product.DefaultUnitOfMeasure)}\r\n </div>\r\n </a>}\r\n {renderProductDimensions(product.AttributeValues)}\r\n {!context.app.config.hideRating && renderRating(context, typeName, id, product.AverageRating, product.TotalRatings, ratingAriaLabel, ratingCountAriaLabel)}\r\n {renderProductAvailability(inventoryLabel)}\r\n {quickViewButton && renderQuickView(quickViewButton, product.RecordId)}\r\n </>\r\n );\r\n};\r\n\r\nfunction renderLabel(\r\n name?: string,\r\n price?: string,\r\n rating?: number,\r\n ratingAriaLabelText?: string,\r\n reviewCount?: number,\r\n ratingCountAriaLabelText?: string): string {\r\n const reviewCountArialableText = getReviewAriaLabel(reviewCount, ratingCountAriaLabelText ?? '');\r\n return (\r\n `${name ?? ''} ${price ?? ''} ${getRatingAriaLabel(rating, ratingAriaLabelText)}${reviewCountArialableText ? ` ${reviewCountArialableText}` : ''}`\r\n );\r\n}\r\n\r\nfunction renderDescription(description?: string): JSX.Element | null {\r\n return (<p className='msc-product__text'>\r\n {description}\r\n </p>);\r\n}\r\n\r\nfunction getRatingAriaLabel(rating?: number, ratingAriaLabel?: string): string {\r\n if (rating && ratingAriaLabel) {\r\n const roundedRating = rating.toFixed(2);\r\n return format(ratingAriaLabel || '', roundedRating, '5');\r\n }\r\n return '';\r\n}\r\n\r\nfunction getReviewAriaLabel(reviewCount?: number, ratingCountAriaLabelText?: string): string {\r\n if (reviewCount && ratingCountAriaLabelText) {\r\n return format(ratingCountAriaLabelText || '', reviewCount);\r\n }\r\n return '';\r\n}\r\n\r\nfunction renderRating(coreContext: ICoreContext, moduleTypeName: string, moduleId: string, avgRating?: number,\r\n totalRatings?: number, ariaLabel?: string, ratingCountAriaLabel?: string): JSX.Element | null {\r\n if (!avgRating) {\r\n return null;\r\n }\r\n\r\n const numberRatings = totalRatings?.toString() || undefined;\r\n const ratingAriaLabelText = getRatingAriaLabel(avgRating, ariaLabel);\r\n const ratingCountAriaLabelText = getReviewAriaLabel(Number(numberRatings), ratingCountAriaLabel);\r\n\r\n return (\r\n <RatingComponent\r\n context={coreContext}\r\n id={moduleId}\r\n typeName={moduleTypeName}\r\n avgRating={avgRating}\r\n ratingCount={numberRatings}\r\n readOnly\r\n ariaLabel={ratingAriaLabelText}\r\n ratingCountAriaLabel={ratingCountAriaLabelText}\r\n data={{}}\r\n />\r\n );\r\n}\r\n\r\nfunction renderPrice(context: ICoreContext, typeName: string, id: string, basePrice?: number, adjustedPrice?: number, savingsText?: string, freePriceText?: string, originalPriceText?: string, currentPriceText?: string, isPriceMinMaxEnabled?: boolean, priceResources?: IPriceComponentResources): JSX.Element | null {\r\n const price: ProductPrice = {\r\n BasePrice: basePrice,\r\n AdjustedPrice: adjustedPrice,\r\n CustomerContextualPrice: adjustedPrice\r\n };\r\n const priceComponent = (\r\n <PriceComponent\r\n context={context}\r\n id={id}\r\n typeName={typeName}\r\n data={{ price }}\r\n savingsText={savingsText}\r\n freePriceText={freePriceText}\r\n originalPriceText={originalPriceText}\r\n isPriceMinMaxEnabled={isPriceMinMaxEnabled}\r\n priceResources={priceResources}\r\n />\r\n );\r\n //console.log(priceResources);\r\n return (\r\n LoginToViewPricingComponent(\r\n context.request,\r\n priceResources?.loginToViewPricingText || '',\r\n priceComponent,\r\n true\r\n )\r\n );\r\n}\r\n\r\nfunction renderProductPlacementImage(imageSettings?: IImageSettings, gridSettings?: IGridSettings,\r\n imageUrl?: string, fallbackImageUrl?: string, altText?: string,\r\n context?: ICoreContext): JSX.Element | null {\r\n if (!imageUrl || !gridSettings || !imageSettings) {\r\n return null;\r\n }\r\n const img: IImageData = {\r\n src: imageUrl,\r\n altText: altText ? altText : '',\r\n fallBackSrc: fallbackImageUrl\r\n };\r\n const imageProps = {\r\n gridSettings,\r\n imageSettings\r\n };\r\n imageProps.imageSettings.cropFocalRegion = true;\r\n return (\r\n <Image\r\n requestContext={context?.actionContext.requestContext} {...img} {...imageProps}\r\n loadFailureBehavior='empty' />\r\n );\r\n}\r\n\r\nexport const ProductComponent: React.FunctionComponent<IProductComponentProps> = msdyn365Commerce.createComponentOverride<IProductComponent>(\r\n 'Product',\r\n { component: ProductCard, ...PriceComponentActions }\r\n);\r\n\r\nexport default ProductComponent;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { IOrderTemplateListViewProps, ISingleOrderTemplateViewProps } from '@msdyn365-commerce-modules/order-template';\r\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { INodeProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport CreateNewTemplateButtonComponent from './components/create-order-template.component';\r\nimport * as React from 'react';\r\n\r\nimport { IOrderTemplateListProps, IOrderTemplateListResources } from '../definition-extensions/order-template-list.ext.props.autogenerated';\r\nimport { IOrderTemplateNameDialogResources } from \"@msdyn365-commerce/components\";\r\n\r\n/**\r\n * Interface for OrderTemplateImage.\r\n */\r\ninterface IOrderTemplateImage {\r\n props: {\r\n children: React.ReactElement[];\r\n };\r\n}\r\n\r\n/**\r\n * To render order template.\r\n * @param orderTemplate - The order template view props.\r\n * @param orderTemplateNodeProps - The order template node props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderOrderTemplate = (orderTemplate: ISingleOrderTemplateViewProps, orderTemplateNodeProps?: INodeProps): JSX.Element | null => {\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from module file\r\n const { key, addToCartButton, orderTemplateImage, orderTemplateStatusMessage, removeButton, orderTemplateName } = orderTemplate;\r\n\r\n const orderTemplateImageElement: IOrderTemplateImage = orderTemplateImage as React.ReactElement;\r\n const currentImageListLength = orderTemplateImageElement.props.children.length;\r\n const defaultNumberImagesInTile = 4;\r\n\r\n if (currentImageListLength < defaultNumberImagesInTile) {\r\n for (let index = 0; index < defaultNumberImagesInTile - currentImageListLength; index++) {\r\n orderTemplateImageElement.props.children.push(<picture />);\r\n }\r\n }\r\n\r\n return (\r\n <Node key={key} className={orderTemplateNodeProps!.className} {...orderTemplateNodeProps}>\r\n {orderTemplateName}\r\n {orderTemplateImage}\r\n {addToCartButton}\r\n {removeButton}\r\n {orderTemplateStatusMessage}\r\n </Node>\r\n );\r\n};\r\n\r\nconst _reloadPage = async () => {\r\n window.location.reload();\r\n};\r\n\r\nconst _generateOrderTemplateNameDialogResources = (resources: IOrderTemplateListResources): IOrderTemplateNameDialogResources => {\r\n return {\r\n orderTemplateHeaderLabel: resources.createOrderTemplateHeader,\r\n orderTemplateTitleLabel: resources.orderTemplateTitle,\r\n orderTemplateNameAriaLabel: resources.orderTemplateNameAriaLabel,\r\n orderTemplateDescription: resources.createOrderTemplateDescription,\r\n\r\n defaultOrderTemplateName: resources.defaultOrderTemplateName,\r\n\r\n orderTemplateButtonLabel: resources.createOrderTemplateButtonText,\r\n orderTemplateCancelButtonLabel: resources.cancelNewOrderTemplateCreationButtonText\r\n };\r\n}\r\n\r\n/**\r\n * Order Template List View.\r\n * @param props - The view props.\r\n * @returns The JSX Element.\r\n */\r\nexport const OrderTemplateListViewComponent: React.FC<IOrderTemplateListViewProps & IOrderTemplateListProps<IOrderTemplateListResources>> = props => {\r\n const {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from module file\r\n OrderTemplateList, OrderTemplates, OrderTemplate,\r\n status,\r\n statusMessage,\r\n heading,\r\n orderTemplates,\r\n createOrderTemplateButton,\r\n templateHeaderStatusMessage\r\n } = props;\r\n console.log(createOrderTemplateButton)\r\n return (\r\n <Module {...OrderTemplateList}>\r\n {heading}\r\n {status !== 'SUCCESS' && statusMessage}\r\n {status === 'EMPTY' && (\r\n <CreateNewTemplateButtonComponent\r\n context={props.context}\r\n id={props.id}\r\n typeName={props.typeName}\r\n data={{}}\r\n createOrderTemplateText={props.resources.createNewTemplateButtonText}\r\n onOrderTemplateCreated={_reloadPage}\r\n createOrderTemplateDialogResources={_generateOrderTemplateNameDialogResources(props.resources)}\r\n />\r\n )}\r\n <Node className=''>\r\n {status === 'SUCCESS' &&\r\n (!OrderTemplates || !orderTemplates ||\r\n !ArrayExtensions.hasElements(orderTemplates)) ? (\r\n <div className='ms-order-template__empty-list'>\r\n <h2 className='ms-order-template__empty-list-heading'>\r\n {props.resources.headingForEmptyOrderTemplateList}\r\n </h2>\r\n <p className='ms-order-template__empty-list-text'>\r\n {props.resources.textForEmptyOrderTemplateList}\r\n </p>\r\n {createOrderTemplateButton}\r\n </div>\r\n ) : createOrderTemplateButton}\r\n {templateHeaderStatusMessage}\r\n </Node>\r\n { OrderTemplates && orderTemplates && ArrayExtensions.hasElements(orderTemplates) &&\r\n <Node {...OrderTemplates}>\r\n {orderTemplates.map((orderTemplate) => {\r\n return renderOrderTemplate(orderTemplate, OrderTemplate);\r\n })}\r\n </Node>}\r\n </Module>\r\n );\r\n};\r\n\r\nexport default OrderTemplateListViewComponent;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { IPriceComponentResources } from \"./components/price.component\";\r\nimport { ProductPrice, ProductSearchResult, SimpleProduct } from \"@msdyn365-commerce/retail-proxy\";\r\nimport { ArrayExtensions, getProductPageUrlSync } from \"@msdyn365-commerce-modules/retail-actions\";\r\nimport {\r\n ICategoryHierarchyViewProps,\r\n IRefineMenuViewProps,\r\n ISearchResultContainerViewProps,\r\n ISearchResultModalViewProps,\r\n ISortByViewProps,\r\n ITitleViewProps\r\n} from \"@msdyn365-commerce-modules/search-result-container\";\r\nimport { Button, getTelemetryObject, IPopupProps, Module, Node, Popup } from \"@msdyn365-commerce-modules/utilities\";\r\nimport React, { PropsWithChildren, useState } from \"react\";\r\nimport { ISearchResultContainerProps } from \"../definition-extensions/search-result-container.ext.props.autogenerated\";\r\nimport { ProductComponent } from \"./components/product.component\";\r\nimport {\r\n getUrlSync,\r\n IGridSettings,\r\n IImageData,\r\n IImageProps,\r\n IImageSettings,\r\n Image,\r\n IRequestContext\r\n} from \"@msdyn365-commerce/core\";\r\nimport { AddToCartListComponent } from \"./components/addToCart.component\";\r\nimport { IProductSearchResultExtensionData } from \"./product-result-container.data\";\r\nimport Table from \"reactstrap/lib/Table\";\r\nimport { LoginToViewPricingComponent } from \"../../../components/LoginToViewPricing.component\";\r\nimport { SupersessionKey } from \"../models/SupersessionKey\";\r\nimport { CommercePropertyValueEnum } from \"../../../modules/allowable-freight/utils/CommercePropertyValueEnum\";\r\nimport { getInventoryLevelRangesAsync } from \"../../../actions/DataActionExtension.g\";\r\nimport { IItemInventoryLevelProfileEntity, IProfileDataMap } from \"../../../actions/DataServiceEntities.g\";\r\nimport getExtensionPropertyValueByKey from \"../../../utils/getExtensionPropertyValueByKey\";\r\nimport { EligibleItems } from \"../../../modules/eve-quick-order/eve-quick-order\";\r\nimport GetProductEligibilityAction, {\r\n GetProductEligibilityInput\r\n} from \"../../../actions/get-product-eligibility.action\";\r\n/**\r\n * DescriptionInterval.\r\n */\r\nenum DescriptionInterval {\r\n productDescriptionInterval = 14,\r\n productDescriptionIntervalRemainder0 = 0,\r\n productDescriptionIntervalRemainder9 = 9\r\n}\r\n\r\n/**\r\n * Render Clear button for mobile viewport.\r\n * @param props - The view props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderProductCards = (props: PropsWithChildren<ISearchResultContainerViewProps & ISearchResultContainerProps<{}>>): JSX.Element | null => {\r\n const products = props.data.listPageState.result?.activeProducts;\r\n if (!products || !ArrayExtensions.hasElements(products)) {\r\n return null;\r\n }\r\n return (\r\n <Node {...props.ProductsContainer}>\r\n {props.errorMessage}\r\n <ul className=\"list-unstyled\">\r\n {products.map((product: ProductSearchResult, index: number) => renderProductCardsDescription(props, product, index, false))}\r\n </ul>\r\n </Node>\r\n );\r\n};\r\n\r\n\r\n/**\r\n * Returns the product inventory label.\r\n * @param channelInventoryConfigurationId - The channel configuration Id.\r\n * @param product - The product.\r\n * @returns The inventory label.\r\n */\r\nfunction getInventoryLabel(channelInventoryConfigurationId: number | undefined, product: ProductSearchResult): string | undefined {\r\n if (!channelInventoryConfigurationId || !ArrayExtensions.hasElements(product.AttributeValues)) {\r\n return undefined;\r\n }\r\n const inventoryAttribute = product.AttributeValues.find(attribute => attribute.RecordId === channelInventoryConfigurationId);\r\n if (inventoryAttribute) {\r\n return inventoryAttribute.TextValue;\r\n }\r\n return undefined;\r\n}\r\n\r\n/**\r\n * Render Clear button for mobile viewport.\r\n * @param props - The view props.\r\n * @param product - The product item data.\r\n * @param index - The index of each product item.\r\n * @param isEnabledProductDescription - The flag for showing Product desription tile.\r\n * @returns The JSX Element.\r\n */\r\nconst renderProductCardsDescription = (\r\n props: PropsWithChildren<ISearchResultContainerViewProps & ISearchResultContainerProps<{}>>,\r\n product: ProductSearchResult,\r\n index: number,\r\n isEnabledProductDescription?: boolean): JSX.Element | null => {\r\n const { config, context, resources } = props;\r\n const telemetryContent = getTelemetryObject(props.context.request.telemetryPageName!, props.friendlyName, props.telemetry);\r\n const breadCrumbType = props.context.app.config.breadcrumbType;\r\n const isAllowBack = props.config.allowBackNavigation && (breadCrumbType === \"back\" || breadCrumbType === \"categoryAndBack\");\r\n const classname = isEnabledProductDescription ? \"ms-product-search-result__item product__description\" : \"ms-product-search-result__item\";\r\n const quickviewslot = ArrayExtensions.hasElements(props.slots.quickview) ? props.slots.quickview[0] : undefined;\r\n const channelInventoryConfigurationId = props.data.products.result?.channelInventoryConfigurationId;\r\n // @ts-ignore\r\n const isPriceMinMaxFeatureState = props.data.featureState.result?.find(\r\n featureState => featureState.Name === \"Dynamics.AX.Application.RetailSearchPriceRangeFeature\");\r\n const priceResources: IPriceComponentResources = {\r\n priceRangeSeparator: resources.priceRangeSeparator,\r\n loginToViewPricingText: resources.loginToViewPricing\r\n };\r\n return (\r\n <li className={classname} key={index}>\r\n <ProductComponent\r\n context={context}\r\n telemetryContent={telemetryContent}\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 allowBack={isAllowBack}\r\n id={props.id}\r\n typeName={props.typeName}\r\n data={{ product }}\r\n quickViewButton={quickviewslot}\r\n isEnabledProductDescription={isEnabledProductDescription}\r\n inventoryLabel={getInventoryLabel(channelInventoryConfigurationId, product)}\r\n isPriceMinMaxEnabled={isPriceMinMaxFeatureState?.IsEnabled}\r\n priceResources={priceResources}\r\n />\r\n </li>\r\n );\r\n};\r\n\r\n/**\r\n * Render Clear button for mobile viewport.\r\n * @param props - The view props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderProducts = (props: PropsWithChildren<ISearchResultContainerViewProps & ISearchResultContainerProps<{}>>): JSX.Element | null => {\r\n const products = props.data.listPageState.result?.activeProducts;\r\n if (!products || !ArrayExtensions.hasElements(products)) {\r\n return null;\r\n }\r\n const productDescriptionInterval: number = DescriptionInterval.productDescriptionInterval;\r\n const productDescriptionIntervalRemainder0: number = DescriptionInterval.productDescriptionIntervalRemainder0;\r\n const productDescriptionIntervalRemainder9: number = DescriptionInterval.productDescriptionIntervalRemainder9;\r\n return (\r\n <Node {...props.ProductsContainer}>\r\n {props.errorMessage}\r\n <ul className=\"list-unstyled\">\r\n {products.map((product: ProductSearchResult, index: number) => (\r\n (index % productDescriptionInterval === productDescriptionIntervalRemainder0) ||\r\n (index % productDescriptionInterval === productDescriptionIntervalRemainder9) ? renderProductCardsDescription(props, product,\r\n index, true) : renderProductCardsDescription(props, product, index, false)\r\n ))}\r\n </ul>\r\n </Node>\r\n );\r\n};\r\n\r\n/**\r\n * Render Title Count.\r\n * @param props - The title view props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderTitleCount = (props: ITitleViewProps): JSX.Element | null => {\r\n const { title, TitleContainer } = props;\r\n return (\r\n <Node {...TitleContainer}>\r\n {title.titleCount}\r\n </Node>\r\n );\r\n};\r\n\r\n/**\r\n * Render Category Hierarchy.\r\n * @param props - The category hierarchy view props.\r\n * @returns The JSX Element.\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\n/**\r\n * Render the category page items.\r\n * @param props - The view props.\r\n * @returns The search Result container module view.\r\n */\r\nconst SearchResultContainerView: React.FC<ISearchResultContainerViewProps & ISearchResultContainerProps<IProductSearchResultExtensionData>> = props => {\r\n const {\r\n SearchResultContainer,\r\n pagination,\r\n ProductSectionContainer,\r\n choiceSummary,\r\n isMobile,\r\n modalToggle,\r\n searchResultModal,\r\n TitleViewProps,\r\n refineMenu,\r\n categoryHierarchy,\r\n sortByOptions,\r\n CategoryNavContainer,\r\n RefineAndProductSectionContainer,\r\n FeatureSearchContainer,\r\n similarLookProduct,\r\n errorMessage,\r\n productPrices,\r\n context: {\r\n request,\r\n cultureFormatter,\r\n actionContext,\r\n actionContext: {\r\n requestContext: {\r\n gridSettings,\r\n user: { isAuthenticated }\r\n }\r\n }\r\n },\r\n resources: {\r\n filterText, partNoHeading,\r\n descriptionHeading,\r\n availabilityHeading,\r\n quantityHeading,\r\n listPriceHeading,\r\n yourPriceHeading,\r\n // loginToViewPricing,\r\n loginToViewPricingAndAvailabilityText,\r\n supersededFromText,\r\n priceAndAvailabilityHeading,\r\n goToCartText,\r\n continueShoppingText,\r\n addToCartModalHeading,\r\n addToCartText\r\n },\r\n data: {\r\n cart,\r\n listPageState: productSearchResults,\r\n manufacturerCodes\r\n },\r\n config: { enableProdutDescription, listView, imageSettings }\r\n } = props;\r\n\r\n\r\n if (request.query) {\r\n const searchTerm = request.query['q'];\r\n const codes = manufacturerCodes?.result as any;\r\n\r\n productSearchResults.result?.activeProducts.forEach((p, i) => {\r\n let matched;\r\n\r\n if (searchTerm && p.ItemId?.toLowerCase() === searchTerm.toLowerCase() || p.ItemId?.substring(3, p.ItemId.length) === searchTerm) {\r\n matched = p;\r\n console.log('code matched');\r\n } else {\r\n\r\n for (let i = 0; i < codes.manufacturerCodes.length; i++) {\r\n if (codes.manufacturerCodes[i].GDNManufacturerCode + searchTerm === p.ItemId) {\r\n matched = p;\r\n console.log('mfr code matched');\r\n break;\r\n }\r\n }\r\n }\r\n if (matched) {\r\n productSearchResults.result?.activeProducts.splice(i, 1);\r\n productSearchResults.result?.activeProducts.unshift(p);\r\n }\r\n });\r\n }\r\n\r\n const [eligbilityList, setEligbilityList] = useState<EligibleItems>([]);\r\n const [isEligibilityChecked, setEligibilityChecked] = useState<boolean>(false);\r\n const [areInventoryRangesChecked, setAreInventoryRangesChecked] = useState<boolean>(false);\r\n const [inventoryRangesList, setInventoryRangesList] = useState<IProfileDataMap[]>([]);\r\n\r\n const getProductEligibility = async (): Promise<void> => {\r\n if (isEligibilityChecked) {\r\n return;\r\n }\r\n const itemIds = props.data.products?.result?.products.map(p => p.ItemId!) || [];\r\n if (!itemIds.length) {\r\n return;\r\n }\r\n const cart = props.data.cart.result?.cart;\r\n // if (!cart) {\r\n // return;\r\n // }\r\n const input = new GetProductEligibilityInput(itemIds, false, cart?.Id || '', null, null, null);\r\n const eligibilityData = await GetProductEligibilityAction(input, props.context.actionContext);\r\n setEligibilityChecked(true);\r\n let list: EligibleItems = [];\r\n\r\n eligibilityData.forEach((i: any) => {\r\n const id = getExtensionPropertyValueByKey(i.ExtensionProperties, \"ItemId\", CommercePropertyValueEnum.string);\r\n list.push({\r\n ItemId: String(id),\r\n IsEligible: i.IsEligible,\r\n IsAssorted: true\r\n });\r\n });\r\n setEligbilityList(list);\r\n void getInvProfs();\r\n }\r\n\r\n const getInvProfs = async (): Promise<void> => {\r\n if (areInventoryRangesChecked) {\r\n return;\r\n }\r\n const itemIds = props.data.products?.result?.products.map(p => p.ItemId!) || [];\r\n const resp = await getInventoryLevelRangesAsync({ callerContext: props.context.actionContext }, itemIds);\r\n setAreInventoryRangesChecked(true);\r\n setInventoryRangesList(resp);\r\n }\r\n\r\n React.useEffect(() => {\r\n if (isAuthenticated) {\r\n void getProductEligibility();\r\n }\r\n }, [props.data.products]);\r\n\r\n const [isExpanded, setIsExpanded] = useState<boolean>(false);\r\n const [modalOpen, setModalOpen] = React.useState<boolean>(false);\r\n const [addedProduct, setAddedProduct] = React.useState<SimpleProduct | undefined>(undefined);\r\n const [productPricing, setProductPricing] = React.useState<ProductPrice | undefined>(undefined);\r\n const toggle = () => {\r\n setIsExpanded(!isExpanded);\r\n };\r\n\r\n const isRecoSearchPage = props.context.actionContext.requestContext.query?.recommendation;\r\n\r\n const setModalProps = (product: SimpleProduct, price: ProductPrice): IPopupProps => {\r\n return {\r\n modalOpen: modalOpen,\r\n context: props.context,\r\n className: 'list-view__modal',\r\n gridSettings,\r\n imageSettings,\r\n priceComponent: props.component,\r\n id: \"1\",\r\n productQuantity: 1,\r\n navigationUrl: getUrlSync('cart', actionContext),\r\n setModalOpen: (value) => setModalOpen(value),\r\n typeName: \"Add To Cart\",\r\n data: { product, price },\r\n dialogStrings: {\r\n goToCartText: goToCartText,\r\n currentPriceText: '',\r\n continueShoppingText: continueShoppingText,\r\n freePriceText: '',\r\n headerItemOneText: addToCartModalHeading,\r\n headerItemFormatText: '',\r\n originalPriceText: '',\r\n headerMessageText: ''\r\n }\r\n }\r\n }\r\n\r\n const handleAddToCart = (productId: number, quantity: number) => {\r\n const foundProduct = productSearchResults.result?.activeProducts.find(pr => pr.RecordId === productId);\r\n if (!foundProduct) {\r\n return;\r\n }\r\n const product: SimpleProduct = {\r\n BasePrice: foundProduct.BasePrice || foundProduct.Price,\r\n AdjustedPrice: foundProduct.Price,\r\n Name: foundProduct.Name,\r\n RecordId: foundProduct.RecordId,\r\n ItemId: foundProduct.ItemId,\r\n ProductTypeValue: 1,\r\n Price: foundProduct.Price,\r\n }\r\n setAddedProduct(product);\r\n setProductPricing(getProductPrice(productPrices, product.RecordId))\r\n cart.result?.addProductToCart({\r\n product,\r\n count: quantity,\r\n }).then((response) => {\r\n if (response.status === \"SUCCESS\" && props.app.config.addToCartBehavior === 'showModal') {\r\n\r\n setModalOpen(true);\r\n }\r\n });\r\n }\r\n\r\n const getProductSupersessionProperty = (product: ProductSearchResult, extensionKey: SupersessionKey) => {\r\n const properties = product.ExtensionProperties;\r\n if (properties) {\r\n return properties.find(pr => pr.Key === extensionKey)?.Value?.StringValue || null;\r\n }\r\n return null;\r\n }\r\n\r\n const renderAddtoCartButton = (pr: ProductSearchResult, courseId: any, courseInCartText: string) => {\r\n if (isAuthenticated) {\r\n const item: any = eligbilityList.find(i => i.ItemId === pr.ItemId);\r\n\r\n const currentInvString = getProductSupersessionProperty(pr, SupersessionKey.Inventory) || '0';\r\n const currentInventory = parseInt(currentInvString, 10);\r\n let invProfOos: IItemInventoryLevelProfileEntity | undefined;\r\n inventoryRangesList.map(ir => {\r\n const tempInvRange = ir.Profile?.find(p => p.ItemId === pr.ItemId && p.Code === 'OOS');\r\n if (tempInvRange) {\r\n invProfOos = tempInvRange;\r\n }\r\n });\r\n\r\n const OosUpperBound = invProfOos?.hasOwnProperty('UpperBoundInclusive') && invProfOos?.UpperBoundInclusive !== undefined ? invProfOos.UpperBoundInclusive : 0;\r\n const isOutOfStock = currentInventory <= OosUpperBound;\r\n\r\n if (item?.IsEligible && !isOutOfStock) {\r\n if (props.data.cart.result?.hasInvoiceLine) {\r\n return (<td><div className=\"eduerrors\">{props.resources.invoiceInCartText}</div></td>)\r\n }\r\n if (courseId){\r\n return (<td><div className=\"eduerrors\">{courseInCartText}</div></td>)\r\n }\r\n return (<AddToCartListComponent\r\n productId={pr.RecordId}\r\n onAddToCart={handleAddToCart}\r\n addToCartButtonText={addToCartText} />)\r\n }\r\n else {\r\n return (<td colSpan={2} style={{ textAlign: 'right' }}>\r\n {item?.ItemId ? props.resources.productEligibilityText : ' '}\r\n </td>)\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n const _renderProductsListView = () => {\r\n const { courseInCartText } = props.resources;\r\n let courseId: string | number | boolean | null | undefined;\r\n let cart = props.data.cart.result?.cart;\r\n let cartlines = cart?.CartLines;\r\n if (cartlines && cartlines.length) {\r\n courseId = getExtensionPropertyValueByKey(cartlines[0].ExtensionProperties, \"CourseId\", CommercePropertyValueEnum.string);\r\n }\r\n return (\r\n <Table className={\"list-view__table\"}>\r\n <thead>\r\n <tr>\r\n <th />\r\n <th>{partNoHeading}</th>\r\n <th>{descriptionHeading}</th>\r\n {isAuthenticated ? (\r\n <th>{availabilityHeading}</th>\r\n ) : null}\r\n <th>{listPriceHeading}</th>\r\n <th>{isAuthenticated ? yourPriceHeading : priceAndAvailabilityHeading}</th>\r\n {isAuthenticated ? (\r\n <>\r\n <th>{quantityHeading}</th>\r\n <th />\r\n </>\r\n ) : null}\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {productSearchResults.result?.activeProducts.map(pr => {\r\n // const pricing = getProductPrice(productPrices, pr.RecordId);\r\n // const inventoryLabel = getInventoryLabel(configurationObject?.result?.channelInventoryConfigurationId, pr);\r\n const priceComponent = <span>{cultureFormatter.formatCurrency(pr.BasePrice || pr.Price)}</span>;\r\n return (\r\n <tr key={pr.RecordId}>\r\n <td>{renderProductPlacementImage(\r\n imageSettings, gridSettings, `/Products/${pr.ItemId}_000_001.png`,\r\n pr.PrimaryImageUrl, pr.Name, request)}</td>\r\n <td>\r\n <a href={getProductPageUrlSync(pr.Name!, pr.RecordId, actionContext)}>{pr.ItemId}</a>\r\n <br />\r\n {getProductSupersessionProperty(pr, SupersessionKey.SupersededId) ?\r\n <p className={'supersession-text'}>{supersededFromText} {getProductSupersessionProperty(pr, SupersessionKey.SupersededId)}</p> : null}\r\n </td>\r\n <td>\r\n {pr.Name}\r\n <br />\r\n {getProductSupersessionProperty(pr, SupersessionKey.SupersededName) ?\r\n <p className={'supersession-text'}>{supersededFromText} {getProductSupersessionProperty(pr, SupersessionKey.SupersededName)}</p> : null}\r\n </td>\r\n {isAuthenticated ? (\r\n <td>{getProductSupersessionProperty(pr, SupersessionKey.Inventory)}</td>\r\n ) : null}\r\n <td>{priceComponent}</td>\r\n {/* {LoginToViewPricingComponent(props.context.request, loginToViewPricing,\r\n priceComponent, props.config.onlyShowPriceWhenAuthenticated ?? true)}</td> */}\r\n\r\n <td>\r\n {LoginToViewPricingComponent(props.context.request, loginToViewPricingAndAvailabilityText, <>{cultureFormatter.formatCurrency(pr.Price)}</>, (isAuthenticated || !props.config.onlyShowPriceWhenAuthenticated))}\r\n {/* {(isAuthenticated || !props.config.onlyShowPriceWhenAuthenticated) ? cultureFormatter.formatCurrency(pr.Price) : null} */}\r\n </td>\r\n {renderAddtoCartButton(pr, courseId, courseInCartText)}\r\n\r\n </tr>\r\n );\r\n })}\r\n </tbody>\r\n </Table>\r\n );\r\n };\r\n\r\n if (isMobile) {\r\n return (\r\n <Module {...SearchResultContainer}>\r\n {similarLookProduct ? null : <Node {...CategoryNavContainer}>\r\n {renderCategoryHierarchy(categoryHierarchy)}\r\n {renderTitle(TitleViewProps)}\r\n {renderTitleCount(TitleViewProps)}\r\n </Node>}\r\n {choiceSummary}\r\n <Node className=\"msc-sort-filter-wrapper\">\r\n {modalToggle}\r\n </Node>\r\n {createSearchResultModal(searchResultModal, refineMenu, sortByOptions, isRecoSearchPage)}\r\n <Node {...FeatureSearchContainer}>\r\n {similarLookProduct}\r\n </Node>\r\n {errorMessage}\r\n {enableProdutDescription ? renderProducts(props) : renderProductCards(props)}\r\n {pagination}\r\n </Module>\r\n );\r\n }\r\n return (\r\n <Module {...SearchResultContainer}>\r\n {/* @ts-ignore */}\r\n {modalOpen && addedProduct ? <Popup {...setModalProps(addedProduct, productPricing)} /> : null}\r\n {similarLookProduct ? null : <Node {...CategoryNavContainer}>\r\n {categoryHierarchy && renderCategoryHierarchy(categoryHierarchy)}\r\n {TitleViewProps && renderTitle(TitleViewProps)}\r\n {TitleViewProps && renderTitleCount(TitleViewProps)}\r\n </Node>}\r\n <Node {...FeatureSearchContainer}>\r\n {similarLookProduct}\r\n </Node>\r\n <Node {...RefineAndProductSectionContainer}>\r\n <Node className=\"ms-refiner-heading\">\r\n <Node className=\"ms-refiner-heading_title\">\r\n <Button\r\n className={isExpanded ? \"ms-refine-filter__toggle_expanded\" : \"ms-refine-filter__toggle_collapsed\"}\r\n aria-label=\"Filter\"\r\n onClick={toggle}\r\n aria-expanded={isExpanded}\r\n tabIndex={0}\r\n >\r\n {filterText}\r\n </Button>\r\n <div className=\"ms-search-result-wrapper-title-choice-summary\">\r\n {choiceSummary}\r\n </div>\r\n <div className=\"ms-search-result-wrapper-sort-by-category\">\r\n {sortByOptions && !isRecoSearchPage && renderSort(sortByOptions)}\r\n </div>\r\n </Node>\r\n {refineMenu && isExpanded && renderRefiner(refineMenu)}\r\n </Node>\r\n <Node {...ProductSectionContainer}>\r\n {errorMessage}\r\n {/*{enableProdutDescription ? renderProducts(props) : renderProductCards(props)}*/}\r\n {listView ? _renderProductsListView() : enableProdutDescription ? renderProducts(props) : renderProductCards(props)}\r\n {pagination}\r\n </Node>\r\n </Node>\r\n </Module>\r\n );\r\n};\r\n\r\n/**\r\n * Render Search result Modal.\r\n * @param modalProps - The Search Result Modal view props.\r\n * @param refineMenu - The Refine Menu view props.\r\n * @param sortByDropDown - The Sort by view props.\r\n * @param isRecoSearchPage - The recomandation search page flag.\r\n * @returns The JSX Element.\r\n */\r\nconst createSearchResultModal = (modalProps: ISearchResultModalViewProps, refineMenu: IRefineMenuViewProps, sortByDropDown: ISortByViewProps,\r\n isRecoSearchPage?: string): JSX.Element => {\r\n return React.cloneElement(modalProps.modal, {}, modalProps.modalHeader, createModalBody(modalProps, refineMenu, sortByDropDown,\r\n isRecoSearchPage), modalProps.modalFooter);\r\n};\r\n\r\n/**\r\n * Render Refiner Mobile.\r\n * @param props - The Refine Menu view props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderRefinerMobile = (props: IRefineMenuViewProps): JSX.Element | null => {\r\n const { refiners, RefineMenuContainer, RefinerSectionContainer } = props;\r\n if (refiners) {\r\n return (\r\n <Node {...RefinerSectionContainer}>\r\n <Node {...RefineMenuContainer}>\r\n {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/**\r\n * Render Search result Body.\r\n * @param props - The Search Result Modal view props.\r\n * @param refineMenu - The Refine Menu view props.\r\n * @param sortByDropDown - The Sort by view props.\r\n * @param isRecoSearchPage - The recomandation search page flag.\r\n * @returns The JSX Element.\r\n */\r\nconst createModalBody = (props: ISearchResultModalViewProps, refineMenu: IRefineMenuViewProps,\r\n sortByDropDown: ISortByViewProps, isRecoSearchPage?: string): JSX.Element | null => {\r\n if (sortByDropDown) {\r\n return React.cloneElement(props.modalBody, {}, renderSort(sortByDropDown, isRecoSearchPage), renderRefinerMobile(refineMenu));\r\n }\r\n return null;\r\n};\r\n\r\n/**\r\n * Render Refiner.\r\n * @param props - The Refine Menu view props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderRefiner = (props: IRefineMenuViewProps): JSX.Element | null => {\r\n const { refiners, RefineMenuContainer, RefinerSectionContainer } = props;\r\n if (refiners) {\r\n return (\r\n <Node {...RefinerSectionContainer}>\r\n <Node {...RefineMenuContainer}>\r\n {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/**\r\n * Render sort by drop down.\r\n * @param props - The sort by view props.\r\n * @param isRecoSearchPage - The recomandation search page flag.\r\n * @returns The JSX Element.\r\n */\r\nconst renderSort = (props: ISortByViewProps, isRecoSearchPage?: string): JSX.Element | null => {\r\n const { SortingContainer, sortByDropDown } = props;\r\n if (sortByDropDown && !isRecoSearchPage) {\r\n return (\r\n <Node {...SortingContainer}>\r\n {sortByDropDown}\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\n/**\r\n * Render Title.\r\n * @param props - The title view props.\r\n * @returns The JSX Element.\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 <Node tag=\"h1\" className=\"\">\r\n {title.titlePrefix}\r\n {title.titleText}\r\n </Node>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst renderProductPlacementImage = (\r\n productCardimageSettings?: IImageSettings, gridSettings?: IGridSettings,\r\n imageUrl?: string, fallbackImageUrl?: string, altText?: string, requestContext?: IRequestContext): JSX.Element | null => {\r\n\r\n if (!imageUrl || !gridSettings || !productCardimageSettings) {\r\n return null;\r\n }\r\n if (productCardimageSettings) {\r\n productCardimageSettings.viewports = {\r\n lg: { h: 100, w: 100, q: \"80\" },\r\n md: { h: 100, w: 100, q: \"80\" },\r\n sm: { h: 100, w: 100, q: \"80\" },\r\n xs: { h: 100, w: 100, q: \"80\" }\r\n };\r\n }\r\n const image: IImageData = {\r\n src: imageUrl,\r\n altText: altText ? altText : \"\",\r\n fallBackSrc: fallbackImageUrl\r\n };\r\n const imageProps: IImageProps = { gridSettings };\r\n\r\n imageProps.gridSettings = gridSettings;\r\n imageProps.imageSettings = productCardimageSettings;\r\n imageProps.imageSettings.cropFocalRegion = true;\r\n return (\r\n <Image\r\n {...image} {...imageProps} loadFailureBehavior=\"empty\"\r\n requestContext={requestContext}\r\n className={\"eve-listview__img\"}\r\n />\r\n );\r\n};\r\n\r\nconst getProductPrice = (pricing: ProductPrice[] | undefined, productRecId: number): ProductPrice | undefined => {\r\n if (!pricing) {\r\n return undefined;\r\n }\r\n return pricing.find(pr => pr.ProductId === productRecId);\r\n};\r\n\r\nexport default SearchResultContainerView;\r\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { 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 { ICoreContext } from '@msdyn365-commerce/core';\nimport { ICartActionResult, ICartState } from '@msdyn365-commerce/global-state';\nimport {\n AsyncResult,\n CartLine,\n CartLineValidationResults,\n CartLineValidationResultsByLineId,\n CartsDataActions,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy';\n\nimport { ITelemetry } from '@msdyn365-commerce/telemetry-internal';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\n\n/**\n * Validate the cart.\n * @param isQuantityLimitsFeatureEnabled -- Is the quantity limits feature enabled.\n * @param cart -- The cart state to validate.\n * @param telemetry -- The telemetry.\n * @param propsContext -- The props context.\n * @param shouldRetry -- Should retry.\n * @returns A list of line data validation failures.\n */\nexport async function validateCartAsync(\n cart: AsyncResult<ICartState>,\n telemetry: ITelemetry,\n propsContext: ICoreContext,\n shouldRetry: boolean = true\n): Promise<CartLineValidationResultsByLineId | undefined> {\n let cartResult: ICartState;\n let cartVersion: number | undefined;\n try {\n cartResult = await cart;\n cartVersion = cartResult.cart.Version;\n } catch (error) {\n telemetry.warning(error);\n telemetry.debug('Unable to get cart or cart version.');\n return AsyncResult.resolve();\n }\n\n if (cartVersion) {\n try {\n const validationResult: CartLineValidationResults = await CartsDataActions.validateForCheckoutAsync(\n { callerContext: propsContext.actionContext, bypassCache: 'none' },\n cartResult.cart.Id,\n cartVersion\n );\n\n return await AsyncResult.resolve(validationResult.ValidationResultsByLineId ?? undefined);\n } catch (error) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- error type is not defined.\n if (shouldRetry && error.name === 'Microsoft_Dynamics_Commerce_Runtime_InvalidCartVersion') {\n try {\n await cartResult.refreshCart({});\n } catch (refreshError) {\n telemetry.warning(refreshError);\n telemetry.debug('Unable to refresh Cart');\n return AsyncResult.resolve();\n }\n try {\n await validateCartAsync(cart, telemetry, propsContext, false);\n return AsyncResult.resolve();\n } catch (validateError) {\n telemetry.warning(validateError);\n telemetry.debug('Unable to validate Cart');\n return AsyncResult.resolve();\n }\n }\n\n telemetry.warning(error);\n telemetry.debug('Unable to validate Cart');\n return AsyncResult.resolve();\n }\n } else {\n telemetry.warning('Cart version not found for Cart validation request.');\n return AsyncResult.resolve();\n }\n}\n\n/**\n * Check if cart line quantity update is success.\n * @param isQuantityLimitsFeatureEnabled -- Is quantity limits feature enabled.\n * @param cartResult -- The cart result.\n * @param telemetry -- The telemetry.\n * @param products -- The products.\n * @param cartLineToUpdate -- The cart line to update.\n * @param quantity -- The quantity.\n * @returns Boolean to indicate if the cart line quantity is updated.\n */\nexport async function isCartLineQuantityUpdatedAsync(\n isQuantityLimitsFeatureEnabled: boolean | undefined,\n cartResult: ICartState | undefined,\n telemetry: ITelemetry,\n products: SimpleProduct[] | undefined,\n cartLineToUpdate: CartLine,\n quantity: number\n): Promise<boolean> {\n if (cartResult) {\n let isUsingDefaultOrderSettingsMax: boolean = false;\n if (ArrayExtensions.hasElements(products) && isQuantityLimitsFeatureEnabled) {\n const modifiedProduct: SimpleProduct | undefined = products.find(\n (product: SimpleProduct) => product.RecordId === cartLineToUpdate.ProductId\n );\n isUsingDefaultOrderSettingsMax = !!modifiedProduct && !!modifiedProduct.Behavior?.MaximumQuantity;\n } else {\n isUsingDefaultOrderSettingsMax = false;\n }\n\n const input = {\n cartLineId: cartLineToUpdate.LineId!.toString(),\n newQuantity: quantity,\n additionalProperties: { isUsingDefaultOrderSettingsMax }\n };\n\n try {\n const updateLineResult: ICartActionResult = await cartResult.updateCartLineQuantity(input);\n return await AsyncResult.resolve(updateLineResult.status === 'SUCCESS');\n } catch (error) {\n telemetry.warning((error as Error).message);\n telemetry.debug('Unable to update Cart Line quantity');\n }\n }\n\n return AsyncResult.resolve(false);\n}\n\n/**\n * Update cart line with cart action result.\n * @param isQuantityLimitsFeatureEnabled -- Is quantity limits feature enabled.\n * @param cartResult -- The cart result.\n * @param telemetry -- The telemetry.\n * @param products -- The products.\n * @param cartLineToUpdate -- The cart line to update.\n * @param quantity -- The quantity.\n * @returns Boolean to indicate if the cart line quantity is updated.\n */\nexport async function cartLineQuantityUpdatedAsync(\n isQuantityLimitsFeatureEnabled: boolean | undefined,\n cartResult: ICartState | undefined,\n telemetry: ITelemetry,\n products: SimpleProduct[] | undefined,\n cartLineToUpdate: CartLine,\n quantity: number\n): Promise<ICartActionResult | undefined> {\n if (cartResult) {\n let isUsingDefaultOrderSettingsMax: boolean = false;\n if (ArrayExtensions.hasElements(products) && isQuantityLimitsFeatureEnabled) {\n const modifiedProduct: SimpleProduct | undefined = products.find(\n (product: SimpleProduct) => product.RecordId === cartLineToUpdate.ProductId\n );\n isUsingDefaultOrderSettingsMax = !!modifiedProduct && !!modifiedProduct.Behavior?.MaximumQuantity;\n } else {\n isUsingDefaultOrderSettingsMax = false;\n }\n\n const input = {\n cartLineId: cartLineToUpdate.LineId!.toString(),\n newQuantity: quantity,\n additionalProperties: { isUsingDefaultOrderSettingsMax }\n };\n\n try {\n const updateLineResult: ICartActionResult = await cartResult.updateCartLineQuantity(input);\n return await AsyncResult.resolve(updateLineResult);\n } catch (error) {\n telemetry.warning((error as Error).message);\n telemetry.debug('Unable to update Cart Line quantity');\n }\n }\n\n return AsyncResult.resolve();\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\n\n/**\n * Find the product in array of products considering product id.\n * @param productId - The searched product id.\n * @param products - The array of products in which search is executed.\n * @returns - The found product.\n */\nexport function getProductByProductId(productId: number | undefined, products?: SimpleProduct[]): SimpleProduct | undefined {\n if (productId !== undefined && ArrayExtensions.hasElements(products)) {\n return products.find(product => {\n return productId === product.RecordId;\n });\n }\n\n return undefined;\n}\n\n/**\n * Find the product in array of products considering product id and product behavior's warehouse.\n * @param productId - The searched product id.\n * @param products - The array of products in which search is executed.\n * @param warehouseId - Warehouse id of cartLine.\n * @param cartState - The cart start in case cart line has no warehouse.\n * @returns - The found product.\n */\nexport function getProductByProductIdAndWarehouse(\n productId: number | undefined,\n products?: SimpleProduct[],\n warehouseId?: string,\n cartState?: ICartState\n): SimpleProduct | undefined {\n const targetWarehouseValue = warehouseId ?? cartState?.cart.WarehouseId;\n\n if (productId !== undefined && ArrayExtensions.hasElements(products)) {\n return products.find(product => {\n return productId === product.RecordId && product.Behavior?.InventoryLocationId === targetWarehouseValue;\n });\n }\n\n return undefined;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { CartLineItemComponent, ICartlineResourceString } from '@msdyn365-commerce/components';\nimport MsDyn365, { ICoreContext, IGridSettings, IImageSettings, ITelemetry, isChannelTypeB2B } from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport {\n CartLine,\n ChannelDeliveryOptionConfiguration,\n OrgUnitLocation,\n ProductAvailableQuantity,\n ProductDeliveryOptions,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy';\nimport { ProductCatalog, ReleasedProductType } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { getProductUrlSync, IProductInventoryInformation } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n Button,\n getPayloadObject,\n getTelemetryAttributes,\n ITelemetryContent,\n TelemetryConstant\n} from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { getProductByProductId, getProductByProductIdAndWarehouse } from '../../../Common/get-product';\n\nexport interface IFlyoutCartLineItemsProps {\n cartlines: CartLine[];\n cartState: ICartState | undefined;\n orgUnitLocations: OrgUnitLocation[] | undefined;\n resources: ICartlineResourceString;\n productAvailabilites: IProductInventoryInformation[] | undefined;\n products: SimpleProduct[] | undefined;\n productDeliveryOptions: ProductDeliveryOptions[] | undefined;\n pickupDeliveryModeCode?: string;\n catalogs?: ProductCatalog[];\n\n /**\n * GridSettings for the product image in cartline\n */\n gridSettings: IGridSettings;\n\n /**\n * ImageSettings for the product image in cartline\n */\n imageSettings: IImageSettings;\n id: string;\n typeName: string;\n context: ICoreContext;\n telemetry: ITelemetry;\n removeButtonText: string;\n outOfStockText: string;\n outOfRangeOneText: string;\n outOfRangeFormatText: string;\n maxCartlineQuantity: number;\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n isQuantityLimitsFeatureEnabled: boolean;\n\n outOfStockThreshold: number;\n isStockCheckEnabled: boolean;\n telemetryContent?: ITelemetryContent;\n removeItemClickHandler(cartlineToRemove: CartLine): void;\n}\n\nexport interface IFlyoutCartLineItemViewProps {\n cartline: React.ReactNode;\n remove: React.ReactNode;\n storeLocation: React.ReactNode;\n hasError: boolean;\n\n data: {\n product: SimpleProduct;\n cartline: CartLine;\n };\n}\n\nconst _getCartItemAvailableQuantity = (\n isStockCheckEnabled: boolean,\n outOfStockThreshold: number,\n productAvailability?: ProductAvailableQuantity\n): number => {\n if (isStockCheckEnabled) {\n if (\n !productAvailability ||\n !productAvailability.AvailableQuantity ||\n productAvailability.AvailableQuantity <= 0 ||\n productAvailability.AvailableQuantity <= outOfStockThreshold\n ) {\n return 0;\n }\n return productAvailability.AvailableQuantity - outOfStockThreshold;\n }\n\n return 0;\n};\n\nconst _getCartItemMaxQuantity = (\n maxQuantityByConfig: number,\n isStockCheckEnabled: boolean,\n availableQuantityInStock: number,\n isQuantityLimitsFeatureEnabled: boolean,\n maxByQuantityLimitsFeature: number\n) => {\n if (isQuantityLimitsFeatureEnabled) {\n let maxByQuantityLimitsFeatureResult = maxByQuantityLimitsFeature;\n\n // If max by feature in not defined when feature is on then we suggest that there is no max by feature\n // and consider available qty if stock check enabled and max from config in site settings.\n if (!maxByQuantityLimitsFeature) {\n maxByQuantityLimitsFeatureResult = maxQuantityByConfig || 10;\n }\n\n return isStockCheckEnabled\n ? maxByQuantityLimitsFeatureResult < availableQuantityInStock\n ? maxByQuantityLimitsFeatureResult\n : availableQuantityInStock\n : maxByQuantityLimitsFeatureResult;\n }\n if (isStockCheckEnabled) {\n return availableQuantityInStock < maxQuantityByConfig ? availableQuantityInStock : maxQuantityByConfig;\n }\n return maxQuantityByConfig;\n};\n\n/**\n * On Remove Click functionality.\n * @param removeItemClickHandler -Remove item click function.\n * @param cartline -CartLine.\n * @returns Remove change value.\n */\nconst onRemoveClickFunction = (removeItemClickHandler: (cartlineToRemove: CartLine) => void, cartline: CartLine) => () => {\n removeItemClickHandler(cartline);\n};\nconst _assembleNode = (\n cartline: CartLine,\n product: SimpleProduct,\n props: IFlyoutCartLineItemsProps,\n index: number,\n foundProductAvailability?: ProductAvailableQuantity,\n foundProductDeliveryOptions?: ProductDeliveryOptions\n): IFlyoutCartLineItemViewProps => {\n const { imageSettings, gridSettings, id, typeName, context, resources, removeButtonText, removeItemClickHandler } = props;\n\n const availableQuantityInStock = _getCartItemAvailableQuantity(\n props.isStockCheckEnabled,\n props.outOfStockThreshold,\n foundProductAvailability\n );\n const maxQuantity =\n product &&\n _getCartItemMaxQuantity(\n props.maxCartlineQuantity,\n props.isStockCheckEnabled,\n availableQuantityInStock,\n props.isQuantityLimitsFeatureEnabled,\n product?.Behavior?.MaximumQuantity || 0\n );\n\n // Check if the product is service or not by product type\n const isServiceItem = product.ItemTypeValue === ReleasedProductType.Service;\n\n const onRemoveClickHandler = onRemoveClickFunction(removeItemClickHandler, cartline);\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.RemoveCartItem);\n const removeCartItemAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n\n let productUrl = getProductUrlSync(product, props.context.actionContext, undefined);\n if (MsDyn365.isBrowser && isChannelTypeB2B(props.context.actionContext.requestContext)) {\n const fullUrl = new URL(productUrl, window.location.href);\n fullUrl.searchParams.set('catalogid', `${cartline.CatalogId ?? 0}`);\n productUrl = fullUrl.href;\n }\n\n return {\n data: {\n product,\n cartline\n },\n hasError: !isServiceItem && props.isStockCheckEnabled ? cartline.Quantity! > maxQuantity : false,\n cartline: (\n <CartLineItemComponent\n data={{\n cartLine: cartline,\n product,\n catalogs: props.catalogs\n }}\n currentQuantity={cartline.Quantity}\n maxQuantity={maxQuantity}\n isOutOfStock={!isServiceItem && props.isStockCheckEnabled ? availableQuantityInStock <= 0 : false}\n gridSettings={gridSettings}\n imageSettings={imageSettings}\n id={id}\n typeName={typeName}\n productUrl={productUrl}\n context={context}\n resources={resources}\n key={`${index}-${productUrl}`}\n isQuantityEditable={false}\n primaryImageUrl={product.PrimaryImageUrl}\n displayMode='COMPACT'\n telemetryContent={props.telemetryContent}\n channelDeliveryOptionConfig={props.channelDeliveryOptionConfig}\n deliveryLocation={_renderDeliveryLocation(cartline, props)}\n />\n ),\n remove: (\n <Button\n className='msc-cart-line__remove-item'\n onClick={onRemoveClickHandler}\n title={removeButtonText}\n {...removeCartItemAttribute}\n >\n {removeButtonText}\n </Button>\n ),\n storeLocation: _renderStoreLocation(cartline, props)\n };\n};\n\nconst _renderDeliveryLocation = (cartLine: CartLine | null | undefined, props: IFlyoutCartLineItemsProps): string | undefined => {\n let deliverylocation;\n if (cartLine && cartLine.FulfillmentStoreId) {\n const orgUnitName = _getOrgUnitName(cartLine.FulfillmentStoreId, props.orgUnitLocations);\n\n let foundProductDeliveryOption;\n if (props.productDeliveryOptions && props.productDeliveryOptions.length > 0) {\n foundProductDeliveryOption = props.productDeliveryOptions.find(deliveryOption => {\n return deliveryOption && deliveryOption.ProductId === cartLine.ProductId;\n });\n }\n const delivery = foundProductDeliveryOption?.DeliveryOptions?.find(option => option.Code === cartLine.DeliveryMode);\n const location = delivery?.Description;\n\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n if (location) {\n deliverylocation = `${location}, ${orgUnitName}`;\n } else {\n deliverylocation = `${orgUnitName}`;\n }\n } else {\n deliverylocation = props.resources.shippingText;\n }\n return deliverylocation;\n};\n\nconst _renderStoreLocation = (cartLine: CartLine | null | undefined, props: IFlyoutCartLineItemsProps): JSX.Element | null => {\n if (cartLine && cartLine.FulfillmentStoreId) {\n const orgUnitName = _getOrgUnitName(cartLine.FulfillmentStoreId, props.orgUnitLocations);\n\n if (orgUnitName) {\n return (\n <div className='msc-cart-line__bopis-method'>\n <span className='pick-up'>{orgUnitName}</span>\n </div>\n );\n }\n }\n\n return null;\n};\n\nconst _getOrgUnitName = (fulfillmentStoreId: string | undefined, orgUnitLocations: OrgUnitLocation[] | undefined) => {\n if (!orgUnitLocations || !fulfillmentStoreId || orgUnitLocations.length === 0) {\n return '';\n }\n\n const foundLocation = orgUnitLocations.find(orgUnitLocation => {\n return orgUnitLocation.OrgUnitNumber === fulfillmentStoreId;\n });\n\n if (foundLocation) {\n return foundLocation.OrgUnitName;\n }\n return fulfillmentStoreId;\n};\n\nconst _assembleCartlines = (\n cartlines: CartLine[],\n products: SimpleProduct[] | undefined,\n props: IFlyoutCartLineItemsProps\n): IFlyoutCartLineItemViewProps[] | null => {\n const reactNodes: IFlyoutCartLineItemViewProps[] = [];\n\n if (!products || products.length === 0) {\n props.context.telemetry.error('Cartlines content is empty, module wont render');\n return null;\n }\n\n cartlines.map((cartline, index) => {\n let product;\n if (props.isQuantityLimitsFeatureEnabled) {\n // When feature is enabled the same products could have different quantity limits in Behavior so we need\n // to check productId and WarehouseId for identification.\n product = getProductByProductIdAndWarehouse(cartline.ProductId, products, cartline.WarehouseId, props.cartState);\n } else {\n product = getProductByProductId(cartline.ProductId, products);\n }\n let foundProductAvailability;\n if (props.productAvailabilites && props.productAvailabilites.length > 0) {\n foundProductAvailability = props.productAvailabilites.find(productAvailability => {\n return productAvailability.ProductAvailableQuantity?.ProductId! === cartline.ProductId;\n });\n }\n let foundProductDeliveryOption;\n if (props.productDeliveryOptions && props.productDeliveryOptions.length > 0) {\n foundProductDeliveryOption = props.productDeliveryOptions.find(deliveryOption => {\n return deliveryOption && deliveryOption.ProductId === cartline.ProductId;\n });\n }\n if (product) {\n reactNodes.push(\n _assembleNode(\n cartline,\n product,\n props,\n index,\n foundProductAvailability?.ProductAvailableQuantity,\n foundProductDeliveryOption\n )\n );\n }\n });\n\n return reactNodes;\n};\n\n/**\n * CartLineItems component.\n */\n\nexport const FlyoutCartLineItems = (props: IFlyoutCartLineItemsProps) => {\n const { products, cartlines } = props;\n return _assembleCartlines(cartlines, products, props);\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { ProductDeliveryOptions, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport {\n ActiveCartProductsInput,\n getActiveCartProductsAction,\n getAvailabilitiesForCartLineItems,\n getDeliveryOptionsForCartLineItems,\n IProductInventoryInformation,\n ProductAvailabilitiesForCartLineItems,\n ProductDeliveryOptionsForCartLineItems\n} from '@msdyn365-commerce-modules/retail-actions';\n\n/**\n * IMiniCartData entity interface.\n */\nexport interface IMiniCartData {\n products?: SimpleProduct[];\n productAvailabilites?: IProductInventoryInformation[];\n deliveryOptions?: ProductDeliveryOptions[];\n}\n\nexport const createInput = () => {\n return new ActiveCartProductsInput();\n};\n\n/**\n * Calls the Retail API and returns a mini cart data.\n * @param ctx\n * @param cartState\n */\nexport async function getMiniCartData(ctx: IActionContext, cartState: ICartState): Promise<IMiniCartData> {\n const miniCartData: IMiniCartData = {};\n\n const cart = cartState.cart;\n\n // If there are cart lines, make call to get products\n // If there are invocie linese, then there is no products, so don't make call to get products\n if (cart && cart.CartLines && cart.CartLines.length > 0 && !cartState.hasInvoiceLine) {\n await getActiveCartProductsAction(new ActiveCartProductsInput(), ctx)\n .then(products => {\n if (products) {\n miniCartData.products = products;\n }\n })\n .catch(error => {\n ctx.telemetry.exception(error);\n throw new Error('[getActiveCartWithProdcuts]Unable to hydrate cart with product information');\n });\n\n await getAvailabilitiesForCartLineItems(new ProductAvailabilitiesForCartLineItems(ctx.requestContext.apiSettings), ctx)\n .then(availableQuantity => {\n if (availableQuantity) {\n miniCartData.productAvailabilites = availableQuantity;\n }\n })\n .catch(error => {\n ctx.telemetry.exception(error);\n throw new Error('[getActiveCartWithProdcuts]Unable to hydrate cart with product information');\n });\n\n await getDeliveryOptionsForCartLineItems(new ProductDeliveryOptionsForCartLineItems(ctx.requestContext.apiSettings), ctx)\n .then(deliveryOptions => {\n if (deliveryOptions) {\n miniCartData.deliveryOptions = deliveryOptions;\n }\n })\n .catch(error => {\n ctx.telemetry.exception(error);\n throw new Error('[getActiveCartWithProdcuts]Unable to hydrate cart with product information');\n });\n }\n\n return miniCartData;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { AddToCartBehavior, CartIconComponent } from '@msdyn365-commerce/components';\nimport { getUrlSync, IDictionary, IImageSettings, msdyn365Commerce, TelemetryEvent } from '@msdyn365-commerce/core';\nimport {\n CartLine,\n ChannelDeliveryOptionConfiguration,\n CartLineValidationResultsByLineId,\n OrgUnitLocation\n} from '@msdyn365-commerce/retail-proxy';\nimport { validateCartAsync } from '@msdyn365-commerce-modules/cart-utilities';\nimport { ArrayExtensions, validateCartLinesInventory } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n Button,\n getPayloadObject,\n getTelemetryAttributes,\n getTelemetryObject,\n INodeProps,\n ITelemetryContent,\n TelemetryConstant,\n UncontrolledTooltip,\n updateMaxQuantityForCartLineItem,\n urlCheck\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { reaction } from 'mobx';\nimport { observer } from 'mobx-react';\nimport React from 'react';\n\nimport { ICartIconData } from './cart-icon.data';\nimport { cartLinesSortOrder, ICartIconProps } from './cart-icon.props.autogenerated';\nimport { FlyoutCartLineItems, IFlyoutCartLineItemViewProps } from './components/flyout-cart-line-items';\nimport { getMiniCartData, IMiniCartData } from './utils/get-products-in-mini-cart';\n\nexport interface IMiniCartState {\n miniCartData: IMiniCartData;\n orgUnitLocations?: OrgUnitLocation[];\n isQuantityLimitsFeatureEnabled: boolean;\n isCartValid: boolean;\n}\n\nexport interface ICartIconViewProps extends ICartIconProps<ICartIconData> {\n className: string;\n cartIcon: React.ReactNode;\n FlyoutContainer?: INodeProps;\n CartlinesWrapper: INodeProps;\n miniCartWrapper: INodeProps;\n miniCartItemWrapper: INodeProps;\n cartlines?: IFlyoutCartLineItemViewProps[];\n flyoutTitle: React.ReactNode;\n totalPrice: React.ReactNode;\n checkoutAsGuestButton?: React.ReactNode;\n checkoutAsSignInUserButton?: React.ReactNode;\n goToCartButton?: React.ReactNode;\n waitingComponent?: React.ReactNode;\n isCartLoading: boolean;\n checkoutBlockedDueToUnavailableFunds?: React.ReactNode;\n\n removeItemClickHandler(cartlineToRemove: CartLine): void;\n}\n\n/**\n *\n * Cart component.\n * @extends {React.PureComponent<ICartProps<ICartData>>}\n */\n@observer\nclass CartIcon extends React.Component<ICartIconProps<ICartIconData>, IMiniCartState> {\n private readonly telemetryContent: ITelemetryContent;\n\n private readonly checkoutBySignInAttributes: IDictionary<string> | undefined;\n\n private readonly checkoutByGuestAttributes: IDictionary<string> | undefined;\n\n private readonly viewShoppingBagAttributes: IDictionary<string> | undefined;\n\n private retailMultiplePickUpOptionEnabled?: boolean = false;\n\n private channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n\n private lastValidatedCartVersion: number | undefined;\n\n constructor(props: ICartIconProps<ICartIconData>) {\n super(props);\n this.state = {\n miniCartData: {},\n isCartValid: true,\n isQuantityLimitsFeatureEnabled: false\n };\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n const payload = getPayloadObject(TelemetryEvent.CheckOut, this.telemetryContent, TelemetryConstant.Checkout);\n this.checkoutBySignInAttributes = getTelemetryAttributes(this.telemetryContent, payload);\n\n payload.contentAction.etext = TelemetryConstant.GuestCheckout;\n this.checkoutByGuestAttributes = getTelemetryAttributes(this.telemetryContent, payload);\n\n payload.contentAction.etext = TelemetryConstant.ViewShoppingBag;\n this.viewShoppingBagAttributes = getTelemetryAttributes(this.telemetryContent, payload);\n }\n\n public async componentDidMount(): Promise<void> {\n const context = this.props.context.actionContext;\n\n reaction(\n () => this.props.data.cart.result?.cart.CartLines,\n async () => {\n this.setState({\n miniCartData: await getMiniCartData(context, this.props.data.cart.result!)\n });\n }\n );\n await this._setQuantityLimitsFeatureFlag();\n\n this.setState({\n orgUnitLocations: this.props.data.orgUnitLocations?.result\n });\n\n this._validateCart();\n }\n\n public componentDidUpdate(prevProps: ICartIconProps<ICartIconData>): void {\n this._validateCart();\n }\n\n public shouldComponentUpdate(nextProps: ICartIconProps<ICartIconData>, nextState: IMiniCartState): boolean {\n if (this.state === nextState && this.props.data === nextProps.data) {\n return false;\n }\n return true;\n }\n\n // eslint-disable-next-line complexity -- disabling the complexity for this method for now as its causing lot of other warnings\n public render(): JSX.Element | null {\n const {\n id,\n typeName,\n config: { enableHoverCart, isAnonymousCheckout },\n context: {\n request: {\n user: { isAuthenticated, signInUrl }\n }\n },\n context,\n resources\n } = this.props;\n\n const cart = (this.props.data.cart && this.props.data.cart.result) || undefined;\n const guestCheckoutUrl = getUrlSync('checkout', this.props.context.actionContext) || '';\n const cartUrl = getUrlSync('cart', this.props.context.actionContext) || '';\n const checkoutURL = this._getCheckoutURL(isAuthenticated, guestCheckoutUrl, signInUrl || '');\n const isCartEmpty = cart && cart.cart.CartLines && cart.cart.CartLines.length === 0;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- check config.\n const shouldShowMiniCart =\n cart?.isProductAddedToCart && this.props.context.app.config.addToCartBehavior === AddToCartBehavior.showMiniCart;\n const hasInvoiceLine = cart?.hasInvoiceLine;\n const emailDeliveryModeCode = this.props.context.request.channel?.EmailDeliveryModeCode;\n const cartLines = this._getCartLines();\n const validInventoryAcrossCartLines = validateCartLinesInventory(\n cart?.cart.CartLines ?? [],\n this.state.miniCartData.productAvailabilites ?? [],\n this.props.context.actionContext,\n this.state.miniCartData.products ?? [],\n emailDeliveryModeCode\n );\n const hasError =\n !validInventoryAcrossCartLines?.isValid ||\n (!validInventoryAcrossCartLines && !this.state.isCartValid) ||\n (cartLines ? cartLines.some(cartline => cartline.hasError) : false);\n const includeFlyout = this.props.data.cart && this.props.data.cart.status === 'SUCCESS' && enableHoverCart;\n const totalItemsInCart = cart?.totalItemsInCart ? cart.totalItemsInCart : 0;\n const goToCartButtonText = resources.goToCartButtonTitle.replace('{count}', totalItemsInCart.toString());\n const flyoutTitle = resources.flyoutTitle;\n const flyoutTooltip = {\n tag: UncontrolledTooltip,\n shouldShowMiniCart,\n placement: 'bottom-end',\n hideArrow: true,\n className: 'ms-cart-icon__flyout-container',\n trigger: 'hover',\n displayMode: 'FLYOUT',\n target: id,\n shouldShowCloseButton: true,\n cartPageUrl: cartUrl,\n hideAriaHidden: true\n };\n\n // If there are invoice lines, don't update mini cart price\n const price = (cart && !cart.hasInvoiceLine && cart.cart.TotalAmount) || undefined;\n const priceString = price\n ? resources.totalPriceFormatString.replace('{price}', context.cultureFormatter.formatCurrency(price))\n : '';\n const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\n this.channelDeliveryOptionConfig = this.props.data.channelDeliveryOptionConfig?.result;\n this.retailMultiplePickUpOptionEnabled = this.props.data.featureState?.result?.find(\n feature => feature.Name === multiplePickupStoreSwitchName\n )?.IsEnabled;\n\n const viewProps = {\n ...this.props,\n cartIcon: (\n <CartIconComponent\n cartLabel={resources.cartLabel}\n cartQtyLabel={resources.cartQtyLabel}\n context={context}\n id={id}\n typeName={typeName}\n data={{ cart }}\n telemetryContent={this.telemetryContent}\n />\n ),\n cartlines: cartLines,\n FlyoutContainer: includeFlyout ? flyoutTooltip : undefined,\n CartlinesWrapper: {\n className: 'ms-cart-icon__cart-lines'\n },\n miniCartWrapper: {\n className: classnames('ms-cart-icon'),\n id: this.props.id\n },\n miniCartItemWrapper: {\n className: classnames('msc-cart-lines-item')\n },\n\n // If there are invoice lines, don't update mini cart checkout button\n // Checkout button will display by default to maintain backward compatibility. When Anonymous user checkout is enabled &&\n // user is authenticated then we will show the checkout button otherwise we will show the guest checkout button.\n checkoutAsSignInUserButton:\n !isCartEmpty && !hasInvoiceLine && (!isAnonymousCheckout || isAuthenticated) ? (\n <Button\n disabled={hasError}\n className='ms-cart-icon__btn-checkout'\n href={checkoutURL}\n title={resources.checkoutButtonTitle}\n {...this.checkoutBySignInAttributes}\n >\n {resources.checkoutButtonTitle}\n </Button>\n ) : null,\n checkoutAsGuestButton:\n isAnonymousCheckout && !isCartEmpty && !isAuthenticated ? (\n <Button\n disabled={hasError}\n className='ms-cart-icon__btn-guestcheckout'\n href={guestCheckoutUrl}\n title={resources.guestCheckoutButtonTitle}\n {...this.checkoutByGuestAttributes}\n >\n {resources.guestCheckoutButtonTitle}\n </Button>\n ) : null,\n goToCartButton: (\n <Button\n className='ms-cart-icon__btn-gotocart'\n href={cartUrl}\n title={goToCartButtonText}\n {...this.viewShoppingBagAttributes}\n >\n {goToCartButtonText}\n </Button>\n ),\n checkoutBlockedDueToUnavailableFunds: null,\n flyoutTitle: <span className='ms-cart-icon__flyout-title'>{flyoutTitle}</span>,\n totalPrice: <div className='ms-cart-icon__subtotal'>{priceString}</div>\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n private _validateCart(): void {\n const {\n data: { cart }\n } = this.props;\n const cartVersion = cart.result?.cart?.Version ?? undefined;\n if (this.lastValidatedCartVersion === cartVersion) {\n return;\n }\n\n this.lastValidatedCartVersion = cartVersion; // This field is populated to block concurrent requests\n\n if (this.state.isQuantityLimitsFeatureEnabled) {\n validateCartAsync(cart, this.props.telemetry, this.props.context)\n .then((result: CartLineValidationResultsByLineId | undefined) => {\n this.setState({ isCartValid: !ArrayExtensions.hasElements(result?.ValidationResultsPairs) });\n })\n .catch(() => {\n this.setState({ isCartValid: false });\n });\n } else {\n this.setState({ isCartValid: true });\n }\n }\n\n private _getCheckoutURL(isAuthenticated: boolean, guestCheckoutUrl: string, signInUrl: string): string {\n if (isAuthenticated) {\n return guestCheckoutUrl;\n }\n\n const isAbsoluteUrl = urlCheck(guestCheckoutUrl);\n let returnURL = guestCheckoutUrl;\n if (msdyn365Commerce.isBrowser && !isAbsoluteUrl) {\n returnURL = `${window.location.origin}${guestCheckoutUrl}`;\n }\n\n return `${signInUrl}${!signInUrl.includes('?') ? '?' : '&'}ru=${returnURL}`;\n }\n\n /**\n * Sort cartline items.\n * @param cartlines - Cartlines to be sorted.\n * @param sortOrder - Ascending or descending.\n * @returns - Sorted cartlines.\n */\n private readonly getSortedCartLines = (cartlines: CartLine[], sortOrder?: cartLinesSortOrder): CartLine[] => {\n const lines: CartLine[] = [...cartlines];\n const zero: number = 0;\n\n if (sortOrder === cartLinesSortOrder.descending) {\n return lines.sort((item1, item2) => (item2.LineNumber ?? zero) - (item1.LineNumber ?? zero));\n }\n return lines.sort((item1, item2) => (item1.LineNumber ?? zero) - (item2.LineNumber ?? zero));\n };\n\n private _getCartLines(): IFlyoutCartLineItemViewProps[] | null {\n const {\n context: {\n request: { channel: { PickupDeliveryModeCode } = { PickupDeliveryModeCode: undefined } }\n },\n config,\n telemetry,\n resources\n } = this.props;\n\n const imageSettings = this._getImageSettings(config.imageSettings);\n const cart = this.props.data.cart && this.props.data.cart.result;\n\n // Cart-icon could be placed in each page\n // so we check cart content to reduce number of RS calls\n return this.state.miniCartData.products && cart && cart.cart.CartLines && cart.cart.CartLines.length > 0\n ? FlyoutCartLineItems({\n cartlines: this.getSortedCartLines(cart.cart.CartLines, config.cartLinesSortOrder),\n products: this.state.miniCartData.products,\n productAvailabilites: this.state.miniCartData.productAvailabilites,\n productDeliveryOptions: this.state.miniCartData.deliveryOptions,\n imageSettings,\n outOfStockThreshold: this.props.context.app.config.outOfStockThreshold || 0,\n isStockCheckEnabled: this.props.context.app.config.enableStockCheck || false,\n maxCartlineQuantity: updateMaxQuantityForCartLineItem(this.props.context.app.config.maxQuantityForCartLineItem),\n gridSettings: this.props.context.request.gridSettings!,\n context: this.props.context,\n typeName: this.props.typeName,\n id: this.props.id,\n resources: {\n sizeString: resources.productDimensionTypeSize,\n colorString: resources.productDimensionTypeColor,\n configString: resources.productDimensionTypeConfiguration,\n styleString: resources.productDimensionTypeStyle,\n quantityDisplayString: resources.quantityDisplayText,\n salesAgreementPricePrompt: resources.salesAgreementPricePrompt,\n inputQuantityAriaLabel: '', // Not used\n discountStringText: '', // Not used\n originalPriceText: '',\n currentPriceText: '',\n shippingChargesText: '',\n shippingText: resources.shippingText\n },\n telemetry,\n removeButtonText: resources.removeCartButtonText,\n outOfStockText: '', // Not used\n outOfRangeOneText: '', // Not used\n outOfRangeFormatText: '', // Not used\n cartState: cart,\n orgUnitLocations: this.state.orgUnitLocations,\n removeItemClickHandler: this._removeItemFromCartHandler,\n pickupDeliveryModeCode: PickupDeliveryModeCode,\n telemetryContent: this.telemetryContent,\n channelDeliveryOptionConfig: this.retailMultiplePickUpOptionEnabled ? this.channelDeliveryOptionConfig : undefined,\n isQuantityLimitsFeatureEnabled: this.state.isQuantityLimitsFeatureEnabled,\n catalogs: this.props.data.catalogs?.result\n })\n : null;\n }\n\n private readonly _getImageSettings = (imageSettings: IImageSettings | undefined): IImageSettings => {\n return (\n imageSettings || {\n viewports: {\n xs: { q: 'w=80&h=94&m=6', w: 0, h: 0 },\n sm: { q: 'w=148&h=174&m=6', w: 0, h: 0 },\n lg: { q: 'w=148&h=174&m=6', w: 0, h: 0 }\n },\n lazyload: true\n }\n );\n };\n\n private readonly _removeItemFromCartHandler = (cartlineToRemove: CartLine) => {\n if (this.props.data.cart.result) {\n const input = {\n cartLineIds: [cartlineToRemove.LineId!.toString()]\n };\n this.props.data.cart.result.removeCartLines(input).catch(error => {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to Remove Cart Line');\n });\n }\n };\n\n private async _setQuantityLimitsFeatureFlag(): Promise<void> {\n const featureStatuses = await this.props.data.featureState;\n\n const isChannelQuantityLimitsFeatureEnabledInHq =\n featureStatuses?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.EcommerceQuantityLimitConfigurationsFeature'\n )?.IsEnabled || false;\n if (isChannelQuantityLimitsFeatureEnabledInHq) {\n this.setState({ isQuantityLimitsFeatureEnabled: true });\n return;\n }\n\n const useSiteBuilderSettings = featureStatuses?.find(\n featureState => featureState.Name === 'RevertToSiteBuilderOrderQuantityLimitsSettings'\n )?.IsEnabled;\n\n if (useSiteBuilderSettings) {\n const defaultOrderQuantityLimitsFeatureConfig = this.props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits;\n if (!defaultOrderQuantityLimitsFeatureConfig || defaultOrderQuantityLimitsFeatureConfig === 'none') {\n this.setState({ isQuantityLimitsFeatureEnabled: false });\n return;\n }\n\n try {\n const featureStatuses = await this.props.data.featureState;\n const isQuantityLimitsFeatureEnabledInHq =\n featureStatuses?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature'\n )?.IsEnabled || false;\n if (!isQuantityLimitsFeatureEnabledInHq) {\n this.setState({ isQuantityLimitsFeatureEnabled: false });\n return;\n }\n } catch (error) {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to get feature states');\n this.setState({ isQuantityLimitsFeatureEnabled: false });\n return;\n }\n if (defaultOrderQuantityLimitsFeatureConfig === 'all') {\n this.setState({ isQuantityLimitsFeatureEnabled: true });\n } else {\n this.props.data.customerInformation\n .then(customerInfo => {\n const result =\n !!customerInfo &&\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b));\n this.setState({ isQuantityLimitsFeatureEnabled: result });\n })\n .catch(error => {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to get customer info');\n });\n }\n } else {\n const cartConfiguration = await this.props.data.cartConfiguration;\n this.setState({ isQuantityLimitsFeatureEnabled: !(cartConfiguration?.IgnoreOrderSettings ?? false) });\n return;\n }\n }\n}\n\nexport default CartIcon;\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 { ICartIconViewProps } from './cart-icon';\nimport { IFlyoutCartLineItemViewProps } from './components/flyout-cart-line-items';\n\nconst _renderCartlines = (cartLines: IFlyoutCartLineItemViewProps[] | undefined, props: ICartIconViewProps): JSX.Element[] | null => {\n if (!cartLines) {\n props.context.telemetry.error('Cartlines content is empty, module wont render');\n return null;\n }\n return cartLines.map((cartLine, index) => {\n return (\n <Node {...props.miniCartItemWrapper} key={index}>\n {cartLine.cartline}\n {cartLine.storeLocation}\n {cartLine.remove}\n </Node>\n );\n });\n};\n\nconst CartIconView: React.FC<ICartIconViewProps> = (props: ICartIconViewProps) => (\n <Node {...props.miniCartWrapper} {...props.renderModuleAttributes(props)}>\n {props.cartIcon}\n {props.FlyoutContainer ? (\n <Node {...props.FlyoutContainer}>\n {props.flyoutTitle}\n {props.checkoutBlockedDueToUnavailableFunds}\n <Node {...props.CartlinesWrapper}>{_renderCartlines(props.cartlines, props)}</Node>\n {props.totalPrice}\n {props.checkoutAsSignInUserButton}\n {props.checkoutAsGuestButton}\n {props.goToCartButton}\n </Node>\n ) : (\n false\n )}\n </Node>\n);\n\nexport default CartIconView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { CartLinePriceEditor, ICartLinePriceEditorResources, PriceComponent } from '@msdyn365-commerce/components';\nimport MsDyn365, { IComponentProps, IGridSettings, IImageSettings, Image } from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { ChannelDeliveryOptionConfiguration, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { CartLine, ProductCatalog, SalesLine } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { ArrayExtensions, getFallbackImageUrl, validateCatalogId } from '@msdyn365-commerce-modules/retail-actions';\nimport { getPayloadObject, getTelemetryAttributes, IncrementalQuantity, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classNames from 'classnames';\nimport * as React from 'react';\n\n/**\n * ICartlineResourceString: Interface for specifying the\n * resource strings that the component needs.\n */\nexport interface ICartlineResourceString {\n /**\n * Display string for discount label\n */\n discountStringText: string;\n\n /**\n * String for size key\n */\n sizeString: string;\n\n /**\n * String for color key\n */\n colorString: string;\n\n /**\n * String associated with the configuration product dimension\n */\n configString: string;\n\n /**\n * String for style key\n */\n styleString: string;\n\n /**\n * String for amount key\n */\n amountString?: string;\n\n /**\n * Display string for quantity label\n */\n quantityDisplayString: string;\n\n /**\n * Display string for quantity label\n */\n inputQuantityAriaLabel: string;\n\n /**\n * Aria label for the decrement button in quantity component\n */\n decrementButtonAriaLabel: string;\n\n /**\n * Aria label for the increment button in quantity component\n */\n incrementButtonAriaLabel: string;\n\n /**\n * Original text screenreader\n */\n originalPriceText: string;\n\n /**\n * Current text screenreader\n */\n currentPriceText: string;\n\n /**\n * Shipping Charges Text\n */\n shippingChargesText: string;\n\n priceEditorResources?: ICartLinePriceEditorResources;\n salesAgreementPricePrompt?: string;\n}\n\ninterface ICartLineData {\n cartLine: CartLine | SalesLine;\n cartState?: ICartState;\n product?: SimpleProduct;\n catalogs?: ProductCatalog[];\n}\n\n/**\n * ICartLineProps: The props required to render cartLineitem.\n */\nexport interface ICartLineProps extends IComponentProps<ICartLineData> {\n /**\n * The flag to change the quantity component from intractable to static.\n */\n disableQuantityInteractivity?: boolean;\n\n /**\n * The primary image url.\n */\n primaryImageUrl?: string;\n\n /**\n * The product url.\n */\n productUrl?: string;\n\n /**\n * GridSettings for the product image in cartLine.\n */\n gridSettings: IGridSettings;\n\n /**\n * ImageSettings for the product image in cartLine.\n */\n imageSettings: IImageSettings;\n\n /**\n * Boolean flag to indicate if the item is out of stock.\n */\n isOutOfStock?: boolean;\n\n /**\n * Flag to make quantity section editable.\n */\n isQuantityEditable?: boolean;\n\n /**\n * Max quantity for line item.\n */\n maxQuantity?: number;\n\n /**\n * Current quantity for line item.\n */\n currentQuantity?: number;\n\n /**\n * Resource string for the component.\n */\n resources: ICartlineResourceString;\n\n /**\n * SalesLine flag.\n */\n isSalesLine?: boolean;\n\n /**\n * Error message to show in place of quantity.\n */\n errorMessage?: string;\n\n /**\n * Inventory information label.\n */\n inventoryInformationLabel?: string;\n\n /**\n * Inventory information class name.\n */\n inventoryLabelClassName?: string;\n\n /**\n * Flag to show/hide shipping charges for line items.\n */\n showShippingChargesForLineItems?: boolean;\n\n /**\n * Boolean flag to indicate if cart state status is ready.\n */\n isCartStateReady?: boolean;\n\n /**\n * Chanel Delivery Option configuration is from api.\n */\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n\n /**\n * The telemetry content.\n */\n telemetryContent?: ITelemetryContent;\n\n /**\n * The cart line index.\n */\n lineIndex?: number;\n\n /**\n * Quantity onChange callback.\n */\n quantityOnChange?(cartLine: CartLine, newQuantity: number, lineIndex?: number): boolean;\n priceCurrency?: string;\n}\n\ninterface IDimensionStrings {\n /**\n * String for size key.\n */\n sizeString: string;\n\n /**\n * String for color key.\n */\n colorString: string;\n\n /**\n * String associated with the configuration product dimension.\n */\n configString: string;\n\n /**\n * String for style key.\n */\n styleString: string;\n\n /**\n * String for amount key.\n */\n amountString?: string;\n}\n\n/**\n * Renders catalog label for the cart line.\n * @param props - Cart line props.\n * @returns Catalog label.\n */\nconst CatalogLabelComponent: React.FC<ICartLineProps> = (props: ICartLineProps) => {\n const catalogId = props.data.cartLine.CatalogId;\n validateCatalogId(catalogId);\n\n if (!props.context.request.user.isB2b || !catalogId || !ArrayExtensions.hasElements(props.data.catalogs)) {\n return null;\n }\n\n const catalog = props.data.catalogs.find(item => item.RecordId === catalogId);\n\n if (!catalog || !catalog.Name) {\n return null;\n }\n\n return <div className='msc-cart-line__catalog-label'>{catalog.Name}</div>;\n};\n\nconst CartLineItemFunctions = {\n renderProductDimensions: (Product: SimpleProduct, DimensionStrings: IDimensionStrings) => {\n if (!Product || !Product.Dimensions) {\n return [];\n }\n\n return Product.Dimensions.map(productDimension => {\n if (productDimension.DimensionTypeValue === 1) {\n return (\n <div key={`${Product.RecordId}ProductDimensions1`} className='msc-cart-line__product-variant-item'>\n <span className='msc-cart-line__product-variant-color'>\n {DimensionStrings.colorString}:\n <span className='name'>{productDimension.DimensionValue && productDimension.DimensionValue.Value}</span>\n </span>\n </div>\n );\n }\n\n if (productDimension.DimensionTypeValue === 2) {\n return (\n <div key={`${Product.RecordId}ProductDimensions2`} className='msc-cart-line__product-variant-item'>\n <span className='msc-cart-line__product-configuration'>\n {DimensionStrings.configString}:\n <span className='name'>{productDimension.DimensionValue && productDimension.DimensionValue.Value}</span>\n </span>\n </div>\n );\n }\n\n if (productDimension.DimensionTypeValue === 3) {\n return (\n <div key={`${Product.RecordId}ProductDimensions3`} className='msc-cart-line__product-variant-item'>\n <span className='msc-cart-line__product-variant-size'>\n {DimensionStrings.sizeString}:\n <span className='name'>{productDimension.DimensionValue && productDimension.DimensionValue.Value}</span>\n </span>\n </div>\n );\n }\n\n if (productDimension.DimensionTypeValue === 4) {\n return (\n <div key={`${Product.RecordId}ProductDimensions4`} className='msc-cart-line__product-variant-item'>\n <span className='msc-cart-line__product-variant-style'>\n {Product.IsGiftCard ? DimensionStrings.amountString : DimensionStrings.styleString}:\n <span className='name'>{productDimension.DimensionValue && productDimension.DimensionValue.Value}</span>\n </span>\n </div>\n );\n }\n return null;\n });\n },\n\n renderDiscountLines: (props: ICartLineProps) => {\n if (!props.data.cartLine.DiscountLines || props.data.cartLine.DiscountLines.length === 0) {\n return null;\n }\n\n return props.data.cartLine.DiscountLines.map((discountLine, index) => {\n return (\n <div key={discountLine.OfferId || index} className='msc-cart-line-item-product-discount'>\n <span>\n {discountLine.OfferName ? discountLine.OfferName : ''}:{` ${props.resources.discountStringText || 'Discount'} `}\n </span>\n <span className='cart-line-item-product-discount-price'>\n <PriceComponent\n data={\n props.isSalesLine\n ? {\n price: {\n // @ts-expect-error\n CustomerContextualPrice: props.data.cartLine.PeriodicDiscount\n }\n }\n : {\n price: {\n CustomerContextualPrice: discountLine.EffectiveAmount,\n BasePrice: discountLine.EffectiveAmount\n }\n }\n }\n context={props.context}\n id={props.id}\n typeName={props.typeName}\n currencyCode={props.priceCurrency}\n />\n </span>\n <span>{` (${discountLine.EffectivePercentage !== undefined ? discountLine.EffectivePercentage : ''}%)`}</span>\n </div>\n );\n });\n },\n renderInventoryLabel: (props: ICartLineProps) => {\n if (!props.inventoryInformationLabel) {\n return null;\n }\n const inventoryCssName = props.inventoryLabelClassName\n ? `msc-cart-line__product-inventory-label ${props.inventoryLabelClassName}`\n : 'msc-cart-line__product-inventory-label';\n return <span className={inventoryCssName}>{props.inventoryInformationLabel}</span>;\n },\n\n /**\n * Gets the react node for product unit of measure display.\n * @param props - Icartline props.\n * @returns The node representing markup for unit of measure component.\n */\n renderUnitOfMeasure: (props: ICartLineProps) => {\n if (props.data.cartLine.IsInvoiceLine) {\n return null;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Do not need type check for appsettings\n if (!props.context.app.config.unitOfMeasureDisplayType || props.context.app.config.unitOfMeasureDisplayType === 'none') {\n return undefined;\n }\n\n const product = props.data.product;\n if (!product || !product.DefaultUnitOfMeasure) {\n return undefined;\n }\n\n return (\n <div className='msc-cartline__product-unit-of-measure'>\n <span>{product.DefaultUnitOfMeasure}</span>\n </div>\n );\n },\n renderShippingLabel: (props: ICartLineProps) => {\n const pickupDeliveryModeCode = props.context.request.channel?.PickupDeliveryModeCode;\n const channelDeliveryOptionConfig = props.channelDeliveryOptionConfig;\n const cartline = props.data.cartLine;\n let hasShippingMethod = false;\n if (channelDeliveryOptionConfig !== undefined) {\n hasShippingMethod = !!(\n cartline.DeliveryMode &&\n channelDeliveryOptionConfig.PickupDeliveryModeCodes?.some(deliveryMode => deliveryMode !== cartline.DeliveryMode)\n );\n } else {\n hasShippingMethod = !!(cartline.DeliveryMode && cartline.DeliveryMode !== pickupDeliveryModeCode);\n }\n if (!hasShippingMethod) {\n return undefined;\n }\n\n const shippingChargeLines = (cartline.ChargeLines || []).filter(chargeLine => chargeLine.IsShipping);\n\n if (shippingChargeLines.length === 0) {\n return undefined;\n }\n\n const freightFee = shippingChargeLines.reduce((chargeTotal, chargeLine) => {\n return chargeTotal + (chargeLine.CalculatedAmount || 0);\n }, 0);\n\n const priceComponent = (\n <PriceComponent\n data={{\n price: {\n CustomerContextualPrice: freightFee\n }\n }}\n freePriceText='Free'\n context={props.context}\n id={props.id}\n typeName={props.typeName}\n className='msc-cart-line__freight-actual'\n currencyCode={props.priceCurrency}\n />\n );\n return (\n <>\n <label className='msc-cart-line__freight-label'>{`${props.resources.shippingChargesText}:`}</label>\n <span className='shipping-value'>{priceComponent}</span>\n </>\n );\n },\n renderOtherCharges: (props: ICartLineProps) => {\n const cartline = props.data.cartLine;\n const otherCharges = cartline.ChargeLines?.filter(chargeline => !chargeline.IsShipping);\n\n return (\n (otherCharges &&\n otherCharges.map((otherCharge, key) => {\n return otherCharge && otherCharge.CalculatedAmount ? (\n <div className='msc-cart-line__other-charges' key={key}>\n <label className='msc-cart-line__other-charges-label'>{`${otherCharge.Description}:`}</label>\n <span className='other-charge-value'>\n <PriceComponent\n data={{\n price: {\n CustomerContextualPrice: otherCharge.CalculatedAmount\n }\n }}\n context={props.context}\n id={props.id}\n typeName={props.typeName}\n className='msc-cart-line__other-charges-actual'\n currencyCode={props.priceCurrency}\n />\n </span>\n </div>\n ) : (\n ''\n );\n })) ||\n undefined\n );\n },\n\n /**\n * Render the sales agreement prompt.\n * @param props - The ICartLineProps.\n * @returns The JSX.Element.\n */\n renderSalesAgreementPrompt: (props: ICartLineProps): JSX.Element | null => {\n if (props.data.cartLine.SalesAgreementLineRecordId === 0) {\n return null;\n }\n return <div className='msc-cart-line__sales-agreement-prompt'>{props.resources.salesAgreementPricePrompt}</div>;\n }\n};\n\n// eslint-disable-next-line no-redeclare\nconst CartLine: React.FC<ICartLineProps> = (props: ICartLineProps) => {\n const { isSalesLine, productUrl, resources } = props;\n const { product, cartLine } = props.data;\n\n const destructDimensionStrings = {\n sizeString: resources.sizeString,\n colorString: resources.colorString,\n styleString: resources.styleString,\n configString: resources.configString,\n amountString: resources.amountString\n };\n\n const fallbackImageUrl =\n product &&\n getFallbackImageUrl(\n product.ItemId,\n props.context.actionContext.requestContext.apiSettings,\n props.context.request.app?.config?.OmniChannelMedia\n );\n const productDimensions = product && CartLineItemFunctions.renderProductDimensions(product, destructDimensionStrings);\n const imageSettings = props.imageSettings;\n if (imageSettings) {\n imageSettings.cropFocalRegion = true;\n }\n const renderDisountLines = CartLineItemFunctions.renderDiscountLines(props);\n const renderInventoryLabel = CartLineItemFunctions.renderInventoryLabel(props);\n const renderUnitOfMeasure = CartLineItemFunctions.renderUnitOfMeasure(props);\n const renderShippingLabel = CartLineItemFunctions.renderShippingLabel(props);\n const renderOtherCharges = CartLineItemFunctions.renderOtherCharges(props);\n const renderSalesAgreementPrompt = CartLineItemFunctions.renderSalesAgreementPrompt(props);\n const payLoad = getPayloadObject('click', props.telemetryContent!, '', product?.RecordId.toString());\n const productAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n const productName = product?.Name || cartLine.Description;\n const imgeClassName = props.data.cartLine.IsInvoiceLine ? 'msc-cart-line__invoice-image' : 'msc-cart-line__product-image';\n\n const onChange = (newValue: number): boolean => {\n if (props.quantityOnChange) {\n return props.quantityOnChange(props.data.cartLine, newValue, props.lineIndex);\n }\n return true;\n };\n\n const _generateErrorMessage = (): JSX.Element | null => {\n if (props.errorMessage) {\n return (\n <div className='msc-cart-line__error-message msc-alert__header'>\n <span className='msi-exclamation-triangle' />\n <span>{props.errorMessage}</span>\n </div>\n );\n }\n\n return null;\n };\n\n const _generateQuantityandPrice = (): JSX.Element[] | null => {\n const nodes = [];\n if (props.isOutOfStock) {\n return null;\n }\n\n // No quantity selector for invoice line\n if (!props.data.cartLine.IsInvoiceLine) {\n if (props.data.product && props.isQuantityEditable) {\n nodes.push(\n <div className='msc-cart-line__product-quantity'>\n <div className='msc-cart-line__product-quantity-label'>{resources.quantityDisplayString}</div>\n <IncrementalQuantity\n id={`msc-cart-line__quantity_${props.data.product.RecordId}-${props.data.cartLine.DeliveryMode}-${props.data.cartLine.LineId}`}\n max={props.maxQuantity || 10}\n currentCount={props.currentQuantity}\n onChange={onChange}\n inputQuantityAriaLabel={resources.inputQuantityAriaLabel}\n decrementButtonAriaLabel={resources.decrementButtonAriaLabel}\n incrementButtonAriaLabel={resources.incrementButtonAriaLabel}\n key={props.data.cartLine.LineId}\n disabled={!props.isCartStateReady}\n isGiftCard={props.data.product.IsGiftCard}\n telemetryContent={props.telemetryContent}\n />\n </div>\n );\n } else {\n nodes.push(\n <div className={classNames('msc-cart-line__quantity', { 'single-quantity': props.data.cartLine.Quantity === 1 })}>\n <label className='quantity-label'>{resources.quantityDisplayString}:</label>\n <span className='quantity-value'>{props.data.cartLine.Quantity}</span>\n </div>\n );\n }\n }\n\n nodes.push(\n <div className='msc-cart-line__product-savings'>\n <PriceComponent\n data={\n isSalesLine\n ? {\n price: {\n CustomerContextualPrice: (props.data.cartLine as SalesLine).NetAmountWithAllInclusiveTax,\n BasePrice: (props.data.cartLine as SalesLine).GrossAmount\n }\n }\n : {\n price: {\n CustomerContextualPrice: (props.data.cartLine as CartLine).ExtendedPrice,\n BasePrice: props.data.cartLine.NetPrice\n }\n }\n }\n context={props.context}\n id={props.id}\n typeName={props.typeName}\n className='msc-cart-line__product-savings-actual'\n originalPriceText={resources.originalPriceText}\n currentPriceText={resources.currentPriceText}\n currencyCode={props.priceCurrency}\n />\n {(props.data.cartLine.DiscountAmount && props.data.cartLine.DiscountAmount > 0 && (\n <>\n <span className='msc-cart-line__product-savings-label'>\n {` ${props.resources.discountStringText || 'Discount'} `}\n </span>\n <PriceComponent\n data={\n props.isSalesLine\n ? {\n price: {\n // @ts-expect-error\n CustomerContextualPrice: props.data.cartLine.PeriodicDiscount\n }\n }\n : {\n price: {\n CustomerContextualPrice: props.data.cartLine.DiscountAmount,\n BasePrice: props.data.cartLine.DiscountAmount\n }\n }\n }\n context={props.context}\n id={props.id}\n typeName={props.typeName}\n className='msc-cart-line__product-savings-text'\n salesAgreementLineId={props.data.cartLine.SalesAgreementLineRecordId}\n currencyCode={props.priceCurrency}\n />\n </>\n )) ||\n null}\n </div>\n );\n\n return nodes;\n };\n\n return (\n <>\n <div className='msc-cart-line'>\n <div className={imgeClassName}>\n <Image\n requestContext={props.context.actionContext.requestContext}\n src={props.primaryImageUrl ?? 'empty'}\n fallBackSrc={fallbackImageUrl}\n altText={productName}\n gridSettings={props.gridSettings}\n imageSettings={imageSettings}\n loadFailureBehavior='empty'\n />\n </div>\n <div className='msc-cart-line__content'>\n <div className='msc-cart-line__product'>\n <CatalogLabelComponent {...props} />\n {MsDyn365.isBrowser ? (\n <a className='msc-cart-line__product-title' {...productAttribute} href={productUrl} key={productUrl}>\n {productName}\n </a>\n ) : null}\n {ArrayExtensions.hasElements(productDimensions) ? (\n <div className='msc-cart-line__product-variants'>{productDimensions}</div>\n ) : (\n ''\n )}\n {renderUnitOfMeasure}\n <div className='msc-cart-line__product-price'>\n <PriceComponent\n data={\n isSalesLine\n ? {\n price: {\n CustomerContextualPrice: (props.data.cartLine as SalesLine).NetAmountWithAllInclusiveTax,\n BasePrice: (props.data.cartLine as SalesLine).GrossAmount\n }\n }\n : {\n price: {\n CustomerContextualPrice: (props.data.cartLine as CartLine).ExtendedPrice,\n BasePrice: props.data.cartLine.NetPrice\n }\n }\n }\n context={props.context}\n id={props.id}\n typeName={props.typeName}\n className='discount-value'\n salesAgreementLineId={props.data.cartLine.SalesAgreementLineRecordId}\n currencyCode={props.priceCurrency}\n />\n </div>\n {renderDisountLines}\n {renderInventoryLabel}\n {props.showShippingChargesForLineItems && <div className='msc-cart-line__freight'>{renderShippingLabel}</div>}\n {renderOtherCharges}\n {renderSalesAgreementPrompt}\n </div>\n {_generateQuantityandPrice()}\n {props.data.cartLine.IsInvoiceLine && props.data.cartState && props.resources.priceEditorResources && (\n <CartLinePriceEditor\n className='msc-cart-line__price-editor-container'\n context={props.context}\n resources={props.resources.priceEditorResources}\n cartState={props.data.cartState}\n cartLine={props.data.cartLine}\n />\n )}\n </div>\n </div>\n {_generateErrorMessage()}\n </>\n );\n};\n\nexport default CartLine;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport 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 { AddToCartComponent, IAddToCartFailureResult, IAddToCartResources, OrderDetailsProduct } from '@msdyn365-commerce/components';\nimport { getUrlSync, IComponentProps, ICoreContext } from '@msdyn365-commerce/core';\nimport { SalesLine } from '@msdyn365-commerce/retail-proxy';\nimport { QuickOrderTemplate } from '@msdyn365-commerce-modules/retail-actions';\nimport React from 'react';\n\n/**\n * The data on which the component should operate.\n */\nexport interface IAddToCartSelectedData {\n quickOrderTemplate: QuickOrderTemplate | undefined;\n}\n\n/**\n * The resources needed to render a buy selected component.\n */\nexport interface IAddToCartSelectedResources {\n quickOrderGridBuySelectedButtonText?: string;\n quickOrderGridBuySelectedButtonAriaLabel?: string;\n quickOrderGridBuySelectedAddingToCartErrorNotificationTitle?: string;\n quickOrderGridBuySelectedAddingToCartErrorNotificationCloseAriaLabel?: string;\n quickOrderGridGoToCartText?: string;\n quickOrderGridDialogCloseText?: string;\n quickOrderGridSingleItemText?: string;\n quickOrderGridMultiLineItemFormatText?: string;\n quickOrderGridMultiLinesFormatText?: string;\n quickOrderGridHeaderMessageText?: string;\n addedQuantityText?: string;\n originalPriceText?: string;\n currentPriceText?: string;\n freePriceText?: string;\n}\n\n/**\n * Configuration of a buy selected component.\n */\nexport interface IAddToCartSelectedProps extends IComponentProps<IAddToCartSelectedData> {\n className: string;\n context: ICoreContext;\n\n resources: IAddToCartSelectedResources;\n\n isIcon?: boolean;\n onError?(result: IAddToCartFailureResult): void;\n}\n\n/**\n * Get the dialog strings.\n * @param props - The buy selected props.\n * @returns The add to cart resources.\n */\nexport const getDialogStrings = (props: IAddToCartSelectedProps): IAddToCartResources => {\n return {\n goToCartText: props.resources.quickOrderGridGoToCartText ?? '',\n continueShoppingText: props.resources.quickOrderGridDialogCloseText ?? '',\n closeNotificationLabel: props.resources.quickOrderGridBuySelectedAddingToCartErrorNotificationCloseAriaLabel ?? '',\n headerItemOneText: props.resources.quickOrderGridSingleItemText ?? '',\n headerItemFormatText: props.resources.quickOrderGridMultiLineItemFormatText ?? '',\n headerLinesFormatText: props.resources.quickOrderGridMultiLinesFormatText ?? '',\n headerMessageText: props.resources.quickOrderGridHeaderMessageText ?? '',\n freePriceText: props.resources.freePriceText ?? '',\n originalPriceText: props.resources.originalPriceText ?? '',\n currentPriceText: props.resources.currentPriceText ?? '',\n addedQuantityText: props.resources.addedQuantityText ?? '',\n buyAgainNotificationTitle: props.resources.quickOrderGridBuySelectedAddingToCartErrorNotificationTitle ?? '',\n buyAgainNotificationCloseAriaLabel: props.resources.quickOrderGridBuySelectedAddingToCartErrorNotificationCloseAriaLabel ?? ''\n };\n};\n\n/**\n * Get the dialog strings.\n * @param quickOrder - The buy selected props.\n * @returns The add to cart resources.\n */\nexport const getOrderDetails = (quickOrder: QuickOrderTemplate): OrderDetailsProduct[] => {\n const orderDetails: OrderDetailsProduct[] = [];\n for (const quickLine of quickOrder.quickOrderTemplateLines) {\n const quantity = quickLine.productListLine.Quantity;\n const salesLine: SalesLine = {\n Quantity: quantity\n };\n const products = new OrderDetailsProduct(salesLine, quickLine.fullProduct?.ProductDetails);\n orderDetails.push(products);\n }\n return orderDetails;\n};\n\n/**\n * Renders a button which adds given products to the cart.\n * @param props - Configuration of the component.\n * @returns A react element or null if no products were given.\n */\nexport const AddToCartProductListComponent: React.FC<IAddToCartSelectedProps> = (props: IAddToCartSelectedProps): JSX.Element | null => {\n const {\n data: { quickOrderTemplate }\n } = props;\n\n if (quickOrderTemplate?.quickOrderTemplateLines[0].fullProduct?.ProductDetails === undefined) {\n return null;\n }\n const quantity = quickOrderTemplate.quickOrderTemplateLines[0].productListLine.Quantity;\n const buttonLabel = props.resources.quickOrderGridBuySelectedButtonText;\n const buttonAriaLabel = props.resources.quickOrderGridBuySelectedButtonAriaLabel;\n const dialogStrings: IAddToCartResources = getDialogStrings(props);\n const shouldSkipSiteSettings: boolean = true;\n const orderDetailProducts = getOrderDetails(quickOrderTemplate);\n return (\n <AddToCartComponent\n addToCartText={buttonLabel ?? ''}\n outOfStockText=''\n addToCartArialLabel={buttonAriaLabel}\n quantity={quantity}\n id={props.id}\n typeName={props.typeName}\n className={props.className}\n navigationUrl={getUrlSync('cart', props.context.actionContext)}\n data={{ product: quickOrderTemplate.quickOrderTemplateLines[0].fullProduct?.ProductDetails }}\n context={props.context}\n dialogStrings={dialogStrings}\n shouldSkipSiteSettings={shouldSkipSiteSettings}\n orderDetailsProducts={orderDetailProducts}\n onError={props.onError}\n />\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IComponentProps, ICoreContext } from '@msdyn365-commerce/core';\nimport { QuickOrderTemplate } from '@msdyn365-commerce-modules/retail-actions';\nimport { Alert, Button, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { AddToCartProductListComponent } from './add-to-list';\nimport { IQuickOrderGridActionsViewProps, IQuickOrderGridState } from './utilities';\n\n/**\n * Interface for quick order grid action data.\n */\nexport interface IQuickOrderGridActionsData {\n quickOrderTemplate: QuickOrderTemplate | undefined;\n}\n\n/**\n * Interface for quick order grid action props.\n */\nexport interface IQuickOrderGridActionsProps extends IComponentProps<IQuickOrderGridActionsData> {\n context: ICoreContext;\n telemetryContent?: ITelemetryContent;\n moduleClassName: string;\n typeName: string;\n handlers: {\n removeProductList(productListId: string): void;\n onErrorMessage(message: string): void;\n };\n quickOrderGridState: IQuickOrderGridState;\n resources: {\n quickOrderGridDeleteButtonText: string;\n quickOrderGridBuySelectedButtonText?: string;\n quickOrderGridBuySelectedButtonAriaLabel?: string;\n quickOrderGridBuySelectedAddingToCartErrorNotificationTitle?: string;\n quickOrderGridBuySelectedAddingToCartErrorNotificationCloseAriaLabel?: string;\n quickOrderGridGoToCartText?: string;\n quickOrderGridDialogCloseText?: string;\n quickOrderGridSingleItemText?: string;\n quickOrderGridMultiLineItemFormatText?: string;\n quickOrderGridMultiLinesFormatText?: string;\n quickOrderGridHeaderMessageText?: string;\n addedQuantityText?: string;\n originalPriceText?: string;\n currentPriceText?: string;\n freePriceText?: string;\n };\n}\n\n/**\n * Remove ProductList Action.\n * @param props -Quick order grid action props.\n */\nconst removeQuickOrderList = (props: IQuickOrderGridActionsProps): void => {\n const {\n data: { quickOrderTemplate },\n handlers\n } = props;\n const { removeProductList } = handlers;\n // eslint-disable-next-line @typescript-eslint/prefer-optional-chain -- Need to check data.\n if (quickOrderTemplate && quickOrderTemplate.productList.Id) {\n removeProductList(quickOrderTemplate.productList.Id);\n }\n};\n\n/**\n * Get Addtobag Button.\n * @param props -Order template action props.\n * @returns QuickOrderGrid actions view props.\n */\nconst getQuickOrderGridAddToCartDialog = (props: IQuickOrderGridActionsProps): React.ReactNode => {\n const {\n data: { quickOrderTemplate },\n context,\n moduleClassName,\n resources,\n typeName\n } = props;\n const buttonId = 'quick-order-grid';\n return (\n <AddToCartProductListComponent\n className={`${moduleClassName}-action-bar__buy-selected msc-btn`}\n id={buttonId}\n typeName={typeName}\n data={{ quickOrderTemplate }}\n context={context}\n resources={resources}\n onError={(result): void => {\n if (result.cartActionResult?.errorDetails?.LocalizedMessage) {\n props.handlers.onErrorMessage(result.cartActionResult.errorDetails.LocalizedMessage);\n }\n }}\n />\n );\n};\n\n/**\n * Remove Quick order grid action.\n * @param props -Quick order grid action props.\n * @returns Remove order template.\n */\nconst removeActionHandler = (props: IQuickOrderGridActionsProps) => () => {\n removeQuickOrderList(props);\n};\n\n/**\n * Quick order grid action view.\n * @param props -Quick Order Grid template action props.\n * @returns QuickOrderGrid actions view props.\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention -- Name needs to be this.\nexport const QuickOrderGridActionsView = (props: IQuickOrderGridActionsProps): IQuickOrderGridActionsViewProps => {\n const { moduleClassName, quickOrderGridState, resources } = props;\n const { quickOrderGridDeleteButtonText } = resources;\n\n const userMessageNode = quickOrderGridState.topStateMessage ? (\n <Alert color={quickOrderGridState.topStateMessage.statusCssString} isOpen={quickOrderGridState.topStateMessage.isOpen}>\n <span className={quickOrderGridState.topStateMessage.messageGlyph} />\n <span>{quickOrderGridState.topStateMessage.messageText}</span>\n </Alert>\n ) : (\n undefined\n );\n\n return {\n addProductListToBag: getQuickOrderGridAddToCartDialog(props),\n removeProductList: (\n <Button className={`${moduleClassName}-action-bar__delete-list-button`} onClick={removeActionHandler(props)}>\n {quickOrderGridDeleteButtonText}\n </Button>\n ),\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 { Button, Collapse, ICollapseProps } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { IQuickOrderGridDrawerProps } from './quick-order-grid-drawer-props';\n\n/**\n * Interface for drawer state.\n */\nexport interface IQuickOrderGridDrawerState {\n isOpen: boolean;\n}\n\n/**\n * Placement of glyph.\n */\nexport type GlyphPlacement = 'start' | 'end';\n\n/**\n * Quick Order Grid Drawer - This is a full width uncontrolled collapse where the button glyph changes\n * when the drawer is open and closed.\n */\nexport class QuickOrderGridDrawer extends React.Component<IQuickOrderGridDrawerProps, IQuickOrderGridDrawerState> {\n private readonly _drawerOpenGlyph: string;\n\n private readonly _drawerCloseGlyph: string;\n\n private readonly _drawerGlyphClass: string;\n\n private _isManuallyToggled: boolean;\n\n public constructor(props: IQuickOrderGridDrawerProps) {\n super(props);\n this._isManuallyToggled = false;\n this.state = { isOpen: props.collapseProps?.isOpen ?? false };\n this._drawerGlyphClass = classnames('drawer__glyph', this.props.toggleGlyphClassName ? this.props.toggleGlyphClassName : '');\n const closeGlyph = this.props.closeGlyph ? this.props.closeGlyph : '';\n if (this.props.isAnimateGlyph) {\n this._drawerOpenGlyph = classnames(this._drawerGlyphClass, this.props.openGlyph ? this.props.openGlyph : closeGlyph);\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, closeGlyph);\n }\n }\n\n /**\n * Method to call on click of drawer button.\n * @param event - Product DeliveryOption List.\n */\n public toggle = (event: React.MouseEvent<HTMLElement> | React.KeyboardEvent<HTMLElement>): void => {\n event.preventDefault();\n this._isManuallyToggled = true;\n if (this.props.onToggle) {\n this.setState(previousState => ({ isOpen: !previousState.isOpen }));\n this.props.onToggle(this.state);\n } else {\n this.setState(previousState => ({ isOpen: !previousState.isOpen }));\n }\n };\n\n public shouldComponentUpdate(nextProps: IQuickOrderGridDrawerProps, nextState: IQuickOrderGridDrawerState): 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: ICollapseProps = { ...this.props.collapseProps };\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 }\n collapseProps.children = this.props.children;\n const drawerClass = classnames('drawer', this.props.className);\n const drawerButtonClassName = `${this.props.className ? this.props.className : ''}__button`;\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.isDisabled}\n className={drawerButtonClassName}\n color='secondary'\n >\n {this._generateDrawerButtonInnerMarkup(collapseProps.isOpen, drawerClass)}\n </Button>\n <Collapse {...collapseProps} />\n </div>\n );\n }\n\n private _generateDrawerButtonInnerMarkup(isCollapseState: boolean, drawerClass: string): JSX.Element {\n const drawerButtonTextClass = classnames(\n 'drawer__buttontext',\n this.props.toggleButtonClassName ? this.props.toggleButtonClassName : ''\n );\n const headingDrawerClass = `${drawerClass}-heading`;\n const descriptionDrawerClass = `${drawerClass}-description`;\n return (\n <>\n <h2 className={classnames(drawerButtonTextClass, headingDrawerClass)}>{this.props.moduleHeadingText}</h2>\n <span className={classnames(drawerButtonTextClass, descriptionDrawerClass)}>{this.props.moduleDescriptionText}</span>\n {this._generateGlyphMarkup('drawer__glyph__end', isCollapseState)}\n </>\n );\n }\n\n private _generateGlyphMarkup(location: string, isCollapseState: boolean): JSX.Element {\n let glyphClass = isCollapseState ? this._drawerOpenGlyph : this._drawerCloseGlyph;\n glyphClass = `${glyphClass} ${location}`;\n return <span className={glyphClass} />;\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 { IQuickOrderGridState } from './utilities';\n\n/**\n * Interface quick order grid form props.\n */\nexport interface IQuickOrderGridFormProps {\n isAddtoListDisabled: boolean | undefined;\n productTextInput: React.RefObject<HTMLInputElement>;\n quantityTextInput: React.RefObject<HTMLInputElement>;\n maxChars: number;\n minQuantity?: number;\n maxQuantity?: number;\n moduleClassName: string;\n ariaLabelQuantity: string;\n ariaLabelProduct: string;\n ariaLabelAddtoCart: string;\n quickOrderGridState: IQuickOrderGridState;\n handleInputChange(query: string): void;\n handleQuantityChange(query: string): void;\n handleAddProductListClick(): Promise<void>;\n}\n\n/**\n * Interface quick order grid form view props.\n */\nexport interface IQuickOrderGridFormViewProps {\n product: React.ReactNode;\n quantity: React.ReactNode;\n addToListBtn: 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\n/**\n * Quick order grid form component.\n * @param props -Component form props.\n * @returns Quick order gridp view props..\n */\nexport const QuickOrderGridFormComponent = (props: IQuickOrderGridFormProps): IQuickOrderGridFormViewProps => {\n const {\n moduleClassName,\n productTextInput,\n quantityTextInput,\n quickOrderGridState,\n maxChars,\n minQuantity,\n maxQuantity,\n isAddtoListDisabled,\n ariaLabelQuantity,\n ariaLabelProduct,\n ariaLabelAddtoCart,\n handleQuantityChange,\n handleInputChange,\n handleAddProductListClick\n } = props;\n\n const onInputChange = onInputChangeFunction(handleInputChange);\n\n const onQuantityInputChange = onQuantityChangeFunction(handleQuantityChange);\n\n const productNode = (\n <div className={`${moduleClassName}__content-form-main-product`}>\n <h2 className={`${moduleClassName}__content-form-main-product-lable`} aria-label={ariaLabelProduct}>\n {ariaLabelProduct}\n </h2>\n <input\n className={`${moduleClassName}__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={`${moduleClassName}__content-form-main-quantity`}>\n <h2 className={`${moduleClassName}__content-form-main-quantity-lable`} aria-label={ariaLabelQuantity}>\n {ariaLabelQuantity}\n </h2>\n <input\n className={`${moduleClassName}__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={minQuantity}\n aria-valuemax={maxQuantity}\n aria-valuenow={quickOrderGridState.quantity}\n />\n </div>\n );\n\n const addToListNode = (\n <div className={`${moduleClassName}__content-form-main-add-to-product-list`}>\n <Button\n className={`${moduleClassName}__content-form-main-add-to-product-list-button`}\n disabled={isAddtoListDisabled}\n aria-label={ariaLabelAddtoCart}\n onClick={handleAddProductListClick}\n >\n {ariaLabelAddtoCart}\n </Button>\n </div>\n );\n\n const userMessageNode = quickOrderGridState.stateMessage ? (\n <Alert color={quickOrderGridState.stateMessage.statusCssString} isOpen={quickOrderGridState.stateMessage.isOpen}>\n <span className={quickOrderGridState.stateMessage.messageGlyph} />\n <span>{quickOrderGridState.stateMessage.messageText}</span>\n </Alert>\n ) : (\n undefined\n );\n\n return {\n product: productNode,\n addToListBtn: addToListNode,\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 { QuickOrderTemplateLine } from '@msdyn365-commerce-modules/retail-actions';\nimport { observable } from 'mobx';\n\n/**\n * Represents a product for quick order grid.\n */\nexport class QuickOrderGridProduct {\n @observable\n public isSelected: boolean;\n\n public readonly productLine: QuickOrderTemplateLine;\n\n public constructor(productLine: QuickOrderTemplateLine) {\n this.productLine = productLine;\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 grid table header resources.\n */\nexport interface IQuickOrderGridTableHeaderResources {\n quickOrderGridProductNumberText: string;\n quickOrderGridProductText: string;\n quickOrderGridUnitPriceText: string;\n quickOrderGridUnitOfMeasureText: string;\n quickOrderGridQuantityText: string;\n quickOrderGridActionsText: string;\n}\n\n/**\n * Interface for quick order grid table props.\n */\nexport interface IQuickOrderGridTableHeaderProps extends IComponentProps {\n context: ICoreContext;\n className: string;\n\n isMobile: boolean;\n resources: IQuickOrderGridTableHeaderResources;\n}\n\n/**\n * Interface for quick order grid table header component.\n */\nexport interface IQuickOrderGridTableHeaderComponent extends IComponent<IQuickOrderGridTableHeaderProps> {}\n\n/**\n * Get the quick order grid header cells for desktop.\n * @param props -- The quick order grid table header props.\n * @returns The list of cells for quick order grid header component in desktop version.\n */\nconst QuickOrderGridDesktopHeaderCellsComponent: React.FC<IQuickOrderGridTableHeaderProps> = (props: IQuickOrderGridTableHeaderProps) => {\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.quickOrderGridProductNumberText}</th>\n <th>{resources.quickOrderGridProductText}</th>\n <th className={columnWithNumberClassName}>{resources.quickOrderGridUnitPriceText}</th>\n <th>{resources.quickOrderGridUnitOfMeasureText}</th>\n <th className={columnWithNumberClassName}>{resources.quickOrderGridQuantityText}</th>\n <th>{resources.quickOrderGridActionsText}</th>\n </>\n );\n};\n\n/**\n * Get the quick order grid header cells for mobile.\n * @param props -- The quick order grid table header props.\n * @returns The quick order grid header component in desktop version.\n */\nconst QuickOrderGridMobileHeaderCellsComponent: React.FC<IQuickOrderGridTableHeaderProps> = (props: IQuickOrderGridTableHeaderProps) => {\n const { resources } = props;\n return (\n <>\n <th className={classnames(`${props.className}__emptyColumn`)} />\n <th>{resources.quickOrderGridProductNumberText}</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 QuickOrderGridTableHeaderComponent: React.FC<IQuickOrderGridTableHeaderProps> = (props: IQuickOrderGridTableHeaderProps) => {\n const rowClassName = `${props.className}__row`;\n\n let headerCells: JSX.Element;\n if (props.isMobile) {\n headerCells = <QuickOrderGridMobileHeaderCellsComponent {...props} />;\n } else {\n headerCells = <QuickOrderGridDesktopHeaderCellsComponent {...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 { PriceComponent } from '@msdyn365-commerce/components';\nimport MsDyn365, { IComponentProps, ICoreContext, IImageSettings, Image } from '@msdyn365-commerce/core';\nimport { ProductListLine, ProductPrice } from '@msdyn365-commerce/retail-proxy';\nimport { getFallbackImageUrl, getProductPageUrlSync, ObjectExtensions, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, IncrementalQuantity, isMobile, VariantType } from '@msdyn365-commerce-modules/utilities';\nimport React, { useState } from 'react';\n\nimport { QuickOrderGridProduct } from '../../quick-order-grid-product';\nimport { IQuickOrderGridRowCallbacks } from '../../utilities';\n\n/**\n * Data required to render each quick order grid row.\n */\nexport interface IQuickOrderGridTableRowData {\n product: QuickOrderGridProduct;\n}\n\n/**\n * Resources for quick order grid table rows.\n */\nexport interface IQuickOrderGridTableRowResources {\n quickOrderGridQuantityMobileText: string;\n quickOrderGridProductDimensionsSeparator: string;\n quickOrderGridViewDetailsButtonText: string;\n quickOrderGridViewDetailsButtonAriaLabel: string;\n quickOrderGridRemoveItemButtonAriaLabel: string;\n quickOrderGridInputQuantityAriaLabel: string;\n quickOrderGridDecrementButtonAriaLabel: string;\n quickOrderGridIncrementButtonAriaLabel: string;\n originalPriceText: string;\n currentPriceText: string;\n freePriceText: string;\n}\n\n/**\n * Interface for quick order grid table props.\n */\nexport interface IQuickOrderGridTableRowProps extends IComponentProps<IQuickOrderGridTableRowData> {\n context: ICoreContext;\n className: string;\n productListLine: ProductListLine;\n price?: ProductPrice;\n moduleId: string;\n moduleTypeName: string;\n min: number;\n max: number;\n quantity: number;\n imageSettings?: IImageSettings;\n isMobile: boolean;\n resources: IQuickOrderGridTableRowResources;\n index: number;\n callbacks: IQuickOrderGridRowCallbacks;\n}\n\n/**\n * The default image settings for quick order grid 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 grid row.\n * @param props - Quick order table row props.\n * @returns React element.\n */\nconst QuickOrderGridTableRowProductImageComponent: React.FC<IQuickOrderGridTableRowProps> = (props: IQuickOrderGridTableRowProps) => {\n const product = props.data.product.productLine.fullProduct?.ProductDetails;\n const fallbackImageUrl = getFallbackImageUrl(\n 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={product?.Name}\n src={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\nlet setShowPreviousActions: React.Dispatch<React.SetStateAction<boolean>> | undefined;\n\n/**\n * Renders product price.\n * @param props - Props for price component.\n * @returns React element.\n */\nconst renderProductPrice = (props: IQuickOrderGridTableRowProps): JSX.Element | null => {\n const { context, moduleId, moduleTypeName, resources } = props;\n const price = props.price;\n\n if (price) {\n return (\n <PriceComponent\n id={moduleId}\n typeName={moduleTypeName}\n data={{ price }}\n className='ms-quick-order-grid-row__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\n/**\n * Renders product price.\n * @param props - Props for price component.\n * @returns React element.\n */\nconst renderUnitOfMeasure = (props: IQuickOrderGridTableRowProps): JSX.Element | null => {\n const price = props.price;\n\n if (price) {\n return (\n <div className='ms-quick-order-grid-row__product-unit-of-measure'>\n {StringExtensions.isNullOrEmpty(props.productListLine.UnitOfMeasure) || price.UnitOfMeasure}\n </div>\n );\n }\n return null;\n};\n\n/**\n * On Change function.\n * @param onChangeQuantity -On change quantity function.\n * @param itemKey -String.\n * @param props -Order template line props.\n * @returns Set change quantity.\n */\nconst onChangeHandler = (\n onChangeQuantity: (\n orderTemplateLineId: string | undefined,\n quantity: number,\n props?: IQuickOrderGridTableRowProps | undefined\n ) => boolean,\n itemKey: string | undefined,\n props: IQuickOrderGridTableRowProps\n) => (newValue: number) => {\n onChangeQuantity(itemKey, newValue, props);\n return true;\n};\n\n/**\n * On Change function.\n * @param onRemoveItem -On change quantity function.\n * @param quickOrderGridProductKey -QuickOrderGridp Product.\n * @param props -Order template line props.\n * @returns Set change quantity.\n */\nconst onRemoveHandler = (\n onRemoveItem: (quickOrderGridProduct: QuickOrderGridProduct, props?: IQuickOrderGridTableRowProps | undefined) => void,\n quickOrderGridProductKey: QuickOrderGridProduct,\n props: IQuickOrderGridTableRowProps\n) => () => {\n onRemoveItem(quickOrderGridProductKey, props);\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 QuickOrderGridExtraActionsPopupComponent: React.FC<IQuickOrderGridTableRowProps> = (\n props: IQuickOrderGridTableRowProps\n): JSX.Element | null => {\n const {\n resources: { quickOrderGridViewDetailsButtonAriaLabel, quickOrderGridViewDetailsButtonText }\n } = props;\n const product = props.data.product.productLine.fullProduct?.ProductDetails;\n const [shouldShowActions, setShowActions] = useState(false);\n let productUrl = '';\n if (product === undefined) {\n return null;\n }\n if (!StringExtensions.isNullOrWhitespace(product.Name) && !ObjectExtensions.isNullOrUndefined(product.RecordId)) {\n productUrl = getProductPageUrlSync(product.Name!, product.RecordId, props.context.actionContext);\n }\n\n const onClickViewDetails = React.useCallback(() => {\n if (MsDyn365.isBrowser) {\n window.location.href = productUrl;\n }\n }, [productUrl]);\n\n const toggle = React.useCallback(() => {\n const shouldShowActionsNewValue = !shouldShowActions;\n if (shouldShowActionsNewValue) {\n if (setShowPreviousActions) {\n setShowPreviousActions(false);\n }\n setShowActions(shouldShowActionsNewValue);\n setShowPreviousActions = setShowActions;\n } else {\n setShowPreviousActions = undefined;\n setShowActions(shouldShowActionsNewValue);\n }\n }, [shouldShowActions, setShowActions]);\n\n if (StringExtensions.isNullOrWhitespace(productUrl)) {\n return null;\n }\n\n const className = `${props.className}__extra-actions-cell`;\n const actionsContainerClassName = `${className}__actions-container`;\n\n return (\n <div className={className}>\n <Button className={`${className}__toggle`} onClick={toggle} />\n {shouldShowActions && (\n <div className={actionsContainerClassName}>\n <Button\n className={`${actionsContainerClassName}__view-details`}\n onClick={onClickViewDetails}\n aria-label={quickOrderGridViewDetailsButtonAriaLabel}\n >\n {quickOrderGridViewDetailsButtonText}\n </Button>\n <Button\n className={`${props.className}__product-remove`}\n aria-label={props.resources.quickOrderGridRemoveItemButtonAriaLabel}\n >\n {props.resources.quickOrderGridRemoveItemButtonAriaLabel}\n </Button>\n </div>\n )}\n </div>\n );\n};\n\n/**\n * Renders quick order grid table rows for desktop view.\n * @param props - Configuration for the rows.\n * @returns A react node with a list of quick order grid rows for desktop view.\n */\nexport const QuickOrderGridDesktopTableRowCellComponent: React.FC<IQuickOrderGridTableRowProps> = (props: IQuickOrderGridTableRowProps) => {\n const product = props.data.product.productLine.fullProduct?.ProductDetails;\n const productListLine = props.data.product.productLine.productListLine;\n const { min, max, quantity } = props;\n const columnWithNumberClassName = `${props.className}__column-with-number`;\n if (product !== undefined) {\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 <QuickOrderGridTableRowProductImageComponent {...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.quickOrderGridProductDimensionsSeparator)}\n </span>\n </div>\n </td>\n <td className={columnWithNumberClassName}>{renderProductPrice(props)}</td>\n <td>{renderUnitOfMeasure(props)}</td>\n <td className={`${props.className}__product-quantity`}>\n <IncrementalQuantity\n id={`msc-quick-order-grid-row__quantity_${product.RecordId}-${productListLine.LineId ?? ''}`}\n min={min}\n max={max}\n currentCount={quantity}\n inputQuantityAriaLabel={props.resources.quickOrderGridInputQuantityAriaLabel}\n decrementButtonAriaLabel={props.resources.quickOrderGridDecrementButtonAriaLabel}\n incrementButtonAriaLabel={props.resources.quickOrderGridIncrementButtonAriaLabel}\n key={productListLine.LineId}\n isGiftCard={product.IsGiftCard}\n onChange={onChangeHandler(props.callbacks.onChangeQuantity, productListLine.LineId, props)}\n />\n </td>\n <td>\n <Button\n className={`${props.className}__product-remove`}\n aria-label={props.resources.quickOrderGridRemoveItemButtonAriaLabel}\n onClick={onRemoveHandler(props.callbacks.onRemoveItem, props.data.product, props)}\n />\n </td>\n </>\n );\n }\n\n return null;\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 grid rows for mobile view.\n */\nexport const QuickOrderGridMobileTableRowCellComponent: React.FC<IQuickOrderGridTableRowProps> = (props: IQuickOrderGridTableRowProps) => {\n const product = props.data.product.productLine.fullProduct?.ProductDetails;\n const productListLine = props.data.product.productLine.productListLine;\n const { min, max, quantity } = props;\n if (product !== undefined) {\n return (\n <>\n <td>\n <QuickOrderGridTableRowProductImageComponent {...props} />\n </td>\n <td>\n <div className={`${props.className}__product-info`}>\n <span className={`${props.className}__product-name`}>{product.RecordId}</span>\n <span className={`${props.className}__product-quantity`}>\n <IncrementalQuantity\n id={`msc-quick-order-grid-row__quantity_${product.RecordId}-${productListLine.LineId ?? ''}`}\n min={min}\n max={max}\n currentCount={quantity}\n inputQuantityAriaLabel={props.resources.quickOrderGridInputQuantityAriaLabel}\n decrementButtonAriaLabel={props.resources.quickOrderGridDecrementButtonAriaLabel}\n incrementButtonAriaLabel={props.resources.quickOrderGridIncrementButtonAriaLabel}\n key={productListLine.LineId}\n isGiftCard={product.IsGiftCard}\n onChange={onChangeHandler(props.callbacks.onChangeQuantity, productListLine.LineId, props)}\n />\n </span>\n </div>\n </td>\n <td>\n <QuickOrderGridExtraActionsPopupComponent {...props} />\n </td>\n </>\n );\n }\n return null;\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 QuickOrderGridTableRowComponent: React.FC<IQuickOrderGridTableRowProps> = (props: IQuickOrderGridTableRowProps) => {\n const rowClassName = `${props.className}__row`;\n const isMobileView = isMobile({ variant: VariantType.Viewport, context: props.context.request }) === 'xs';\n let headerCells: JSX.Element;\n if (isMobileView) {\n headerCells = <QuickOrderGridMobileTableRowCellComponent {...props} />;\n } else {\n headerCells = <QuickOrderGridDesktopTableRowCellComponent {...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, IImageSettings } from '@msdyn365-commerce/core';\nimport React from 'react';\n\nimport { ObjectExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { QuickOrderGridProduct } from '../quick-order-grid-product';\nimport { IQuickOrderGridRowCallbacks } from '../utilities';\nimport {\n IQuickOrderGridTableHeaderResources,\n IQuickOrderGridTableRowResources,\n QuickOrderGridTableHeaderComponent,\n QuickOrderGridTableRowComponent\n} from './components';\n\n/**\n * Quick order table data interface.\n */\ninterface IQuickOrderGridTableData {\n quickOrderGridProducts: QuickOrderGridProduct[];\n isOrderQuantityLimitsFeatureEnabled: boolean;\n}\n\n/**\n * Quick order table resources.\n */\nexport interface IQuickOrderGridTableResources extends IQuickOrderGridTableHeaderResources, IQuickOrderGridTableRowResources {}\n\n/**\n * Quick order table props.\n */\nexport interface IQuickOrderGridTableProps extends IComponentProps<IQuickOrderGridTableData> {\n context: ICoreContext;\n className: string;\n moduleId: string;\n moduleTypeName: string;\n\n resources: IQuickOrderGridTableResources;\n isMobileView: boolean;\n imageSettings?: IImageSettings;\n callBacks: IQuickOrderGridRowCallbacks;\n}\n\n/**\n * Quick order table component.\n */\nexport interface IQuickOrderGridTableComponent extends IComponent<IQuickOrderGridTableProps> {}\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 QuickOrderGridTableComponent: React.FC<IQuickOrderGridTableProps> = (props: IQuickOrderGridTableProps) => {\n const [isMobile, setIsMobile] = React.useState(props.isMobileView);\n const quickOrderGridProducts = props.data.quickOrderGridProducts;\n const isOrderQuantityLimitsFeatureEnabled = props.data.isOrderQuantityLimitsFeatureEnabled;\n\n /**\n * Update the view port.\n */\n const updateViewport = () => {\n setIsMobile(props.isMobileView);\n };\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 <QuickOrderGridTableHeaderComponent\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 {quickOrderGridProducts.map((quickOrderProduct, index) => {\n let quantity = quickOrderProduct.productLine.productListLine.Quantity!;\n const product = quickOrderProduct.productLine.fullProduct;\n let min: number = 1;\n let max: number = 10;\n const behavior = product?.ProductDetails?.Behavior;\n if (isOrderQuantityLimitsFeatureEnabled && !ObjectExtensions.isNullOrUndefined(behavior)) {\n if (behavior.MinimumQuantity && behavior.MinimumQuantity > 0) {\n min = behavior.MinimumQuantity;\n }\n if (behavior.MaximumQuantity && behavior.MaximumQuantity > 0) {\n max = behavior.MaximumQuantity;\n }\n quantity = Math.max(quantity, min);\n }\n const price = quickOrderProduct.productLine.fullProduct?.ProductPrice;\n return (\n <QuickOrderGridTableRowComponent\n context={props.context}\n typeName={props.typeName}\n id={`${rowClassName}-${index}`}\n key={quickOrderProduct.productLine.fullProduct?.ProductDetails.RecordId}\n className={rowClassName}\n resources={props.resources}\n isMobile={isMobile}\n price={price}\n moduleId={props.moduleId}\n moduleTypeName={props.moduleTypeName}\n min={min}\n max={max}\n quantity={quantity}\n index={index}\n imageSettings={props.imageSettings}\n productListLine={quickOrderProduct.productLine.productListLine}\n callbacks={props.callBacks}\n data={{\n product: quickOrderProduct\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 {\n getProductConfigure,\n IProductDimensionCallbacks,\n IProductDimensionConfigureResources,\n IProductDimensionConfigureViewProps\n} from '@msdyn365-commerce/components';\nimport {\n ProductDimension,\n ProductDimensionType,\n ProductDimensionValue,\n ProductListsDataActions,\n ProductListType,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy';\nimport {\n addItemToProductListAction,\n AddItemToProductListInput,\n ArrayExtensions,\n createProductList,\n CreateProductListInput,\n FinitePromiseQueue,\n FinitePromiseQueueError,\n getDimensionsForSelectedVariant,\n GetDimensionsForSelectedVariantInput,\n getScanResult,\n GetScanResultInput,\n getSelectedVariant,\n IDimensionForSelectedVariant,\n IPromiseQueue,\n ObjectExtensions,\n QuickOrderTemplate,\n QuickOrderTemplateLine,\n SelectedVariantInput,\n StringExtensions\n} from '@msdyn365-commerce-modules/retail-actions';\nimport {\n getTelemetryObject,\n Heading,\n IModuleProps,\n INodeProps,\n isMobile,\n ITelemetryContent,\n VariantType\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { debounce } from 'lodash';\nimport { computed } from 'mobx';\nimport * as React from 'react';\n\nimport { getCatalogId } from '@msdyn365-commerce/core';\nimport { ActiveProductListInput } from './actions';\nimport {\n EcommerceQuantityLimitConfigurationsFeatureName,\n IQuickOrderGridActionsProps,\n IQuickOrderGridActionsViewProps,\n IQuickOrderGridRowCallbacks,\n IQuickOrderGridState,\n QuickOrderGridActionsView,\n QuickOrderGridDrawer,\n QuickOrderGridFormComponent,\n QuickOrderGridProduct,\n QuickOrderGridTableComponent,\n RetailDefaultOrderQuantityLimitsFeatureName\n} from './components';\nimport { IQuickOrderGridData } from './quick-order-grid.data';\nimport { IQuickOrderGridProps, IQuickOrderGridResources } from './quick-order-grid.props.autogenerated';\n\n/**\n * QuickOrder Grid View props.\n */\nexport interface IQuickOrderGridViewProps extends IQuickOrderGridProps<IQuickOrderGridData> {\n header: JSX.Element;\n actions?: INodeProps;\n isB2bCustomer?: boolean;\n isQuickOrderGridFormExpanded: boolean;\n contentProps: INodeProps;\n drawer: INodeProps;\n loading?: React.ReactNode;\n quickOrderGridForm: INodeProps;\n quickOrderGridFormProductContent: INodeProps;\n quickOrderGridFormMsgContent: INodeProps;\n quickOrderGridProps: IModuleProps;\n form: React.ReactNode;\n configure?: IProductDimensionConfigureViewProps;\n isMobileView: boolean;\n container?: JSX.Element;\n orderActions?: IQuickOrderGridActionsViewProps | null;\n bulkPurchase?: React.ReactNode;\n}\n\n/**\n * QuickOrder Grid View port.\n */\nexport type GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\n/**\n * QuickOrderGrid component.\n * @extends {React.PureComponent<IQuickOrderGridProps<IQuickOrderGridData>>}\n */\nclass QuickOrderGrid extends React.PureComponent<IQuickOrderGridProps<IQuickOrderGridData>, IQuickOrderGridState> {\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 _dimensionUpdateQueueMaxLength: number = 2;\n\n private readonly _errorCssClass: string = 'danger';\n\n private readonly _errorCssGlyphClass: string = 'fas fa-exclamation-triangle';\n\n private readonly _quickOrderGridFormClass: string;\n\n private readonly _quickOrderGridFormProductContent: string;\n\n private readonly _quickOrderGridFormMsgContent: string;\n\n private readonly _telemetryContent: ITelemetryContent;\n\n private readonly _dimensionUpdateQueue: IPromiseQueue<void> = new FinitePromiseQueue<void>(this._dimensionUpdateQueueMaxLength);\n\n private _dimensions: { [id: number]: string } = {};\n\n private _initializedDimensions: Set<string> = new Set();\n\n private readonly _cssClassNameConfigure: string = 'ms-quick-order_grid__content-form-main';\n\n private readonly _className: string = 'ms-quick-order-grid';\n\n // @ts-expect-error: Debouce needs to be used as type.\n private _cancellabelDebounce: debounce;\n\n private _isOrderQuantityLimitsFeatureEnabled: boolean = false;\n\n private _isChannelLimitsFeatureEnabled: boolean = false;\n\n private _applyDefaultOrderSettingsForCartLine: boolean = false;\n\n private readonly _quickOrderGridCallbacks: IProductDimensionCallbacks = {\n initializeDimension: (initializedDimension: string): void => {\n if (initializedDimension) {\n this._initializedDimensions.add(initializedDimension);\n }\n },\n /**\n * Get Dropdown name.\n * @param selectedDimensionId - Dimension type.\n * @param selectedDimensionValueId - Resources.\n * @returns Dropdown name.\n */\n dimensionSelectedAsync: async (selectedDimensionId: number, selectedDimensionValueId: string): Promise<void> => {\n this._dimensions[selectedDimensionId] = selectedDimensionValueId;\n // Only trigger _updateDimensions when all dimensions are initialized\n if (this._initializedDimensions.size === this.state.productDimensions?.length) {\n return this._dimensionUpdateQueue\n .enqueue(async () => {\n return this._updateDimensions();\n })\n .catch((error: string) => {\n // Ignore discarded processes.\n if (error !== FinitePromiseQueueError.ProcessWasDiscardedFromTheQueue) {\n throw new Error(error);\n }\n });\n }\n },\n\n /**\n * Get Dropdown name.\n * @param dimensionType - Dimension type.\n * @param resources - Resources.\n * @returns Dropdown name.\n */\n getDropdownName: (dimensionType: number, resources: IProductDimensionConfigureResources): string => {\n return this._getDropdownName(dimensionType, resources);\n },\n\n /**\n * Method to call on dimension change.\n * @param isUpdatingDimension - Flag to update dimension.\n */\n changeUpdatingDimension: (isUpdatingDimension: boolean): void => {\n this.setState({ isUpdatingDimension });\n }\n };\n\n private readonly _quickOrderGridRowCallbacks: IQuickOrderGridRowCallbacks = {\n /**\n * Method to call remove button.\n * @param line - Grid row product.\n */\n onRemoveItem: (line: QuickOrderGridProduct): void => {\n this._removeItemRowFromTable(line.productLine);\n },\n\n /**\n * Method to call on change quantity button.\n * @param productListLineId - Grid row product list line id.\n * @param quantity - Product quantity.\n * @returns - Falg to get confirmation for action.\n */\n onChangeQuantity: (productListLineId: string | undefined, quantity: number): boolean => {\n return this._changeRowQuantity(productListLineId, quantity);\n }\n };\n\n public constructor(props: IQuickOrderGridProps<IQuickOrderGridData>) {\n super(props);\n this._productTextInput = React.createRef();\n this._quantityInput = React.createRef<HTMLInputElement>();\n\n this._telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n this.state = {\n isQuickOrderGridFormExpanded: false,\n min: 0,\n max: 10,\n quantity: 1,\n productResponse: undefined,\n productDimensions: undefined,\n productDimensionErrorState: {\n configureErrors: {}\n },\n isMobile: this.isMobile,\n products: [],\n isUpdatingDimension: false,\n productListId: ''\n };\n\n this._quickOrderGridFormClass = 'ms-quick-order-grid__content-form';\n this._quickOrderGridFormProductContent = 'ms-quick-order-grid__content-form-main';\n this._quickOrderGridFormMsgContent = 'ms-quick-order-grid__content-form-msg';\n\n this._isOrderQuantityLimitsFeatureEnabled =\n this.props.data.featureState.result?.find(featureState => featureState.Name === RetailDefaultOrderQuantityLimitsFeatureName)\n ?.IsEnabled ?? false;\n\n this._isChannelLimitsFeatureEnabled =\n this.props.data.featureState.result?.find(featureState => featureState.Name === EcommerceQuantityLimitConfigurationsFeatureName)\n ?.IsEnabled ?? false;\n\n const cartConfiguration = this.props.data.cartConfiguration;\n this._applyDefaultOrderSettingsForCartLine = cartConfiguration?.result?.ValidateDefaultOrderSettingsPerLine ?? false;\n }\n\n @computed public get isMobile(): boolean {\n const size = isMobile({ variant: VariantType.Viewport, context: this.props.context.request });\n return size === 'xs';\n }\n\n public render(): JSX.Element | null {\n const { data } = this.props;\n if (!data.customerInformation.result) {\n return null;\n }\n const quickOrderTemplate = data.quickOrderTemplate;\n\n if (quickOrderTemplate?.result !== undefined) {\n this.setState({\n products: quickOrderTemplate.result.quickOrderTemplateLines,\n productListId: quickOrderTemplate.result.productList.Id\n });\n }\n const { className = '', maxQuantity } = this.props.config;\n const customerInfo = this.props.data.customerInformation.result;\n const {\n quickOrderGridModuleHeading,\n quickOrderGridModuleDescription,\n quickOrderGridAddtogrid,\n quickOrderGridProductQuantityInputLabel,\n quickOrderGridProductInputLabel,\n quickOrderGridProductDimensionTypeColor,\n quickOrderGridProductDimensionTypeConfiguration,\n quickOrderGridSelectDimensionFormatString,\n quickOrderGridProductDimensionTypeSize,\n quickOrderGridProductDimensionTypeStyle,\n quickOrderGridProductDimensionTypeAmount,\n quickOrderGridModulePageHeading\n } = this.props.resources;\n\n const productConfigureResources: IProductDimensionConfigureResources = {\n selectDimensionFormatString: quickOrderGridSelectDimensionFormatString,\n productDimensionTypeColor: quickOrderGridProductDimensionTypeColor,\n productDimensionTypeConfiguration: quickOrderGridProductDimensionTypeConfiguration,\n productDimensionTypeSize: quickOrderGridProductDimensionTypeSize,\n productDimensionTypeStyle: quickOrderGridProductDimensionTypeStyle,\n productDimensionTypeAmount: quickOrderGridProductDimensionTypeAmount\n };\n\n const { isQuickOrderGridFormExpanded, productDimensionErrorState, productResponse, productDimensions } = this.state;\n\n const headerClassName = `${this._className}__header`;\n\n const header = (\n <div className={headerClassName}>\n <Heading className={`${headerClassName}-heading`} text={quickOrderGridModulePageHeading} />\n </div>\n );\n\n const viewProps: IQuickOrderGridViewProps = {\n ...(this.props as IQuickOrderGridProps<IQuickOrderGridData>),\n\n quickOrderGridProps: { className: classnames('ms-quick-order-grid', className), moduleProps: this.props },\n contentProps: { className: 'ms-quick-order-grid__content' },\n isB2bCustomer: customerInfo?.IsB2b,\n header,\n actions: {\n className: `${this._className}-action-bar`,\n tag: 'div'\n },\n drawer: {\n tag: QuickOrderGridDrawer,\n className: `${this._className}__drawer`,\n collapseProps: { isOpen: this.state.isQuickOrderGridFormExpanded },\n moduleHeadingText: quickOrderGridModuleHeading,\n moduleDescriptionText: quickOrderGridModuleDescription,\n requestContext: this.props.context.request,\n telemetryContent: this._telemetryContent\n },\n bulkPurchase: this._renderBulkPurchase(),\n quickOrderGridForm: {\n className: `${this._quickOrderGridFormClass} ${isQuickOrderGridFormExpanded ? 'qo-show' : 'qo-hide'}`\n },\n quickOrderGridFormProductContent: {\n className: this._quickOrderGridFormProductContent\n },\n quickOrderGridFormMsgContent: {\n className: this._quickOrderGridFormMsgContent\n },\n form: QuickOrderGridFormComponent({\n productTextInput: this._productTextInput,\n quantityTextInput: this._quantityInput,\n isAddtoListDisabled: !productResponse,\n ariaLabelAddtoCart: quickOrderGridAddtogrid,\n ariaLabelProduct: quickOrderGridProductInputLabel,\n ariaLabelQuantity: quickOrderGridProductQuantityInputLabel,\n maxChars: 50,\n minQuantity: this.state.min ?? 0,\n maxQuantity: this.state.max ?? maxQuantity,\n moduleClassName: this._className,\n quickOrderGridState: this.state,\n handleInputChange: this._handleInputChange,\n handleQuantityChange: this._handleQuantityChange,\n handleAddProductListClick: this._addItemToProductListLine\n }),\n configure:\n productResponse && productDimensions\n ? getProductConfigure(\n this._cssClassNameConfigure,\n this.props.context,\n this.props.friendlyName,\n this.props.telemetry,\n quickOrderGridSelectDimensionFormatString,\n productConfigureResources,\n this._quickOrderGridCallbacks,\n productResponse,\n productDimensions,\n productDimensionErrorState\n )\n : undefined,\n isQuickOrderGridFormExpanded: this.state.isQuickOrderGridFormExpanded,\n isMobileView: this.state.isMobile,\n container: ArrayExtensions.hasElements(this.state.products) ? this._renderListContainer() : undefined,\n orderActions: this._renderQuickOrderGridActions(quickOrderTemplate?.result)\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n private _renderQuickOrderGridActions(quickOrderTemplate: QuickOrderTemplate | undefined): IQuickOrderGridActionsViewProps | null {\n const { typeName, context, resources } = this.props;\n const {\n quickOrderGridDeleteButtonText,\n quickOrderGridBuySelectedButtonText,\n quickOrderGridBuySelectedButtonAriaLabel,\n quickOrderGridBuySelectedAddingToCartErrorNotificationTitle,\n quickOrderGridBuySelectedAddingToCartErrorNotificationCloseAriaLabel,\n quickOrderGridGoToCartText,\n quickOrderGridDialogCloseText,\n quickOrderGridSingleItemText,\n quickOrderGridMultiLineItemFormatText,\n quickOrderGridMultiLinesFormatText,\n quickOrderGridHeaderMessageText,\n addedQuantityText,\n originalPriceText,\n currentPriceText,\n freePriceText\n } = resources;\n if (ArrayExtensions.hasElements(quickOrderTemplate?.quickOrderTemplateLines)) {\n const quickOrderGridActions: IQuickOrderGridActionsProps = {\n data: { quickOrderTemplate },\n moduleClassName: this._className,\n id: 'quick-order-grid',\n typeName,\n context,\n handlers: {\n removeProductList: this._removeProductList,\n onErrorMessage: (message: string) =>\n this.setState({\n topStateMessage: {\n messageText: message,\n statusCssString: this._errorCssClass,\n messageGlyph: this._errorCssGlyphClass,\n isOpen: true\n }\n })\n },\n quickOrderGridState: this.state,\n resources: {\n quickOrderGridDeleteButtonText,\n quickOrderGridBuySelectedButtonText,\n quickOrderGridBuySelectedButtonAriaLabel,\n quickOrderGridBuySelectedAddingToCartErrorNotificationTitle,\n quickOrderGridBuySelectedAddingToCartErrorNotificationCloseAriaLabel,\n quickOrderGridGoToCartText,\n quickOrderGridDialogCloseText,\n quickOrderGridSingleItemText,\n quickOrderGridMultiLineItemFormatText,\n quickOrderGridMultiLinesFormatText,\n quickOrderGridHeaderMessageText,\n addedQuantityText,\n originalPriceText,\n currentPriceText,\n freePriceText\n }\n };\n\n return QuickOrderGridActionsView(quickOrderGridActions);\n }\n return null;\n }\n\n /**\n * Renders bulk purchase module.\n * @returns Bulk purchase module react node.\n */\n private _renderBulkPurchase(): React.ReactNode {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Temporary switch for the feature which is under development.\n if (!this.props.context.app.config.isBulkPurchaseEnabled) {\n return null;\n }\n\n if (!ArrayExtensions.hasElements(this.props.slots.bulkPurchaseSlots)) {\n return null;\n }\n\n const containerClass = `${this._className}__bulk-purchase`;\n return (\n <div className={containerClass}>\n {React.cloneElement(this.props.slots.bulkPurchaseSlots[0] as React.ReactElement, {\n productDimensions: this.state.productDimensions\n })}\n </div>\n );\n }\n\n /**\n * Render list container.\n * @returns JSX element.\n */\n private _renderListContainer(): JSX.Element {\n const containerClass = `${this._className}__table-content`;\n return <div className={containerClass}>{this._renderQuickOrderTable(this._className)}</div>;\n }\n\n /**\n * Initial the products on quick order.\n * @returns List of quick order products or undefined.\n */\n private _initQuickOrderGridProducts(): QuickOrderGridProduct[] {\n const products: QuickOrderTemplateLine[] = this.state.products;\n\n const quickOrderGridProduct: QuickOrderGridProduct[] = products.map((product: QuickOrderTemplateLine) => {\n return new QuickOrderGridProduct(product);\n });\n\n return ArrayExtensions.validValues(quickOrderGridProduct);\n }\n\n /**\n * Method to call on clear button.\n */\n private readonly _removeProductList = () => {\n const { context, data, telemetry, resources } = this.props;\n const { quickOrderTemplate } = data;\n const userToken = context.request.user.isAuthenticated && context.request.user.token;\n if (userToken && quickOrderTemplate && quickOrderTemplate.result) {\n ProductListsDataActions.deleteAsync({ callerContext: context.actionContext }, quickOrderTemplate.result.productList)\n .then(() => {\n window.location.reload();\n })\n .catch((error: string) => {\n telemetry.warning('[quick-order-grid] Unable to delete product list.');\n telemetry.error(error);\n this._updateStatusState(\n resources.quickOrderGridDeleteProductListFailedText,\n this._errorCssClass,\n this._errorCssGlyphClass,\n true\n );\n });\n } else {\n telemetry.warning('[quick-order-grid] Failed to delete product list. Product List was not found');\n }\n };\n\n /**\n * Initial the products on quick order.\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 <QuickOrderGridTableComponent\n id={tableClassName}\n moduleId={this.props.id}\n moduleTypeName={this.props.typeName}\n typeName={this.props.typeName}\n key={tableClassName}\n className={tableClassName}\n data={{\n quickOrderGridProducts: this._initQuickOrderGridProducts(),\n isOrderQuantityLimitsFeatureEnabled: this._isOrderQuantityLimitsFeatureEnabled\n }}\n context={this.props.context}\n resources={this.props.resources}\n isMobileView={this.state.isMobile}\n callBacks={this._quickOrderGridRowCallbacks}\n />\n );\n }\n\n private _updateQuantitiesInState(product: SimpleProduct): void {\n const min: number = this._getMinQuantityForCartLineItem(this._isOrderQuantityLimitsFeatureEnabled, product);\n const max: number = this._getMaxQuantityForCartLineItem(\n this._isChannelLimitsFeatureEnabled || this._isOrderQuantityLimitsFeatureEnabled,\n product\n );\n let quantity: number = this._getQuantity(\n this._isOrderQuantityLimitsFeatureEnabled,\n this._applyDefaultOrderSettingsForCartLine,\n product\n );\n quantity = Math.max(quantity, min);\n\n this.setState({\n min,\n max,\n quantity\n });\n }\n\n private _getMinQuantityForCartLineItem(isOrderQuantityLimitsFeatureEnabled: boolean, product: SimpleProduct): number {\n if (\n isOrderQuantityLimitsFeatureEnabled &&\n this._getIgnoreOrderSettings() &&\n product?.Behavior?.MinimumQuantity &&\n product.Behavior.MinimumQuantity > 0\n ) {\n return product.Behavior.MinimumQuantity;\n }\n\n return 1;\n }\n\n private _getMaxQuantityForCartLineItem(isQuantityLimitsFeatureEnabled: boolean, product: SimpleProduct): number {\n if (\n isQuantityLimitsFeatureEnabled &&\n this._getIgnoreOrderSettings() &&\n product?.Behavior?.MaximumQuantity &&\n product.Behavior.MaximumQuantity > 0\n ) {\n return product.Behavior.MaximumQuantity;\n }\n\n return this.props.context.app.config.maxQuantityForCartLineItem;\n }\n\n /**\n * Retrieves the value of the IgnoreOrderSettings property from the cart configuration.\n * If the property is not present, it defaults to false.\n * @returns {boolean} The value of the IgnoreOrderSettings property.\n */\n private _getIgnoreOrderSettings(): boolean {\n const cartConfiguration = this.props.data.cartConfiguration;\n return !(cartConfiguration?.result?.IgnoreOrderSettings ?? false);\n }\n\n private _getQuantity(\n isOrderQuantityLimitsFeatureEnabled: boolean,\n applyDefaultOrderSettingsForCartLine: boolean,\n product: SimpleProduct\n ): number {\n let defaultQuantity = 1;\n\n if (!isOrderQuantityLimitsFeatureEnabled || !applyDefaultOrderSettingsForCartLine) {\n return defaultQuantity;\n }\n\n if (product?.Behavior?.DefaultQuantity && product.Behavior.DefaultQuantity > 0) {\n defaultQuantity = product.Behavior.DefaultQuantity;\n }\n\n return defaultQuantity;\n }\n\n /**\n * Method to called on product input change.\n * @param query - Product inventory info.\n */\n private readonly _handleInputChange = (query: string): void => {\n const queryMinLength = 4;\n if (!query || query.length > queryMinLength) {\n this.setState({ quantity: 0, productDimensions: [], productResponse: undefined });\n this._updateStatusState('', '', '', false);\n }\n if (this._cancellabelDebounce) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call -- existing code.\n this._cancellabelDebounce.cancel();\n }\n\n const { telemetry, context } = this.props;\n const zeroNumber = 0;\n if (!StringExtensions.isNullOrEmpty(query)) {\n this._cancellabelDebounce = 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 isQuickOrderGridFormExpanded: true\n });\n if (results?.Product) {\n this._updateQuantitiesInState(results.Product);\n }\n })\n .catch((error: Error) => {\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._cancellabelDebounce();\n }, zeroNumber);\n this.setState({ isQuickOrderGridFormExpanded: true });\n } else {\n this.setState({ productResponse: undefined, isQuickOrderGridFormExpanded: true });\n }\n };\n\n /**\n * Method to called on quantity change.\n * @param value - Quantity value.\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 const quantityChangeDebounceTimeout = 200;\n let minimumQuantity = 0;\n let needToUpdateUIValue: boolean = false;\n if (this._isOrderQuantityLimitsFeatureEnabled && !ObjectExtensions.isNullOrUndefined(this.state.productResponse?.Behavior)) {\n const behavior = this.state.productResponse!.Behavior;\n minimumQuantity = behavior?.MinimumQuantity ?? 0;\n const newCurrentValue = Math.max(currentValue, minimumQuantity);\n if (newCurrentValue !== currentValue) {\n needToUpdateUIValue = true;\n }\n currentValue = newCurrentValue;\n }\n\n this.setState({ quantity: currentValue }, () => {\n debounce(() => {\n if (needToUpdateUIValue && !Number.isNaN(this.state.quantity) && inputElement) {\n inputElement.setAttribute('aria-valuenow', currentValue.toString());\n inputElement.value = currentValue.toString();\n }\n }, quantityChangeDebounceTimeout)();\n });\n };\n\n /**\n * Method to get dropdwon name.\n * @param dimensionType - Dimension Type.\n * @param resources - String resources.\n * @returns Dropdwon label.\n */\n private readonly _getDropdownName = (dimensionType: number, resources: IProductDimensionConfigureResources): string => {\n const isGiftCard = this.state.productResponse?.IsGiftCard;\n\n switch (dimensionType) {\n case ProductDimensionType.Color: // ProductDimensionType.Color\n return resources.productDimensionTypeColor;\n case ProductDimensionType.Configuration: // ProductDimensionType.Configuration\n return resources.productDimensionTypeConfiguration;\n case ProductDimensionType.Size: // ProductDimensionType.Size\n return resources.productDimensionTypeSize;\n case ProductDimensionType.Style: // ProductDimensionType.Style\n return isGiftCard ? resources.productDimensionTypeAmount : resources.productDimensionTypeStyle;\n default:\n return '';\n }\n };\n\n /**\n * Method to update dimension and product in UI.\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 const hasProductDimensions = ArrayExtensions.hasElements(productDimensions);\n if (!productResponse || !hasProductDimensions) {\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 // eslint-disable-next-line react/no-access-state-in-setstate -- existing code.\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 dimensionKey of Object.keys(dimensionsToUpdate)) {\n if (this.state.productDimensionErrorState.configureErrors[dimensionKey]) {\n // eslint-disable-next-line react/no-access-state-in-setstate -- existing code.\n const errorState = { ...this.state.productDimensionErrorState };\n errorState.configureErrors[dimensionKey] = 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 // eslint-disable-next-line no-async-promise-executor -- existing code\n const selectedProduct = new Promise<SimpleProduct | null>(async resolve => {\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 };\n\n /**\n * Method to get updated dimension value.\n * @param productDimensionFull - Product dimension full.\n * @param newValueId - New Dimension value.\n * @returns Dimension Value.\n */\n private readonly _updateDimensionValue = (\n productDimensionFull: IDimensionForSelectedVariant,\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 /**\n * Method to get dropdwon name.\n * @param dimensionTypeValue - Dimension Type.\n * @param resources - String resources.\n * @param isGiftCard - Flag to check if its a giftcard product.\n * @returns Dropdwon error label.\n */\n private readonly _getDimensionErrorString = (\n dimensionTypeValue: number,\n resources: IQuickOrderGridResources,\n isGiftCard?: boolean\n ): string => {\n const amountErrorMessage = resources.quickOrderGridproductDimensionTypeAmountErrorMessage;\n\n switch (dimensionTypeValue) {\n case ProductDimensionType.Color: // ProductDimensionType.Color\n return resources.quickOrderGridproductDimensionTypeColorErrorMessage;\n case ProductDimensionType.Configuration: // ProductDimensionType.Configuration\n return resources.quickOrderGridproductDimensionTypeConfigurationErrorMessage;\n case ProductDimensionType.Size: // ProductDimensionType.Size\n return resources.quickOrderGridproductDimensionTypeSizeErrorMessage;\n case ProductDimensionType.Style: // ProductDimensionType.Style\n return isGiftCard ? amountErrorMessage : resources.quickOrderGridproductDimensionTypeStyleErrorMessage;\n default:\n return '';\n }\n };\n\n /**\n * Initial the products on quick order.\n * @param productResponse - Simple Product.\n * @param quantity - Product Quantity.\n * @returns Flag to validate productlistline.\n */\n private readonly _validateCart = (productResponse: SimpleProduct, quantity: number): boolean => {\n // eslint-disable-next-line @typescript-eslint/prefer-optional-chain -- existing code\n const missingDimensions = productResponse.Dimensions?.filter(\n dimension => !(dimension.DimensionValue && dimension.DimensionValue.Value)\n );\n const minimumQuantity = 0;\n if (ArrayExtensions.hasElements(missingDimensions)) {\n const userMessage = this._getConfigureErrors(missingDimensions, false);\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- existing code\n if (this.state.productDimensionErrorState.configureErrors) {\n // eslint-disable-next-line react/no-access-state-in-setstate -- existing code\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 <= minimumQuantity) {\n const resources = this.props.resources;\n this._updateStatusState(resources.quickOrderGridWrongQuantityErrorMsg, this._errorCssClass, this._errorCssGlyphClass, true);\n return false;\n }\n return true;\n };\n\n /**\n * Initial the products on quick order.\n * @param result - Simple Product.\n * @param isGiftCard - Product Quantity.\n * @returns Flag to validate cart.\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 /**\n * Method to call on quantity change in row.\n * @param itemKey - Product Key.\n * @param quantity - Product quantity.\n * @returns Flag to update status.\n */\n private readonly _changeRowQuantity = (itemKey: string | undefined, quantity: number): boolean => {\n const { context, data, telemetry } = this.props;\n const { quickOrderTemplate } = data;\n if (quickOrderTemplate?.result) {\n const quickOrderTemplateLinesData = quickOrderTemplate.result.quickOrderTemplateLines;\n if (ArrayExtensions.hasElements(quickOrderTemplateLinesData)) {\n const orderLineIndex = quickOrderTemplateLinesData.findIndex(\n (lines: QuickOrderTemplateLine) => lines.productListLine.LineId === itemKey\n );\n const newProductListLine = { ...quickOrderTemplateLinesData[orderLineIndex] };\n if (quickOrderTemplateLinesData[orderLineIndex].productListLine.Quantity === quantity) {\n return true;\n }\n const previousQuantity = newProductListLine.productListLine.Quantity;\n newProductListLine.productListLine.Quantity = quantity;\n const { fullProduct, ...line } = newProductListLine;\n\n ProductListsDataActions.updateProductListLinesAsync(\n { callerContext: context.actionContext },\n quickOrderTemplate.result.productList.Id,\n [line.productListLine]\n )\n .then(list => {\n if (ArrayExtensions.hasElements(list)) {\n const newLine = list.find(lines => lines.LineId === itemKey);\n quickOrderTemplateLinesData[orderLineIndex].productListLine = newLine!;\n const updatedLines = [...quickOrderTemplateLinesData];\n updatedLines[orderLineIndex] = { fullProduct, productListLine: newLine! };\n const updatedProductList = { ...quickOrderTemplate.result, ProductListLines: updatedLines };\n context.actionContext.update(\n new ActiveProductListInput(context.actionContext.requestContext),\n updatedProductList\n );\n return true;\n }\n\n return false;\n })\n .catch((error: Error) => {\n telemetry.warning('[quick-order-grid] Unable to update product quantity.');\n telemetry.error(error.message);\n const userMessage = 'Failed to update quantity value.';\n newProductListLine.productListLine.Quantity = previousQuantity;\n this._updateStatusState(userMessage, this._errorCssClass, this._errorCssGlyphClass, true);\n return false;\n });\n }\n return false;\n }\n\n return false;\n };\n\n /**\n * Method to call on remove item from table.\n * @param line - Order Template Line.\n */\n private readonly _removeItemRowFromTable = (line: QuickOrderTemplateLine): void => {\n const { context, data, telemetry } = this.props;\n const { quickOrderTemplate } = data;\n\n if (quickOrderTemplate?.result) {\n const userToken = context.request.user.isAuthenticated && context.request.user.token;\n if (userToken) {\n ProductListsDataActions.removeProductListLinesAsync(\n { callerContext: context.actionContext },\n line.productListLine.ProductListId!,\n [line.productListLine]\n )\n .then(() => {\n window.location.reload(false);\n })\n .catch((error: Error) => {\n telemetry.warning('[quick-order-grid] Unable remove item from product list grid');\n telemetry.error(error.message);\n });\n } else {\n telemetry.warning('[quick-order-grid] Unable remove items from product list grid user token was not found');\n }\n }\n };\n\n private readonly _isChannelMultipleCatalogsFeatureEnabled = (): boolean => {\n let isMultipleCatalogFeatureEnabledInHq = false;\n if (this.props.data.featureState) {\n isMultipleCatalogFeatureEnabledInHq =\n this.props.data.featureState.result?.find(\n feature => feature.Name === 'Dynamics.AX.Application.ChannelMultipleCatalogsFeature'\n )?.IsEnabled || false;\n }\n return isMultipleCatalogFeatureEnabledInHq;\n };\n\n /**\n * Method to call on add item from form.\n */\n private readonly _addItemToProductListLine = async (): Promise<void> => {\n const {\n context: { actionContext },\n resources,\n telemetry\n } = this.props;\n const {\n quickOrderGridAddedToGridSuccessMessage,\n quickOrderGridAddedToGridFailureMessage,\n quickOrderGridAddedToGridDuplicateError\n } = resources;\n const { productResponse, quantity, productListId } = this.state;\n // get the current catalog id.\n const catalogId = getCatalogId(this.props.context.request);\n\n this._updateStatusState('', '', '', false);\n\n if (productResponse !== undefined && this._validateCart(productResponse, quantity)) {\n if (StringExtensions.isNullOrWhitespace(productListId)) {\n await this._createProductList();\n }\n\n if (StringExtensions.isNullOrWhitespace(this.state.productListId)) {\n this._updateStatusState(quickOrderGridAddedToGridFailureMessage, this._errorCssClass, this._errorCssGlyphClass, true);\n return;\n }\n const input = new AddItemToProductListInput(\n this.state.productListId,\n productResponse.RecordId,\n quantity,\n productResponse.DefaultUnitOfMeasure ?? 'ea',\n this._isChannelMultipleCatalogsFeatureEnabled(),\n catalogId\n );\n\n await addItemToProductListAction(input, actionContext)\n .then(result => {\n if (result.ProductListId) {\n this._updateStatusState(quickOrderGridAddedToGridSuccessMessage, 'success', 'fas fa-check', true);\n window.location.reload();\n this.setState({});\n }\n })\n .catch((error: Error) => {\n telemetry.debug('[quick-order-grid] Error trying to Update Grid Line from the quick order grid');\n if (error.name === 'Microsoft_Dynamics_Commerce_Runtime_DuplicateObject') {\n this._updateStatusState(\n quickOrderGridAddedToGridDuplicateError,\n this._errorCssClass,\n this._errorCssGlyphClass,\n true\n );\n } else {\n this._updateStatusState(\n quickOrderGridAddedToGridFailureMessage,\n this._errorCssClass,\n this._errorCssGlyphClass,\n true\n );\n }\n });\n }\n };\n\n /**\n * Method to create product list.\n * @returns - ProductListId.\n */\n private _createProductList = async (): Promise<string> => {\n const {\n context: { actionContext },\n telemetry,\n resources\n } = this.props;\n const { productListId } = this.state;\n const { quickOrderGridAddedToGridFailureMessage } = resources;\n\n if (StringExtensions.isNullOrWhitespace(productListId)) {\n const input = new CreateProductListInput('', ProductListType.QuickOrder);\n\n await createProductList(input, actionContext)\n .then(result => {\n if (!StringExtensions.isNullOrWhitespace(result.Id)) {\n this.setState({ productListId: result.Id });\n return result.Id;\n }\n return '';\n })\n .catch((error: Error) => {\n telemetry.debug('[quick-order-grid] Error on creating productlist from quick order grid');\n telemetry.error(error.message);\n this._updateStatusState(quickOrderGridAddedToGridFailureMessage, this._errorCssClass, this._errorCssGlyphClass, true);\n return '';\n });\n return '';\n }\n\n return productListId;\n };\n\n /**\n * Method to create product list.\n * @param messageText - Message Text.\n * @param statusCssString - Css class names.\n * @param messageGlyph - Glyph string.\n * @param isOpen - Flag to show.\n */\n private readonly _updateStatusState = (messageText: string, statusCssString: string, messageGlyph: string, isOpen: boolean): void => {\n this.setState({\n // eslint-disable-next-line react/no-unused-state -- Showing user message in Form component.\n stateMessage: {\n messageText,\n statusCssString,\n messageGlyph,\n isOpen\n }\n });\n };\n}\nexport default QuickOrderGrid;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IErrorState } from '@msdyn365-commerce/components';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { IDimensionForSelectedVariant, OrderTemplateLine } from '@msdyn365-commerce-modules/retail-actions';\n\nimport { QuickOrderGridProduct } from './quick-order-grid-product';\n\n/**\n * QuickOrderGrid state message Interface.\n */\nexport interface IQuickOrderGridStateMessage {\n isOpen: boolean;\n messageGlyph: string;\n messageText: string;\n statusCssString: string;\n}\n\n/**\n * QuickOrderGrid state Interface.\n */\nexport interface IQuickOrderGridState {\n isQuickOrderGridFormExpanded: boolean;\n isUpdatingDimension?: boolean;\n productResponse: SimpleProduct | undefined;\n productDimensions: IDimensionForSelectedVariant[] | undefined;\n min: number | undefined;\n max: number | undefined;\n quantity: number;\n stateMessage?: IQuickOrderGridStateMessage;\n topStateMessage?: IQuickOrderGridStateMessage;\n productDimensionErrorState: IErrorState;\n isMobile: boolean;\n products: OrderTemplateLine[];\n productListId: string;\n}\n\n/**\n * QuickOrder Grid Row view.\n */\nexport interface IQuickOrderGridRowViewModel extends OrderTemplateLine {\n isChecked: boolean;\n}\n\n/**\n * Interface for quick order callbacks.\n */\nexport interface IQuickOrderGridRowCallbacks {\n onRemoveItem(line: QuickOrderGridProduct): void;\n onChangeQuantity(orderTemplateLineId: string | undefined, quantity: number): boolean;\n}\n\n/**\n * Interface for quick order grid action view props.\n */\nexport interface IQuickOrderGridActionsViewProps {\n addProductListToBag: React.ReactNode;\n removeProductList?: React.ReactNode;\n userMessage?: React.ReactNode;\n}\n\nexport const RetailDefaultOrderQuantityLimitsFeatureName: string = 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature';\n\nexport const EcommerceQuantityLimitConfigurationsFeatureName: string =\n 'Dynamics.AX.Application.EcommerceQuantityLimitConfigurationsFeature';\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 { IQuickOrderGridViewProps, IQuickOrderGridFormViewProps } from './index';\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\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 container.\n * @param form -- Form props.\n * @param isMobileView -- Flag to check mobile view.\n * @param quickOrderForm - Form component container.\n * @param quickOrderProductContent - Form product component.\n * @param quickOrderMessageContent - Form user message component.\n * @param configure - Product Dimension component.\n * @returns Jsx element of quick order form component.\n */\nconst renderForm = (\n form: IQuickOrderGridFormViewProps,\n isMobileView: boolean,\n quickOrderForm: INodeProps,\n quickOrderProductContent: INodeProps,\n quickOrderMessageContent: 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 {...quickOrderMessageContent}>{form.userMessage}</Node>\n {form.addToListBtn}\n </Node>\n </Node>\n ) : (\n <Node {...quickOrderForm}>\n <Node {...quickOrderMessageContent}>{form.userMessage}</Node>\n <Node {...quickOrderProductContent}>\n {form.product}\n {renderConfigure(configure)}\n {form.quantity}\n {form.addToListBtn}\n </Node>\n </Node>\n );\n};\n\n/**\n * Retrieves current sort criteria.\n * @param props - QuickOrder Grid view props.\n * @returns - Render View.\n */\nconst quickOrderGridView: React.FC<IQuickOrderGridViewProps> = props => {\n const {\n quickOrderGridProps,\n contentProps,\n form,\n quickOrderGridForm,\n drawer,\n configure,\n quickOrderGridFormProductContent,\n quickOrderGridFormMsgContent,\n isMobileView,\n header,\n container,\n actions,\n orderActions\n } = props;\n\n return (\n <Module {...quickOrderGridProps}>\n {header}\n {actions && (\n <Node {...actions}>\n {orderActions?.userMessage}\n {orderActions?.addProductListToBag}\n {orderActions?.removeProductList}\n </Node>\n )}\n <Node {...drawer}>\n <Node {...contentProps}>\n {renderForm(\n form as IQuickOrderGridFormViewProps,\n isMobileView,\n quickOrderGridForm,\n quickOrderGridFormProductContent,\n quickOrderGridFormMsgContent,\n configure\n )}\n {props.bulkPurchase}\n </Node>\n </Node>\n {container}\n </Module>\n );\n};\n\nexport default quickOrderGridView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\nimport {\n IPriceComponentResources,\n ISwatchItem,\n PriceComponent,\n ProductComponentSwatchComponent,\n RatingComponent\n} from '@msdyn365-commerce/components';\nimport {\n getCatalogId,\n IAny,\n IComponent,\n IComponentProps,\n ICoreContext,\n IGeneric,\n IGridSettings,\n IImageData,\n IImageSettings,\n Image,\n msdyn365Commerce\n} from '@msdyn365-commerce/core';\nimport {\n AttributeSwatch,\n AttributeValue,\n ProductDimension,\n ProductPrice,\n ProductSearchResult,\n ProductType,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy';\nimport {\n ArrayExtensions,\n convertDimensionTypeToProductDimensionType,\n Dictionary,\n DimensionTypes,\n generateImageUrl,\n getProductPageUrlSync,\n IDimensionsApp,\n StringExtensions,\n validateCatalogId\n} from '@msdyn365-commerce-modules/retail-actions';\nimport {\n format,\n getPayloadObject,\n getTelemetryAttributes,\n ITelemetryContent,\n onTelemetryClick\n} from '@msdyn365-commerce-modules/utilities';\nimport React, { useState } from 'react';\n\nexport interface IProductComponentProps extends IComponentProps<{ product?: ProductSearchResult; productPrice?: ProductPrice }> {\n className?: string;\n imageSettings?: IImageSettings;\n savingsText?: string;\n freePriceText?: string;\n originalPriceText?: string;\n currentPriceText?: string;\n ratingAriaLabel?: string;\n ratingCountAriaLabel?: string;\n allowBack?: boolean;\n telemetryContent?: ITelemetryContent;\n quickViewButton?: React.ReactNode;\n productComparisonButton?: React.ReactNode;\n isEnabledProductDescription?: boolean;\n isPriceMinMaxEnabled?: boolean;\n priceResources?: IPriceComponentResources;\n inventoryLabel?: string;\n dimensionAvailabilities?: IProductsDimensionsAvailabilities[];\n swatchItemAriaLabel?: string;\n}\n\nexport interface IProductComponent extends IComponent<IProductComponentProps> {}\n\nconst PriceComponentActions = {};\n\n/**\n * Gets the product page url from the default swatch selected.\n * @param productData - Product card to be rendered.\n * @returns The default color swatch selected if any.\n */\nfunction getDefaultSwatchSelected(coreContext: ICoreContext, productData?: ProductSearchResult): AttributeSwatch | null {\n if (!productData || !productData.AttributeValues) {\n return null;\n }\n\n const siteContext = coreContext as ICoreContext<IDimensionsApp>;\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\n\n const attributeSwatches = productData.AttributeValues.find(\n attributeValue => attributeValue.KeyName?.toLocaleLowerCase() === dimensionToPreSelectInProductCard\n )?.Swatches;\n\n if (!ArrayExtensions.hasElements(attributeSwatches)) {\n return null;\n }\n\n const defaultSwatch = attributeSwatches.find(item => item.IsDefault === true) ?? attributeSwatches[0];\n return defaultSwatch;\n}\n\n/**\n * Gets the product image from the default swatch selected.\n * @param coreContext - Context of the module using the component.\n * @param productData - Product card to be rendered.\n * @returns The product card image url.\n */\nfunction getProductImageUrlFromDefaultSwatch(coreContext: ICoreContext, productData?: ProductSearchResult): string | undefined {\n const defaultSwatch = getDefaultSwatchSelected(coreContext, productData);\n const swatchProductImageUrls = defaultSwatch?.ProductImageUrls;\n if (!ArrayExtensions.hasElements(swatchProductImageUrls)) {\n return productData?.PrimaryImageUrl;\n }\n\n return generateImageUrl(swatchProductImageUrls[0], coreContext.request.apiSettings);\n}\n\n/**\n * Updates the product url link to product details page.\n * @param productDetailsPageUrl - Product page url.\n * @param coreContext - Context of the module using the component.\n * @param queryString - Querystring to be added to the URL.\n * @returns The update product page url.\n */\nfunction updateProductUrl(productDetailsPageUrl: string, coreContext: ICoreContext, queryString: string): string {\n const sourceUrl = new URL(productDetailsPageUrl, coreContext.request.apiSettings.baseUrl);\n if (sourceUrl.search) {\n sourceUrl.search += `&${queryString}`;\n } else {\n sourceUrl.search += queryString;\n }\n\n const updatedUrl = new URL(sourceUrl.href);\n return updatedUrl.pathname + sourceUrl.search;\n}\n\n/**\n * Gets the react node for product unit of measure display.\n * @param unitOfMeasure - DefaultUnitOfMeasure property from product.\n * @returns The node representing markup for unit of measure component.\n */\nfunction renderProductUnitOfMeasure(unitOfMeasure?: string): JSX.Element | null {\n if (!unitOfMeasure) {\n return null;\n }\n return (\n <div className='msc-product__unit-of-measure'>\n <span>{unitOfMeasure}</span>\n </div>\n );\n}\n\n/**\n * Gets the react node for product availability.\n * @param inventoryAvailabilityLabel - The product information.\n * @returns The node representing markup for product availability.\n */\nfunction renderProductAvailability(inventoryAvailabilityLabel: string | undefined): JSX.Element | null {\n if (!inventoryAvailabilityLabel || inventoryAvailabilityLabel === '') {\n return null;\n }\n\n return (\n <div className='msc-product__availability'>\n <span>{inventoryAvailabilityLabel}</span>\n </div>\n );\n}\n\n/**\n * Renders product comparison button similar to the quick view button.\n * @param productComparisonButton - React element of the button.\n * @param product - Current product info.\n * @param catalogId - Current catalog.\n * @returns React element for the specific product.\n */\nfunction renderProductComparisonButton(\n productComparisonButton: React.ReactNode,\n product: ProductSearchResult,\n catalogId: number\n): JSX.Element | undefined {\n validateCatalogId(catalogId);\n return React.cloneElement(productComparisonButton as React.ReactElement, { product, catalogId });\n}\n\n/**\n * Gets the product page url from the default swatch selected.\n * @param coreContext - Context of the module using the component.\n * @param productUrl - Product page url for the product card.\n * @param productData - Product card to be rendered.\n * @returns The product card image url.\n */\nfunction getProductPageUrlFromDefaultSwatch(\n coreContext: ICoreContext,\n productUrl: string,\n productData?: ProductSearchResult\n): string | undefined {\n const defaultSwatch = getDefaultSwatchSelected(coreContext, productData);\n if (!defaultSwatch?.SwatchValue) {\n return productUrl;\n }\n\n const siteContext = coreContext as ICoreContext<IDimensionsApp>;\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\n\n const queryStringEncoded = encodeURIComponent(defaultSwatch.SwatchValue);\n const queryString = `${dimensionToPreSelectInProductCard}=${queryStringEncoded}`;\n return updateProductUrl(productUrl, coreContext, queryString);\n}\n\nconst ProductCard: React.FC<IProductComponentProps> = ({\n data,\n context,\n imageSettings,\n savingsText,\n freePriceText,\n originalPriceText,\n currentPriceText,\n ratingAriaLabel,\n ratingCountAriaLabel,\n allowBack,\n typeName,\n id,\n telemetryContent,\n quickViewButton,\n productComparisonButton,\n isEnabledProductDescription,\n isPriceMinMaxEnabled,\n priceResources,\n inventoryLabel,\n dimensionAvailabilities,\n swatchItemAriaLabel\n}) => {\n const product = data.product;\n const productPrice = data.productPrice;\n\n let productUrl = getProductPageUrlSync(product?.Name ?? '', product?.RecordId ?? Number.MIN_VALUE, context.actionContext, undefined);\n if (allowBack) {\n productUrl = updateProductUrl(productUrl, context, 'back=true');\n }\n const productImageUrlFromSwatch = getProductImageUrlFromDefaultSwatch(context, product) ?? product?.PrimaryImageUrl;\n const productPageUrlFromSwatch = getProductPageUrlFromDefaultSwatch(context, productUrl, product) ?? productUrl;\n const [productPageUrl, setProductPageUrl] = useState<string>(productPageUrlFromSwatch);\n const [productImageUrl, setProductImageUrl] = useState<string | undefined>(productImageUrlFromSwatch);\n React.useEffect(() => {\n setProductPageUrl(productPageUrlFromSwatch);\n setProductImageUrl(productImageUrlFromSwatch);\n }, [productUrl, productPageUrlFromSwatch, productImageUrlFromSwatch]);\n const [selectedSwatchItems] = useState(new Dictionary<DimensionTypes, ISwatchItem>());\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-member-access -- app context is generic\n const enableStockCheck = context.app.config.enableStockCheck;\n\n const siteContext = context as ICoreContext<IDimensionsApp>;\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\n\n /**\n * Updates the product page and Image url based on swatch selected.\n * @param coreContext - Context of the caller.\n * @param swatchItem - Dimension swatch selected.\n */\n const updatePageAndImageUrl = React.useCallback(\n (coreContext: ICoreContext, swatchItem: ISwatchItem) => {\n const dimensionType = swatchItem.dimensionType;\n selectedSwatchItems.setValue(dimensionType, swatchItem);\n if (StringExtensions.isNullOrWhitespace(swatchItem.value)) {\n return;\n }\n const queryString = `${dimensionType}=${swatchItem.value}`;\n let productPageUrlWithSwatch = '';\n if (productPageUrl.includes(dimensionType)) {\n const newUrl = new URL(productPageUrl, coreContext.request.apiSettings.baseUrl);\n newUrl.searchParams.delete(dimensionType);\n productPageUrlWithSwatch = updateProductUrl(newUrl.toString(), context, queryString);\n } else {\n productPageUrlWithSwatch = updateProductUrl(productPageUrl, context, queryString);\n }\n setProductPageUrl(productPageUrlWithSwatch);\n if (dimensionType === dimensionToPreSelectInProductCard) {\n const swatchProductImageUrl = ArrayExtensions.hasElements(swatchItem.productImageUrls)\n ? swatchItem.productImageUrls[0]\n : undefined;\n const newImageUrl = generateImageUrl(swatchProductImageUrl, coreContext.request.apiSettings);\n setProductImageUrl(newImageUrl);\n }\n },\n [selectedSwatchItems, context, productPageUrl]\n );\n\n if (!product) {\n return null;\n }\n\n /**\n * Checks if rendering the particular dimensions is allowed for product card.\n * @param dimensionType - Dimension to be displayed.\n * @returns Updates the state with new product page url.\n */\n function shouldDisplayDimension(dimensionType: string): boolean {\n const dimensionsContext = context as ICoreContext<IDimensionsApp>;\n const dimensionsToDisplayOnProductCard = dimensionsContext.app.config.dimensionsInProductCard;\n return (\n ArrayExtensions.hasElements(dimensionsToDisplayOnProductCard) &&\n !dimensionsToDisplayOnProductCard.includes(DimensionTypes.none) &&\n dimensionsToDisplayOnProductCard.includes(dimensionType.toLocaleLowerCase() as DimensionTypes)\n );\n }\n\n /**\n * Gets the react node for product dimension as swatch.\n * @param attributeValues - Attribute value property from product.\n * @returns The node representing markup for unit of measure component.\n */\n function renderProductDimensions(attributeValues?: AttributeValue[]): JSX.Element | null {\n if (!attributeValues) {\n return null;\n }\n\n return (\n <div className='msc-product__dimensions'>\n {attributeValues.map((item: AttributeValue) => {\n const dimensionTypeValue = item.KeyName?.toLocaleLowerCase() ?? '';\n if (!shouldDisplayDimension(dimensionTypeValue)) {\n return null;\n }\n\n const siteContext = context as ICoreContext<IDimensionsApp>;\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\n const dimensionType = dimensionTypeValue as DimensionTypes;\n const swatches =\n item.Swatches?.map<ISwatchItem>(swatchItem => {\n return {\n itemId: `${item.RecordId ?? ''}-${dimensionTypeValue}-${swatchItem.SwatchValue ?? ''}`,\n value: swatchItem.SwatchValue ?? '',\n dimensionType,\n colorHexCode: swatchItem.SwatchColorHexCode,\n imageUrl: swatchItem.SwatchImageUrl,\n productImageUrls: swatchItem.ProductImageUrls,\n isDefault: swatchItem.IsDefault,\n swatchItemAriaLabel: swatchItemAriaLabel ? format(swatchItemAriaLabel, dimensionType) : '',\n isDisabled:\n enableStockCheck &&\n dimensionAvailabilities?.find(\n dimensionAvailability => dimensionAvailability.value === (swatchItem.SwatchValue ?? '')\n )?.isDisabled\n };\n }) ?? [];\n if (\n dimensionType === dimensionToPreSelectInProductCard &&\n ArrayExtensions.hasElements(swatches) &&\n !swatches.some(swatch => swatch.isDefault)\n ) {\n swatches[0].isDefault = true;\n }\n return (\n <ProductComponentSwatchComponent\n context={context}\n swatches={swatches}\n onSelectDimension={updatePageAndImageUrl}\n key={item.RecordId}\n />\n );\n })}\n </div>\n );\n }\n\n function renderQuickView(quickview: React.ReactNode, item?: number): JSX.Element | undefined {\n if (quickview === null) {\n return undefined;\n }\n const selectedDimensions: ProductDimension[] = selectedSwatchItems.getValues().map<ProductDimension>(swatches => {\n return {\n DimensionTypeValue: convertDimensionTypeToProductDimensionType(swatches.dimensionType),\n DimensionValue: {\n RecordId: 0,\n Value: swatches.value\n }\n };\n });\n return React.cloneElement(quickview as React.ReactElement, { selectedProductId: item, selectedDimensions });\n }\n\n // Construct telemetry attribute to render\n const payLoad = getPayloadObject('click', telemetryContent!, '', product.RecordId.toString());\n\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- -- Do not need type check for appsettings\n const isUnitOfMeasureEnabled = context.app.config && context.app.config.unitOfMeasureDisplayType === 'buyboxAndBrowse';\n\n return (\n <>\n {isEnabledProductDescription ? (\n <a\n href={productPageUrl}\n onClick={onTelemetryClick(telemetryContent!, payLoad, product.Name!)}\n aria-label={renderLabel(\n product.Name,\n context.cultureFormatter.formatCurrency(product.Price),\n product.AverageRating,\n ratingAriaLabel,\n product.TotalRatings,\n ratingCountAriaLabel\n )}\n className='msc-product'\n {...attribute}\n >\n <div className='msc-product__image__description'>\n <div className='msc-product__image'>\n {renderProductPlacementImage(\n imageSettings,\n context.request.gridSettings,\n productImageUrl,\n product.PrimaryImageUrl,\n product.Name,\n context\n )}\n </div>\n <div className='msc-product__title_description'>\n <h2 className='msc-product__title__text'>{product.Name}</h2>\n {renderPrice(\n context,\n typeName,\n id,\n product,\n savingsText,\n freePriceText,\n originalPriceText,\n currentPriceText,\n isPriceMinMaxEnabled,\n priceResources,\n productPrice\n )}\n {isUnitOfMeasureEnabled && renderProductUnitOfMeasure(product.DefaultUnitOfMeasure)}\n {renderDescription(product.Description)}\n </div>\n </div>\n </a>\n ) : (\n <a\n href={productPageUrl}\n onClick={onTelemetryClick(telemetryContent!, payLoad, product.Name!)}\n aria-label={renderLabel(\n product.Name,\n context.cultureFormatter.formatCurrency(product.Price),\n product.AverageRating,\n ratingAriaLabel\n )}\n className='msc-product'\n {...attribute}\n >\n <div className='msc-product__image'>\n {renderProductPlacementImage(\n imageSettings,\n context.request.gridSettings,\n productImageUrl,\n product.PrimaryImageUrl,\n product.Name,\n context\n )}\n </div>\n <div className='msc-product__details'>\n <h2 className='msc-product__title'>{product.Name}</h2>\n {renderPrice(\n context,\n typeName,\n id,\n product,\n savingsText,\n freePriceText,\n originalPriceText,\n currentPriceText,\n isPriceMinMaxEnabled,\n priceResources,\n productPrice\n )}\n {isUnitOfMeasureEnabled && renderProductUnitOfMeasure(product.DefaultUnitOfMeasure)}\n </div>\n </a>\n )}\n {renderProductDimensions(product.AttributeValues)}\n {!context.app.config.hideRating &&\n renderRating(context, typeName, id, product.AverageRating, product.TotalRatings, ratingAriaLabel, ratingCountAriaLabel)}\n {renderProductAvailability(inventoryLabel)}\n {quickViewButton && renderQuickView(quickViewButton, product.RecordId)}\n {productComparisonButton && renderProductComparisonButton(productComparisonButton, product, getCatalogId(context.request))}\n </>\n );\n};\n\nfunction renderLabel(\n name?: string,\n price?: string,\n rating?: number,\n ratingAriaLabelText?: string,\n reviewCount?: number,\n ratingCountAriaLabelText?: string\n): string {\n const reviewCountArialableText = getReviewAriaLabel(reviewCount, ratingCountAriaLabelText ?? '');\n return `${name ?? ''} ${price ?? ''} ${getRatingAriaLabel(rating, ratingAriaLabelText)}${\n reviewCountArialableText ? ` ${reviewCountArialableText}` : ''\n }`;\n}\n\nfunction renderDescription(description?: string): JSX.Element | null {\n return <p className='msc-product__text'>{description}</p>;\n}\n\nfunction getRatingAriaLabel(rating?: number, ratingAriaLabel?: string): string {\n if (rating && ratingAriaLabel) {\n const roundedRating = rating.toFixed(2);\n return format(ratingAriaLabel || '', roundedRating, '5');\n }\n return '';\n}\n\nfunction getReviewAriaLabel(reviewCount?: number, ratingCountAriaLabelText?: string): string {\n if (reviewCount && ratingCountAriaLabelText) {\n return format(ratingCountAriaLabelText || '', reviewCount);\n }\n return '';\n}\n\nfunction renderRating(\n coreContext: ICoreContext,\n moduleTypeName: string,\n moduleId: string,\n avgRating?: number,\n totalRatings?: number,\n ariaLabel?: string,\n ratingCountAriaLabel?: string\n): JSX.Element | null {\n if (!avgRating) {\n return null;\n }\n\n const numberRatings = totalRatings?.toString() || undefined;\n const ratingAriaLabelText = getRatingAriaLabel(avgRating, ariaLabel);\n const ratingCountAriaLabelText = getReviewAriaLabel(Number(numberRatings), ratingCountAriaLabel);\n\n return (\n <RatingComponent\n context={coreContext}\n id={moduleId}\n typeName={moduleTypeName}\n avgRating={avgRating}\n ratingCount={numberRatings}\n readOnly\n ariaLabel={ratingAriaLabelText}\n ratingCountAriaLabel={ratingCountAriaLabelText}\n data={{}}\n />\n );\n}\n\nfunction renderPrice(\n context: ICoreContext,\n typeName: string,\n id: string,\n productSearchResult: ProductSearchResult,\n savingsText?: string,\n freePriceText?: string,\n originalPriceText?: string,\n currentPriceText?: string,\n isPriceMinMaxEnabled?: boolean,\n priceResources?: IPriceComponentResources,\n productPrice?: ProductPrice\n): JSX.Element | null {\n const product: SimpleProduct = {\n // This is a fake product. The product type is only used for price component to determine if it should show price range or not.\n ProductTypeValue: productSearchResult.IsMasterProduct ? ProductType.Master : ProductType.Standalone\n } as SimpleProduct;\n\n const price: ProductPrice = productPrice ?? {\n BasePrice: productSearchResult.BasePrice,\n AdjustedPrice: productSearchResult.Price,\n CustomerContextualPrice: productSearchResult.Price,\n MaxVariantPrice: productSearchResult.MaxVariantPrice ? productSearchResult.MaxVariantPrice : productSearchResult.Price,\n MinVariantPrice: productSearchResult.MinVariantPrice ? productSearchResult.MinVariantPrice : productSearchResult.Price\n };\n\n return (\n <PriceComponent\n context={context}\n id={id}\n typeName={typeName}\n product={product}\n data={{ price }}\n savingsText={savingsText}\n freePriceText={freePriceText}\n originalPriceText={originalPriceText}\n isPriceMinMaxEnabled={isPriceMinMaxEnabled}\n priceResources={priceResources}\n />\n );\n}\n\nfunction renderProductPlacementImage(\n imageSettings?: IImageSettings,\n gridSettings?: IGridSettings,\n imageUrl?: string,\n fallbackImageUrl?: string,\n altText?: string,\n context?: ICoreContext<IGeneric<IAny>>\n): JSX.Element | null {\n if (!imageUrl || !gridSettings || !imageSettings) {\n return null;\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment -- Site level config can be of any type.\n const contextConfig = context?.app.config?.placeholderImageName;\n const emptyPlaceHolderImage = contextConfig as string;\n let fallbackImageSource = fallbackImageUrl;\n if (emptyPlaceHolderImage && fallbackImageUrl) {\n fallbackImageSource = `${fallbackImageUrl},${emptyPlaceHolderImage}`;\n }\n const img: IImageData = {\n src: imageUrl,\n altText: altText ? altText : '',\n fallBackSrc: fallbackImageSource\n };\n const imageProps = {\n gridSettings,\n imageSettings\n };\n imageProps.imageSettings.cropFocalRegion = true;\n return (\n <Image\n requestContext={context?.actionContext.requestContext}\n {...img}\n {...imageProps}\n loadFailureBehavior='empty'\n bypassHideOnFailure\n />\n );\n}\n\nexport const ProductComponent: React.FunctionComponent<IProductComponentProps> = msdyn365Commerce.createComponentOverride<\n IProductComponent\n>('Product', { component: ProductCard, ...PriceComponentActions });\n\nexport default ProductComponent;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IPriceComponentResources } from '@msdyn365-commerce/components';\nimport MsDyn365 from '@msdyn365-commerce/core';\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n ICategoryHierarchyViewProps,\n IRefineMenuViewProps,\n ISearchResultContainerViewProps,\n ISearchResultModalViewProps,\n ISortByViewProps,\n ITitleViewProps\n} from '@msdyn365-commerce-modules/search-result-container';\nimport { Button, getTelemetryObject, Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport React, { MouseEventHandler, useEffect, useState } from 'react';\n\nimport { IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\nimport {\n ISearchResultContainerProps,\n ISearchResultContainerResources\n} from '../definition-extensions/search-result-container.ext.props.autogenerated';\nimport { ProductComponent } from './components/product.component';\n\n/**\n * DescriptionInterval.\n */\nenum DescriptionInterval {\n productDescriptionInterval = 14,\n productDescriptionIntervalRemainder0 = 0,\n productDescriptionIntervalRemainder9 = 9\n}\n\n/**\n * Render Clear button for mobile viewport.\n * @param props - The view props.\n * @returns The JSX Element.\n */\nconst renderProductCards = (props: ISearchResultContainerViewProps & ISearchResultContainerProps<{}>): JSX.Element | null => {\n return <Node {...props.ProductsContainer}>{props.products}</Node>;\n};\n\n/**\n * Returns the product inventory label.\n * @param channelInventoryConfigurationId - The channel configuration Id.\n * @param product - The product.\n * @returns The inventory label.\n */\nfunction getInventoryLabel(channelInventoryConfigurationId: number | undefined, product: ProductSearchResult): string | undefined {\n if (!channelInventoryConfigurationId || !ArrayExtensions.hasElements(product.AttributeValues)) {\n return undefined;\n }\n const inventoryAttribute = product.AttributeValues.find(attribute => attribute.RecordId === channelInventoryConfigurationId);\n if (inventoryAttribute) {\n return inventoryAttribute.TextValue;\n }\n return undefined;\n}\n\n/**\n * Render Clear button for mobile viewport.\n * @param props - The view props.\n * @param product - The product item data.\n * @param index - The index of each product item.\n * @param isEnabledProductDescription - The flag for showing Product desription tile.\n * @returns The JSX Element.\n */\nconst renderProductCardsDescription = (\n props: ISearchResultContainerViewProps & ISearchResultContainerProps<{}>,\n product: ProductSearchResult,\n index: number,\n isEnabledProductDescription?: boolean\n): JSX.Element | null => {\n const { config, context, resources, productsDimensionAvailabilities } = props;\n const telemetryContent = getTelemetryObject(props.context.request.telemetryPageName!, props.friendlyName, props.telemetry);\n const breadCrumbType = props.context.app.config.breadcrumbType;\n const isAllowBack = props.config.allowBackNavigation && (breadCrumbType === 'back' || breadCrumbType === 'categoryAndBack');\n const classname = isEnabledProductDescription\n ? 'ms-product-search-result__item product__description'\n : 'ms-product-search-result__item';\n const quickviewslot = ArrayExtensions.hasElements(props.slots.quickview) ? props.slots.quickview[0] : undefined;\n const channelInventoryConfigurationId = props.data.products.result?.channelInventoryConfigurationId;\n const isPriceMinMaxFeatureState = props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailSearchPriceRangeFeature'\n );\n const priceResources: IPriceComponentResources = {\n priceRangeSeparator: resources.priceRangeSeparator\n };\n\n const productComparisonButton = ArrayExtensions.hasElements(props.slots.productComparisonButton)\n ? props.slots.productComparisonButton[0]\n : null;\n\n return (\n <li className={classname} key={index}>\n <ProductComponent\n context={context}\n telemetryContent={telemetryContent}\n imageSettings={config.imageSettings}\n freePriceText={resources.priceFree}\n originalPriceText={resources.originalPriceText}\n currentPriceText={resources.currentPriceText}\n ratingAriaLabel={resources.ratingAriaLabel}\n allowBack={isAllowBack}\n id={props.id}\n key={product.RecordId}\n typeName={props.typeName}\n data={{ product }}\n quickViewButton={quickviewslot}\n productComparisonButton={productComparisonButton}\n isEnabledProductDescription={isEnabledProductDescription}\n inventoryLabel={getInventoryLabel(channelInventoryConfigurationId, product)}\n isPriceMinMaxEnabled={isPriceMinMaxFeatureState?.IsEnabled}\n priceResources={priceResources}\n swatchItemAriaLabel={resources.swatchItemAriaLabel}\n dimensionAvailabilities={productsDimensionAvailabilities?.find(\n (dimensionAvailability: IProductsDimensionsAvailabilities[]) =>\n ArrayExtensions.hasElements(dimensionAvailability) &&\n dimensionAvailability[0].masterProductId === product.MasterProductId\n )}\n />\n </li>\n );\n};\n\n/**\n * Render Clear button for mobile viewport.\n * @param props - The view props.\n * @returns The JSX Element.\n */\nconst renderProducts = (props: ISearchResultContainerViewProps & ISearchResultContainerProps<{}>): JSX.Element | null => {\n const products = props.data.listPageState.result?.activeProducts;\n if (!products || !ArrayExtensions.hasElements(products)) {\n return null;\n }\n const productDescriptionInterval: number = DescriptionInterval.productDescriptionInterval;\n const productDescriptionIntervalRemainder0: number = DescriptionInterval.productDescriptionIntervalRemainder0;\n const productDescriptionIntervalRemainder9: number = DescriptionInterval.productDescriptionIntervalRemainder9;\n return (\n <Node {...props.ProductsContainer}>\n {props.errorMessage}\n <ul className='list-unstyled'>\n {products.map((product: ProductSearchResult, index: number) =>\n index % productDescriptionInterval === productDescriptionIntervalRemainder0 ||\n index % productDescriptionInterval === productDescriptionIntervalRemainder9\n ? renderProductCardsDescription(props, product, index, true)\n : renderProductCardsDescription(props, product, index, false)\n )}\n </ul>\n </Node>\n );\n};\n\n/**\n * Render Title Count.\n * @param props - The title view props.\n * @returns The JSX Element.\n */\nconst renderTitleCount = (props: ITitleViewProps): JSX.Element | null => {\n const { title, TitleContainer } = props;\n if (title) {\n return <Node {...TitleContainer}>{title.titleCount}</Node>;\n }\n return null;\n};\n\n/**\n * Render Category Hierarchy.\n * @param props - The category hierarchy view props.\n * @returns The JSX Element.\n */\nconst renderCategoryHierarchy = (props: ICategoryHierarchyViewProps): JSX.Element | null => {\n const { CategoryHierarchyContainer, categoryHierarchyList, categoryHierarchySeparator } = props;\n if (categoryHierarchyList) {\n return (\n <Node {...CategoryHierarchyContainer}>\n {categoryHierarchyList.map((category, index) => (\n <React.Fragment key={index}>\n {category}\n {categoryHierarchyList[index + 1] && categoryHierarchySeparator}\n </React.Fragment>\n ))}\n </Node>\n );\n }\n\n return null;\n};\n\n/**\n * Function to make filter sticky.\n * @param isMobile - The boolean prop.\n * @param isStickyHeader - The boolean prop.\n */\nexport const configureStickyFilter = (isMobile: boolean, isStickyHeader: boolean): void => {\n // Get heights of cookie and promotion banners\n const defaultValue = 0;\n const defaultOffset = 28;\n const headerContainer: HTMLElement | null = document.querySelector('.ms-header');\n\n const headerHeight: number | undefined = headerContainer?.offsetHeight;\n const containerHeight: number = headerHeight ?? defaultOffset;\n const bannerHeights = isStickyHeader ? defaultValue : containerHeight;\n const headerElement = document.querySelector('header .lock-opaque');\n const defaultContainer = document.querySelector('header .default-container');\n const refinerElement = isMobile ? document.querySelector('.msc-sort-filter-wrapper') : document.querySelector('.ms-refiner-heading');\n if (refinerElement && headerElement && defaultContainer) {\n if (MsDyn365.isBrowser && document.documentElement.scrollTop > bannerHeights) {\n refinerElement.classList.add('lock-Filter');\n refinerElement.setAttribute('style', `top: ${defaultContainer.clientHeight}px`);\n } else {\n refinerElement.classList.remove('lock-Filter');\n }\n } else if (refinerElement) {\n if (MsDyn365.isBrowser && document.documentElement.scrollTop > bannerHeights) {\n refinerElement.classList.add('lock-top');\n } else {\n refinerElement.classList.remove('lock-top');\n refinerElement.classList.remove('lock-Filter');\n refinerElement.removeAttribute('style');\n }\n }\n};\n\n/**\n * Function to setup filter sticky.\n * @param isMobile - The boolean prop.\n * @param isStickyHeader - The boolean prop.\n */\nfunction stickyFilterSetup(isMobile: boolean, isStickyHeader: boolean): void {\n window.addEventListener('scroll', () => {\n configureStickyFilter(isMobile, isStickyHeader);\n });\n configureStickyFilter(isMobile, isStickyHeader);\n}\n\n/**\n * Function to make filter sticky.\n * @param refinerRefernce - Ref prop for filter.\n * @param toggle - Toggle function for filter menu.\n */\nfunction useOutsideClick(refinerRefernce: React.RefObject<HTMLElement>, toggle: (event: Event) => void) {\n React.useEffect(() => {\n /**\n * Function to make filter sticky.\n * @param event - Event prop for filter.\n */\n function handleClickOutside(event: Event) {\n const element = document.querySelector('.ms-refine-filter__toggle_collapsed');\n if (refinerRefernce.current && !refinerRefernce.current.contains(event.target as Node) && !element) {\n toggle(event);\n }\n }\n if (MsDyn365.isBrowser) {\n document.addEventListener('click', handleClickOutside);\n }\n return () => {\n if (MsDyn365.isBrowser) {\n document.removeEventListener('click', handleClickOutside);\n }\n };\n }, [refinerRefernce, toggle]);\n}\n\n/**\n * Render the category page items.\n * @param props - The view props.\n * @returns The search Result container module view.\n */\nconst SearchResultContainerView: React.FC<ISearchResultContainerViewProps & ISearchResultContainerProps<{}>> = props => {\n const {\n SearchResultContainer,\n pagination,\n ProductSectionContainer,\n choiceSummary,\n isMobile,\n modalToggle,\n searchResultModal,\n TitleViewProps,\n refineMenu,\n categoryHierarchy,\n sortByOptions,\n CategoryNavContainer,\n RefineAndProductSectionContainer,\n FeatureSearchContainer,\n similarLookProduct,\n errorMessage,\n resources\n } = props;\n useEffect(() => {\n if (props.config.useStickyFilter && MsDyn365.isBrowser) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app context is generic\n stickyFilterSetup(props.isMobile, props.context.app.config.enableStickyHeader as boolean);\n }\n }, [props]);\n const [isExpanded, setIsExpanded] = useState<boolean>(false);\n const toggle = () => {\n setIsExpanded(!isExpanded);\n };\n const wrapperRefiner = React.useRef(null);\n useOutsideClick(wrapperRefiner, toggle);\n const isRecoSearchPage = props.context.actionContext.requestContext.query?.recommendation;\n if (isMobile) {\n return (\n <Module {...SearchResultContainer}>\n {similarLookProduct ? null : (\n <Node {...CategoryNavContainer}>\n {renderCategoryHierarchy(categoryHierarchy)}\n {renderTitle(TitleViewProps)}\n {renderTitleCount(TitleViewProps)}\n </Node>\n )}\n {choiceSummary}\n <Node className='msc-sort-filter-wrapper'>{modalToggle}</Node>\n {createSearchResultModal(searchResultModal, refineMenu, sortByOptions, isRecoSearchPage)}\n <Node {...FeatureSearchContainer}>{similarLookProduct}</Node>\n {errorMessage}\n {props.config.enableProdutDescription ? renderProducts(props) : renderProductCards(props)}\n {pagination}\n </Module>\n );\n }\n return (\n <Module {...SearchResultContainer}>\n {similarLookProduct ? null : (\n <Node {...CategoryNavContainer}>\n {categoryHierarchy && renderCategoryHierarchy(categoryHierarchy)}\n {TitleViewProps && renderTitle(TitleViewProps)}\n {TitleViewProps && renderTitleCount(TitleViewProps)}\n </Node>\n )}\n <Node {...FeatureSearchContainer}>{similarLookProduct}</Node>\n <Node {...RefineAndProductSectionContainer}>\n <Node ref={wrapperRefiner} className='ms-refiner-heading'>\n <Node className='ms-refiner-heading_title'>\n <Button\n className={isExpanded ? 'ms-refine-filter__toggle_expanded' : 'ms-refine-filter__toggle_collapsed'}\n aria-label='Filter'\n onClick={toggle}\n aria-expanded={isExpanded}\n tabIndex={0}\n >\n {resources.filterText}\n </Button>\n <div className='ms-search-result-wrapper-title-choice-summary'>{choiceSummary}</div>\n <div className='ms-search-result-wrapper-sort-by-category'>\n {sortByOptions && !isRecoSearchPage && renderSort(sortByOptions)}\n </div>\n </Node>\n {refineMenu && isExpanded && renderRefiner(refineMenu)}\n <Node className='ms-refine__footer'>\n {refineMenu && isExpanded && renderRefinerFooter(refineMenu, toggle, resources)}\n </Node>\n </Node>\n\n <Node {...ProductSectionContainer}>\n {errorMessage}\n {props.config.enableProdutDescription ? renderProducts(props) : renderProductCards(props)}\n {pagination}\n </Node>\n </Node>\n </Module>\n );\n};\n\n/**\n * Render Search result Modal.\n * @param modalProps - The Search Result Modal view props.\n * @param refineMenu - The Refine Menu view props.\n * @param sortByDropDown - The Sort by view props.\n * @param isRecoSearchPage - The recomandation search page flag.\n * @returns The JSX Element.\n */\nconst createSearchResultModal = (\n modalProps: ISearchResultModalViewProps,\n refineMenu: IRefineMenuViewProps,\n sortByDropDown: ISortByViewProps,\n isRecoSearchPage?: string\n): JSX.Element => {\n return React.cloneElement(\n modalProps.modal,\n {},\n modalProps.modalHeader,\n createModalBody(modalProps, refineMenu, sortByDropDown, isRecoSearchPage),\n modalProps.modalFooter\n );\n};\n\n/**\n * Render Refiner Mobile.\n * @param props - The Refine Menu view props.\n * @returns The JSX Element.\n */\nconst renderRefinerMobile = (props: IRefineMenuViewProps): JSX.Element | null => {\n const { refiners, RefineMenuContainer, RefinerSectionContainer } = props;\n if (refiners) {\n return (\n <Node {...RefinerSectionContainer}>\n <Node {...RefineMenuContainer}>\n {refiners.map((submenu, index) => (\n <React.Fragment key={index}>{submenu}</React.Fragment>\n ))}\n </Node>\n </Node>\n );\n }\n return null;\n};\n\n/**\n * Render Search result Body.\n * @param props - The Search Result Modal view props.\n * @param refineMenu - The Refine Menu view props.\n * @param sortByDropDown - The Sort by view props.\n * @param isRecoSearchPage - The recomandation search page flag.\n * @returns The JSX Element.\n */\nconst createModalBody = (\n props: ISearchResultModalViewProps,\n refineMenu: IRefineMenuViewProps,\n sortByDropDown: ISortByViewProps,\n isRecoSearchPage?: string\n): JSX.Element | null => {\n if (sortByDropDown) {\n return React.cloneElement(props.modalBody, {}, renderSort(sortByDropDown, isRecoSearchPage), renderRefinerMobile(refineMenu));\n }\n return null;\n};\n\n/**\n * Render Refiner.\n * @param props - The Refine Menu view props.\n * @returns The JSX Element.\n */\nconst renderRefiner = (props: IRefineMenuViewProps): JSX.Element | null => {\n const { refiners, RefineMenuContainer, RefinerSectionContainer } = props;\n if (refiners) {\n return (\n <Node {...RefinerSectionContainer}>\n <Node {...RefineMenuContainer}>\n {refiners.map((submenu, index) => (\n <React.Fragment key={index}>{submenu}</React.Fragment>\n ))}\n </Node>\n </Node>\n );\n }\n return null;\n};\n\n/**\n * Render Refiner Footer.\n * @param props - The Refine Menu view props.\n * @param handler - The Refine menu toggle function.\n * @param resources - Resources to get the done text and aria label.\n * @returns The JSX Element.\n */\nconst renderRefinerFooter = (\n props: IRefineMenuViewProps,\n handler: MouseEventHandler,\n resources: ISearchResultContainerResources\n): JSX.Element | null => {\n const { refiners } = props;\n if (refiners) {\n return (\n <Node className='ms-refine__footer__done'>\n <Node tag='button' className='ms-refine-filter-done' aria-label={resources.doneAriaLabel} tabIndex={0} onClick={handler}>\n {resources.doneText}\n </Node>\n </Node>\n );\n }\n return null;\n};\n\n/**\n * Render sort by drop down.\n * @param props - The sort by view props.\n * @param isRecoSearchPage - The recomandation search page flag.\n * @returns The JSX Element.\n */\nconst renderSort = (props: ISortByViewProps, isRecoSearchPage?: string): JSX.Element | null => {\n const { SortingContainer, sortByDropDown } = props;\n if (sortByDropDown && !isRecoSearchPage) {\n return <Node {...SortingContainer}>{sortByDropDown}</Node>;\n }\n return null;\n};\n\n/**\n * Render Title.\n * @param props - The title view props.\n * @returns The JSX Element.\n */\nconst renderTitle = (props: ITitleViewProps): JSX.Element | null => {\n const { title, TitleContainer } = props;\n if (title) {\n return (\n <Node {...TitleContainer}>\n <Node tag='h1' className=''>\n {title.titlePrefix}\n {title.titleText}\n </Node>\n </Node>\n );\n }\n return null;\n};\n\nexport default SearchResultContainerView;\n"],"names":["LoginToViewPricingComponent","context","loginText","priceComponent","shouldBlockPricing","className","arguments","length","undefined","user","signInUrl","isAuthenticated","React","href","ProductRefinerValueDataTypeValue","ProductRefinerTypeValue","ProductRefinerSource","isRangeType","dataTypeValue","AttributeDataType","Currency","Decimal","Integer","findMatchingRefinementCriterion","productRefinerValue","refinementCriteria","find","refinementCriterion","isMatchingRefinementCriterion","RefinerRecordId","RefinerSourceValue","DataTypeValue","LeftValueBoundString","getUpdatedRefinementCriteria","itemToggleNotification","currentRefinementCriteria","updatedRefinementCriteria","toggledItemFound","forEach","selectedCriterion","isSelecting","next","_objectSpread","rangeStart","RightValueBoundString","rangeEnd","push","Text","TrueFalse","parentProductRefinerHierarchy","RefinerTypeValue","RefinerType","SingleSelect","Values","child","matchingIndex","findIndex","criterion","splice","ChoiceSummary","constructor","props","super","closeButtonGlyph","_onClick","e","preventDefault","stopPropagation","target","currentTarget","clearAll","getAttribute","includes","selectedRefiner","this","_getSelectedRefinerChoice","onChoiceClicked","itemClicked","choiceClicked","nextItemToFocus","nextSibling","payLoad","getPayloadObject","telemetryContent","selectedRefinersMap","_this$props$context","selectedChoices","channelInventoryConfigurationId","refinerHierarchy","app","config","productListInventoryDisplay","ProductListInventoryFilteringOptions","HideOOS","filter","choice","parent","hierarchy","value","RecordId","map","key","_getKeyForRefinerValue","render","clearAllText","label","classNames","choiceAriaLabel","closeAriaLabel","items","contentAction","etext","clearAllAttributes","getTelemetryAttributes","classnames","item","attribute","Object","assign","urlBuilder","onClick","role","choiceFormat","choiceRangeValueFormat","telemetry","overallFormat","rangeFormat","refinerValueName","refinerName","KeyName","warning","replace","_formatPrice","UnitText","LeftValueBoundLocalizedString","amount","currency","trace","result","cultureFormatter","formatCurrency","Number","error","selected","textContent","trim","__decorate","computed","observer","ErrorMessage","_ref","text","FeatureSearchResultItem","product","imageSettings","resources","recommendation","productName","Name","productRecordId","productUrl","getProductPageUrlSync","actionContext","fallbackImage","getFallbackImageUrl","ItemId","requestContext","apiSettings","heading","featureSimilarDescriptionTitle","featureSimilarLooksTitle","toString","onTelemetryClick","gridSettings","imageUrl","altText","img","src","imageProps","fallBackSrc","Image","loadFailureBehavior","renderProductPlacementImage","request","PrimaryImageUrl","title","Link","ariaLabel","ModalToggle","innerRef","id","ref","modalNode","Modal","autoFocus","applicationNode","returnFocusRef","returnRef","isOpen","toggle","onModalToggle","zIndex","modalHeaderNode","ModalHeader","modalTitle","modalFooterNode","ModalFooter","Button","modalCloseButtonText","getInventoryLabel","ArrayExtensions","hasElements","AttributeValues","inventoryAttribute","TextValue","ProductSearchResultItems","products","moduleType","moduleId","allowBackNavigation","quickviewSlot","isPriceMinMaxEnabled","productsDimensionAvailabilities","priceResources","priceRangeSeparator","index","ProductComponent","freePriceText","priceFree","originalPriceText","currentPriceText","ratingAriaLabel","allowBack","typeName","data","quickViewButton","inventoryLabel","swatchItemAriaLabel","dimensionAvailabilities","dimensionAvailability","masterProductId","MasterProductId","RangeRefineItem","_selectedRefinementCr","_this$props$selectedR","_this$props$selectedR2","_ref2","_this$props$selectedR3","_this$props$selectedR4","_formattedPriceReverseLookup","Map","getLabels","sliderId","minPrice","maxPrice","labelId","labelString","labelPositioning","getSliderThumbs","sliderKey","selectedMin","selectedMinPrice","selectedMax","selectedMaxPrice","_this$props$minValueS","_this$props$maxValueS","minValueSliderThumbAriaLabel","currencyCode","ariaValueText","maxValueSliderThumbAriaLabel","_onRangeUpdate","bind","_onRangeUpdateEnd","_handleRangeTooltipText","_changeMin","_changeMax","_finishChangeMin","_finishChangeMax","minInput","maxInput","selectedRefinementCriterion","initialMin","initialMax","String","minValue","maxValue","labels","sliderKeyString","sliderThumbs","state","isChecked","validationErrorMin","validationErrorMax","touchedMin","touchedMax","shouldComponentUpdate","nextProps","nextState","componentDidUpdate","previousProps","updateSliderProps","refineItemCommonProps","rangeType","_renderInputFields","_renderSlider","_ref3","_this$props$selectedR5","_this$props$selectedR6","_ref4","_this$props$selectedR7","_this$props$selectedR8","setState","isDisabled","formAttrs","rangeNameFormat","minInputClassName","maxInputClassName","formattedSelectedMin","_getFormattedSelectedValue","formattedSelectedMax","minLabel","onChange","onFocus","onBlur","maxLabel","placeholder","placeholderTextMax","ariaAttributes","Slider","inForm","min","max","step","orientation","showLabels","showTooltip","onChangeEnd","debounce","handleTooltipText","event","_changeValue","inputType","selectedKey","touchedKey","_getInputWithoutFormatting","selectedMinValue","minTouched","onToggle","maxNum","isNaN","validationErrorNaN","_focus","_validateRange","selectedMaxValue","maxTouched","minNum","setTimeout","current","focus","touched","validationError","validationErrorRange","input","inputAsNum","get","sliderChangeNotification","eventType","firstThumbValue","secondThumbValue","_focusOnSliderThumb","element","document","getElementById","tooltip","RefineItem","anchorType","_productRefinerValue$","_this$props","productCountAriaLabel","singleProductCountAriaLabel","children","refineItemAriaLabel","refineItemsAriaLabel","attrs","_objectWithoutProperties","_excluded","JSON","stringify","isSingleSelect","itemTypeClassName","SourceValue","Rating","_renderRating","productText","productCount","Count","refineMenuItemAriaLabel","format","_getRefinerUrl","tabIndex","_renderSwatch","_this$props$parentPro","_this$props$parentPro2","_productRefinerValue$2","dimensionType","toLocaleLowerCase","hasColor","StringExtensions","isNullOrWhitespace","SwatchColorHexCode","hasImage","SwatchImageUrl","swatchItems","checkIfShouldDisplayAsSwatch","itemId","colorHexCode","SwatchComponent","list","isSelectionEnabled","isRefineItem","ratingUserCountAriaLabel","ratingSingleUserCountAriaLabel","_productRefinerValue$3","refinerRating","parseInt","ratingRefiner","selectedRefinerValues","selectedRating","defaultChkProductCount","ratingComponentClass","productCountAriaLabelValue","isMobileView","RatingComponent","avgRating","ratingCount","hideCount","readOnly","moduleTypeName","RefineSubmenu","_onToggleItem","_onToggleSubmenu","isExpanded","isExpandedOnInitialLoad","expanded","productRefinerHierarchy","hideRating","Collapse","timeout","_renderChildItems","_renderRange","_renderSingleMultiSelect","isMobile","refinerValuesList","listItems","selectedValue","_getRangeType","DisplayTemplateValue","DisplayTemplate","Range","SliderWithBars","onUpdateRefiners","prevState","Separator","separator","Title","expandRefinersCount","SearchResultContainer","SearchResultContainer_1","_props$context$reques","sortByDropdownOptions","sortOptions","sortByOptionRelevanceDesc","sortByOptionNameAsc","sortByOptionNameDesc","sortByOptionPriceAsc","sortByOptionPriceDesc","sortByOptionRatingDesc","sortByOptionBestSelling","sortByOptionNewScore","sortByOptionTrendingScore","_pageType","urlTokens","pageType","_viewport","expandrefinerCount","defaultPageNumber","catalogId","getCatalogId","isListPageStateUpdated","_updateListPageState","listPageState","_this$props$context$r","_this$props$config$it","_this$props$config$it2","_this$props$context$r2","querySorting","query","sorting","parse","decodeURIComponent","currentPageNumber","skip","itemsPerPage","sortingCritera","Columns","pageSize","totalProductCount","count","activeFilters","hydrateRefinersFromUrl","productId","featureProduct","_getProductsDimensionsAvailabilities","async","_this$props$data$list","_this$props$data$list2","productsList","activeProducts","getDimensionAvailabilitiesForProductSearchResultAction","DimensionAvailabilitiesForProductSearchResultInput","_getActivePrice","_this$props$data$list3","_this$props$data$list4","getPriceForProductSearchResult","PriceForProductSearchResultInput","_getSearchResultModal","modal","modalHeader","modalFooter","modalBody","ModalBody","SearchResultModal","modalIsOpen","_modalToggleRef","_toggleModal","_getCollectionTitle","collectionTitle","q","category","getFriendlyName","locale","NameTranslations","productCountNumber","productCountText","numberOfProducts","oneProduct","TitleContainer","telemetryPageName","toLowerCase","titlePrefix","searchTextPrefix","titleText","titleCount","_getCategoryHierarchy","categoryHierarchy","CategoryHierarchyContainer","tag","categoryHierarchyList","categoryLinkAriaLabel","Url","categoryHierarchySeparator","_getSortingDropDown","activeDropdown","_getCurrentlySelectedOption","sortingState","selectedSortByOption","dropdownOptions","_getAllSortByOptions","dropdownOption","SortingContainer","sortByDropDown","LabeledDropdown","labelClassname","labelText","sortByDropdownLabel","dropdownId","dropdownClassname","toggleColor","selectedOption","onSelectOption","_updateSortByDropdown","_sortAndFilterContainerRef","_getPagination","fullUrl","getCurrentUrl","skipCount","totalItems","previousText","flipperPrevious","nextText","flipperNext","UncontrolledPagination","paginationAriaLabel","url","qsp","startingItem","_renderPrev","_renderNext","previousAriaLabel","nextAriaLabel","_getRefineMenu","tempRangeTypeTODO","inputRange","validRefiners","updateRefinerPanel","refiners","refiner","_shouldHideFromRefiners","activeRefiners","_getexpandRefinerCount","expandedRefiners","RefineMenuContainer","RefinerSectionContainer","_refineItemCommonProps","_onUpdateRefiners","_buildRefinerUrl","_this$props$data$prod","_this$props$data$prod2","inventoryAwareSortableAttributeId","_getChoiceSummary","_this$props$data$prod3","selectedRefiners","choiceSummaryLabel","_onChoiceClicked","_buildRefinerUrlForChoiceSummary","_getProducts","_this$props$slots","_this$props$data$feat","_this$props$data$prod4","shouldAllowBackNavigation","breadCrumbType","breadcrumbType","shouldAllowBack","slots","quickview","isPriceMinMaxFeatureState","featureState","IsEnabled","notification","window","history","pushState","buildListPageUrl","_getSortColumnFromSelectedOption","transaction","option","searchConfiguration","mappedConfiguration","sortColumn","_getSortCriteriaColumn","_this$props$data$list5","sortCriteria","queryColumns","parseQueryParam","mappedSearchConfiguration","mappedSearchConfig","validValues","activeSortColumn","activeMappedConfig","ColumnName","IsDescending","_this$props$data$list6","newRefinementCriteria","dropdownElementId","dropdownElement","selectedChoice","isClearAll","refinerCount","all","one","two","three","four","paginationPreviousText","paginationNextText","device","Type","_updateViewport","productPrices","pending","validationErrorNotNumber","validationErrorNotRange","getTelemetryObject","friendlyName","static","nameTranslations","_nameTranslation","nameTranslation","Language","_this$props$context$a2","MsDyn365","isBrowser","addEventListener","reaction","_listPageState$active","_listPageState$sortin","_newListPageState$cur","_newListPageState$sor","_newListPageState$act","_this$props$context$r3","_this$props$context$r4","_this$props$context$r5","_this$props$context$a","newListPageState","GetFullProductsByCollectionInput","Paging","Top","Skip","Math","Sorting","recordId","ProductId","Recommendation","includeAttributes","productResults","getCollectionProducts","enableAffiliationBasedPricing","_newListPageState$cur2","_newListPageState$sor2","_newListPageState$act2","_this$props$context$r6","_this$props$context$r7","refinerInput","RefinersByCollectionInput","getCollectionRefinersAction","dimensionsToDisplayOnProductCard","dimensionsInProductCard","dimensionsToDisplayAsSwatch","dimensionsAsSwatchType","DimensionTypes","none","componentWillUnmount","removeEventListener","_listPageState$result","_listPageState$result2","_this$props$context$r8","_this$props$data$list7","_this$props$data$list8","productCollection","searchProduct","errorText","resultCategoryNotFoundText","resultSearchNotFoundText","productsComponent","featureComponent","searchResultContainerViewProps","TitleViewProps","disableHierarchy","refineMenu","moduleProps","sortByOptions","pagination","ProductsContainer","ProductSectionContainer","CategoryNavContainer","RefineAndProductSectionContainer","choiceSummary","modalToggle","searchResultModal","errorMessage","FeatureSearchContainer","similarLookProduct","renderView","_getViewport","variant","VariantType","Browser","Viewport","observable","action","DescriptionInterval","renderProductCards","_props$data$listPageS","Node","renderProductCardsDescription","isEnabledProductDescription","_props$data$products$","_props$data$featureSt","isAllowBack","classname","quickviewslot","loginToViewPricingText","loginToViewPricing","renderProducts","_props$data$listPageS2","productDescriptionInterval","productDescriptionIntervalRemainder0","productDescriptionIntervalRemainder9","renderTitleCount","renderCategoryHierarchy","createSearchResultModal","modalProps","isRecoSearchPage","createModalBody","renderSort","submenu","renderRefinerMobile","renderRefiner","renderTitle","productCardimageSettings","fallbackImageUrl","viewports","lg","h","w","md","sm","xs","image","cropFocalRegion","getProductPrice","pricing","productRecId","pr","_props$context$action","filterText","partNoHeading","descriptionHeading","availabilityHeading","listPriceHeading","yourPriceHeading","goToCartText","continueShoppingText","addToCartModalHeading","addToCartText","cart","productSearchResults","enableProdutDescription","listView","eligbilityList","setEligbilityList","useState","_props$data$products","_cart$result","itemIds","p","GetProductEligibilityInput","Id","eligibilityData","GetProductEligibilityAction","i","getExtensionPropertyValueByKey","ExtensionProperties","CommercePropertyValueEnum","string","IsEligible","getProductEligibility","setIsExpanded","modalOpen","setModalOpen","addedProduct","setAddedProduct","productPricing","setProductPricing","handleAddToCart","quantity","_productSearchResults","_cart$result2","foundProduct","BasePrice","Price","AdjustedPrice","ProductTypeValue","addProductToCart","then","response","status","addToCartBehavior","getProductSupersessionProperty","extensionKey","properties","_properties$find","Key","Value","StringValue","Module","Popup","price","component","productQuantity","navigationUrl","getUrlSync","dialogStrings","headerItemOneText","headerItemFormatText","headerMessageText","_renderProductsListView","_props$data$cart$resu2","_productSearchResults2","courseInCartText","courseId","cartlines","CartLines","Table","SupersessionKey","SupersededId","SupersededName","Inventory","renderAddtoCartButton","_props$data$cart$resu","hasInvoiceLine","invoiceInCartText","AddToCartListComponent","onAddToCart","addToCartButtonText","colSpan","style","textAlign","productEligibilityText","setModalProps","CartIconView","_modalContainer","placement","hideArrow","wrapClassName","isModalOpen","closeModal","_openModal","_renderCartCloseIcon","_renderCartItemCount","cartItemCount","_escFunction","keyCode","KeyCodes","Escape","isAutoDisplayTriggered","isCartValid","isQuantityLimitsFeatureEnabled","payload","TelemetryEvent","CheckOut","TelemetryConstant","Checkout","GuestCheckout","checkoutByGuestAttributes","componentDidMount","_validateCart","_removeCommentFromCartLine","cartState","_cartState$cart$CartL","Comment","_clonedCart","updateCart","newCartObject","_renderGuestCheckout","hasError","guestCheckoutUrl","disabled","guestCheckoutButtonTitle","_cart$result$cart$Ver","cartVersion","Version","lastValidatedCartVersion","validateCartAsync","ValidationResultsPairs","catch","_this$props$data$cart","_this$props$data$cart2","_this$props$data$cart3","_this$props$data$cart4","shouldShowMiniCart","isProductAddedToCart","AddToCartBehavior","showMiniCart","some","cartline","miniCartWrapper","renderModuleAttributes","cartIcon","flyoutTitle","isEmpty","emptyCart","CartlinesWrapper","cartLines","cartLine","cartLineIndex","miniCartItemWrapper","storeLocation","remove","promoContentItem","_props$resources$tota","TotalAmount","totalPrice","emptyPrice","totalPriceFormatString","renderTotalPrice","subTotalMessage","goToCartButton","continueShoppingButtonTitle","renderCartlines","setQuantity","type","valueAsNumber","modalCloseButtonReference","onCancelHandler","isCreateOrderTemplateDialogOpen","setOrderTemplateNameDialogOpen","onCreateButtonClick","color","createOrderTemplateText","OrderTemplateNameDialog","isUpdateDialog","createOrderTemplateDialogResources","onCancel","onSuccess","onOrderTemplateCreated","parentElementRef","getDefaultColorSwatchSelected","productData","_colorAttribute$Swatc","_colorAttribute$Swatc2","_colorAttribute$Swatc3","colorAttribute","attributeValue","_attributeValue$KeyNa","defaultSwatch","Swatches","IsDefault","updateProductUrl","productDetailsPageUrl","coreContext","queryString","sourceUrl","URL","baseUrl","search","pathname","renderProductUnitOfMeasure","unitOfMeasure","renderLabel","name","rating","ratingAriaLabelText","reviewCount","ratingCountAriaLabelText","reviewCountArialableText","getReviewAriaLabel","getRatingAriaLabel","roundedRating","toFixed","renderPrice","basePrice","adjustedPrice","savingsText","CustomerContextualPrice","PriceComponent","console","log","msdyn365Commerce","createComponentOverride","_product$Name","_product$RecordId","_getProductImageUrlFr","_getProductPageUrlFro","ratingCountAriaLabel","MIN_VALUE","productImageUrlFromSwatch","dimensionToPreSelectInProductCard","ProductImageUrls","generateImageUrl","getProductImageUrlFromDefaultColorSwatch","productPageUrlFromSwatch","SwatchValue","getProductPageUrlFromDefaultSwatch","productPageUrl","setProductPageUrl","productImageUrl","setProductImageUrl","selectedSwatchItems","Dictionary","enableStockCheck","updatePageAndImageUrl","swatchItem","setValue","productPageUrlWithSwatch","newUrl","searchParams","delete","swatchProductImageUrl","productImageUrls","newImageUrl","isUnitOfMeasureEnabled","unitOfMeasureDisplayType","AverageRating","TotalRatings","DefaultUnitOfMeasure","description","Description","attributeValues","_item$KeyName$toLocal","_item$KeyName","_item$Swatches$map","_item$Swatches","dimensionTypeValue","shouldDisplayDimension","swatches","_item$RecordId","_swatchItem$SwatchVal","_swatchItem$SwatchVal2","_dimensionAvailabilit","isDefault","_swatchItem$SwatchVal3","swatch","ProductComponentSwatchComponent","onSelectDimension","totalRatings","numberRatings","renderRating","inventoryAvailabilityLabel","selectedDimensions","getValues","DimensionTypeValue","convertDimensionTypeToProductDimensionType","DimensionValue","selectedProductId","renderQuickView","_reloadPage","location","reload","OrderTemplateListViewComponent","OrderTemplateList","OrderTemplates","OrderTemplate","statusMessage","orderTemplates","createOrderTemplateButton","templateHeaderStatusMessage","CreateNewTemplateButtonComponent","createNewTemplateButtonText","orderTemplateHeaderLabel","createOrderTemplateHeader","orderTemplateTitleLabel","orderTemplateTitle","orderTemplateNameAriaLabel","orderTemplateDescription","createOrderTemplateDescription","defaultOrderTemplateName","orderTemplateButtonLabel","createOrderTemplateButtonText","orderTemplateCancelButtonLabel","cancelNewOrderTemplateCreationButtonText","headingForEmptyOrderTemplateList","textForEmptyOrderTemplateList","orderTemplate","renderOrderTemplate","orderTemplateNodeProps","addToCartButton","orderTemplateImage","orderTemplateStatusMessage","removeButton","orderTemplateName","orderTemplateImageElement","currentImageListLength","quantityHeading","configurationObject","areInventoryRangesChecked","setAreInventoryRangesChecked","inventoryRangesList","setInventoryRangesList","onlyShowPriceWhenAuthenticated","resp","getInventoryLevelRangesAsync","callerContext","getInvProfs","_configurationObject$","_invProfOos","_invProfOos2","currentInvString","currentInventory","invProfOos","ir","_ir$Profile","tempInvRange","Profile","Code","hasOwnProperty","UpperBoundInclusive","productUnavailableText","valueType","property","_modalErrContainer","isErrModalOpen","closeErrModal","isErrAutoDisplayTriggered","isAddressCheckComplete","iProductsPresentVersion","customer","readAsync","customerAccountNumber","_customer$Addresses","Addresses","add","IsPrimary","ShippingAddress","primaryAddress","getAddresses","updateShippingAddress","newShippingAddress","_cart$cart","ippContent","iProductsPresent","ineligibleProductsText","r","Barcode","err","handleCartAddress","allowableFreight","invoiceInCartMessage","_data$detail$Products","detail","Products","removeCartLines","cartLineIds","LineId","checkoutAsSignInUserButton","checkoutAsGuestButton","loginToViewPricingAndAvailabilityText","supersededFromText","priceAndAvailabilityHeading","manufacturerCodes","searchTerm","codes","_p$ItemId","_p$ItemId2","matched","substring","GDNManufacturerCode","_productSearchResults3","unshift","isEligibilityChecked","setEligibilityChecked","_props$data$products2","IsAssorted","_productSearchResults4","_props$data$cart$resu3","_productSearchResults5","isOutOfStock","CarouselModule","_handleDismissCarousel","cookies","set","dismissCarousel","_next","nextIndex","activeIndex","content","animating","closeNow","_previous","_onExiting","_onExited","_goToIndex","newIndex","viewProps","carouselContainer","closeAnimation","previous","onIndicatorsClickHandler","handleDismissCarousel","handleOnExited","handleOnExiting","retrieveItems","Carousel","pause","pauseOnHover","ride","autoplay","interval","transitionType","hideFlipper","dismissEnabled","dismissCarouselAriaText","ariaLabelForDismissButton","indicatorAriaText","ariaLabelForSlide","directionTextPrev","directionTextNext","keyboard","propsContext","cartResult","shouldRetry","debug","AsyncResult","resolve","_validationResult$Val","validationResult","CartsDataActions","bypassCache","ValidationResultsByLineId","refreshCart","refreshError","validateError","cartLineQuantityUpdatedAsync","cartLineToUpdate","isUsingDefaultOrderSettingsMax","_modifiedProduct$Beha2","modifiedProduct","Behavior","MaximumQuantity","cartLineId","newQuantity","additionalProperties","updateLineResult","updateCartLineQuantity","message","getProductByProductId","getProductByProductIdAndWarehouse","warehouseId","targetWarehouseValue","WarehouseId","_product$Behavior","InventoryLocationId","_renderDeliveryLocation","deliverylocation","FulfillmentStoreId","_foundProductDelivery","orgUnitName","_getOrgUnitName","orgUnitLocations","foundProductDeliveryOption","productDeliveryOptions","deliveryOption","delivery","DeliveryOptions","DeliveryMode","shippingText","_renderStoreLocation","fulfillmentStoreId","foundLocation","orgUnitLocation","OrgUnitNumber","OrgUnitName","_assembleCartlines","reactNodes","foundProductAvailability","_foundProductAvailabi","productAvailabilites","productAvailability","_productAvailability$","ProductAvailableQuantity","_assembleNode","foundProductDeliveryOptions","removeButtonText","removeItemClickHandler","availableQuantityInStock","isStockCheckEnabled","outOfStockThreshold","AvailableQuantity","_getCartItemAvailableQuantity","maxQuantity","_getCartItemMaxQuantity","maxQuantityByConfig","maxByQuantityLimitsFeature","maxByQuantityLimitsFeatureResult","maxCartlineQuantity","isServiceItem","ItemTypeValue","ReleasedProductType","Service","onRemoveClickHandler","onRemoveClickFunction","RemoveCartItem","removeCartItemAttribute","getProductUrlSync","isChannelTypeB2B","_cartline$CatalogId","CatalogId","Quantity","CartLineItemComponent","catalogs","currentQuantity","isQuantityEditable","primaryImageUrl","displayMode","channelDeliveryOptionConfig","deliveryLocation","getMiniCartData","ctx","miniCartData","getActiveCartProductsAction","ActiveCartProductsInput","exception","Error","getAvailabilitiesForCartLineItems","ProductAvailabilitiesForCartLineItems","availableQuantity","getDeliveryOptionsForCartLineItems","ProductDeliveryOptionsForCartLineItems","deliveryOptions","CartIcon","retailMultiplePickUpOptionEnabled","getSortedCartLines","sortOrder","lines","sort","item1","item2","_item2$LineNumber","_item1$LineNumber","LineNumber","_item1$LineNumber2","_item2$LineNumber2","_getImageSettings","lazyload","_removeItemFromCartHandler","cartlineToRemove","checkoutBySignInAttributes","ViewShoppingBag","viewShoppingBagAttributes","_this$props$data$orgU","_setQuantityLimitsFeatureFlag","prevProps","_cart$cart$CartLines","_this$state$miniCartD","_this$state$miniCartD2","_this$props$data$chan","enableHoverCart","isAnonymousCheckout","cartUrl","checkoutURL","_getCheckoutURL","isCartEmpty","emailDeliveryModeCode","channel","EmailDeliveryModeCode","_getCartLines","validInventoryAcrossCartLines","validateCartLinesInventory","isValid","includeFlyout","totalItemsInCart","goToCartButtonText","goToCartButtonTitle","flyoutTooltip","UncontrolledTooltip","trigger","shouldShowCloseButton","cartPageUrl","hideAriaHidden","priceString","feature","CartIconComponent","cartLabel","cartQtyLabel","FlyoutContainer","checkoutButtonTitle","checkoutBlockedDueToUnavailableFunds","isAbsoluteUrl","urlCheck","returnURL","origin","_this$props$data$cata","PickupDeliveryModeCode","FlyoutCartLineItems","cartLinesSortOrder","updateMaxQuantityForCartLineItem","maxQuantityForCartLineItem","sizeString","productDimensionTypeSize","colorString","productDimensionTypeColor","configString","productDimensionTypeConfiguration","styleString","productDimensionTypeStyle","quantityDisplayString","quantityDisplayText","salesAgreementPricePrompt","inputQuantityAriaLabel","discountStringText","shippingChargesText","removeCartButtonText","outOfStockText","outOfRangeOneText","outOfRangeFormatText","pickupDeliveryModeCode","_featureStatuses$find","_featureStatuses$find2","featureStatuses","defaultOrderQuantityLimitsFeatureConfig","platform","enableDefaultOrderQuantityLimits","_featureStatuses$find3","customerInformation","customerInfo","IsB2b","_cartConfiguration$Ig","cartConfiguration","IgnoreOrderSettings","_renderCartlines","CatalogLabelComponent","validateCatalogId","isB2b","catalog","CartLineItemFunctions","renderProductDimensions","Product","DimensionStrings","Dimensions","productDimension","IsGiftCard","amountString","DiscountLines","discountLine","OfferId","OfferName","isSalesLine","PeriodicDiscount","EffectiveAmount","priceCurrency","EffectivePercentage","inventoryInformationLabel","inventoryCssName","inventoryLabelClassName","IsInvoiceLine","hasShippingMethod","_channelDeliveryOptio","PickupDeliveryModeCodes","deliveryMode","shippingChargeLines","ChargeLines","chargeLine","IsShipping","freightFee","reduce","chargeTotal","CalculatedAmount","_cartline$ChargeLines","otherCharges","chargeline","otherCharge","SalesAgreementLineRecordId","_props$context$reques2","_props$primaryImageUr","destructDimensionStrings","OmniChannelMedia","productDimensions","renderDisountLines","renderInventoryLabel","renderUnitOfMeasure","renderShippingLabel","renderOtherCharges","renderSalesAgreementPrompt","productAttribute","imgeClassName","newValue","quantityOnChange","lineIndex","NetAmountWithAllInclusiveTax","GrossAmount","ExtendedPrice","NetPrice","salesAgreementLineId","showShippingChargesForLineItems","_generateQuantityandPrice","nodes","IncrementalQuantity","currentCount","decrementButtonAriaLabel","incrementButtonAriaLabel","isCartStateReady","isGiftCard","DiscountAmount","priceEditorResources","CartLinePriceEditor","ProductComparisonPreview","_renderGreyPlaceHolders","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","collapseButton","_renderCollapseButton","isMainContentReady","hasUserInteractedWithComparison","_getProdutComparisonDataByCatalogId","productsLimit","_getProductsLimit","ObjectExtensions","isNullOrUndefined","subheaderText","productComparisonPreviewHeaderTextWithLimit","handleCollapseClick","productsMainInfo","_getProductsMainInfo","previewGreyPlaceHolders","productComparisonLink","clearAllProductsFromTheComparison","removeProductFromList","goToComparisonButton","_renderGoToComparisonButton","clearAllButton","_renderClearAllButton","_productData$filter","_this$props$data$acco5","GetProductsInPreviewProductComparisonInput","getProductsInPreviewProductComparisonAction","productDataByCatalogId","_getGreyPlaceHoldersCount","limit","placeHolder","productImageContainerClassName","tableRowClassName","productImageClassName","productNameClassName","productNameLink","_product$Dimensions","dimension","_dimension$DimensionV","dimensionValue","dimensionName","convertProductDimensionTypeToDimensionTypes","removeFromComparisonButton","RemoveFromComparisonButtonComponent","onClickHandler","productImage","_renderProductImage","productLink","viewport","productComparisonMobileProductsLimit","productComparisonDesktopProductsLimit","_product$PrimaryImage","_getFallbackImageUrl","defaultImageSettingQ","defaultImageSettings","xl","_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","CurrencyCode","_product$DateTimeOffs","isFunction","DateTimeOffsetValue","toUTCString","IntegerValue","FloatValue","dangerouslySetInnerHTML","getRichTextHtml","_specification$DataTy","specification","_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","tableHeaderLockedClassName","_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","Date","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","AttributeValueId","uniqueSpecificationNames","unique","dimensions","productInfo","allDimensions","dimensionIds","actionBarClassName","clearAllProductsFromComparison","isEmptyContent","_renderHeading","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","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","productDimensionValues","productMainInfo","renderSwatch","textValue","productsDimension","_productsDimension$di","_productsDimension$di2","dimensionItems","dimensionItem","_dimensionItem$map","currentDimensionId","_productMainInfo$prod","_swatchItem$Dimension2","_swatchItem$Dimension3","_swatchItem$Dimension4","_swatchItem$Dimension5","_swatchItem$Dimension6","_swatchItem$Dimension7","_swatchItem$Dimension8","_swatchItem$Dimension9","isDefaultDimension","selectedDimension","_swatchItem$Dimension","DimensionId","ColorHexCode","ImageUrl","_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","productPrice","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","AddToCartProductListComponent","_quickOrderTemplate$q","_quickOrderTemplate$q2","quickOrderTemplate","quickOrderTemplateLines","fullProduct","ProductDetails","productListLine","buttonLabel","quickOrderGridBuySelectedButtonText","buttonAriaLabel","quickOrderGridBuySelectedButtonAriaLabel","_props$resources$quic","_props$resources$quic2","_props$resources$quic3","_props$resources$quic4","_props$resources$quic5","_props$resources$quic6","_props$resources$quic7","_props$resources$free","_props$resources$orig","_props$resources$curr","_props$resources$adde","_props$resources$quic8","_props$resources$quic9","quickOrderGridGoToCartText","quickOrderGridDialogCloseText","closeNotificationLabel","quickOrderGridBuySelectedAddingToCartErrorNotificationCloseAriaLabel","quickOrderGridSingleItemText","quickOrderGridMultiLineItemFormatText","headerLinesFormatText","quickOrderGridMultiLinesFormatText","quickOrderGridHeaderMessageText","addedQuantityText","buyAgainNotificationTitle","quickOrderGridBuySelectedAddingToCartErrorNotificationTitle","buyAgainNotificationCloseAriaLabel","getDialogStrings","orderDetailProducts","quickOrder","orderDetails","quickLine","_quickLine$fullProduc","salesLine","OrderDetailsProduct","getOrderDetails","AddToCartComponent","addToCartArialLabel","shouldSkipSiteSettings","orderDetailsProducts","onError","getQuickOrderGridAddToCartDialog","moduleClassName","_result$cartActionRes","cartActionResult","errorDetails","LocalizedMessage","handlers","onErrorMessage","removeActionHandler","removeProductList","productList","removeQuickOrderList","QuickOrderGridDrawer","_props$collapseProps$","_props$collapseProps","_isManuallyToggled","collapseProps","_drawerGlyphClass","toggleGlyphClassName","closeGlyph","isAnimateGlyph","_drawerOpenGlyph","openGlyph","_drawerCloseGlyph","drawerClass","drawerButtonClassName","toggleButtonProps","block","_generateDrawerButtonInnerMarkup","isCollapseState","drawerButtonTextClass","toggleButtonClassName","headingDrawerClass","descriptionDrawerClass","moduleHeadingText","moduleDescriptionText","_generateGlyphMarkup","glyphClass","QuickOrderGridFormComponent","productTextInput","quantityTextInput","quickOrderGridState","maxChars","minQuantity","isAddtoListDisabled","ariaLabelQuantity","ariaLabelProduct","ariaLabelAddtoCart","handleQuantityChange","handleInputChange","handleAddProductListClick","onInputChange","onInputChangeFunction","onQuantityInputChange","onQuantityChangeFunction","productNode","quantityNode","pattern","maxLength","addToListBtn","userMessage","stateMessage","Alert","statusCssString","messageGlyph","messageText","QuickOrderGridProduct","productLine","isSelected","QuickOrderGridDesktopHeaderCellsComponent","columnWithNumberClassName","quickOrderGridProductNumberText","quickOrderGridProductText","quickOrderGridUnitPriceText","quickOrderGridUnitOfMeasureText","quickOrderGridQuantityText","quickOrderGridActionsText","QuickOrderGridMobileHeaderCellsComponent","QuickOrderGridTableHeaderComponent","rowClassName","headerCells","QuickOrderGridTableRowProductImageComponent","_props$data$product$p","_props$imageSettings","setShowPreviousActions","onChangeHandler","onChangeQuantity","itemKey","onRemoveHandler","onRemoveItem","quickOrderGridProductKey","QuickOrderGridExtraActionsPopupComponent","_props$data$product$p2","quickOrderGridViewDetailsButtonAriaLabel","quickOrderGridViewDetailsButtonText","shouldShowActions","setShowActions","onClickViewDetails","shouldShowActionsNewValue","actionsContainerClassName","quickOrderGridRemoveItemButtonAriaLabel","QuickOrderGridDesktopTableRowCellComponent","_props$data$product$p3","_productListLine$Line","join","quickOrderGridProductDimensionsSeparator","renderProductPrice","UnitOfMeasure","quickOrderGridInputQuantityAriaLabel","quickOrderGridDecrementButtonAriaLabel","quickOrderGridIncrementButtonAriaLabel","callbacks","QuickOrderGridMobileTableRowCellComponent","_props$data$product$p4","_productListLine$Line2","QuickOrderGridTableRowComponent","QuickOrderGridTableComponent","setIsMobile","quickOrderGridProducts","isOrderQuantityLimitsFeatureEnabled","updateViewport","quickOrderProduct","_product$ProductDetai","_quickOrderProduct$pr","_quickOrderProduct$pr2","behavior","MinimumQuantity","ProductPrice","callBacks","QuickOrderGrid","_this$props$data$feat2","_this$props$data$feat3","_this$props$data$feat4","_this$props$data$feat5","_cartConfiguration$re","_cartConfiguration$re2","_waitTime","_dimensionUpdateQueueMaxLength","_errorCssClass","_errorCssGlyphClass","_dimensionUpdateQueue","FinitePromiseQueue","_dimensions","_initializedDimensions","Set","_cssClassNameConfigure","_className","_isOrderQuantityLimitsFeatureEnabled","_isChannelLimitsFeatureEnabled","_applyDefaultOrderSettingsForCartLine","_quickOrderGridCallbacks","initializeDimension","initializedDimension","dimensionSelectedAsync","selectedDimensionId","selectedDimensionValueId","_this$state$productDi","size","enqueue","_updateDimensions","FinitePromiseQueueError","ProcessWasDiscardedFromTheQueue","getDropdownName","_getDropdownName","changeUpdatingDimension","isUpdatingDimension","_quickOrderGridRowCallbacks","line","_removeItemRowFromTable","productListLineId","_changeRowQuantity","_removeProductList","token","ProductListsDataActions","_updateStatusState","quickOrderGridDeleteProductListFailedText","_handleInputChange","productResponse","_cancellabelDebounce","cancel","isQuickOrderGridFormExpanded","getScanResult","GetScanResultInput","channelId","results","ProductDimensionFull","_updateQuantitiesInState","_handleQuantityChange","_this$state$productRe","currentValue","inputElement","_quantityInput","HTMLInputElement","minimumQuantity","needToUpdateUIValue","_behavior$MinimumQuan","newCurrentValue","setAttribute","_this$state$productRe2","Configuration","productDimensionTypeAmount","hasProductDimensions","dimensionsToUpdate","productDimensionErrorState","otherError","clearOtherErrorState","dimensionKey","keys","configureErrors","errorState","mappedDimensions","_this$_updateDimensio","_updateDimensionValue","selectedProduct","Promise","newProduct","getSelectedVariant","SelectedVariantInput","getDimensionsForSelectedVariant","GetDimensionsForSelectedVariantInput","variantProduct","productDimensionFull","newValueId","DimensionValues","_getDimensionErrorString","amountErrorMessage","quickOrderGridproductDimensionTypeAmountErrorMessage","quickOrderGridproductDimensionTypeColorErrorMessage","quickOrderGridproductDimensionTypeConfigurationErrorMessage","quickOrderGridproductDimensionTypeSizeErrorMessage","quickOrderGridproductDimensionTypeStyleErrorMessage","_productResponse$Dime","missingDimensions","_getConfigureErrors","quickOrderGridWrongQuantityErrorMsg","quickOrderTemplateLinesData","orderLineIndex","newProductListLine","previousQuantity","newLine","updatedLines","updatedProductList","ProductListLines","update","ActiveProductListInput","ProductListId","_isChannelMultipleCatalogsFeatureEnabled","isMultipleCatalogFeatureEnabledInHq","_addItemToProductListLine","quickOrderGridAddedToGridSuccessMessage","quickOrderGridAddedToGridFailureMessage","quickOrderGridAddedToGridDuplicateError","productListId","_productResponse$Defa","_createProductList","AddItemToProductListInput","addItemToProductListAction","CreateProductListInput","ProductListType","QuickOrder","createProductList","_productTextInput","_telemetryContent","_quickOrderGridFormClass","_quickOrderGridFormProductContent","_quickOrderGridFormMsgContent","ValidateDefaultOrderSettingsPerLine","_this$state$min","_this$state$max","quickOrderGridModuleHeading","quickOrderGridModuleDescription","quickOrderGridAddtogrid","quickOrderGridProductQuantityInputLabel","quickOrderGridProductInputLabel","quickOrderGridProductDimensionTypeColor","quickOrderGridProductDimensionTypeConfiguration","quickOrderGridSelectDimensionFormatString","quickOrderGridProductDimensionTypeSize","quickOrderGridProductDimensionTypeStyle","quickOrderGridProductDimensionTypeAmount","quickOrderGridModulePageHeading","productConfigureResources","selectDimensionFormatString","header","quickOrderGridProps","contentProps","isB2bCustomer","actions","drawer","bulkPurchase","_renderBulkPurchase","quickOrderGridForm","quickOrderGridFormProductContent","quickOrderGridFormMsgContent","form","configure","getProductConfigure","container","_renderListContainer","orderActions","_renderQuickOrderGridActions","quickOrderGridDeleteButtonText","userMessageNode","topStateMessage","addProductListToBag","QuickOrderGridActionsView","isBulkPurchaseEnabled","bulkPurchaseSlots","containerClass","_renderQuickOrderTable","_initQuickOrderGridProducts","quickOrderGridProduct","_getMinQuantityForCartLineItem","_getMaxQuantityForCartLineItem","_getQuantity","_getIgnoreOrderSettings","_product$Behavior2","_cartConfiguration$re3","_cartConfiguration$re4","applyDefaultOrderSettingsForCartLine","_product$Behavior3","defaultQuantity","DefaultQuantity","renderConfigureDropdown","dropdown","containerProps","labelContainerProps","errors","select","renderConfigure","dropdowns","renderForm","quickOrderForm","quickOrderProductContent","quickOrderMessageContent","getDefaultSwatchSelected","_productData$Attribut","_attributeSwatches$fi","attributeSwatches","productSearchResult","IsMasterProduct","ProductType","Master","Standalone","MaxVariantPrice","MinVariantPrice","_context$app$config","contextConfig","placeholderImageName","fallbackImageSource","bypassHideOnFailure","productComparisonButton","swatchProductImageUrls","getProductImageUrlFromDefaultSwatch","encodeURIComponent","renderProductComparisonButton","configureStickyFilter","isStickyHeader","headerContainer","querySelector","headerHeight","offsetHeight","bannerHeights","headerElement","defaultContainer","refinerElement","clientHeight","removeAttribute","renderRefinerFooter","doneAriaLabel","doneText","useEffect","useStickyFilter","stickyFilterSetup","enableStickyHeader","wrapperRefiner","refinerRefernce","handleClickOutside","contains","useOutsideClick"],"sourceRoot":""}