{"version":3,"file":"static/js/9.be240b9e160a7e1216d2.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/cartlineitem.component.tsx?767d","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/components/promocode.component.tsx?5a9f","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/cartlineitem.component.tsx?4855","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/components/promocode.component.tsx?6892","webpack://Msdyn365.Commerce.Online/./src/utils/cartAttributeManager.ts?36c3","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/media-gallery/media-gallery.tsx?24d7","webpack://Msdyn365.Commerce.Online/./src/modules/media-gallery/media-gallery.view.tsx?5061","webpack://Msdyn365.Commerce.Online/./src/modules/media-gallery/utils/helper.ts?b895","webpack://Msdyn365.Commerce.Online/./src/modules/media-gallery/utils/get-valid-product-images.ts?a364","webpack://Msdyn365.Commerce.Online/./src/modules/order-template-list/components/order-template-list.tsx?86c4","webpack://Msdyn365.Commerce.Online/./src/modules/order-template-list/components/orderTemplateList-status-message.tsx?183c","webpack://Msdyn365.Commerce.Online/./src/modules/order-template-list/components/create-order-template.tsx?ea38","webpack://Msdyn365.Commerce.Online/./src/modules/order-template-list/order-template-list.tsx?18d0","webpack://Msdyn365.Commerce.Online/./src/modules/order-template-list/order-template-list.view.tsx?103b","webpack://Msdyn365.Commerce.Online/./src/modules/order-template/components/add-line/spinner.tsx?b423","webpack://Msdyn365.Commerce.Online/./src/modules/order-template/components/add-line/add-line.tsx?5f8a","webpack://Msdyn365.Commerce.Online/./src/modules/order-template/components/add-line/dropdown.tsx?1cba","webpack://Msdyn365.Commerce.Online/./src/modules/order-template/components/add-line/not-found.tsx?392d","webpack://Msdyn365.Commerce.Online/./src/modules/order-template/components/common/order-template-quantity.tsx?99a1","webpack://Msdyn365.Commerce.Online/./src/modules/order-template/components/add-line/product-configuration.tsx?b256","webpack://Msdyn365.Commerce.Online/./src/modules/order-template/components/add-line/product-list.tsx?4284","webpack://Msdyn365.Commerce.Online/./src/modules/order-template/components/bulk-actions.tsx?dbe8","webpack://Msdyn365.Commerce.Online/./src/modules/order-template/components/order-template-actions.tsx?8136","webpack://Msdyn365.Commerce.Online/./src/modules/order-template/components/order-template-lines.tsx?3703","webpack://Msdyn365.Commerce.Online/./src/modules/order-template/components/order-template-lines-status-message.tsx?2986","webpack://Msdyn365.Commerce.Online/./src/modules/order-template/components/order-template-table-heading.tsx?665c","webpack://Msdyn365.Commerce.Online/./src/modules/order-template/order-template.tsx?4ecb","webpack://Msdyn365.Commerce.Online/./src/modules/order-template/order-template.view.tsx?a45e","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/search-result-container/components/utilities.ts?8569","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/choice-summary.tsx?3f71","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/error-message.tsx?6302","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/feature-search-result-item.tsx?71fa","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/link.tsx?52c2","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/modal.tsx?d78e","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/product-search-result-items.tsx?5174","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/range-refine-item.tsx?6288","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/refine-item.tsx?a594","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/range-refine-item-input.tsx?09aa","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/refine-submenu.tsx?1292","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/separator.tsx?4ea6","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/title.tsx?c269","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/search-result-container.tsx?7500","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/search-result-container.view.tsx?b779","webpack://Msdyn365.Commerce.Online/./src/modules/wishlist-items/components/wishlist-items-dimensions.tsx?15c5","webpack://Msdyn365.Commerce.Online/./src/modules/wishlist-items/components/wishlist-item.tsx?d2da","webpack://Msdyn365.Commerce.Online/./src/modules/wishlist-items/components/wishlist-items-status-message.tsx?cdb3","webpack://Msdyn365.Commerce.Online/./src/modules/wishlist-items/wishlist-items.tsx?df8b","webpack://Msdyn365.Commerce.Online/./src/modules/wishlist-items/wishlist-items.view.tsx?4d80","webpack://Msdyn365.Commerce.Online/./src/modules/adventureworks/views/components/product.component.tsx?fd23","webpack://Msdyn365.Commerce.Online/./src/modules/adventureworks/views/media-gallery.view.tsx?7624","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 { CartLinePriceEditor, ICartLinePriceEditorResources, PriceComponent } from '@msdyn365-commerce/components';\r\nimport { IComponentProps, IGridSettings, IImageSettings, Image } from '@msdyn365-commerce/core';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport { ChannelDeliveryOptionConfiguration, ProductDimensionType, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport { CartLine, DiscountLine, DiscountLineType, SalesLine } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport { ArrayExtensions, getFallbackImageUrl } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { getPayloadObject, getTelemetryAttributes, IncrementalQuantity, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport classNames from 'classnames';\r\nimport * as React from 'react';\r\n\r\n/**\r\n * ICartlineResourceString: Interface for specifying the\r\n * resource strings that the component needs.\r\n */\r\nexport interface ICartlineResourceString {\r\n\r\n /** Display string for discount label. */\r\n discountStringText: string;\r\n\r\n /** String for size key. */\r\n sizeString: string;\r\n\r\n /** String for color key. */\r\n colorString: string;\r\n\r\n /** String associated with the configuration product dimension. */\r\n configString: string;\r\n\r\n /** String for style key. */\r\n styleString: string;\r\n\r\n /** String for amount key. */\r\n amountString?: string;\r\n\r\n /** Display string for quantity label. */\r\n quantityDisplayString: string;\r\n\r\n /** Display string for quantity label. */\r\n inputQuantityAriaLabel: string;\r\n\r\n /** Aria label for the decrement button in quantity component. */\r\n decrementButtonAriaLabel: string;\r\n\r\n /** Aria label for the increment button in quantity component. */\r\n incrementButtonAriaLabel: string;\r\n\r\n /** Original text screenreader. */\r\n originalPriceText: string;\r\n\r\n /** Current text screenreader. */\r\n currentPriceText: string;\r\n\r\n /** Shipping Charges Text. */\r\n shippingChargesText: string;\r\n\r\n /** Price Editor Charges Text. */\r\n priceEditorResources?: ICartLinePriceEditorResources;\r\n}\r\n\r\n/**\r\n * Represents cart line data interface.\r\n */\r\ninterface ICartLineData {\r\n cartLine: CartLine | SalesLine;\r\n cartState?: ICartState;\r\n product?: SimpleProduct;\r\n}\r\n\r\n/**\r\n * ICartLineProps: The props required to render cartLineitem.\r\n */\r\nexport interface ICartLineProps extends IComponentProps<ICartLineData> {\r\n\r\n /** The flag to change the quantity component from interactible to static. */\r\n disableQuantityInteractivity?: boolean;\r\n\r\n /** The primary image url. */\r\n primaryImageUrl?: string;\r\n\r\n /** The product url. */\r\n productUrl?: string;\r\n\r\n /** GridSettings for the product image in cartLine. */\r\n gridSettings: IGridSettings;\r\n\r\n /** ImageSettings for the product image in cartLine. */\r\n imageSettings: IImageSettings;\r\n\r\n /** Boolean flag to indicate if the item is out of stock. */\r\n isOutOfStock?: boolean;\r\n\r\n /** Flag to make quantity section editable. */\r\n isQuantityEditable?: boolean;\r\n\r\n /** Max quantity for line item. */\r\n maxQuantity?: number;\r\n\r\n /** Current quantity for line item. */\r\n currentQuantity?: number;\r\n\r\n /** Resource string for the component. */\r\n resources: ICartlineResourceString;\r\n\r\n /** SalesLine flag. */\r\n isSalesLine?: boolean;\r\n\r\n /** Error message to show in place of quantity. */\r\n errorMessage?: string;\r\n\r\n /** Inventory information label. */\r\n inventoryInformationLabel?: string;\r\n\r\n /** Inventory information class name. */\r\n inventoryLabelClassName?: string;\r\n\r\n /** Flag to show/hide shipping charges for line items. */\r\n showShippingChargesForLineItems?: boolean;\r\n\r\n /** Boolean flag to indicate if cart state status is ready. */\r\n isCartStateReady?: boolean;\r\n\r\n /** Chanel Delivery Option configuration is from api. */\r\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\r\n\r\n /** The telemetry content. */\r\n telemetryContent?: ITelemetryContent;\r\n\r\n /** Quantity onChange callback. */\r\n quantityOnChange?(cartLine: CartLine, newQuantity: number): boolean;\r\n}\r\n\r\n/**\r\n * Represents dimensions strings.\r\n */\r\ninterface IDimensionStrings {\r\n\r\n /** String for size key. */\r\n sizeString: string;\r\n\r\n /** String for color key. */\r\n colorString: string;\r\n\r\n /** String associated with the configuration product dimension. */\r\n configString: string;\r\n\r\n /** String for style key. */\r\n styleString: string;\r\n\r\n /** String for amount key. */\r\n amountString?: string;\r\n}\r\n\r\nconst cartLineItemFunctions = {\r\n\r\n /**\r\n * Render product dimensions.\r\n * @param product - Product data.\r\n * @param dimensionStrings - Dimension strings interface.\r\n * @returns JSX Element.\r\n */\r\n renderProductDimensions: (product: SimpleProduct, dimensionStrings: IDimensionStrings) => {\r\n if (!product.Dimensions) {\r\n return [];\r\n }\r\n\r\n return product.Dimensions.map(productDimension => {\r\n\r\n if (productDimension.DimensionTypeValue === ProductDimensionType.Color) {\r\n return (\r\n <div key={`${product.RecordId}ProductDimensions1`} className='msc-cart-line__product-variant-item'>\r\n <span className='msc-cart-line__product-variant-color'>\r\n {dimensionStrings.colorString}\r\n {': '}\r\n <span className='name'>\r\n {productDimension.DimensionValue?.Value}\r\n </span>\r\n </span>\r\n </div>\r\n );\r\n }\r\n\r\n if (productDimension.DimensionTypeValue === ProductDimensionType.Configuration) {\r\n return (\r\n <div key={`${product.RecordId}ProductDimensions2`} className='msc-cart-line__product-variant-item'>\r\n <span className='msc-cart-line__product-configuration'>\r\n {dimensionStrings.configString}\r\n {': '}\r\n <span className='name'>\r\n {productDimension.DimensionValue?.Value}\r\n </span>\r\n </span>\r\n </div>\r\n );\r\n }\r\n\r\n if (productDimension.DimensionTypeValue === ProductDimensionType.Size) {\r\n return (\r\n <div key={`${product.RecordId}ProductDimensions3`} className='msc-cart-line__product-variant-item'>\r\n <span className='msc-cart-line__product-variant-size'>\r\n {dimensionStrings.sizeString}\r\n {': '}\r\n <span className='name'>\r\n {productDimension.DimensionValue?.Value}\r\n </span>\r\n </span>\r\n </div>\r\n );\r\n }\r\n\r\n if (productDimension.DimensionTypeValue === ProductDimensionType.Style) {\r\n return (\r\n <div key={`${product.RecordId}ProductDimensions4`} className='msc-cart-line__product-variant-item'>\r\n <span className='msc-cart-line__product-variant-style'>\r\n {product.IsGiftCard ? dimensionStrings.amountString : dimensionStrings.styleString}\r\n {': '}\r\n <span className='name'>\r\n {productDimension.DimensionValue?.Value}\r\n </span>\r\n </span>\r\n </div>\r\n );\r\n }\r\n return null;\r\n });\r\n },\r\n\r\n /**\r\n * Gets the react node for product unit of price display.\r\n * @param props - The cart line props.\r\n * @returns The node representing markup for unit of measure component.\r\n */\r\n renderProductUnitPrice: (props: ICartLineProps) => {\r\n if (!props.data.cartLine.Price) {\r\n return null;\r\n }\r\n const zeroQuantity: number = 0;\r\n return (\r\n <div className='msc-cart-line__product-unit-price'>\r\n <span>\r\n <PriceComponent\r\n data={props.data.cartLine.Quantity && props.data.cartLine.Quantity > zeroQuantity ? {\r\n price: {\r\n CustomerContextualPrice: props.data.cartLine.Price\r\n }\r\n } : {\r\n price: {\r\n CustomerContextualPrice: props.data.cartLine.Price\r\n }\r\n }}\r\n context={props.context}\r\n id={props.id}\r\n typeName={props.typeName}\r\n />\r\n </span>\r\n </div>\r\n );\r\n },\r\n\r\n /**\r\n * Render discount lines.\r\n * @param props - The cart line props.\r\n * @returns JSX element.\r\n */\r\n renderDiscountLines: (props: ICartLineProps) => {\r\n\r\n if (!props.data.cartLine.DiscountLines || !ArrayExtensions.hasElements(props.data.cartLine.DiscountLines)) {\r\n return null;\r\n }\r\n\r\n /**\r\n * Get the updated discount percentage.\r\n * @param discountLine - The discount line.\r\n * @param cartLine - The cart line.\r\n * @returns The updated discount percentage.\r\n */\r\n const discountPercent = (discountLine: DiscountLine, cartLine: CartLine): number => {\r\n const numberZero = 0;\r\n const decimalPrecision = 2;\r\n const fullPercentage = 100;\r\n let updatedPercent: number = discountLine.Percentage ?? numberZero;\r\n\r\n if ((discountLine.Percentage === numberZero ||\r\n (discountLine.DiscountLineTypeValue && discountLine.DiscountLineTypeValue === DiscountLineType.TenderTypeDiscount)) &&\r\n cartLine.Price && cartLine.Price > numberZero && cartLine.Quantity && cartLine.Quantity !== numberZero) {\r\n const effectiveAmount = discountLine.EffectiveAmount ?? numberZero;\r\n updatedPercent = Number(((effectiveAmount / (cartLine.Price * cartLine.Quantity)) * fullPercentage).toFixed(decimalPrecision));\r\n }\r\n\r\n return updatedPercent;\r\n };\r\n\r\n return props.data.cartLine.DiscountLines.map((discountLine, index) => {\r\n return (\r\n <div key={discountLine.OfferId ?? index} className='msc-cart-line__product-discount'>\r\n <span>\r\n {discountLine.OfferName ? discountLine.OfferName : ''}\r\n </span>\r\n <span className='msc-cart-line-item-product-discount-price'>\r\n <PriceComponent\r\n data={props.isSalesLine ? {\r\n price: {\r\n // @ts-expect-error -- Auto suppressed.\r\n CustomerContextualPrice: props.data.cartLine.PeriodicDiscount\r\n }\r\n } : {\r\n price: {\r\n CustomerContextualPrice: discountLine.EffectiveAmount,\r\n BasePrice: discountLine.EffectiveAmount\r\n }\r\n }}\r\n context={props.context}\r\n id={props.id}\r\n typeName={props.typeName}\r\n />\r\n </span>\r\n <span className='msc-cart-line__product-discount-percentage'>\r\n {` (${discountLine.Percentage !== undefined ? discountPercent(discountLine, props.data.cartLine) : ''}%)`}\r\n </span>\r\n </div>\r\n );\r\n });\r\n },\r\n\r\n /**\r\n * Render inventory label.\r\n * @param props - The cart line props.\r\n * @returns JSX element.\r\n */\r\n renderInventoryLabel: (props: ICartLineProps) => {\r\n const inventoryCssName = props.inventoryLabelClassName ? (\r\n `msc-cart-line__product-inventory-label ${props.inventoryLabelClassName}`) : 'msc-cart-line__product-inventory-label';\r\n\r\n return (\r\n <p className={inventoryCssName}>\r\n {props.inventoryInformationLabel}\r\n </p>\r\n );\r\n },\r\n\r\n /**\r\n * Render shipping label.\r\n * @param props - The cart line props.\r\n * @returns JSX element.\r\n */\r\n renderShippingLabel: (props: ICartLineProps) => {\r\n const pickupDeliveryModeCode = props.context.request.channel?.PickupDeliveryModeCode;\r\n const channelDeliveryOptionConfig = props.channelDeliveryOptionConfig;\r\n const cartline = props.data.cartLine;\r\n let hasShippingMethod = false;\r\n if (channelDeliveryOptionConfig !== undefined) {\r\n hasShippingMethod = !!(cartline.DeliveryMode && channelDeliveryOptionConfig.PickupDeliveryModeCodes?.some(\r\n deliveryMode => deliveryMode !== cartline.DeliveryMode));\r\n } else {\r\n hasShippingMethod = !!(cartline.DeliveryMode && cartline.DeliveryMode !== pickupDeliveryModeCode);\r\n }\r\n if (!hasShippingMethod) {\r\n return undefined;\r\n }\r\n\r\n const shippingChargeLines = (cartline.ChargeLines ?? []).filter(chargeLine => chargeLine.IsShipping);\r\n\r\n if (!ArrayExtensions.hasElements(shippingChargeLines)) {\r\n return undefined;\r\n }\r\n\r\n const defaultCharge: number = 0;\r\n const freightFee = shippingChargeLines.reduce((chargeTotal, chargeLine) => {\r\n return chargeTotal + (chargeLine.CalculatedAmount ?? defaultCharge);\r\n }, defaultCharge);\r\n\r\n const priceComponent = (\r\n <PriceComponent\r\n data={{\r\n price: {\r\n CustomerContextualPrice: freightFee\r\n }\r\n }}\r\n freePriceText='Free'\r\n context={props.context}\r\n id={props.id}\r\n typeName={props.typeName}\r\n className='msc-cart-line__freight-actual'\r\n />\r\n );\r\n return (\r\n <>\r\n <label className='msc-cart-line__freight-label'>\r\n {`${props.resources.shippingChargesText}:`}\r\n </label>\r\n <span className='shipping-value'>\r\n {priceComponent}\r\n </span>\r\n </>\r\n );\r\n },\r\n\r\n /**\r\n * Render other charges.\r\n * @param props - The cart line props.\r\n * @returns JSX element.\r\n */\r\n renderOtherCharges: (props: ICartLineProps) => {\r\n const cartline = props.data.cartLine;\r\n const otherCharges = cartline.ChargeLines?.filter((chargeline) => !chargeline.IsShipping);\r\n\r\n return otherCharges?.map((otherCharge, index) => {\r\n const itemIndex = index;\r\n return otherCharge.CalculatedAmount ? (\r\n <div className='msc-cart-line__other-charges' key={itemIndex}>\r\n <label className='msc-cart-line__other-charges-label'>\r\n {`${String(otherCharge.Description)}:`}\r\n </label>\r\n <span className='other-charge-value'>\r\n <PriceComponent\r\n data={{\r\n price: {\r\n CustomerContextualPrice: otherCharge.CalculatedAmount\r\n }\r\n }}\r\n context={props.context}\r\n id={props.id}\r\n typeName={props.typeName}\r\n className='msc-cart-line__other-charges-actual'\r\n />\r\n </span>\r\n </div>\r\n ) : '';\r\n }) ?? undefined;\r\n }\r\n};\r\n\r\n/**\r\n * Render cartline component.\r\n * @param props - The cart line props.\r\n * @returns JSX element.\r\n */\r\nconst CartLine: React.FC<ICartLineProps> = (props: ICartLineProps) => {\r\n const { isSalesLine, productUrl, resources } = props;\r\n const { product, cartLine } = props.data;\r\n\r\n const destructDimensionStrings = {\r\n sizeString: resources.sizeString,\r\n colorString: resources.colorString,\r\n styleString: resources.styleString,\r\n configString: resources.configString,\r\n amountString: resources.amountString\r\n };\r\n\r\n const fallbackImageUrl = product && getFallbackImageUrl(product.ItemId, props.context.actionContext.requestContext.apiSettings);\r\n const productDimensions = product && cartLineItemFunctions.renderProductDimensions(product, destructDimensionStrings);\r\n const renderProductUnitPrice = cartLineItemFunctions.renderProductUnitPrice(props);\r\n const imageSettings = props.imageSettings;\r\n if (imageSettings) {\r\n imageSettings.cropFocalRegion = true;\r\n }\r\n const renderDiscountLines = cartLineItemFunctions.renderDiscountLines(props);\r\n const renderInventoryLabel = cartLineItemFunctions.renderInventoryLabel(props);\r\n const renderShippingLabel = cartLineItemFunctions.renderShippingLabel(props);\r\n const renderOtherCharges = cartLineItemFunctions.renderOtherCharges(props);\r\n const payLoad = getPayloadObject('click', props.telemetryContent!, '', product?.RecordId.toString());\r\n const productAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\r\n const productName = product?.Name ?? cartLine.Description;\r\n const imgeClassName = props.data.cartLine.IsInvoiceLine ? 'msc-cart-line__invoice-image' : 'msc-cart-line__product-image';\r\n const cartLineContentClassName = props.data.cartLine.IsInvoiceLine ? 'msc-cart-line__invoice-content' : 'msc-cart-line__content';\r\n\r\n /**\r\n * Render other charges.\r\n * @param newValue - The cart line props.\r\n * @returns Boolean.\r\n */\r\n const onChange = (newValue: number): boolean => {\r\n if (props.quantityOnChange) {\r\n return props.quantityOnChange(props.data.cartLine, newValue);\r\n }\r\n return true;\r\n };\r\n\r\n /**\r\n * Generate error message.\r\n * @returns JSX element.\r\n */\r\n const generateErrorMessage = (): JSX.Element | null => {\r\n if (props.errorMessage) {\r\n return (\r\n <div className='msc-alert__header'>\r\n <span className='msi-exclamation-triangle' />\r\n <span>\r\n {props.errorMessage}\r\n </span>\r\n </div>\r\n );\r\n }\r\n\r\n return null;\r\n };\r\n\r\n /**\r\n * Render Saving component.\r\n * @returns JSX element.\r\n */\r\n // const renderSaving = (): JSX.Element | null => {\r\n\r\n // if (!props.data.cartLine.DiscountAmount) {\r\n // return null;\r\n // }\r\n // const discountAmountZero: number = 0;\r\n\r\n // if (props.data.cartLine.DiscountAmount > discountAmountZero) {\r\n // return (\r\n // <>\r\n // <span className='msc-cart-line__product-savings-label'>\r\n // {`${props.resources.discountStringText || 'Discount'}`}\r\n // </span>\r\n // <PriceComponent\r\n // data={props.isSalesLine ? {\r\n // price: {\r\n // // @ts-expect-error -- Auto suppressed.\r\n // CustomerContextualPrice: props.data.cartLine.PeriodicDiscount\r\n // }\r\n // } : {\r\n // price: {\r\n // CustomerContextualPrice: props.data.cartLine.DiscountAmountWithoutTax,\r\n // BasePrice: props.data.cartLine.DiscountAmount\r\n // }\r\n // }}\r\n // context={props.context}\r\n // id={props.id}\r\n // typeName={props.typeName}\r\n // className='msc-cart-line__product-savings-text'\r\n // />\r\n // </>\r\n // );\r\n // }\r\n // return null;\r\n // };\r\n\r\n /**\r\n * Gets the react node for product unit of measure display.\r\n * @returns The node representing markup for unit of measure component.\r\n */\r\n const renderUnitOfMeasure = () => {\r\n\r\n if (props.data.cartLine.IsInvoiceLine) {\r\n return null;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Do not need type check for appsettings\r\n if (!props.context.app.config.unitOfMeasureDisplayType || props.context.app.config.unitOfMeasureDisplayType === 'none') {\r\n return undefined;\r\n }\r\n\r\n if (!product || !product.DefaultUnitOfMeasure) {\r\n return undefined;\r\n }\r\n\r\n return (\r\n <div className='msc-cart-line__product-unit-of-measure'>\r\n <span>\r\n {product.DefaultUnitOfMeasure}\r\n </span>\r\n </div>\r\n );\r\n };\r\n\r\n /**\r\n * Generate quantity and price component.\r\n * @returns JSX element.\r\n */\r\n const generateQuantityAndPrice = (): JSX.Element[] | null => {\r\n const nodes = [];\r\n const defaultMaxQuantity: number = 10;\r\n const singleQuantity: number = 1;\r\n const unitOfMeasure = renderUnitOfMeasure();\r\n // No quantity selector for invoice line\r\n if (!props.data.cartLine.IsInvoiceLine) {\r\n if (props.data.product && props.isQuantityEditable) {\r\n nodes.push(\r\n <div className='msc-cart-line__product-quantity'>\r\n <div className='msc-cart-line__product-quantity-label'>\r\n {resources.quantityDisplayString}\r\n </div>\r\n\r\n {generateErrorMessage()}\r\n\r\n <IncrementalQuantity\r\n id={`msc-cart-line__quantity_${props.data.product.RecordId}-\r\n ${String(props.data.cartLine.DeliveryMode)}-${String(props.data.cartLine.LineId)}`}\r\n max={props.maxQuantity ?? defaultMaxQuantity}\r\n currentCount={props.currentQuantity}\r\n onChange={onChange}\r\n inputQuantityAriaLabel={resources.inputQuantityAriaLabel}\r\n decrementButtonAriaLabel={resources.decrementButtonAriaLabel}\r\n incrementButtonAriaLabel={resources.incrementButtonAriaLabel}\r\n key={props.data.cartLine.LineId}\r\n disabled={!props.isCartStateReady}\r\n isGiftCard={props.data.product.IsGiftCard ?? props.isOutOfStock}\r\n telemetryContent={props.telemetryContent}\r\n />\r\n {unitOfMeasure}\r\n </div>\r\n );\r\n } else {\r\n nodes.push(\r\n <div className={classNames('msc-cart-line__quantity', { 'single-quantity': props.data.cartLine.Quantity === singleQuantity })}>\r\n {unitOfMeasure}\r\n <label className='quantity-label'>\r\n {resources.quantityDisplayString}\r\n {': '}\r\n </label>\r\n\r\n {generateErrorMessage()}\r\n\r\n <span className='quantity-value'>\r\n {props.data.cartLine.Quantity}\r\n </span>\r\n </div>\r\n );\r\n }\r\n }\r\n\r\n nodes.push(\r\n <div className='msc-cart-line__product-savings'>\r\n <PriceComponent\r\n data={isSalesLine ? {\r\n price: {\r\n // @ts-expect-error -- Auto suppressed.\r\n CustomerContextualPrice: props.data.cartLine.NetAmount,\r\n BasePrice: props.data.cartLine.Price\r\n }\r\n } : {\r\n price: {\r\n CustomerContextualPrice: props.data.cartLine.NetAmountWithoutTax,\r\n BasePrice: props.data.cartLine.NetPrice\r\n }\r\n }}\r\n context={props.context}\r\n id={props.id}\r\n typeName={props.typeName}\r\n className='msc-cart-line__product-savings-actual'\r\n originalPriceText={resources.originalPriceText}\r\n currentPriceText={resources.currentPriceText}\r\n />\r\n {/* {\r\n renderSaving()\r\n } */}\r\n {props.isOutOfStock ? renderInventoryLabel : null}\r\n </div>\r\n );\r\n\r\n return nodes;\r\n };\r\n\r\n return (\r\n <div className='msc-cart-line'>\r\n <a className={imgeClassName} href={productUrl} aria-label={productName}>\r\n <Image\r\n requestContext={props.context.actionContext.requestContext}\r\n aria-hidden='true'\r\n src={props.primaryImageUrl ?? 'empty'} fallBackSrc={fallbackImageUrl} altText={productName}\r\n gridSettings={props.gridSettings} imageSettings={imageSettings} loadFailureBehavior='empty' />\r\n </a>\r\n <div className={cartLineContentClassName}>\r\n <div className='msc-cart-line__product'>\r\n <a className='msc-cart-line__product-title' href={productUrl} {...productAttribute} >\r\n {productName}\r\n </a>\r\n {ArrayExtensions.hasElements(productDimensions) ? <div className='msc-cart-line__product-variants'>\r\n {productDimensions}\r\n </div> : ''}\r\n <div className='msc-cart-line__product-price'>\r\n <PriceComponent\r\n data={isSalesLine ? {\r\n price: {\r\n // @ts-expect-error -- Auto suppressed.\r\n CustomerContextualPrice: props.data.cartLine.NetAmount,\r\n BasePrice: props.data.cartLine.Price\r\n }\r\n } : {\r\n price: {\r\n CustomerContextualPrice: props.data.cartLine.NetAmountWithoutTax,\r\n BasePrice: props.data.cartLine.NetPrice\r\n }\r\n }}\r\n context={props.context}\r\n id={props.id}\r\n typeName={props.typeName}\r\n className='msc-cart-line__product-discount-value'\r\n />\r\n {renderUnitOfMeasure()}\r\n </div>\r\n {renderProductUnitPrice}\r\n {renderInventoryLabel}\r\n {renderDiscountLines}\r\n {props.showShippingChargesForLineItems && <div className='msc-cart-line__freight'>\r\n {renderShippingLabel}\r\n </div>}\r\n {renderOtherCharges}\r\n </div>\r\n {\r\n generateQuantityAndPrice()\r\n }\r\n {\r\n props.data.cartLine.IsInvoiceLine && props.data.cartState && props.resources.priceEditorResources && <CartLinePriceEditor\r\n className='msc-cart-line__price-editor-container'\r\n context={props.context}\r\n resources={props.resources.priceEditorResources}\r\n cartState={props.data.cartState}\r\n cartLine={props.data.cartLine}\r\n />\r\n }\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default CartLine;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { 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 { IComponent, IComponentProps } from '@msdyn365-commerce/core';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport { Coupon } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { Button, format, getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\n/**\r\n * IPromoCodeProps: Interface for promo code component.\r\n */\r\nexport interface IPromoCodeProps extends IComponentProps<{}> {\r\n cart: ICartState | undefined;\r\n promoCodeHeadingText: string;\r\n appliedPromoCodeHeadingText: string;\r\n removePromoAriaLabelFormat: string;\r\n promoPlaceholderText: string;\r\n promoCodeApplyButtonText: string;\r\n collapseTimeOut: number;\r\n removePromoText: string;\r\n invalidPromoCodeErrorText: string;\r\n failedToAddPromoCodeErrorText: string;\r\n duplicatePromoCodeErrorText: string;\r\n failedToRemovePromoCodeErrorText: string;\r\n\r\n /** The telemetry content. */\r\n telemetryContent?: ITelemetryContent;\r\n promoCodeApplyCallback?(): void;\r\n}\r\n\r\n/**\r\n * IPromoCodeProps: Interface for promo code component.\r\n */\r\nexport interface IPromoCodeComponent extends IComponent<IPromoCodeProps> { }\r\n\r\n/**\r\n * IPromoCodeProps: Interface for promo code state.\r\n */\r\ninterface IPromoCodeState {\r\n promoCodeInputValue: string;\r\n error: string;\r\n canApply: boolean;\r\n}\r\n\r\n/**\r\n *\r\n * The PromoCode component renders the promocode section.\r\n * @extends {React.PureComponent<IRefineSubmenuProps>}\r\n */\r\nclass PromoCode extends React.PureComponent<IPromoCodeProps, IPromoCodeState> {\r\n\r\n private readonly payLoad: IPayLoad;\r\n\r\n public constructor(props: IPromoCodeProps) {\r\n super(props);\r\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, TelemetryConstant.ApplyPromoCode);\r\n this.state = {\r\n promoCodeInputValue: '',\r\n error: '',\r\n canApply: false\r\n };\r\n }\r\n\r\n public render(): JSX.Element {\r\n return (\r\n <div>\r\n <div className='msc-promo-code-heading'>\r\n {this.props.promoCodeHeadingText}\r\n </div>\r\n {this._renderForm(this.props.promoPlaceholderText, this.props.promoCodeApplyButtonText, this.props.cart)}\r\n <p className={this.state.error ? 'msc-alert-danger' : ''} aria-live='assertive'>\r\n {this.state.error}\r\n </p>\r\n {this._renderAppliedPromoCode(this.props)}\r\n </div>\r\n );\r\n }\r\n\r\n /**\r\n * On input change method.\r\n * @param event - Change event.\r\n */\r\n private readonly _onInputChangeHandler = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n const error = event.target.value === '' ? '' : this.state.error;\r\n this.setState({\r\n promoCodeInputValue: event.target.value, error,\r\n canApply: !!event.target.value\r\n });\r\n };\r\n\r\n /**\r\n * Apply promo code method.\r\n * @param cartState - Cart state interface.\r\n */\r\n private readonly _applyPromotion = (cartState: ICartState | undefined) => {\r\n if (!cartState) {\r\n return;\r\n }\r\n const appliedPromo = this.state.promoCodeInputValue;\r\n\r\n cartState.addPromoCode({ promoCode: appliedPromo })\r\n .then(result => {\r\n if (result.status === 'SUCCESS') {\r\n // Show success text\r\n this.setState({ promoCodeInputValue: '', error: '', canApply: false });\r\n } else if (result.substatus === 'ALREADYADDED') {\r\n this.setState({ error: this.props.duplicatePromoCodeErrorText });\r\n } else {\r\n this.setState({ error: this.props.invalidPromoCodeErrorText });\r\n }\r\n })\r\n .catch(() => {\r\n this.setState({ error: this.props.failedToAddPromoCodeErrorText });\r\n });\r\n };\r\n\r\n /**\r\n * On submit action.\r\n * @param cartState - Cart state.\r\n * @returns Apply promotion.\r\n */\r\n private readonly _onSubmitHandler = (cartState: ICartState | undefined) => (event: React.FormEvent<HTMLFormElement>) => {\r\n event.preventDefault();\r\n this._applyPromotion(cartState);\r\n };\r\n\r\n /**\r\n * On apply promotion.\r\n * @param cartState - Cart state.\r\n * @returns Apply promotion.\r\n */\r\n private readonly applyPromotionHandler = (cartState: ICartState | undefined) => () => {\r\n this._applyPromotion(cartState);\r\n };\r\n\r\n /**\r\n * Renders promo code form.\r\n * @param promoPlaceholderText - Promo code input box placeholder string.\r\n * @param promoCodeApplyButtonText - Promo code button text string.\r\n * @param cartState - Cart state interface.\r\n * @returns Promo code form.\r\n */\r\n private readonly _renderForm = (promoPlaceholderText: string, promoCodeApplyButtonText: string, cartState: ICartState | undefined) => {\r\n\r\n const attributes = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\r\n\r\n return (\r\n <form onSubmit={this._onSubmitHandler(cartState)} className='msc-promo-code__form-container'>\r\n <div className='msc-promo-code__group'>\r\n <input\r\n className='msc-promo-code__input-box'\r\n onChange={this._onInputChangeHandler}\r\n value={this.state.promoCodeInputValue}\r\n placeholder={promoPlaceholderText}\r\n />\r\n <Button\r\n title={promoCodeApplyButtonText}\r\n className='msc-promo-code__apply-btn btn'\r\n onClick={this.applyPromotionHandler(cartState)}\r\n disabled={!this.state.canApply}\r\n {...attributes}\r\n />\r\n </div>\r\n </form>\r\n );\r\n };\r\n\r\n /**\r\n * Remove promo code method.\r\n * @param cartState - Cart state interface.\r\n * @param event - Mouse event.\r\n */\r\n private readonly _removePromotion = (cartState: ICartState | undefined, event: React.MouseEvent) => {\r\n if (!cartState) {\r\n return;\r\n }\r\n const code = event.currentTarget.getAttribute('data-value') ?? '';\r\n cartState.removePromoCodes({\r\n promoCodes: [code]\r\n })\r\n .then(result => {\r\n if (result.status === 'SUCCESS') {\r\n this.setState({ error: '' });\r\n }\r\n })\r\n .catch(() => {\r\n this.setState({ error: this.props.failedToRemovePromoCodeErrorText });\r\n });\r\n\r\n };\r\n\r\n /**\r\n * Renders applied promo code form.\r\n * @param props - Promo code component props.\r\n * @returns Applied promo code.\r\n */\r\n private readonly _renderAppliedPromoCode = (props: IPromoCodeProps) => {\r\n if (!props.cart || !props.cart.cart.Coupons || !ArrayExtensions.hasElements(props.cart.cart.Coupons)) {\r\n return;\r\n }\r\n\r\n /**\r\n * On remove promotion action.\r\n * @param event - Mouse event.\r\n */\r\n const removePromotionHandler = (event: React.MouseEvent<HTMLElement>) => {\r\n this._removePromotion(props.cart, event);\r\n };\r\n\r\n return (\r\n <>\r\n {\r\n props.cart.cart.Coupons.map((coupon: Coupon) => {\r\n const ariaLabel = props.removePromoAriaLabelFormat ? format(props.removePromoAriaLabelFormat, props.removePromoText, coupon.Code) : '';\r\n\r\n return (\r\n <div key={coupon.Code} className='msc-promo-code__line-container'>\r\n <div className='msc-promo-code__line-value'>\r\n {'Code '}\r\n <span className='msc-promo-code__line-value-code'>\r\n {coupon.Code}\r\n </span>\r\n {'Applied '}\r\n\r\n </div>\r\n <Button\r\n title={props.removePromoText}\r\n className='msc-promo-code__line__btn-remove'\r\n onClick={removePromotionHandler}\r\n data-value={coupon.Code}\r\n aria-label={ariaLabel}\r\n />\r\n </div>\r\n );\r\n })\r\n }\r\n </>\r\n );\r\n };\r\n}\r\n\r\nexport default PromoCode;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { 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 { CartLinePriceEditor, ICartLinePriceEditorResources, PriceComponent } from '@msdyn365-commerce/components';\r\nimport { IComponentProps, IGridSettings, IImageSettings, Image } from '@msdyn365-commerce/core';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport { ChannelDeliveryOptionConfiguration, ProductDimensionType, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport { CartLine, CommerceProperty, DiscountLine, DiscountLineType, SalesLine } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport { ArrayExtensions, getFallbackImageUrl } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { getPayloadObject, getTelemetryAttributes, IncrementalQuantity, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport classNames from 'classnames';\r\nimport * as React from 'react';\r\nimport { CommercePropertyValueEnum } from '../../../../modules/allowable-freight/utils/CommercePropertyValueEnum';\r\n\r\n/**\r\n * ICartlineResourceString: Interface for specifying the\r\n * resource strings that the component needs.\r\n */\r\nexport interface ICartlineResourceString {\r\n\r\n /** Display string for discount label. */\r\n discountStringText: string;\r\n\r\n /** String for size key. */\r\n sizeString: string;\r\n\r\n /** String for color key. */\r\n colorString: string;\r\n\r\n /** String associated with the configuration product dimension. */\r\n configString: string;\r\n\r\n /** String for style key. */\r\n styleString: string;\r\n\r\n /** String for amount key. */\r\n amountString?: string;\r\n\r\n /** Display string for quantity label. */\r\n quantityDisplayString: string;\r\n\r\n /** Display string for quantity label. */\r\n inputQuantityAriaLabel: string;\r\n\r\n /** Aria label for the decrement button in quantity component. */\r\n decrementButtonAriaLabel: string;\r\n\r\n /** Aria label for the increment button in quantity component. */\r\n incrementButtonAriaLabel: string;\r\n\r\n /** Original text screenreader. */\r\n originalPriceText: string;\r\n\r\n /** Current text screenreader. */\r\n currentPriceText: string;\r\n\r\n /** Shipping Charges Text. */\r\n shippingChargesText: string;\r\n\r\n /** Price Editor Charges Text. */\r\n priceEditorResources?: ICartLinePriceEditorResources;\r\n}\r\n\r\n/**\r\n * Represents cart line data interface.\r\n */\r\ninterface ICartLineData {\r\n cartLine: CartLine | SalesLine;\r\n cartState?: ICartState;\r\n product?: SimpleProduct;\r\n}\r\n\r\n/**\r\n * ICartLineProps: The props required to render cartLineitem.\r\n */\r\nexport interface ICartLineProps extends IComponentProps<ICartLineData> {\r\n\r\n /** The flag to change the quantity component from interactible to static. */\r\n disableQuantityInteractivity?: boolean;\r\n\r\n /** The primary image url. */\r\n primaryImageUrl?: string;\r\n\r\n /** The product url. */\r\n productUrl?: string;\r\n\r\n /** GridSettings for the product image in cartLine. */\r\n gridSettings: IGridSettings;\r\n\r\n /** ImageSettings for the product image in cartLine. */\r\n imageSettings: IImageSettings;\r\n\r\n /** Boolean flag to indicate if the item is out of stock. */\r\n isOutOfStock?: boolean;\r\n\r\n /** Flag to make quantity section editable. */\r\n isQuantityEditable?: boolean;\r\n\r\n /** Max quantity for line item. */\r\n maxQuantity?: number;\r\n\r\n /** Current quantity for line item. */\r\n currentQuantity?: number;\r\n\r\n /** Resource string for the component. */\r\n resources: ICartlineResourceString;\r\n\r\n /** SalesLine flag. */\r\n isSalesLine?: boolean;\r\n\r\n /** Error message to show in place of quantity. */\r\n errorMessage?: string;\r\n\r\n /** Inventory information label. */\r\n inventoryInformationLabel?: string;\r\n\r\n /** Inventory information class name. */\r\n inventoryLabelClassName?: string;\r\n\r\n /** Flag to show/hide shipping charges for line items. */\r\n showShippingChargesForLineItems?: boolean;\r\n\r\n /** Boolean flag to indicate if cart state status is ready. */\r\n isCartStateReady?: boolean;\r\n\r\n /** Chanel Delivery Option configuration is from api. */\r\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\r\n\r\n /** The telemetry content. */\r\n telemetryContent?: ITelemetryContent;\r\n\r\n /** Quantity onChange callback. */\r\n quantityOnChange?(cartLine: CartLine, newQuantity: number): boolean;\r\n}\r\n\r\n/**\r\n * Represents dimensions strings.\r\n */\r\ninterface IDimensionStrings {\r\n\r\n /** String for size key. */\r\n sizeString: string;\r\n\r\n /** String for color key. */\r\n colorString: string;\r\n\r\n /** String associated with the configuration product dimension. */\r\n configString: string;\r\n\r\n /** String for style key. */\r\n styleString: string;\r\n\r\n /** String for amount key. */\r\n amountString?: string;\r\n}\r\n\r\nconst cartLineItemFunctions = {\r\n\r\n /**\r\n * Render product dimensions.\r\n * @param product - Product data.\r\n * @param dimensionStrings - Dimension strings interface.\r\n * @returns JSX Element.\r\n */\r\n renderProductDimensions: (product: SimpleProduct, dimensionStrings: IDimensionStrings) => {\r\n if (!product.Dimensions) {\r\n return [];\r\n }\r\n\r\n return product.Dimensions.map(productDimension => {\r\n\r\n if (productDimension.DimensionTypeValue === ProductDimensionType.Color) {\r\n return (\r\n <div key={`${product.RecordId}ProductDimensions1`} className='msc-cart-line__product-variant-item'>\r\n <span className='msc-cart-line__product-variant-color'>\r\n {dimensionStrings.colorString}\r\n {': '}\r\n <span className='name'>\r\n {productDimension.DimensionValue?.Value}\r\n </span>\r\n </span>\r\n </div>\r\n );\r\n }\r\n\r\n if (productDimension.DimensionTypeValue === ProductDimensionType.Configuration) {\r\n return (\r\n <div key={`${product.RecordId}ProductDimensions2`} className='msc-cart-line__product-variant-item'>\r\n <span className='msc-cart-line__product-configuration'>\r\n {dimensionStrings.configString}\r\n {': '}\r\n <span className='name'>\r\n {productDimension.DimensionValue?.Value}\r\n </span>\r\n </span>\r\n </div>\r\n );\r\n }\r\n\r\n if (productDimension.DimensionTypeValue === ProductDimensionType.Size) {\r\n return (\r\n <div key={`${product.RecordId}ProductDimensions3`} className='msc-cart-line__product-variant-item'>\r\n <span className='msc-cart-line__product-variant-size'>\r\n {dimensionStrings.sizeString}\r\n {': '}\r\n <span className='name'>\r\n {productDimension.DimensionValue?.Value}\r\n </span>\r\n </span>\r\n </div>\r\n );\r\n }\r\n\r\n if (productDimension.DimensionTypeValue === ProductDimensionType.Style) {\r\n return (\r\n <div key={`${product.RecordId}ProductDimensions4`} className='msc-cart-line__product-variant-item'>\r\n <span className='msc-cart-line__product-variant-style'>\r\n {product.IsGiftCard ? dimensionStrings.amountString : dimensionStrings.styleString}\r\n {': '}\r\n <span className='name'>\r\n {productDimension.DimensionValue?.Value}\r\n </span>\r\n </span>\r\n </div>\r\n );\r\n }\r\n return null;\r\n });\r\n },\r\n//\r\n /**\r\n * Gets the react node for product unit of price display.\r\n * @param props - The cart line props.\r\n * @returns The node representing markup for unit of measure component.\r\n */\r\n renderProductUnitPrice: (props: ICartLineProps) => {\r\n if (!props.data.cartLine.Price) {\r\n return null;\r\n }\r\n const zeroQuantity: number = 0;\r\n return (\r\n <div className='msc-cart-line__product-unit-price'>\r\n <span>\r\n <PriceComponent\r\n data={props.data.cartLine.Quantity && props.data.cartLine.Quantity > zeroQuantity ? {\r\n price: {\r\n CustomerContextualPrice: props.data.cartLine.Price\r\n }\r\n } : {\r\n price: {\r\n CustomerContextualPrice: props.data.cartLine.Price\r\n }\r\n }}\r\n context={props.context}\r\n id={props.id}\r\n typeName={props.typeName}\r\n />\r\n </span>\r\n </div>\r\n );\r\n },\r\n\r\n /**\r\n * Render discount lines.\r\n * @param props - The cart line props.\r\n * @returns JSX element.\r\n */\r\n renderDiscountLines: (props: ICartLineProps) => {\r\n\r\n if (!props.data.cartLine.DiscountLines || !ArrayExtensions.hasElements(props.data.cartLine.DiscountLines)) {\r\n return null;\r\n }\r\n\r\n /**\r\n * Get the updated discount percentage.\r\n * @param discountLine - The discount line.\r\n * @param cartLine - The cart line.\r\n * @returns The updated discount percentage.\r\n */\r\n const discountPercent = (discountLine: DiscountLine, cartLine: CartLine): number => {\r\n const numberZero = 0;\r\n const decimalPrecision = 2;\r\n const fullPercentage = 100;\r\n let updatedPercent: number = discountLine.Percentage ?? numberZero;\r\n\r\n if ((discountLine.Percentage === numberZero ||\r\n (discountLine.DiscountLineTypeValue && discountLine.DiscountLineTypeValue === DiscountLineType.TenderTypeDiscount)) &&\r\n cartLine.Price && cartLine.Price > numberZero && cartLine.Quantity && cartLine.Quantity !== numberZero) {\r\n const effectiveAmount = discountLine.EffectiveAmount ?? numberZero;\r\n updatedPercent = Number(((effectiveAmount / (cartLine.Price * cartLine.Quantity)) * fullPercentage).toFixed(decimalPrecision));\r\n }\r\n\r\n return updatedPercent;\r\n };\r\n\r\n return props.data.cartLine.DiscountLines.map((discountLine, index) => {\r\n return (\r\n <div key={discountLine.OfferId ?? index} className='msc-cart-line__product-discount'>\r\n <span>\r\n {discountLine.OfferName ? discountLine.OfferName : ''}\r\n </span>\r\n <span className='msc-cart-line-item-product-discount-price'>\r\n <PriceComponent\r\n data={props.isSalesLine ? {\r\n price: {\r\n // @ts-expect-error -- Auto suppressed.\r\n CustomerContextualPrice: props.data.cartLine.PeriodicDiscount\r\n }\r\n } : {\r\n price: {\r\n CustomerContextualPrice: discountLine.EffectiveAmount,\r\n BasePrice: discountLine.EffectiveAmount\r\n }\r\n }}\r\n context={props.context}\r\n id={props.id}\r\n typeName={props.typeName}\r\n />\r\n </span>\r\n <span className='msc-cart-line__product-discount-percentage'>\r\n {` (${discountLine.Percentage !== undefined ? discountPercent(discountLine, props.data.cartLine) : ''}%)`}\r\n </span>\r\n </div>\r\n );\r\n });\r\n },\r\n\r\n /**\r\n * Render inventory label.\r\n * @param props - The cart line props.\r\n * @returns JSX element.\r\n */\r\n renderInventoryLabel: (props: ICartLineProps) => {\r\n const inventoryCssName = props.inventoryLabelClassName ? (\r\n `msc-cart-line__product-inventory-label ${props.inventoryLabelClassName}`) : 'msc-cart-line__product-inventory-label';\r\n\r\n return (\r\n <p className={inventoryCssName}>\r\n {props.inventoryInformationLabel}\r\n </p>\r\n );\r\n },\r\n\r\n /**\r\n * Render shipping label.\r\n * @param props - The cart line props.\r\n * @returns JSX element.\r\n */\r\n renderShippingLabel: (props: ICartLineProps) => {\r\n const pickupDeliveryModeCode = props.context.request.channel?.PickupDeliveryModeCode;\r\n const channelDeliveryOptionConfig = props.channelDeliveryOptionConfig;\r\n const cartline = props.data.cartLine;\r\n let hasShippingMethod = false;\r\n if (channelDeliveryOptionConfig !== undefined) {\r\n hasShippingMethod = !!(cartline.DeliveryMode && channelDeliveryOptionConfig.PickupDeliveryModeCodes?.some(\r\n deliveryMode => deliveryMode !== cartline.DeliveryMode));\r\n } else {\r\n hasShippingMethod = !!(cartline.DeliveryMode && cartline.DeliveryMode !== pickupDeliveryModeCode);\r\n }\r\n if (!hasShippingMethod) {\r\n return undefined;\r\n }\r\n\r\n const shippingChargeLines = (cartline.ChargeLines ?? []).filter(chargeLine => chargeLine.IsShipping);\r\n\r\n if (!ArrayExtensions.hasElements(shippingChargeLines)) {\r\n return undefined;\r\n }\r\n\r\n const defaultCharge: number = 0;\r\n const freightFee = shippingChargeLines.reduce((chargeTotal, chargeLine) => {\r\n return chargeTotal + (chargeLine.CalculatedAmount ?? defaultCharge);\r\n }, defaultCharge);\r\n\r\n const priceComponent = (\r\n <PriceComponent\r\n data={{\r\n price: {\r\n CustomerContextualPrice: freightFee\r\n }\r\n }}\r\n freePriceText='Free'\r\n context={props.context}\r\n id={props.id}\r\n typeName={props.typeName}\r\n className='msc-cart-line__freight-actual'\r\n />\r\n );\r\n return (\r\n <>\r\n <label className='msc-cart-line__freight-label'>\r\n {`${props.resources.shippingChargesText}:`}\r\n </label>\r\n <span className='shipping-value'>\r\n {priceComponent}\r\n </span>\r\n </>\r\n );\r\n },\r\n\r\n /**\r\n * Render other charges.\r\n * @param props - The cart line props.\r\n * @returns JSX element.\r\n */\r\n renderOtherCharges: (props: ICartLineProps) => {\r\n const cartline = props.data.cartLine;\r\n const otherCharges = cartline.ChargeLines?.filter((chargeline) => !chargeline.IsShipping);\r\n\r\n return otherCharges?.map((otherCharge, index) => {\r\n const itemIndex = index;\r\n return otherCharge.CalculatedAmount ? (\r\n <div className='msc-cart-line__other-charges' key={itemIndex}>\r\n <label className='msc-cart-line__other-charges-label'>\r\n {`${String(otherCharge.Description)}:`}\r\n </label>\r\n <span className='other-charge-value'>\r\n <PriceComponent\r\n data={{\r\n price: {\r\n CustomerContextualPrice: otherCharge.CalculatedAmount\r\n }\r\n }}\r\n context={props.context}\r\n id={props.id}\r\n typeName={props.typeName}\r\n className='msc-cart-line__other-charges-actual'\r\n />\r\n </span>\r\n </div>\r\n ) : '';\r\n }) ?? undefined;\r\n }\r\n};\r\n\r\n/**\r\n * Render cartline component.\r\n * @param props - The cart line props.\r\n * @returns JSX element.\r\n */\r\nconst CartLine: React.FC<ICartLineProps> = (props: ICartLineProps) => {\r\n const { isSalesLine, productUrl, resources } = props;\r\n const { product, cartLine } = props.data;\r\n const destructDimensionStrings = {\r\n sizeString: resources.sizeString,\r\n colorString: resources.colorString,\r\n styleString: resources.styleString,\r\n configString: resources.configString,\r\n amountString: resources.amountString\r\n };\r\n\r\n const fallbackImageUrl = product && getFallbackImageUrl(product.ItemId, props.context.actionContext.requestContext.apiSettings);\r\n const productDimensions = product && cartLineItemFunctions.renderProductDimensions(product, destructDimensionStrings);\r\n const renderProductUnitPrice = cartLineItemFunctions.renderProductUnitPrice(props);\r\n const imageSettings = props.imageSettings;\r\n if (imageSettings) {\r\n imageSettings.cropFocalRegion = true;\r\n }\r\n const renderDiscountLines = cartLineItemFunctions.renderDiscountLines(props);\r\n const renderInventoryLabel = cartLineItemFunctions.renderInventoryLabel(props);\r\n const renderShippingLabel = cartLineItemFunctions.renderShippingLabel(props);\r\n const renderOtherCharges = cartLineItemFunctions.renderOtherCharges(props);\r\n const payLoad = getPayloadObject('click', props.telemetryContent!, '', product?.RecordId.toString());\r\n const productAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\r\n const productName = product?.Name ?? cartLine.Description;\r\n const imgeClassName = props.data.cartLine.IsInvoiceLine ? 'msc-cart-line__invoice-image' : 'msc-cart-line__product-image';\r\n const cartLineContentClassName = props.data.cartLine.IsInvoiceLine ? 'msc-cart-line__invoice-content' : 'msc-cart-line__content';\r\n\r\n /**\r\n * Render other charges.\r\n * @param newValue - The cart line props.\r\n * @returns Boolean.\r\n */\r\n const onChange = (newValue: number): boolean => {\r\n if (props.quantityOnChange) {\r\n return props.quantityOnChange(props.data.cartLine, newValue);\r\n }\r\n return true;\r\n };\r\n\r\n /**\r\n * Generate error message.\r\n * @returns JSX element.\r\n */\r\n const generateErrorMessage = (): JSX.Element | null => {\r\n if (props.errorMessage) {\r\n return (\r\n <div className='msc-alert__header'>\r\n <span className='msi-exclamation-triangle' />\r\n <span>\r\n {props.errorMessage}\r\n </span>\r\n </div>\r\n );\r\n }\r\n\r\n return null;\r\n };\r\n\r\n /**\r\n * Gets the react node for product unit of measure display.\r\n * @returns The node representing markup for unit of measure component.\r\n */\r\n const renderUnitOfMeasure = () => {\r\n\r\n if (props.data.cartLine.IsInvoiceLine) {\r\n return null;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Do not need type check for appsettings\r\n if (!props.context.app.config.unitOfMeasureDisplayType || props.context.app.config.unitOfMeasureDisplayType === 'none') {\r\n return undefined;\r\n }\r\n\r\n if (!product || !product.DefaultUnitOfMeasure) {\r\n return undefined;\r\n }\r\n\r\n return (\r\n <div className='msc-cart-line__product-unit-of-measure'>\r\n <span>\r\n {product.DefaultUnitOfMeasure}\r\n </span>\r\n </div>\r\n );\r\n };\r\n\r\n\r\n const getExtensionPropertyValueByKey = (\r\n properties: CommerceProperty[] | undefined,\r\n key: string,\r\n valueType: CommercePropertyValueEnum\r\n ) => {\r\n const property = properties?.find(p => p.Key === key)?.Value;\r\n\r\n // eslint-disable-next-line security/detect-object-injection\r\n const val = property ? property[valueType] : null;\r\n return val;\r\n };\r\n\r\n /**\r\n * Generate quantity and price component.\r\n * @returns JSX element.\r\n */\r\n const generateQuantityAndPrice = (): JSX.Element[] | null => {\r\n const nodes = [];\r\n const defaultMaxQuantity: number = 10;\r\n const singleQuantity: number = 1;\r\n const unitOfMeasure = renderUnitOfMeasure();\r\n const courseId = getExtensionPropertyValueByKey(props.data.cartLine.ExtensionProperties, \"CourseId\", CommercePropertyValueEnum.string);\r\n // No quantity selector for invoice line or for courseId\r\n if (!props.data.cartLine.IsInvoiceLine\r\n && !courseId // hide for courses\r\n ) {\r\n if (props.data.product && props.isQuantityEditable) {\r\n nodes.push(\r\n <div className='msc-cart-line__product-quantity'>\r\n <div className='msc-cart-line__product-quantity-label'>\r\n {resources.quantityDisplayString}\r\n </div>\r\n\r\n {generateErrorMessage()}\r\n\r\n <IncrementalQuantity\r\n id={`msc-cart-line__quantity_${props.data.product.RecordId}-\r\n ${String(props.data.cartLine.DeliveryMode)}-${String(props.data.cartLine.LineId)}`}\r\n max={props.maxQuantity ?? defaultMaxQuantity}\r\n currentCount={props.currentQuantity}\r\n onChange={onChange}\r\n inputQuantityAriaLabel={resources.inputQuantityAriaLabel}\r\n decrementButtonAriaLabel={resources.decrementButtonAriaLabel}\r\n incrementButtonAriaLabel={resources.incrementButtonAriaLabel}\r\n key={props.data.cartLine.LineId}\r\n disabled={!props.isCartStateReady}\r\n isGiftCard={props.data.product.IsGiftCard ?? props.isOutOfStock}\r\n telemetryContent={props.telemetryContent}\r\n />\r\n {unitOfMeasure}\r\n </div>\r\n );\r\n } else {\r\n nodes.push(\r\n <div className={classNames('msc-cart-line__quantity', { 'single-quantity': props.data.cartLine.Quantity === singleQuantity })}>\r\n {unitOfMeasure}\r\n <label className='quantity-label'>\r\n {resources.quantityDisplayString}\r\n {': '}\r\n </label>\r\n\r\n {generateErrorMessage()}\r\n\r\n <span className='quantity-value'>\r\n {props.data.cartLine.Quantity}\r\n </span>\r\n </div>\r\n );\r\n }\r\n }\r\n\r\n nodes.push(\r\n <div className='msc-cart-line__product-savings'>\r\n <PriceComponent\r\n data={isSalesLine ? {\r\n price: {\r\n // @ts-expect-error -- Auto suppressed.\r\n CustomerContextualPrice: props.data.cartLine.NetAmount,\r\n BasePrice: props.data.cartLine.Price\r\n }\r\n } : {\r\n price: {\r\n CustomerContextualPrice: props.data.cartLine.NetAmountWithoutTax,\r\n BasePrice: props.data.cartLine.NetPrice\r\n }\r\n }}\r\n context={props.context}\r\n id={props.id}\r\n typeName={props.typeName}\r\n className='msc-cart-line__product-savings-actual'\r\n originalPriceText={resources.originalPriceText}\r\n currentPriceText={resources.currentPriceText}\r\n />\r\n {props.isOutOfStock ? renderInventoryLabel : null}\r\n </div>\r\n );\r\n\r\n return nodes;\r\n };\r\n\r\n return (\r\n <div className='msc-cart-line'>\r\n <a className={imgeClassName} href={productUrl} aria-label={productName}>\r\n <Image\r\n requestContext={props.context.actionContext.requestContext}\r\n aria-hidden='true'\r\n src={props.primaryImageUrl ?? 'empty'} fallBackSrc={fallbackImageUrl} altText={productName}\r\n gridSettings={props.gridSettings} imageSettings={imageSettings} loadFailureBehavior='empty' />\r\n </a>\r\n <div className={cartLineContentClassName}>\r\n <div className='msc-cart-line__product'>\r\n <a className='msc-cart-line__product-title' href={productUrl} {...productAttribute} >\r\n {product?.ItemId || null} - {productName}\r\n </a>\r\n {ArrayExtensions.hasElements(productDimensions) ? <div className='msc-cart-line__product-variants'>\r\n {productDimensions}\r\n </div> : ''}\r\n <div className='msc-cart-line__product-price'>\r\n <PriceComponent\r\n data={isSalesLine ? {\r\n price: {\r\n // @ts-expect-error -- Auto suppressed.\r\n CustomerContextualPrice: props.data.cartLine.NetAmount,\r\n BasePrice: props.data.cartLine.Price\r\n }\r\n } : {\r\n price: {\r\n CustomerContextualPrice: props.data.cartLine.NetAmountWithoutTax,\r\n BasePrice: props.data.cartLine.NetPrice\r\n }\r\n }}\r\n context={props.context}\r\n id={props.id}\r\n typeName={props.typeName}\r\n className='msc-cart-line__product-discount-value'\r\n />\r\n {renderUnitOfMeasure()}\r\n </div>\r\n {renderProductUnitPrice}\r\n {renderInventoryLabel}\r\n {renderDiscountLines}\r\n {props.showShippingChargesForLineItems && <div className='msc-cart-line__freight'>\r\n {renderShippingLabel}\r\n </div>}\r\n {renderOtherCharges}\r\n </div>\r\n {\r\n generateQuantityAndPrice()\r\n }\r\n {\r\n props.data.cartLine.IsInvoiceLine && props.data.cartState && props.resources.priceEditorResources && <CartLinePriceEditor\r\n className='msc-cart-line__price-editor-container'\r\n context={props.context}\r\n resources={props.resources.priceEditorResources}\r\n cartState={props.data.cartState}\r\n cartLine={props.data.cartLine}\r\n />\r\n }\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default CartLine;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { 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 { IComponent, IComponentProps, msdyn365Commerce } from '@msdyn365-commerce/core';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport { Coupon } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport { Button, format, getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { PriceComponent } from '@msdyn365-commerce/components';\r\nimport { addAttributeToCart, removeAttributeFromCart } from \"../../../../utils/cartAttributeManager\";\r\nimport { ICouponCodeMapData } from '../../definition-extensions/cart.ext.props.autogenerated';\r\n\r\nexport interface IPromoCodeProps extends IComponentProps<{}> {\r\n cart: ICartState | undefined;\r\n promoCodeHeadingText: string;\r\n appliedPromoCodeHeadingText: string;\r\n removePromoAriaLabelFormat: string;\r\n promoPlaceholderText: string;\r\n promoCodeApplyButtonText: string;\r\n collapseTimeOut: number;\r\n removePromoText: string;\r\n invalidPromoCodeErrorText: string;\r\n failedToAddPromoCodeErrorText: string;\r\n duplicatePromoCodeErrorText: string;\r\n failedToRemovePromoCodeErrorText: string;\r\n couponMapping: ICouponCodeMapData[];\r\n /**\r\n * The telemetry content\r\n */\r\n telemetryContent?: ITelemetryContent;\r\n promoCodeApplyCallback?(): void;\r\n}\r\n\r\nexport interface IPromoCodeComponent extends IComponent<IPromoCodeProps> { }\r\n\r\nconst PromoCodeComponentActions = {};\r\n\r\ninterface IPromoCodeState {\r\n isCollapseOpen: boolean;\r\n promoCodeInputValue: string;\r\n error: string;\r\n canApply: boolean;\r\n}\r\n\r\n/**\r\n *\r\n * The PromoCode component renders the promocode section.\r\n * @extends {React.PureComponent<IRefineSubmenuProps>}\r\n */\r\nclass PromoCode extends React.Component<IPromoCodeProps, IPromoCodeState> {\r\n private readonly COUPON_ATTRIBUTE_KEY = 'coupon-code';\r\n private readonly payLoad: IPayLoad;\r\n\r\n constructor(props: IPromoCodeProps, state: IPromoCodeState) {\r\n super(props);\r\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, TelemetryConstant.ApplyPromoCode);\r\n this.state = {\r\n isCollapseOpen: false,\r\n promoCodeInputValue: '',\r\n error: '',\r\n canApply: false\r\n };\r\n }\r\n\r\n public shouldComponentUpdate(nextProps: IPromoCodeProps): boolean {\r\n if (this.props.appliedPromoCodeHeadingText !== nextProps.appliedPromoCodeHeadingText) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n public formatDate(date: Date) {\r\n const year = date.getFullYear();\r\n const month = String(date.getMonth() + 1).padStart(2, '0'); // Months are zero-based\r\n const day = String(date.getDate()).padStart(2, '0');\r\n return `${year}-${month}-${day}`;\r\n }\r\n\r\n public getMondayOfCurrentWeek() {\r\n const today = new Date();\r\n const day = today.getDay();\r\n const diff = today.getDate() - day + (day === 0 ? -6 : 1); // adjust when day is Sunday\r\n const monday = new Date(today.setDate(diff));\r\n return monday;\r\n }\r\n\r\n public getCouponCodeMap = (enteredCode: string) => {\r\n const foundCode = this.props.couponMapping.find(c => c.fromCouponCode?.toUpperCase() === enteredCode.toUpperCase());\r\n if (foundCode) { \r\n const mondaysDate = this.formatDate(this.getMondayOfCurrentWeek());\r\n const coupon = foundCode.toCouponCode?.find(tcc => tcc.date === mondaysDate)?.code;\r\n return coupon;\r\n }\r\n return null;\r\n }\r\n\r\n public render(): JSX.Element {\r\n return (\r\n <div>\r\n <div className='msc-promo-code-heading'>\r\n {this.props.promoCodeHeadingText}\r\n </div>\r\n {this._renderForm(this.props.promoPlaceholderText, this.props.promoCodeApplyButtonText, this.props.cart)}\r\n <p className={this.state.error ? 'msc-alert-danger' : ''} aria-live='assertive'>\r\n {this.state.error}\r\n </p>\r\n {this._renderAppliedPromoCode(this.props)}\r\n </div>\r\n );\r\n }\r\n\r\n private readonly _onInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const error = e.target.value === '' ? '' : this.state.error;\r\n this.setState({\r\n promoCodeInputValue: e.target.value, error,\r\n canApply: !!e.target.value\r\n });\r\n };\r\n\r\n private readonly _applyPromotion = (cartState: ICartState | undefined) => {\r\n if (!cartState || !cartState.cart) {\r\n return;\r\n }\r\n const appliedPromo = this.state.promoCodeInputValue;\r\n const promoCode = this.getCouponCodeMap(appliedPromo)\r\n cartState.addPromoCode({ promoCode: promoCode || appliedPromo })\r\n .then(result => {\r\n if (result.status === 'SUCCESS') {\r\n // Show success text\r\n this.setState({ promoCodeInputValue: '', error: '', canApply: false });\r\n const _cart = addAttributeToCart(this.COUPON_ATTRIBUTE_KEY, appliedPromo, cartState.cart);\r\n void cartState.updateCart({newCartObject: _cart})\r\n } else if (result.substatus === 'ALREADYADDED') {\r\n this.setState({ error: this.props.duplicatePromoCodeErrorText });\r\n } else {\r\n this.setState({ error: this.props.invalidPromoCodeErrorText });\r\n }\r\n })\r\n .catch(error => {\r\n this.setState({ error: this.props.failedToAddPromoCodeErrorText });\r\n });\r\n };\r\n\r\n private readonly _renderForm = (promoPlaceholderText: string, promoCodeApplyButtonText: string, cartState: ICartState | undefined) => {\r\n const _onSubmit = (event: React.FormEvent<HTMLFormElement>) => {\r\n event.preventDefault(); this._applyPromotion(cartState);\r\n };\r\n const _applyPromotion = (event: React.MouseEvent<HTMLElement>) => {\r\n this._applyPromotion(cartState);\r\n };\r\n const attributes = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\r\n\r\n return (\r\n <form onSubmit={_onSubmit} className='msc-promo-code__form-container'>\r\n <div className='msc-promo-code__group'>\r\n <input\r\n className='msc-promo-code__input-box'\r\n aria-label={promoPlaceholderText}\r\n onChange={this._onInputChange}\r\n value={this.state.promoCodeInputValue}\r\n placeholder={promoPlaceholderText}\r\n />\r\n <Button\r\n title={promoCodeApplyButtonText}\r\n className='msc-promo-code__apply-btn btn'\r\n onClick={_applyPromotion}\r\n disabled={!this.state.canApply}\r\n {...attributes}\r\n >\r\n {promoCodeApplyButtonText}\r\n </Button>\r\n </div>\r\n </form>\r\n );\r\n };\r\n\r\n private readonly _removePromotion = (cartState: ICartState | undefined, event: React.MouseEvent) => {\r\n if (!cartState) {\r\n return;\r\n }\r\n const code = event.currentTarget.getAttribute('data-value') || '';\r\n cartState.removePromoCodes({\r\n promoCodes: [code]\r\n })\r\n .then(result => {\r\n if (result.status === 'SUCCESS') {\r\n const _cart = removeAttributeFromCart(this.COUPON_ATTRIBUTE_KEY, cartState.cart);\r\n void cartState.updateCart({newCartObject: _cart, additionalProperties: { AttributeValues: _cart.AttributeValues || [] }});\r\n this.setState({ error: '' });\r\n\r\n }\r\n })\r\n .catch(() => {\r\n this.setState({ error: this.props.failedToRemovePromoCodeErrorText });\r\n });\r\n\r\n };\r\n\r\n private readonly _calculateDiscount = (code: string, cartState: ICartState | undefined) => {\r\n if (!cartState || !cartState.cart || !cartState.cart.CartLines || cartState.cart.CartLines.length === 0 || !code) {\r\n return;\r\n }\r\n let discountAmount = 0;\r\n for (const line of cartState.cart.CartLines) {\r\n if (line.DiscountLines) {\r\n for (const discountLine of line.DiscountLines) {\r\n if (discountLine.DiscountCode === code) {\r\n discountAmount += discountLine.DiscountCost!;\r\n }\r\n }\r\n }\r\n }\r\n return discountAmount * -1;\r\n };\r\n\r\n private readonly _renderAppliedPromoCode = (props: IPromoCodeProps) => {\r\n if (!props.cart || !props.cart.cart || !props.cart.cart.Coupons || !(props.cart.cart.Coupons.length > 0)) {\r\n return;\r\n }\r\n\r\n const _removePromotion = (event: React.MouseEvent<HTMLElement>) => {\r\n this._removePromotion(props.cart, event);\r\n };\r\n let totalCouponDiscountAmount = 0;\r\n for (const coupon of props.cart.cart.Coupons) {\r\n const discountAmount = this._calculateDiscount(coupon.Code ?? '', props.cart);\r\n if (discountAmount) {\r\n totalCouponDiscountAmount += discountAmount;\r\n }\r\n }\r\n\r\n return (\r\n <>\r\n <div className='msc-promo-code__discount'>\r\n <div className='msc-promo-code__discount-heading'>\r\n {this.props.appliedPromoCodeHeadingText}\r\n </div>\r\n <PriceComponent\r\n data={{\r\n price: {\r\n CustomerContextualPrice: totalCouponDiscountAmount\r\n\r\n }\r\n }}\r\n context={props.context}\r\n id={props.id}\r\n typeName={props.typeName}\r\n className='msc-promo-code__discount-value'\r\n />\r\n </div>\r\n {\r\n props.cart.cart.Coupons.map((coupon: Coupon) => {\r\n const ariaLabel = props.removePromoAriaLabelFormat ? format(props.removePromoAriaLabelFormat, props.removePromoText, coupon.Code) : '';\r\n\r\n return (\r\n <div key={coupon.Code} className='msc-promo-code__line-container'>\r\n <div className='msc-promo-code__line-value'>\r\n {coupon.Code}\r\n {' '}\r\n (\r\n <PriceComponent\r\n data={{\r\n price: {\r\n CustomerContextualPrice: this._calculateDiscount(coupon.Code || '', props.cart)\r\n\r\n }\r\n }}\r\n context={props.context}\r\n id={props.id}\r\n typeName={props.typeName}\r\n className='msc-promo-code__line-discount-value'\r\n />\r\n )\r\n </div>\r\n <Button\r\n title={props.removePromoText}\r\n className='msc-promo-code__line__btn-remove'\r\n onClick={_removePromotion}\r\n data-value={coupon.Code}\r\n aria-label={ariaLabel}\r\n >\r\n {props.removePromoText}\r\n </Button>\r\n </div>\r\n );\r\n })\r\n }\r\n </>\r\n );\r\n };\r\n}\r\n\r\n// @ts-expect-error\r\nexport const PromoCodeComponent: React.FunctionComponent<IPromoCodeProps> = msdyn365Commerce.createComponentOverride<IPromoCodeComponent>(\r\n 'PromoCode',\r\n { component: PromoCode, ...PromoCodeComponentActions }\r\n);\r\n\r\n\r\nexport default PromoCodeComponent;\r\n","import { Cart } from '@msdyn365-commerce/retail-proxy';\r\nimport { AttributeTextValueClass } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceModels.g';\r\n\r\nconst addAttributeToCart = (attrKey: string, attrValue: string, cart: Cart): Cart => {\r\n const _cart = { ...cart };\r\n const attributeArray = _cart.AttributeValues || [];\r\n const attributeObj = {\r\n '@odata.type': '#Microsoft.Dynamics.Commerce.Runtime.DataModel.AttributeTextValue',\r\n Name: attrKey,\r\n ExtensionProperties: [],\r\n TextValue: attrValue,\r\n TextValueTranslations: []\r\n };\r\n const attrIdx = attributeArray.findIndex(a => a.Name?.toUpperCase() === attrKey.toUpperCase());\r\n\r\n //Update existing attribute if there.\r\n if (attrIdx > -1) {\r\n (attributeArray[attrIdx] as AttributeTextValueClass).TextValue = attrValue;\r\n } else {\r\n attributeArray.push(attributeObj);\r\n }\r\n\r\n _cart.AttributeValues = attributeArray;\r\n\r\n return _cart;\r\n};\r\n\r\nconst removeAttributeFromCart = (attrKey: string, cart: Cart): Cart => {\r\n const _cart = { ...cart };\r\n const attributeArray = _cart.AttributeValues || [];\r\n const attrIdx = attributeArray.findIndex(a => a.Name?.toUpperCase() === attrKey.toUpperCase());\r\n\r\n //We can't remove attribute values for some reason, so we'll just set the value to ''\r\n if (attrIdx > -1) {\r\n (attributeArray[attrIdx] as AttributeTextValueClass).TextValue = '';\r\n }\r\n _cart.AttributeValues = attributeArray;\r\n return _cart;\r\n};\r\n\r\nexport { addAttributeToCart, removeAttributeFromCart };\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { 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 { Carousel, ICarouselProps, Player, IPlayerData, IPlayerOptions, IVideoMetadata } from '@msdyn365-commerce/components';\nimport { IImageData, IImageSettings, Image, Video } from '@msdyn365-commerce/core';\nimport { MediaLocation, MediaType, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions, getFallbackImageUrl, ObjectExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n defaultDataScale,\n IComponentNodeProps,\n ImagefullView,\n IModalViewProps,\n IModuleProps,\n inlineZoomImageOnHover,\n inlineZoomImageOnMouseMove,\n inlineZoomImageOnMouseOut,\n inlineZoomInitClick,\n INodeProps,\n ISingleSlideCarouselProps,\n isMobile,\n KeyCodes,\n NodeTag,\n onContainerZoomInit,\n onMouseMoveLensContainer,\n onMouseOutLensContainer,\n onMouseOverImageContainer,\n removeContainerZoomStyle,\n removeInlineZoomStyle,\n SingleSlideCarousel,\n VariantType\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { reaction } from 'mobx';\nimport * as React from 'react';\n\nimport { IMediaGalleryData } from './media-gallery.data';\nimport { imageSource, imageZoom, IMediaGalleryProps, thumbnailsOrientation } from './media-gallery.props.autogenerated';\nimport { getProductImages, getValidProductImages, getVideoMetadataFromApi, validateProductImages } from './utils';\nimport { getAltText, IMediaData } from './utils/helper';\n\n/**\n * IMediaGalleryState Interface.\n */\nexport interface IMediaGalleryState {\n animating: boolean;\n activeIndex: number;\n isImageZoomed: boolean;\n modalIsOpen: boolean;\n lastUpdate?: number;\n isMobileImageZoomed?: boolean;\n mediaGalleryItems?: IMediaData[];\n isInitialLoad?: boolean;\n shouldUseOptimizedImage?: boolean;\n}\n\n/**\n * IMediaGalleryThumbnailsViewProps Interface.\n */\nexport interface IMediaGalleryThumbnailsViewProps {\n ThumbnailsContainerProps: INodeProps;\n SingleSlideCarouselComponentProps: INodeProps;\n items?: IMediaGalleryThumbnailItemViewProps[];\n}\n\n/**\n * IMediaGalleryThumbnailItemViewProps Interface.\n */\nexport interface IMediaGalleryThumbnailItemViewProps {\n ThumbnailItemContainerProps: INodeProps;\n Picture: React.ReactElement;\n}\n\n/**\n * IMediaGalleryViewProps Interface.\n */\nexport interface IMediaGalleryViewProps extends IMediaGalleryProps<IMediaGalleryData> {\n state: IMediaGalleryState;\n MediaGallery: IModuleProps;\n CarouselProps: INodeProps;\n Thumbnails: IMediaGalleryThumbnailsViewProps;\n Modal?: React.ReactElement | null;\n callbackToggle?(): void;\n callbackThumbnailClick?(index: number): void;\n callbackThumbnailKeyDown?(index: number): void;\n}\n\n/**\n * Props for carousel.\n */\ninterface IMediaGalleryCarouselItems<ItemType> {\n items: ItemType[];\n keys: (string | undefined)[];\n}\n\n/**\n * Media gallery component.\n */\nclass MediaGallery extends React.Component<IMediaGalleryProps<IMediaGalleryData>, IMediaGalleryState> {\n private readonly _inlineZoomDivRef: Map<number, HTMLDivElement> = new Map();\n\n private readonly fullScreenOverlayButtonRef: React.RefObject<HTMLAnchorElement & HTMLButtonElement> = React.createRef();\n private readonly player: React.RefObject<Player> = React.createRef<Player>();\n private fallbackImage?: string;\n\n private readonly defaultGalleryImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=767&h=767&m=8', w: 0, h: 0 },\n sm: { q: 'w=600&h=600&m=8', w: 0, h: 0 },\n md: { q: 'w=600&h=772&m=8', w: 0, h: 0 },\n lg: { q: 'h=772&m=8', w: 0, h: 0 }\n },\n lazyload: true,\n cropFocalRegion: true\n };\n\n private readonly defaultThumbnailImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=100&m=8', w: 100, h: 0 },\n lg: { q: 'w=100&m=8', w: 100, h: 0 }\n },\n lazyload: true,\n cropFocalRegion: true\n };\n\n private readonly _zoomedImageSettings: IImageSettings;\n\n public constructor(props: IMediaGalleryProps<IMediaGalleryData>) {\n super(props);\n this._toggleModal = this._toggleModal.bind(this);\n const mediaGalleryImages = this.getImagesData();\n this.state = {\n activeIndex: 0,\n animating: false,\n isImageZoomed: false,\n modalIsOpen: false,\n isInitialLoad: true,\n shouldUseOptimizedImage: !!this.props.config.skipImageValidation,\n mediaGalleryItems: mediaGalleryImages\n };\n\n this._zoomedImageSettings =\n props.config.zoomedImageSettings ?? props.config.galleryImageSettings ?? this.defaultGalleryImageSettings;\n\n this._onImageMouseOut = this._onImageMouseOut.bind(this);\n this._inlineZoomImageOnHover = this._inlineZoomImageOnHover.bind(this);\n this._onInlineImageClick = this._onInlineImageClick.bind(this);\n this._onContainerZoomImageClick = this._onContainerZoomImageClick.bind(this);\n this._onMouseOutLensContainer = this._onMouseOutLensContainer.bind(this);\n }\n\n public isMobile(): boolean {\n const size = isMobile({ variant: VariantType.Viewport, context: this.props.context.request });\n return size === 'xs';\n }\n\n public async componentDidMount(): Promise<void> {\n const source = this.props.config.imageSource ?? imageSource.pageContext;\n const shouldUpdateOnPartialDimensionSelection = this.props.config.shouldUpdateOnPartialDimensionSelection;\n this._setRenderType();\n if (!this.props.context.request.app?.config?.OmniChannelMedia) {\n if (source === imageSource.pageContext) {\n if (this.state.mediaGalleryItems === undefined && this.props.data.mediaLocationsForSelectedVariant.result) {\n const images = await validateProductImages(\n this.props.data.mediaLocationsForSelectedVariant.result,\n this.props.context.actionContext,\n this.props.config.thumbnailImageSettings ?? this.defaultThumbnailImageSettings\n );\n await this._setImages(images);\n } else if (this.state.mediaGalleryItems === undefined && this.props.data.product.result) {\n const product = this.props.data.product.result;\n const images = await getValidProductImages(\n product.RecordId,\n +this.props.context.request.apiSettings.channelId,\n this.props.context.actionContext,\n this.props.config.thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\n product.productVariant\n );\n\n await this._setImages(images);\n } else {\n await this._setImages([]);\n }\n }\n }\n\n reaction(\n () => {\n const product = this.props.data.product.result;\n if (!product) {\n return null;\n }\n\n if (!shouldUpdateOnPartialDimensionSelection || !product.productVariant?.RecordId) {\n return `${product.RecordId}`;\n }\n\n return `${product.RecordId}-${product.productVariant.RecordId}`;\n },\n async () => {\n const product = this.props.data.product.result;\n let images: IImageData[] = [];\n if (product) {\n if (this.props.context.app?.config?.OmniChannelMedia) {\n images = await getProductImages(\n product.RecordId,\n this.shouldUseCmsAltText(),\n +this.props.context.request.apiSettings.channelId,\n this.props.context.actionContext,\n product.Name,\n shouldUpdateOnPartialDimensionSelection ? product.productVariant : undefined\n );\n } else {\n images = await getValidProductImages(\n product.RecordId,\n +this.props.context.request.apiSettings.channelId,\n this.props.context.actionContext,\n this.props.config.thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\n shouldUpdateOnPartialDimensionSelection ? product.productVariant : undefined\n );\n }\n await this._setImages(images);\n } else {\n await this._setImages([]);\n }\n },\n { fireImmediately: true }\n );\n\n if (source === imageSource.productId && this.props.data.mediaLocations.result) {\n const images = await validateProductImages(\n this.props.data.mediaLocations.result,\n this.props.context.actionContext,\n this.props.config.thumbnailImageSettings ?? this.defaultThumbnailImageSettings\n );\n await this._setImages(images);\n }\n }\n\n public shouldComponentUpdate(nextProps: IMediaGalleryProps<IMediaGalleryData>, nextState: IMediaGalleryState): boolean {\n if (this.state === nextState && this.props.data === nextProps.data) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element {\n const { id, config, resources } = this.props;\n\n const { className, showPaginationTooltip } = config;\n\n const isVertical: boolean = config.thumbnailsOrientation === thumbnailsOrientation.vertical;\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- || is required.\n const isFullscreenAllowed: boolean = this.isMobile() || config.allowFullScreen || false;\n const zoomViewMode: string =\n config.imageZoom === imageZoom.inline ? imageZoom.inline : config.imageZoom === imageZoom.container ? imageZoom.container : '';\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Site level config can be of any type.\n const emptyPlaceHolderImage = this.props.context.app.config?.placeholderImageName as string;\n if (this.props.data.product.result) {\n this.fallbackImage = getFallbackImageUrl(\n this.props.data.product.result.ItemId,\n this.props.context.request.apiSettings,\n this.props.context.request.app?.config?.OmniChannelMedia\n );\n }\n if (emptyPlaceHolderImage && this.fallbackImage) {\n this.fallbackImage = `${this.fallbackImage},${emptyPlaceHolderImage}`;\n }\n\n const mediaGalleryCarouselItems = this._getMediaGalleryItems(isFullscreenAllowed, zoomViewMode);\n const mediaGalleryThumbnailCarouselItems = this._getMediaGalleryThumbnailItems();\n const viewProps: IMediaGalleryViewProps = {\n ...(this.props as IMediaGalleryProps<IMediaGalleryData>),\n state: this.state,\n MediaGallery: {\n moduleProps: this.props,\n className: classnames(`ms-media-gallery ${isVertical ? 'vertical' : ''}`, className)\n },\n Modal: isFullscreenAllowed ? this.imageModalSlider(zoomViewMode) : null,\n callbackToggle: this.openModalDialog,\n callbackThumbnailClick: this._generateOnThumbnailClick,\n callbackThumbnailKeyDown: this._generateOnThumbnailKeyDown,\n CarouselProps: {\n tag: Carousel,\n className: 'ms-media-gallery__carousel',\n items: mediaGalleryCarouselItems.items,\n activeIndex: this.state.activeIndex,\n next: this.next,\n previous: this.previous,\n interval: false,\n directionTextPrev: resources.previousScreenshotFlipperText,\n directionTextNext: resources.nextScreenshotFlipperText,\n onIndicatorsClickHandler: this.goToIndex,\n showPaginationTooltip: showPaginationTooltip === true,\n indicatorAriaText: resources.ariaLabelForSlide,\n handleOnExited: this.onExited,\n handleOnExiting: this.onExiting,\n key: mediaGalleryCarouselItems.keys\n } as IComponentNodeProps<ICarouselProps>,\n Thumbnails: {\n ThumbnailsContainerProps: { className: 'ms-media-gallery__thumbnails-container' },\n SingleSlideCarouselComponentProps: {\n tag: SingleSlideCarousel,\n className: 'ms-media-gallery__thumbnails',\n vertical: isVertical,\n flipperPrevLabel: resources.previousScreenshotFlipperText,\n flipperNextLabel: resources.nextScreenshotFlipperText,\n parentId: id,\n useTabList: true,\n key: JSON.stringify(mediaGalleryThumbnailCarouselItems.keys)\n } as IComponentNodeProps<ISingleSlideCarouselProps>,\n items: mediaGalleryThumbnailCarouselItems.items\n }\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n /**\n * Zoomed out image on previous/next click.\n */\n public updateZoomedInImage(): void {\n this.setState({ isImageZoomed: false });\n }\n\n private readonly onExiting = () => {\n this.setState({ animating: true });\n };\n\n private readonly onExited = () => {\n this.setState({ animating: false });\n };\n\n /**\n * On click next in carousel.\n */\n private readonly next = (): void => {\n removeInlineZoomStyle();\n if (this.isLastItem() === undefined) {\n return;\n }\n\n const nextIndex = this.isLastItem() ? 0 : this.state.activeIndex + 1;\n this.goToIndex(nextIndex);\n\n this.updateZoomedInImage();\n };\n\n /**\n * On click previous in carousel.\n */\n private readonly previous = (): void => {\n removeInlineZoomStyle();\n const images = this.state.mediaGalleryItems;\n const nextIndex = this.isFirstItem() ? (images ? images.length - 1 : 0) : this.state.activeIndex - 1;\n this.goToIndex(nextIndex);\n this.updateZoomedInImage();\n };\n\n private readonly goToIndex = (index: number): void => {\n const { autoplay } = this.props.config;\n const currentIndex = this.state.activeIndex;\n const mediaItems = this.state.mediaGalleryItems;\n if (autoplay && mediaItems) {\n if (mediaItems[`${index}`]?.mediaTypeValue === MediaType.Video) {\n this.player.current?.play();\n } else if (mediaItems[`${currentIndex}`].mediaTypeValue === MediaType.Video) {\n this.player.current?.pause();\n }\n }\n this.setState({ activeIndex: index });\n };\n\n private _getMediaGalleryThumbnailItems(): IMediaGalleryCarouselItems<IMediaGalleryThumbnailItemViewProps> {\n const mediaGalleryItems = this.state.mediaGalleryItems;\n const thumbnailImageSettings = this.props.config.thumbnailImageSettings;\n if (thumbnailImageSettings) {\n thumbnailImageSettings.cropFocalRegion = true;\n }\n\n const hasMediaGalleryItems = ArrayExtensions.hasElements(mediaGalleryItems);\n\n if (!hasMediaGalleryItems) {\n if (this.state.lastUpdate) {\n const defaultKey = 0;\n return {\n items: [this._getEmptyThumbnailItem(thumbnailImageSettings, defaultKey, this.state.activeIndex)],\n keys: ['empty']\n };\n }\n return { items: [], keys: [] };\n }\n\n return {\n items: [\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n ...mediaGalleryItems!.map((item: IMediaData, index: number) => {\n if (item.mediaTypeValue === MediaType.Video) {\n return this.getVideoThumbNailItem(\n item,\n thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\n index,\n this.state.activeIndex\n );\n } else {\n return this._getThumbnailItem(\n item,\n thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\n index,\n this.state.activeIndex\n );\n }\n })\n ],\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n keys: [...mediaGalleryItems!.map(item => item.src)]\n };\n }\n\n private getImagesData = (): IImageData[] => {\n if (this.props.config.skipImageValidation || this.props.context.request.app?.config?.OmniChannelMedia) {\n const source = this.props.config.imageSource ?? imageSource.pageContext;\n let images: IImageData[] = [];\n let mediaLocations: MediaLocation[] = [];\n if (source === imageSource.pageContext && this.props.data.mediaLocationsForSelectedVariant.result) {\n mediaLocations = this.props.data.mediaLocationsForSelectedVariant.result;\n } else if (source === imageSource.productId && this.props.data.mediaLocations.result) {\n mediaLocations = this.props.data.mediaLocations.result;\n }\n images = mediaLocations.map(mediaLocation => {\n return {\n src: mediaLocation.Uri ?? '',\n altText: getAltText(\n this.props.context.actionContext.requestContext,\n this.shouldUseCmsAltText(),\n this.props.data.product.result?.Name,\n mediaLocation.AltText\n ),\n additionalProperties: mediaLocation.IsApplicableForChildEntities\n ? {\n isApplicableForChildEntities: 'true'\n }\n : undefined\n };\n });\n const curatedImages = this.props.config.images ?? [];\n\n return [...this._filterMasterImageFromVariant(images), ...curatedImages];\n }\n return [];\n };\n\n private _getMediaGalleryItems(isFullscreenAllowed: boolean, zoomViewMode: string): IMediaGalleryCarouselItems<React.ReactNode> {\n const mediaGalleryItems = this.state.mediaGalleryItems;\n const galleryImageSettings = this.props.config.galleryImageSettings;\n if (galleryImageSettings) {\n galleryImageSettings.cropFocalRegion = true;\n }\n\n const zoomView = isFullscreenAllowed ? 'fullscreen' : zoomViewMode;\n\n const hasMediaGalleryItems = ArrayExtensions.hasElements(mediaGalleryItems);\n\n if (!hasMediaGalleryItems) {\n if (this.state.lastUpdate) {\n return { items: [this._renderEmptyImage(galleryImageSettings)], keys: ['empty'] };\n }\n return { items: [], keys: [] };\n }\n\n return {\n items: [\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n ...mediaGalleryItems!.map((item: IMediaData, index: number) => {\n return this._renderCarouselItemImageView(\n zoomView,\n item,\n galleryImageSettings ?? this.defaultGalleryImageSettings,\n index\n );\n })\n ],\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n keys: [...mediaGalleryItems!.map(item => item.src)]\n };\n }\n\n private async _setImages(images?: IMediaData[]): Promise<void> {\n const curatedImage = this.props.config.images || [];\n const mediaToSet: IMediaData[] = this._filterMasterImageFromVariant(images);\n\n void Promise.all(\n mediaToSet.map(async mediaData => {\n if (mediaData.mediaTypeValue === MediaType.Video && mediaData.src) {\n try {\n const url = new URL(mediaData.src);\n const videoId = url.searchParams.get('CVID');\n if (videoId) {\n mediaData.videoData = await getVideoMetadataFromApi(videoId, this.props.context.actionContext);\n }\n } catch (error) {\n if (this.props.telemetry) {\n this.props.telemetry.debug('Error while fetching videoId');\n }\n }\n }\n return mediaData;\n })\n ).then(mediaData => {\n const mediaItems = mediaData.filter(element => {\n return (\n element.mediaTypeValue !== MediaType.Video ||\n (element.mediaTypeValue === MediaType.Video && element.videoData !== undefined)\n );\n });\n\n this.setState({\n mediaGalleryItems: [...mediaItems, ...curatedImage],\n activeIndex: 0,\n lastUpdate: Date.now(),\n shouldUseOptimizedImage: false\n });\n });\n\n this.setState({\n mediaGalleryItems: [...mediaToSet, ...curatedImage],\n activeIndex: 0,\n lastUpdate: Date.now(),\n shouldUseOptimizedImage: false\n });\n }\n\n private _setRenderType(): void {\n this.setState({\n isInitialLoad: false\n });\n }\n\n private _renderCarouselItemImageView(\n zoomView: string,\n media: IMediaData,\n imageSettings: IImageSettings,\n index: number,\n isInPopup: boolean = false\n ): React.ReactNode {\n if (media.mediaTypeValue === MediaType.Video) {\n if (isInPopup || zoomView !== 'fullscreen') {\n return <>{this._renderCarouselItemVideo(media, index, imageSettings)}</>;\n }\n return <>{this._renderVideoThumbnail(media, index, imageSettings)}</>;\n } else {\n if (this.isMobile()) {\n if (isInPopup) {\n return this._renderImageInContainerOnZoom(media, this._zoomedImageSettings, index);\n }\n return this._renderImageFullScreenOnZoom(media, imageSettings, index);\n }\n\n switch (zoomView) {\n case 'container': {\n return this._renderImageInContainerOnZoom(media, this._zoomedImageSettings, index);\n }\n case 'inline': {\n return this._renderImageInlineOnZoom(media, this._zoomedImageSettings, index);\n }\n case 'fullscreen': {\n return this._renderImageFullScreenOnZoom(media, imageSettings, index);\n }\n\n // No default\n }\n return <>{this._getCarouselItem(media, imageSettings, index, isInPopup)}</>;\n }\n }\n\n private _filterMasterImageFromVariant(images?: IImageData[]): IImageData[] {\n const shouldHidePrimaryImages = this.props.config.shouldHideMasterProductImagesForVariant ?? true;\n let variantImages = images ?? [];\n const isVariantProduct =\n !ObjectExtensions.isNullOrUndefined(this.props.data.product.result?.MasterProductId) ||\n !ObjectExtensions.isNullOrUndefined(this.props.data.product.result?.productVariant);\n const itemId = this.props.data.product.result?.ItemId;\n if (shouldHidePrimaryImages && isVariantProduct && itemId) {\n variantImages = variantImages.filter(item => {\n const isApplicableForChildEntities = item.additionalProperties?.isApplicableForChildEntities;\n return !isApplicableForChildEntities;\n });\n if (!ArrayExtensions.hasElements(variantImages)) {\n variantImages = images ?? [];\n }\n }\n return variantImages;\n }\n\n private readonly _renderCarouselItemVideo = (mediaData: IMediaData, index: number, imageSettings: IImageSettings): React.ReactNode => {\n const videoData = mediaData.videoData;\n if (videoData) {\n const options: IPlayerOptions = this.props.config as IPlayerOptions;\n const playerResources = this.props.resources;\n const videoMetaData: IVideoMetadata = {};\n videoMetaData.videoId = videoData.id;\n videoMetaData.title = videoData.title;\n videoMetaData.duration = videoData.playTime;\n if (videoData.thumbnail) {\n videoMetaData.posterframeUrl = videoData.thumbnail.src;\n }\n if (videoData._links?.binaryReferences) {\n videoMetaData.videoBinaryReferences = videoData._links.binaryReferences;\n }\n const videoPlayerData: IPlayerData = { options, metaData: videoMetaData };\n const attributes = {\n id: `${this.props.id}__carousel-item__${index}`\n };\n return (\n <Video className='ms-media-gallery__player' editProps={{ key: videoData, requestContext: this.props.context.request }}>\n <Player\n ref={this.player}\n playerData={videoPlayerData}\n isEditor={this.props.context.request.params.isEditor}\n playerResources={playerResources}\n {...attributes}\n />\n </Video>\n );\n }\n return this._renderEmptyImage(imageSettings);\n };\n\n private readonly _getCarouselItem = (\n image: IImageData,\n imageSettings: IImageSettings,\n index: number,\n isInPopup: boolean = false\n ): React.ReactNode => (\n <Image\n requestContext={this.props.context.actionContext.requestContext}\n className='ms-media-gallery__item'\n {...image}\n fallBackSrc={this.props.context.request.app?.config?.OmniChannelMedia ? '' : index === 0 ? this.fallbackImage : image.src}\n gridSettings={this.props.context.request.gridSettings!}\n imageSettings={imageSettings}\n loadFailureBehavior='hide'\n id={`${this.props.id}__carousel-item__${index}`}\n shouldSkipToMainImage={isInPopup}\n bypassHideOnFailure={index === 0}\n />\n );\n\n private readonly _getThumbnailItem = (\n image: IImageData,\n imageSettings: IImageSettings,\n index: number,\n modifiedActiveIndex: number\n ): IMediaGalleryThumbnailItemViewProps => {\n const classes = classnames(\n 'ms-media-gallery__thumbnail-item',\n modifiedActiveIndex === index ? 'ms-media-gallery__thumbnail-item-active' : ''\n );\n\n return {\n ThumbnailItemContainerProps: {\n tag: 'li' as NodeTag,\n className: classes,\n role: 'tab',\n tabIndex: 0,\n key: index,\n 'aria-label': image.altText,\n 'aria-selected': modifiedActiveIndex === index,\n onClick: this._generateOnThumbnailClick(index),\n onKeyDown: this._generateOnThumbnailKeyDown(index)\n },\n Picture: (\n <Image\n requestContext={this.props.context.actionContext.requestContext}\n className='ms-media-gallery__thumbnail'\n {...image}\n fallBackSrc={index === 0 ? this.fallbackImage : image.src}\n gridSettings={this.props.context.request.gridSettings!}\n imageSettings={imageSettings}\n loadFailureBehavior='hide'\n imageFallbackOptimize={this.state.shouldUseOptimizedImage}\n bypassHideOnFailure={index === 0}\n />\n )\n };\n };\n\n /**\n * Gets the video thumbnail item to display media gallery.\n * @param props - The Media gallery view props from business layer.\n * @returns Return thumbnail view props which will be used to render video.\n */\n private readonly getVideoThumbNailItem = (\n mediaData: IMediaData,\n imageSettings: IImageSettings,\n index: number,\n modifiedActiveIndex: number\n ): IMediaGalleryThumbnailItemViewProps => {\n const classes = classnames(\n 'ms-media-gallery__thumbnail-item',\n modifiedActiveIndex === index ? 'ms-media-gallery__thumbnail-item-active' : ''\n );\n\n const videoData = mediaData.videoData;\n let image: IImageData;\n if (videoData?.thumbnail) {\n image = videoData.thumbnail;\n } else {\n image = {\n src: 'empty'\n };\n }\n\n return {\n ThumbnailItemContainerProps: {\n tag: 'li' as NodeTag,\n className: classes,\n role: 'tab',\n tabIndex: 0,\n key: index,\n 'aria-label': image.altText,\n 'aria-selected': modifiedActiveIndex === index,\n onClick: this._generateOnThumbnailClick(index),\n onKeyDown: this._generateOnThumbnailKeyDown(index)\n },\n Picture: (\n <Image\n requestContext={this.props.context.actionContext.requestContext}\n className='ms-media-gallery__thumbnail'\n {...image}\n fallBackSrc={image.src}\n gridSettings={this.props.context.request.gridSettings!}\n imageSettings={imageSettings}\n loadFailureBehavior='hide'\n imageFallbackOptimize={this.state.shouldUseOptimizedImage}\n bypassHideOnFailure={index === 0}\n />\n )\n };\n };\n\n /**\n * Ref Handler.\n * @param index -Remove item click function.\n * @returns Set inline zoom.\n */\n private readonly _refHandler = (index: number) => (divRef: HTMLDivElement) => {\n this._inlineZoomDivRef.set(index, divRef);\n };\n\n private readonly _generateOnThumbnailKeyDown = (index: number) => {\n return (event: React.KeyboardEvent) => {\n if (event.which === KeyCodes.Enter || event.which === KeyCodes.Space) {\n event.preventDefault();\n\n this.goToIndex(index);\n }\n };\n };\n\n private readonly _generateOnThumbnailClick = (index: number) => {\n return (event: React.MouseEvent<HTMLLIElement>) => {\n event.preventDefault();\n\n this.goToIndex(index);\n };\n };\n\n private _renderImageInlineOnZoom(image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode {\n return (\n <div\n className={`ms-inline-zoom ${this.state.isImageZoomed ? 'zoomed' : ''}`}\n ref={this._refHandler(index)}\n data-scale={this.props.config.dataScale ?? defaultDataScale}\n >\n <Image\n requestContext={this.props.context.actionContext.requestContext}\n className='ms-media-gallery__item'\n {...image}\n fallBackSrc={index === 0 ? this.fallbackImage : image.src}\n gridSettings={this.props.context.request.gridSettings!}\n imageSettings={imageSettings}\n loadFailureBehavior='hide'\n onClick={this._onInlineImageClick}\n onMouseOver={(this.state.isImageZoomed && this._inlineZoomImageOnHover) || undefined}\n id={`${this.props.id}__carousel-item__${index}`}\n shouldSkipToMainImage\n imageFallbackOptimize={this.state.shouldUseOptimizedImage && !this.props.config.allowFullScreen}\n bypassHideOnFailure={index === 0}\n />\n <Image\n role='presentation'\n requestContext={this.props.context.actionContext.requestContext}\n className='ms-inline-zoom__zoomedImg'\n {...image}\n fallBackSrc={index === 0 ? this.fallbackImage : image.src}\n onClick={this._onImageMouseOut}\n gridSettings={this.props.context.request.gridSettings!}\n imageSettings={imageSettings}\n loadFailureBehavior='hide'\n id={`${this.props.id}__zoom__${index}`}\n onMouseMove={(this.state.isImageZoomed && inlineZoomImageOnMouseMove) || undefined}\n shouldSkipToMainImage\n imageFallbackOptimize={this.state.shouldUseOptimizedImage && !this.props.config.allowFullScreen}\n bypassHideOnFailure={index === 0}\n />\n </div>\n );\n }\n\n private _inlineZoomImageOnHover(event: React.MouseEvent<HTMLImageElement>): void {\n inlineZoomImageOnHover(event, this.props.config.dataScale ?? String(defaultDataScale));\n }\n\n private _handleMobileViewZoomedImageClick(event: React.MouseEvent<HTMLImageElement>) {\n const target = this.state.shouldUseOptimizedImage ? (event.target as HTMLImageElement) : event.currentTarget;\n const mobileZoomedInImageClassName = 'msc-mobile-zoomed-in';\n if (!this.state.isMobileImageZoomed) {\n const bounds = target.getBoundingClientRect();\n const dataScale = Number(this.props.config.dataScale ?? defaultDataScale);\n\n const positionX = event.clientX - bounds.left;\n const positionY = event.clientY - bounds.top;\n const scaledPositionX = positionX * dataScale;\n const scaledPositionY = positionY * dataScale;\n\n target.style.transform = `scale(${dataScale})`;\n target.classList.add(mobileZoomedInImageClassName);\n target.parentElement!.style.overflow = 'auto';\n target.parentElement!.scrollTo(scaledPositionX - positionX, scaledPositionY - positionY);\n this.setState({\n isMobileImageZoomed: true\n });\n } else {\n target.style.transform = '';\n target.classList.remove(mobileZoomedInImageClassName);\n target.parentElement!.style.overflow = '';\n this.setState({\n isMobileImageZoomed: false\n });\n }\n }\n\n private _onInlineImageClick(event: React.MouseEvent<HTMLImageElement>): void {\n if (window.innerWidth <= 768) {\n // $msv-breakpoint-m\n this._handleMobileViewZoomedImageClick(event);\n return;\n }\n inlineZoomInitClick(event, this.props.config.dataScale ?? String(defaultDataScale));\n this.setState({\n isImageZoomed: true\n });\n }\n\n private _onImageMouseOut(event: React.MouseEvent<HTMLImageElement, MouseEvent>): void {\n inlineZoomImageOnMouseOut(event);\n this.setState({\n isImageZoomed: false\n });\n }\n\n private _onContainerZoomImageClick(event: React.MouseEvent<HTMLImageElement>): void {\n if (window.innerWidth <= 768) {\n // $msv-breakpoint-m\n this._handleMobileViewZoomedImageClick(event);\n return;\n }\n\n onContainerZoomInit(event);\n\n this.setState({\n isImageZoomed: true\n });\n }\n\n private _onMouseOutLensContainer(event: React.MouseEvent<HTMLImageElement>): void {\n onMouseOutLensContainer(event);\n\n this.setState({\n isImageZoomed: false\n });\n }\n\n private _renderImageInContainerOnZoom(image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode {\n return (\n <div className='ms-containerZoom__container'>\n <div\n data-scale={this.props.config.dataScale ?? defaultDataScale}\n className='ms-containerZoom__zoom-lens'\n role='presentation'\n onMouseOut={this._onMouseOutLensContainer}\n onClick={this._onMouseOutLensContainer}\n onMouseMove={(this.state.isImageZoomed && onMouseMoveLensContainer) || undefined}\n />\n <Image\n requestContext={this.props.context.actionContext.requestContext}\n className='ms-media-gallery__item'\n {...image}\n fallBackSrc={index === 0 ? this.fallbackImage : image.src}\n gridSettings={this.props.context.request.gridSettings!}\n onClick={this._onContainerZoomImageClick}\n imageSettings={imageSettings}\n loadFailureBehavior='hide'\n onMouseOver={(this.state.isImageZoomed && onMouseOverImageContainer) || undefined}\n id={`${this.props.id}__carousel-item__${index}`}\n shouldSkipToMainImage\n imageFallbackOptimize={this.state.shouldUseOptimizedImage && !this.props.config.allowFullScreen}\n bypassHideOnFailure={index === 0}\n />\n </div>\n );\n }\n\n private _renderImageFullScreenOnZoom(image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode {\n return (\n <div className='ms-fullscreen-section'>\n <Image\n requestContext={this.props.context.actionContext.requestContext}\n className='ms-media-gallery__item'\n {...image}\n fallBackSrc={index === 0 ? this.fallbackImage : image.src}\n gridSettings={this.props.context.request.gridSettings!}\n imageSettings={imageSettings}\n loadFailureBehavior='hide'\n imageFallbackOptimize={this.state.shouldUseOptimizedImage}\n bypassHideOnFailure={index === 0}\n />\n <div className='ms-fullscreen-section__overlay'>\n {}\n <a\n href='javascript:void(0);'\n title={this.props.resources.fullScreenTitleText}\n role='button'\n ref={this.fullScreenOverlayButtonRef}\n onClick={this.openModalDialog}\n className='ms-fullscreen-section__magnifying-glass-icon'\n />\n </div>\n </div>\n );\n }\n\n /**\n * Render the video thumbnail in full screen.\n * @param mediaData - Media Data.\n * @param index - Index\n * @param imageSettings - Image settings.\n * @returns - JSX.Element\n */\n private readonly _renderVideoThumbnail = (mediaData: IMediaData, index: number, imageSettings: IImageSettings): React.ReactNode => {\n const videoData = mediaData.videoData;\n let image: IImageData;\n if (videoData?.thumbnail) {\n image = videoData.thumbnail;\n } else {\n image = {\n src: 'empty'\n };\n }\n\n return (\n <div className='ms-fullscreen-section'>\n <Image\n requestContext={this.props.context.actionContext.requestContext}\n className='ms-fullscreen-section__video'\n {...image}\n fallBackSrc={image.src}\n gridSettings={this.props.context.request.gridSettings!}\n imageSettings={imageSettings}\n loadFailureBehavior='hide'\n imageFallbackOptimize={this.state.shouldUseOptimizedImage}\n bypassHideOnFailure={index === 0}\n />\n <div className='ms-fullscreen-section__video-overlay'>\n {}\n <button\n title={this.props.resources.fullScreenTitleText}\n role='button'\n ref={this.fullScreenOverlayButtonRef}\n onClick={this.openModalDialog}\n className='ms-fullscreen-section__video-play-icon'\n />\n </div>\n </div>\n );\n };\n\n private _mapProductToImageData(product: SimpleProduct): IImageData {\n return {\n src: product.PrimaryImageUrl ?? ''\n };\n }\n\n private _renderEmptyImage(imageSettings: IImageSettings | undefined): React.ReactNode {\n return (\n <div className='ms-media-gallery__item'>\n <Image\n requestContext={this.props.context.actionContext.requestContext}\n className='ms-media-gallery__item__image'\n src='empty'\n gridSettings={this.props.context.request.gridSettings!}\n imageSettings={imageSettings ?? this.defaultGalleryImageSettings}\n loadFailureBehavior='empty'\n />\n </div>\n );\n }\n\n private _getEmptyThumbnailItem(\n imageSettings: IImageSettings | undefined,\n index: number,\n modifiedActiveIndex: number\n ): IMediaGalleryThumbnailItemViewProps {\n const classes = classnames(\n 'ms-media-gallery__thumbnail-item',\n modifiedActiveIndex === index ? 'ms-media-gallery__thumbnail-item-active' : ''\n );\n return {\n ThumbnailItemContainerProps: {\n tag: 'li' as NodeTag,\n className: classes,\n role: 'tab',\n tabIndex: 0,\n key: 'empty',\n 'aria-label': '',\n 'aria-selected': modifiedActiveIndex === index,\n onClick: this._generateOnThumbnailClick(index),\n onKeyDown: this._generateOnThumbnailKeyDown(index)\n },\n Picture: (\n <Image\n requestContext={this.props.context.actionContext.requestContext}\n className='ms-media-gallery__thumbnail-item__image'\n src='empty'\n gridSettings={this.props.context.request.gridSettings!}\n imageSettings={imageSettings ?? this.defaultThumbnailImageSettings}\n loadFailureBehavior='empty'\n />\n )\n };\n }\n\n private readonly isFirstItem = () => this.state.activeIndex === 0;\n\n private readonly isLastItem = () => {\n const images = this.state.mediaGalleryItems;\n return images && this.state.activeIndex === images.length - 1;\n };\n\n private readonly openModalDialog = (): void => {\n this._toggleModal();\n };\n\n private _toggleModal(): void {\n if (this.state.modalIsOpen) {\n this.fullScreenOverlayButtonRef.current?.focus();\n const parentDiv = this._inlineZoomDivRef.get(this.state.activeIndex);\n if (parentDiv && parentDiv.children && parentDiv.children.length >= 2) {\n const image = parentDiv.children[1].querySelector('img');\n if (image) {\n image.removeAttribute('style');\n }\n }\n this.setState({\n isImageZoomed: false\n });\n }\n this.setState({\n isImageZoomed: false,\n modalIsOpen: !this.state.modalIsOpen\n });\n removeInlineZoomStyle();\n removeContainerZoomStyle();\n }\n\n private readonly imageModalSlider = (ZoomView: string): React.ReactElement => {\n const {\n data: {\n product: { result: product }\n },\n resources\n } = this.props;\n let mediaGalleryItems = this.state.mediaGalleryItems;\n\n if (!mediaGalleryItems && product) {\n mediaGalleryItems = [this._mapProductToImageData(product)];\n }\n const carouselprops = {\n tag: Carousel,\n className: 'ms-media-gallery__carousel',\n items:\n mediaGalleryItems &&\n mediaGalleryItems.map((item: IImageData, index: number) =>\n this._renderCarouselItemImageView(ZoomView, item, this._zoomedImageSettings, index, true)\n ),\n activeIndex: this.state.activeIndex,\n next: this.next,\n previous: this.previous,\n interval: false,\n directionTextPrev: resources.previousScreenshotFlipperText,\n directionTextNext: resources.nextScreenshotFlipperText,\n onIndicatorsClickHandler: this.goToIndex,\n showPaginationTooltip: true,\n hideIndicator: false,\n keyboard: false,\n handleOnExited: this.onExited,\n handleOnExiting: this.onExiting,\n isDisabledFunctionality: this.state.isMobileImageZoomed\n } as IComponentNodeProps<ICarouselProps>;\n const carousel = <Carousel {...carouselprops} />;\n\n const imageModalSliderProps: IModalViewProps = {\n modalIsOpen: this.state.modalIsOpen,\n ontoggle: this._toggleModal,\n galleryCarousel: carousel,\n classNames: classnames('ms-media-gallery__modal', 'msc-modal-input-required')\n };\n return ImagefullView(imageModalSliderProps) as React.ReactElement;\n };\n\n private shouldUseCmsAltText = (): boolean => {\n if (this.props.config.altTextSource === 'product') {\n return false;\n } else {\n return true;\n }\n };\n}\n\nexport default MediaGallery;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IMediaGalleryThumbnailItemViewProps, IMediaGalleryThumbnailsViewProps, IMediaGalleryViewProps } from '../..';\n\nconst MediaGalleryView: React.FC<IMediaGalleryViewProps> = props => {\n const { CarouselProps, Thumbnails, MediaGallery, Modal } = props;\n\n return (\n <Module {...MediaGallery}>\n <Node {...CarouselProps} />\n {Modal}\n {_renderThumbnails(Thumbnails)}\n </Module>\n );\n};\n\nconst _renderThumbnails = (thumbnails: IMediaGalleryThumbnailsViewProps): JSX.Element => {\n const { ThumbnailsContainerProps, SingleSlideCarouselComponentProps, items } = thumbnails;\n\n return (\n <Node {...ThumbnailsContainerProps}>\n <Node {...SingleSlideCarouselComponentProps}>{items && items.map(_renderThumbnailItem)}</Node>\n </Node>\n );\n};\n\nconst _renderThumbnailItem = (thumbnail: IMediaGalleryThumbnailItemViewProps): JSX.Element => {\n const { ThumbnailItemContainerProps, Picture } = thumbnail;\n\n return <Node {...ThumbnailItemContainerProps}>{Picture}</Node>;\n};\n\nexport default MediaGalleryView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IImageData, IRequestContext, IVideoData } from '@msdyn365-commerce/core';\n\nexport enum MediaType {\n /**\n * The None.\n */\n None = 0,\n /**\n * The Image type.\n */\n Image = 1,\n /**\n * The video type.\n */\n Video = 2,\n /**\n * The file type.\n */\n File = 3\n}\n\nexport interface IMediaData extends IImageData {\n mediaTypeValue?: MediaType;\n displayOrder?: number;\n videoData?: IVideoData;\n}\n\n/**\n * Gets correct alt text for image based on configuration of site.\n * @param productName Product name.\n * @param context Current request context.\n * @param imageAltText Alt-text from CMS image.\n */\nexport function getAltText(\n context: IRequestContext,\n shouldUseCmsAltText: boolean,\n productName?: string,\n imageAltText?: string\n): string | undefined {\n if (!context?.app?.config?.OmniChannelMedia) {\n return productName;\n }\n if (shouldUseCmsAltText) {\n return imageAltText;\n }\n return productName;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n commerceApiRequest,\n commerceVideoMetadataRequest,\n getCatalogId,\n IActionContext,\n IImageData,\n IImageSettings,\n IVideoData\n} from '@msdyn365-commerce/core';\nimport { MediaLocation, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport {\n ArrayExtensions,\n getMediaLocationsForSelectedVariant,\n MediaLocationsForSelectedVariantInput\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { getAltText } from './helper';\n\nasync function validateMediaLocationAsync(mediaLocation: MediaLocation): Promise<[IImageData, boolean]> {\n const imageData: IImageData = {\n src: mediaLocation.Uri || '',\n altText: mediaLocation.AltText || ''\n };\n if (mediaLocation.IsApplicableForChildEntities) {\n imageData.additionalProperties = { isApplicableForChildEntities: 'true' };\n }\n\n if (imageData.src === '') {\n return [imageData, false];\n }\n\n return new Promise<[IImageData, boolean]>(resolve => {\n try {\n const http = new XMLHttpRequest();\n http.open('HEAD', imageData.src!, true);\n\n http.addEventListener('load', () => {\n resolve([imageData, http.status === 200 || http.status === 201]);\n });\n\n http.addEventListener('error', () => {\n resolve([imageData, false]);\n });\n\n http.send();\n } catch {\n resolve([imageData, false]);\n }\n });\n}\n\nexport async function getValidProductImages(\n productId: number,\n channelId: number,\n actionContext: IActionContext,\n imageSettings: IImageSettings,\n selectedProduct?: SimpleProduct\n): Promise<IImageData[]> {\n const catalogId = getCatalogId(actionContext.requestContext);\n const actionInput = new MediaLocationsForSelectedVariantInput(productId, channelId, selectedProduct, catalogId);\n\n return getMediaLocationsForSelectedVariant(actionInput, actionContext)\n .then(mediaLocations => {\n if (mediaLocations) {\n return Promise.all(mediaLocations.map(mediaLocation => validateMediaLocationAsync(mediaLocation))).then(pairs => {\n return pairs.filter(pair => pair[1]).map(pair => pair[0]);\n });\n }\n\n return [];\n })\n .catch(error => {\n actionContext.telemetry.exception(error);\n actionContext.telemetry.debug('Unable to get Media Locations for Selected Variant');\n return [];\n });\n}\n\n/**\n * Gets product variant images on dimension change of buy-box module for Omni scenario.\n * @param productId Product record id.\n * @param shouldUseCmsAltText Alt-text source to use.\n * @param channelId Current channel id.\n * @param actionContext Current action context.\n * @param productName Product name.\n * @param selectedProduct Currently selected variant product.\n * @returns List of images.\n */\n\nexport async function getProductImages(\n productId: number,\n shouldUseCmsAltText: boolean,\n channelId: number,\n actionContext: IActionContext,\n productName?: string,\n selectedProduct?: SimpleProduct\n): Promise<IImageData[]> {\n const catalogId = getCatalogId(actionContext.requestContext);\n if (actionContext.requestContext?.params?.isPreview) {\n const response = await commerceApiRequest(actionContext.requestContext, 'msdyn365-ochannel-product-info', 'post', {\n productId: productId,\n channelId: channelId,\n catalogId: catalogId\n });\n if (response.status !== 200) {\n actionContext.telemetry.debug('Unable to get Media Locations for Selected Variant for preview scenario');\n return [];\n }\n const previewImageData = response?.data as MediaLocation[];\n if (previewImageData) {\n return previewImageData.map(mediaLocation => {\n return {\n src: mediaLocation.Uri ?? '',\n altText: getAltText(actionContext.requestContext, shouldUseCmsAltText, productName, mediaLocation.AltText),\n displayOrder: mediaLocation.DisplayOrder,\n mediaTypeValue: mediaLocation.MediaTypeValue,\n additionalProperties: mediaLocation.IsApplicableForChildEntities\n ? {\n isApplicableForChildEntities: 'true'\n }\n : undefined\n };\n });\n }\n return [];\n }\n const actionInput = new MediaLocationsForSelectedVariantInput(productId, channelId, selectedProduct, catalogId);\n return getMediaLocationsForSelectedVariant(actionInput, actionContext)\n .then(mediaLocations => {\n if (mediaLocations) {\n return mediaLocations.map(mediaLocation => {\n return {\n src: mediaLocation.Uri ?? '',\n altText: getAltText(actionContext.requestContext, shouldUseCmsAltText, productName, mediaLocation.AltText),\n displayOrder: mediaLocation.DisplayOrder,\n mediaTypeValue: mediaLocation.MediaTypeValue,\n additionalProperties: mediaLocation.IsApplicableForChildEntities\n ? {\n isApplicableForChildEntities: 'true'\n }\n : undefined\n };\n });\n }\n return [];\n })\n .catch(error => {\n actionContext.telemetry.exception(error);\n actionContext.telemetry.debug('Unable to get Media Locations for Selected Variant');\n return [];\n });\n}\n\nexport async function validateProductImages(\n mediaLocations: MediaLocation[],\n actionContext: IActionContext,\n imageSettings: IImageSettings\n): Promise<IImageData[]> {\n return Promise.all(mediaLocations.map(mediaLocation => validateMediaLocationAsync(mediaLocation)))\n .then(pairs => {\n return pairs.filter(pair => pair[1]).map(pair => pair[0]);\n })\n .catch(error => {\n actionContext.telemetry.exception(error);\n actionContext.telemetry.debug('Unable to validate product images');\n return [];\n });\n}\n\n/**\n * GetVideoMetadataFromAPI - Makes API call to get video metadata.\n * @param videoId: Video Id\n * @param actionContext: Action context\n * @returns: Returns the meta data of the video.\n */\nexport async function getVideoMetadataFromApi(videoId: string, actionContext: IActionContext): Promise<IVideoData | undefined> {\n let videoPlayerData: IVideoData | undefined;\n if (videoId) {\n const response = await commerceVideoMetadataRequest(actionContext.requestContext, [videoId]);\n\n if (response.status !== 200) {\n actionContext.telemetry.debug(`Unable to get video metadata for videoId: ${videoId}`);\n return;\n }\n\n const videoData = response.data as [];\n if (videoData && ArrayExtensions.hasElements(videoData)) {\n videoPlayerData = videoData[0];\n }\n }\n return videoPlayerData;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { AddOrderTemplateToCartComponent, ILinesAddedToCartDialogResources } from '@msdyn365-commerce/components';\nimport { getUrlSync, ICoreContext, IImageSettings, Image, ITelemetry } from '@msdyn365-commerce/core';\nimport { ProductList, SimpleProduct } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport {\n getFallbackImageUrl,\n getProductUrlSync,\n OrderTemplate,\n OrderTemplateLine,\n StringExtensions\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { Alert, Button, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IOrderTemplateActionMessageState } from '../order-template-list';\n\nexport interface ISingleOrderTemplateProps extends ProductList {\n orderTemplateState: IOrderTemplateActionMessageState;\n name?: string;\n orderTemplate: OrderTemplate;\n context: ICoreContext;\n imageSettings?: IImageSettings;\n enableImageProductLink?: boolean;\n removeFromOrderTemplateListText: string;\n addToBagText: string;\n index: number;\n itemKey: string;\n telemetry: ITelemetry;\n moduleId: string;\n moduleTypeName: string;\n handlers: {\n onRemoveOrderTemplate(id: string): void | undefined;\n onDismiss(): void;\n };\n resources: {\n closeWindowButtonText: string;\n addToCartFailureMessage: string;\n addToCartSuccessMessage: string;\n addToCartProcessMessage: string;\n orderTemplateErrorMessage: string;\n linesAddedToCartDialogResources: ILinesAddedToCartDialogResources;\n };\n telemetryContent?: ITelemetryContent;\n isMultipleCatalogFeatureEnabledInHq?: boolean;\n}\n\nexport interface ISingleOrderTemplateViewProps {\n key: string;\n orderTemplateImage: React.ReactNode;\n addToCartButton?: React.ReactNode;\n removeButton?: React.ReactNode;\n orderTemplateStatusMessage?: React.ReactNode;\n orderTemplateName?: React.ReactNode;\n orderTemplateAriaLabel?: string;\n orderTemplateHeaderDivider?: React.ReactNode;\n}\n\nconst _removeItemFromOrderTemplateList = (props: ISingleOrderTemplateProps): void => {\n const { onRemoveOrderTemplate } = props.handlers;\n const { itemKey } = props;\n\n onRemoveOrderTemplate && itemKey && onRemoveOrderTemplate(itemKey);\n};\n\nconst OrderTemplateActions = {\n removeOrderTemplate: _removeItemFromOrderTemplateList\n};\n\n/**\n * Remove order template action.\n * @param input -Single order template props.\n * @returns Set remove order template.\n */\nconst removeOrderTemplateActionHandler = (input: ISingleOrderTemplateProps) => () => {\n OrderTemplateActions.removeOrderTemplate(input);\n};\n\nexport const OrderTemplateRender = (input: ISingleOrderTemplateProps): ISingleOrderTemplateViewProps | null => {\n const {\n Id,\n orderTemplate,\n removeFromOrderTemplateListText,\n orderTemplateState,\n handlers,\n name,\n imageSettings,\n context,\n telemetryContent,\n enableImageProductLink\n } = input;\n\n if (!Id) {\n return null;\n }\n\n const _getOrderTemplatePageUrl = (): string => {\n const url = getUrlSync('ordertemplate', context.actionContext) ?? '';\n const separator = url.includes('?') ? '&' : '?';\n if (Id) {\n return `${url}${separator}id=${Id}`;\n }\n return '';\n };\n\n const { onDismiss } = handlers;\n\n return {\n key: `${Id}-template`,\n orderTemplateImage: _renderOrderTemplateImages(context, orderTemplate.orderTemplateLines, imageSettings, enableImageProductLink),\n orderTemplateAriaLabel: _renderAriaLabel(input),\n orderTemplateName: (\n <div>\n <div className='ms-order-template__list-item-title'>\n <a href={_getOrderTemplatePageUrl()} aria-label={name}>\n {name}\n </a>\n </div>\n <div className='ms-order-template__line-count'>\n {orderTemplate.totalLines}\n {` `}\n line items\n </div>\n <hr color='#F9F9F9' />\n </div>\n ),\n addToCartButton: (\n <div className='ms-order-template__add-to-bag-button-div'>\n <AddOrderTemplateToCartComponent\n id={Id}\n context={context}\n typeName={input.moduleTypeName}\n data={{\n orderTemplate: input.orderTemplate\n }}\n className='ms-order-template__add-to-bag-button'\n addToCartText={input.addToBagText}\n dialogStrings={input.resources}\n telemetryContent={telemetryContent}\n isMultipleCatalogFeatureEnabledInHq={input.isMultipleCatalogFeatureEnabledInHq}\n />\n </div>\n ),\n removeButton: (\n <Button\n className='ms-order-template__remove-list'\n aria-label={removeFromOrderTemplateListText}\n onClick={removeOrderTemplateActionHandler(input)}\n />\n ),\n orderTemplateStatusMessage: orderTemplateState && orderTemplateState.isOpen && orderTemplateState.userMessage && (\n <div className='ms-orderTemplate__status'>\n <Alert color={orderTemplateState.statusCssString} isOpen={orderTemplateState.isOpen} toggle={onDismiss}>\n <span>{orderTemplateState.userMessage}</span>\n </Alert>\n </div>\n )\n };\n};\n\n/**\n * On image click handler.\n * @param productUrl -Product url value.\n * @returns Assign window location.\n */\nconst onClickHandler = (productUrl: string) => () => {\n window.location.assign(productUrl);\n};\n\nconst _renderOrderTemplateImages = (\n context: ICoreContext,\n orderTemplateLines?: OrderTemplateLine[],\n imageSettings?: IImageSettings,\n enableImageProductLink?: boolean\n): JSX.Element | null => {\n const defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=140&h=140&m=6', w: 0, h: 0 },\n lg: { q: 'w=140&h=140&m=6', w: 0, h: 0 },\n xl: { q: 'w=140&h=140&m=6', w: 0, h: 0 }\n },\n lazyload: true\n };\n\n if (orderTemplateLines) {\n const count = orderTemplateLines.length < 4 ? orderTemplateLines.length : 4;\n\n return (\n <div className='ms-order-template__image-container'>\n {orderTemplateLines?.slice(0, count).map(line => {\n const productUrl = line.fullProduct\n ? _updateProductUrlCatalog(line.fullProduct.ProductDetails, context, line?.productListLine?.CatalogId)\n : '';\n\n return (\n <Image\n altText={line.fullProduct?.ProductDetails.Name ?? 'image'}\n requestContext={context.actionContext.requestContext}\n key={line.fullProduct?.ProductDetails.Name}\n src={line.fullProduct?.ProductDetails.PrimaryImageUrl ?? ''}\n fallBackSrc={\n getFallbackImageUrl(\n line.fullProduct?.ProductDetails.ItemId,\n context.actionContext.requestContext.apiSettings,\n context.request.app?.config?.OmniChannelMedia\n ) ?? ''\n }\n gridSettings={context.request.gridSettings!}\n imageSettings={imageSettings ?? defaultImageSettings}\n loadFailureBehavior='empty'\n onClick={enableImageProductLink && onClickHandler(productUrl)}\n className={enableImageProductLink ? 'product-link' : ''}\n />\n );\n })}\n </div>\n );\n }\n return <div className='ms-order-template__image-container' />;\n};\n\n// This method is used to update the product url with the catalogId\nconst _updateProductUrlCatalog = (productDetails: SimpleProduct, context: ICoreContext, catalogId: number | undefined): string => {\n const productUrl = getProductUrlSync(productDetails, context.actionContext, undefined);\n if (!StringExtensions.isNullOrWhitespace(productUrl) && catalogId !== undefined) {\n const fullUrl = new URL(productUrl, window.location.href);\n fullUrl.searchParams.set('catalogid', `${catalogId ?? 0}`);\n return fullUrl.href;\n }\n return productUrl;\n};\n\nconst _renderAriaLabel = (props: ISingleOrderTemplateProps): string => {\n const { name } = props;\n return `${name}`;\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { orderTemplateListStatus } from '../order-template-list';\n\nexport interface IOrderTemplateListStatusMessageProps {\n className?: string;\n errorType: orderTemplateListStatus;\n text?: string;\n}\n\nexport const OrderTemplateListStatusMessage: React.FC<IOrderTemplateListStatusMessageProps> = ({ className, errorType, text }) => {\n switch (errorType) {\n case 'EMPTY':\n return <p className={classnames('ms-orderTemplateList__message-empty', className)}>{text}</p>;\n case 'FAILED':\n return <p className={classnames('ms-orderTemplateList__message-failed', className)}>{text}</p>;\n case 'LOADING':\n default:\n return <p className='ms-orderTemplateList__message-waiting'>{text}</p>;\n }\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IOrderTemplateNameDialogResources, OrderTemplateNameDialog } from '@msdyn365-commerce/components';\nimport { IComponentProps } from '@msdyn365-commerce/core';\nimport React, { useState } from 'react';\n\nconst modalCloseButtonReference: React.RefObject<HTMLButtonElement> = React.createRef();\n\n/**\n * The Create Order Template Button Props.\n */\nexport interface ICreateOrderTemplateButtonProps extends IComponentProps {\n /**\n * The label for create order template.\n */\n createOrderTemplateText: string;\n\n /**\n * The create order template dialog resources.\n */\n createOrderTemplateDialogResources: IOrderTemplateNameDialogResources;\n\n /**\n * The delegate to fire when dialog captured any user entry.\n */\n onOrderTemplateCreated(): Promise<void>;\n}\n\nconst CreateOrderTemplateButton: React.FC<ICreateOrderTemplateButtonProps> = props => {\n const onCancelHandler = React.useCallback(() => {\n return;\n }, []);\n const [isCreateOrderTemplateDialogOpen, setOrderTemplateNameDialogOpen] = useState(false);\n const onCreateButtonClick = React.useCallback(() => {\n setOrderTemplateNameDialogOpen(true);\n }, []);\n\n return (\n <>\n <button\n className='ms-order-template__add-template-button msc-btn btn-primary'\n color='primary'\n onClick={onCreateButtonClick}\n ref={modalCloseButtonReference}\n aria-label={props.createOrderTemplateText}\n >\n {props.createOrderTemplateText}\n </button>\n <OrderTemplateNameDialog\n className='msc-order-template-name-dialog'\n modalOpen={isCreateOrderTemplateDialogOpen}\n isUpdateDialog={false}\n setModalOpen={setOrderTemplateNameDialogOpen}\n context={props.context}\n id={props.id}\n data={{}}\n typeName={props.typeName}\n dialogStrings={props.createOrderTemplateDialogResources}\n onCancel={onCancelHandler}\n onSuccess={props.onOrderTemplateCreated}\n parentElementRef={modalCloseButtonReference}\n />\n </>\n );\n};\n\nexport default CreateOrderTemplateButton;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IOrderTemplateNameDialogResources } from '@msdyn365-commerce/components';\nimport { deleteAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductListsDataActions.g';\nimport { OrderTemplate } from '@msdyn365-commerce-modules/retail-actions';\nimport { Alert, Heading, IModuleProps, INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport Spinner from '../order-template/components/add-line/spinner';\nimport {\n ISingleOrderTemplateProps,\n ISingleOrderTemplateViewProps,\n OrderTemplateListStatusMessage,\n OrderTemplateRender\n} from './components';\nimport CreateNewTemplateButtonComponent from './components/create-order-template';\nimport { IOrderTemplateListData } from './order-template-list.data';\nimport { HeadingTag, IOrderTemplateListProps, IOrderTemplateListResources } from './order-template-list.props.autogenerated';\n\nexport interface IOrderTemplateActionMessageState {\n itemKey: string;\n userMessage: string;\n statusCssString: string;\n messageGlyph: string;\n isOpen: boolean;\n headerStatusMessage: string;\n}\n\nexport type orderTemplateListStatus = 'LOADING' | 'SUCCESS' | 'FAILED' | 'EMPTY';\n\nexport interface IOrderTemplateListViewProps extends IOrderTemplateListProps<IOrderTemplateListData> {\n OrderTemplateList: IModuleProps;\n status?: orderTemplateListStatus;\n statusMessage?: React.ReactNode;\n heading?: React.ReactNode;\n OrderTemplates?: INodeProps;\n OrderTemplate?: INodeProps;\n orderTemplates?: ISingleOrderTemplateViewProps[];\n createOrderTemplateButton?: React.ReactNode;\n templateHeaderStatusMessage?: React.ReactNode;\n}\n\n/**\n *\n * OrderTemplateList component.\n * @extends {React.PureComponent<IOrderTemplateListProps<IOrderTemplateListData>, IOrderTemplateListActionMessageState>}\n */\n@observer\nclass OrderTemplateList extends React.Component<IOrderTemplateListProps<IOrderTemplateListData>, IOrderTemplateActionMessageState> {\n constructor(props: IOrderTemplateListProps<IOrderTemplateListData>) {\n super(props);\n this.state = {\n itemKey: '',\n userMessage: '',\n headerStatusMessage: '',\n statusCssString: 'success',\n messageGlyph: 'fas fa-check',\n isOpen: false\n };\n }\n\n public async componentDidMount(): Promise<void> {\n this.setState({});\n }\n\n public shouldComponentUpdate(\n nextProps: IOrderTemplateListProps<IOrderTemplateListData>,\n nextState: IOrderTemplateActionMessageState\n ): boolean {\n if (this.state === nextState && this.props.data === nextProps.data) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element | null {\n const { className, heading } = this.props.config;\n const { emptyOrderTemplateText, createNewTemplateButtonText } = this.props.resources;\n const { orderTemplates } = this.props.data;\n const orderTemplatesData = orderTemplates && orderTemplates.result;\n const orderTemplateListHeading = heading?.text ?? this.props.resources.orderTemplateListTitle;\n\n if (orderTemplates.status === 'LOADING') {\n const errorProps: IOrderTemplateListViewProps = {\n ...(this.props as IOrderTemplateListProps<IOrderTemplateListData>),\n OrderTemplateList: {\n moduleProps: this.props,\n className: classnames('ms-order-template', className)\n },\n status: 'LOADING',\n statusMessage: <Spinner className='ms-order-template' msg={this.props.resources.progressNotificationText} />,\n heading: (\n <Heading className='ms-order-template__heading' tag={heading?.tag ?? HeadingTag.h2} text={orderTemplateListHeading} />\n )\n };\n return this.props.renderView(errorProps);\n }\n\n if (orderTemplatesData && orderTemplatesData.length === 0) {\n // When no order templates are found for customer\n const emptyViewProps: IOrderTemplateListViewProps = {\n ...(this.props as IOrderTemplateListProps<IOrderTemplateListData>),\n OrderTemplateList: {\n moduleProps: this.props,\n className: classnames('ms-order-template', className)\n },\n status: 'EMPTY',\n statusMessage: <OrderTemplateListStatusMessage errorType='EMPTY' text={emptyOrderTemplateText} />,\n createOrderTemplateButton: (\n <CreateNewTemplateButtonComponent\n context={this.props.context}\n id={this.props.id}\n typeName={this.props.typeName}\n data={{}}\n createOrderTemplateText={createNewTemplateButtonText}\n onOrderTemplateCreated={this._reloadPage}\n createOrderTemplateDialogResources={this._generateOrderTemplateNameDialogResources(this.props.resources)}\n />\n ),\n heading: (\n <Heading className='ms-order-template__heading' tag={heading?.tag ?? HeadingTag.h2} text={orderTemplateListHeading} />\n )\n };\n\n return this.props.renderView(emptyViewProps);\n }\n\n const viewProps: IOrderTemplateListViewProps = {\n ...(this.props as IOrderTemplateListProps<IOrderTemplateListData>),\n OrderTemplateList: {\n moduleProps: this.props,\n className: classnames('ms-order-template', className)\n },\n status: 'SUCCESS',\n heading: <Heading className='ms-order-template__heading' tag={heading?.tag ?? HeadingTag.h2} text={orderTemplateListHeading} />,\n createOrderTemplateButton: (\n <CreateNewTemplateButtonComponent\n context={this.props.context}\n id={this.props.id}\n typeName={this.props.typeName}\n data={{}}\n createOrderTemplateText={createNewTemplateButtonText}\n onOrderTemplateCreated={this._reloadPage}\n createOrderTemplateDialogResources={this._generateOrderTemplateNameDialogResources(this.props.resources)}\n />\n ),\n templateHeaderStatusMessage: this.state.isOpen && this.state.headerStatusMessage && (\n <div className='ms-order-template__products-status'>\n <Alert color={this.state.statusCssString} isOpen={this.state.isOpen} toggle={this._onDismiss}>\n <span>{this.state.headerStatusMessage}</span>\n </Alert>\n </div>\n ),\n OrderTemplates: {\n className: 'ms-order-template__list-item',\n tag: 'ul'\n },\n OrderTemplate: {\n className: 'ms-order-template__tile',\n tag: 'li'\n },\n orderTemplates: orderTemplatesData && this._renderOrderTemplateList(orderTemplatesData)\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n private _generateOrderTemplateNameDialogResources(resources: IOrderTemplateListResources): IOrderTemplateNameDialogResources {\n return {\n orderTemplateHeaderLabel: resources.createOrderTemplateHeader,\n orderTemplateTitleLabel: resources.orderTemplateTitle,\n orderTemplateNameAriaLabel: resources.orderTemplateNameAriaLabel,\n orderTemplateDescription: resources.createOrderTemplateDescription,\n\n defaultOrderTemplateName: resources.defaultOrderTemplateName,\n\n orderTemplateButtonLabel: resources.createOrderTemplateButtonText,\n orderTemplateCancelButtonLabel: resources.cancelNewOrderTemplateCreationButtonText\n };\n }\n\n private readonly _isChannelMultipleCatalogsFeatureEnabled = (): boolean => {\n let isMultipleCatalogFeatureEnabledInHq = false;\n if (this.props.data.featureState) {\n isMultipleCatalogFeatureEnabledInHq =\n this.props.data.featureState.result?.find(\n feature => feature.Name === 'Dynamics.AX.Application.ChannelMultipleCatalogsFeature'\n )?.IsEnabled || false;\n }\n return isMultipleCatalogFeatureEnabledInHq;\n };\n\n private _renderOrderTemplateList(orderTemplates: OrderTemplate[]): ISingleOrderTemplateViewProps[] {\n const { context, telemetry } = this.props;\n const { imageSettings, enableImageProductLink } = this.props.config;\n return orderTemplates.map((orderTemplate: OrderTemplate, index) => {\n const currentTemplateProps: ISingleOrderTemplateProps = {\n orderTemplateState: this.state,\n Id: orderTemplate.productList.Id,\n name: orderTemplate.productList.Name,\n orderTemplate,\n context,\n imageSettings,\n enableImageProductLink,\n removeFromOrderTemplateListText: 'remove',\n addToBagText: this.props.resources.addToBagButtonText,\n index,\n itemKey: orderTemplate.productList.Id,\n telemetry,\n moduleId: this.props.id,\n moduleTypeName: this.props.typeName,\n handlers: {\n onRemoveOrderTemplate: this._onRemoveFromOrderTemplateList,\n onDismiss: this._onDismiss\n },\n resources: {\n closeWindowButtonText: this.props.resources.closeWindowButtonText,\n addToCartFailureMessage: this.props.resources.addToCartFailureMessage,\n addToCartSuccessMessage: this.props.resources.addToCartSuccessMessage,\n addToCartProcessMessage: this.props.resources.addToCartProcessMessage,\n orderTemplateErrorMessage: this.props.resources.orderTemplateErrorMessage,\n linesAddedToCartDialogResources: {\n viewCartButtonText: this.props.resources.viewCartButtonText,\n orderTemplateCloseButtonText: this.props.resources.orderTemplateCloseButtonText,\n linesAddedToCartHeaderItemsOneText: this.props.resources.linesAddedToCartHeaderItemsOneText,\n linesAddedToCartHeaderLinesOneText: this.props.resources.linesAddedToCartHeaderLinesOneText,\n linesAddedToCartHeaderLinesFormatText: this.props.resources.linesAddedToCartHeaderLinesFormatText,\n linesAddedToCartHeaderMessageText: this.props.resources.linesAddedToCartHeaderMessageText\n }\n },\n isMultipleCatalogFeatureEnabledInHq: this._isChannelMultipleCatalogsFeatureEnabled()\n };\n\n return OrderTemplateRender(currentTemplateProps)!;\n });\n }\n\n private readonly _onDismiss = () => {\n this.setState({\n isOpen: false\n });\n };\n\n private readonly _reloadPage = async () => {\n window.location.reload();\n };\n\n private readonly _onRemoveFromOrderTemplateList = (productListId: string): void | undefined => {\n const { context, data, telemetry, resources } = this.props;\n const { orderTemplates } = data;\n\n if (context && context.actionContext) {\n const userToken = context.request.user.isAuthenticated && context.request.user.token;\n if (userToken && orderTemplates.result && orderTemplates.result[0] && productListId) {\n const orderTemplate = orderTemplates.result.find(p => p.productList.Id === productListId);\n if (orderTemplate) {\n deleteAsync({ callerContext: context.actionContext }, orderTemplate.productList)\n .then()\n .catch((error: string) => {\n telemetry.warning('[order-template-list] Unable to delete order template.');\n telemetry.error(error);\n this.setState({\n itemKey: productListId,\n headerStatusMessage: resources.deleteOrderTemplateFailedText,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n })\n .then(this._reloadPage)\n .catch((error: string) => {\n telemetry.warning('[order-template-list] Unable to delete order template.');\n telemetry.error(error);\n });\n } else {\n telemetry.warning('[order-template-list] Failed to delete order template. Order template was not found');\n }\n } else {\n telemetry.warning('[order-template-list] Failed to delete order template.');\n }\n }\n };\n}\n\nexport default OrderTemplateList;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { INodeProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISingleOrderTemplateViewProps } from './components';\nimport { IOrderTemplateListViewProps } from './order-template-list';\n\nexport const OrderTemplateListView: React.FC<IOrderTemplateListViewProps> = props => {\n const {\n OrderTemplateList,\n status,\n statusMessage,\n heading,\n OrderTemplates,\n orderTemplates,\n OrderTemplate,\n createOrderTemplateButton,\n templateHeaderStatusMessage\n } = props;\n\n return (\n <Module {...OrderTemplateList}>\n {heading}\n {status !== 'SUCCESS' && statusMessage}\n <Node className=''>\n {createOrderTemplateButton}\n {templateHeaderStatusMessage}\n </Node>\n {OrderTemplates && orderTemplates && orderTemplates.length > 0 && (\n <Node {...OrderTemplates}>\n {orderTemplates &&\n orderTemplates.map(orderTemplate => {\n return _renderOrderTemplate(orderTemplate, OrderTemplate);\n })}\n </Node>\n )}\n </Module>\n );\n};\n\nconst _renderOrderTemplate = (orderTemplate: ISingleOrderTemplateViewProps, OrderTemplate?: INodeProps): JSX.Element | null => {\n const { key, addToCartButton, orderTemplateImage, orderTemplateStatusMessage, removeButton, orderTemplateName } = orderTemplate;\n return (\n <Node key={key} className={OrderTemplate!.className} {...OrderTemplate}>\n {orderTemplateName}\n {orderTemplateImage}\n {addToCartButton}\n {removeButton}\n {orderTemplateStatusMessage}\n </Node>\n );\n};\n\nexport default OrderTemplateListView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\nexport default (props: { className: string; msg?: string }) => (\n <>\n <div className={`${props.className}__loading__icon`} />\n {props?.msg && <div className={`${props.className}__loading__msg`}>{props?.msg}</div>}\n </>\n);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ProductDimensionFull } from '@msdyn365-commerce/commerce-entities';\nimport { getCatalogId, ICoreContext, IImageSettings } from '@msdyn365-commerce/core';\nimport { ProductListLine, ProductSearchCriteria, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\nimport { searchByCriteriaAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\nimport { ProductCatalog, SimpleProduct } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport {\n addItemToOrderTemplate,\n AddItemToOrderTemplateInput,\n ArrayExtensions,\n getDimensionsForSelectedVariant,\n GetDimensionsForSelectedVariantInput,\n getSelectedVariant,\n SelectedVariantInput,\n validateCatalogId\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { Modal, ModalBody, ModalHeader, getPayloadObject, ITelemetryContent, onTelemetryClick } from '@msdyn365-commerce-modules/utilities';\nimport { get } from 'lodash';\nimport { computed } from 'mobx';\nimport React from 'react';\n\nimport { IProductConfigurationState, NotFoundComponent, ProductConfiguration, ProductList } from '.';\nimport Spinner from './spinner';\n\nexport interface IAddLineToTemplateProps {\n context: ICoreContext;\n resources: IAddLineToTemplateResources;\n orderTemplateId: string;\n imageSettings?: IImageSettings;\n isMultipleCatalogFeatureEnabledInHq: boolean;\n catalogs?: ProductCatalog[] | undefined;\n telemetryContent?: ITelemetryContent;\n}\n\nexport interface IAddLineToTemplateResources {\n addLineModalLinkText: string;\n searchButtonAriaLabel: string;\n searchInputAriaLabel: string;\n searchModalPlaceholderText: string;\n selectCatalogTitleText: string;\n selectProductButtonText: string;\n addItemToTemplateText: string;\n addLineProductUnitPricePrefix: string;\n backButtonText: string;\n decrementButtonAriaLabel: string;\n incrementButtonAriaLabel: string;\n quantitySelectLabel: string;\n addLineProductUnitOfMeasurePrefix: string;\n notFoundSearchErrorNotice: string;\n notFoundSearchErrorRedediation: string;\n searchErrorMessage: string;\n productDimensionTypeColor: string;\n productDimensionTypeConfiguration: string;\n productDimensionTypeSize: string;\n productDimensionTypeStyle: string;\n searchResultsCountVerbage: string;\n searchResultsCountSubject: string;\n addToTemplateConfirmation: string;\n totalPriceLabel: string;\n progressNotificationText: string;\n addToTemplateDuplicateError: string;\n addToTemplateGenericError: string;\n dimensionMissingError: string;\n backToResultsText?: string;\n}\n\nenum CONTENT {\n Search,\n ProductList,\n ProductConfiguration,\n NotFound,\n Error,\n Loading\n}\n\ninterface IAddLineToTemplateState {\n isOpen: boolean;\n query: string;\n products: ProductSearchResult[];\n productCatalogs: ProductCatalog[] | null;\n content: number;\n selectedProduct: SimpleProduct | null;\n selectedCatalogId: number | undefined;\n selectedProductDimensions?: ProductDimensionFull[];\n selectedQuantity?: number;\n reloadPage?: boolean;\n}\n\n/**\n * Add Lines to order template.\n */\nexport class AddLineToTemplate extends React.Component<IAddLineToTemplateProps, IAddLineToTemplateState> {\n public state: IAddLineToTemplateState = {\n isOpen: false,\n query: '',\n products: [],\n productCatalogs: [],\n content: CONTENT.Search,\n selectedProduct: null,\n selectedCatalogId: 0\n };\n\n public defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=64&h=64&m=6', w: 0, h: 0 },\n lg: { q: 'w=64&h=64&m=6', w: 0, h: 0 },\n xl: { q: 'w=64&h=64&m=6', w: 0, h: 0 }\n },\n lazyload: true\n };\n\n public searchTextInput: React.RefObject<HTMLInputElement> = React.createRef(); // @TODO public/private\n\n private readonly addLineButtonRef: React.RefObject<HTMLButtonElement> = React.createRef<HTMLButtonElement>();\n\n constructor(props: IAddLineToTemplateProps) {\n super(props);\n }\n\n public onComponentDidMount(): void {\n this.searchTextInput.current?.focus();\n }\n\n public componentDidMount(): void {\n this._getCatalogs();\n }\n\n public onComponentDidUpdate(): void {\n this.searchTextInput.current?.focus();\n }\n\n @computed get showBackArrow(): boolean {\n return this.state.content === CONTENT.ProductConfiguration;\n }\n\n public shouldComponentUpdate(nextProps: IAddLineToTemplateProps, nextState: IAddLineToTemplateState): 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 {\n resources: { addLineModalLinkText, backToResultsText }\n } = this.props;\n\n const modalProps = {\n ...this.props,\n className: 'msc-add-line-to-template',\n toggle: this._toggleModalHandler,\n isOpen: this.state.isOpen,\n ariaLabel: addLineModalLinkText\n };\n\n return (\n <>\n <Modal {...modalProps}>\n <ModalHeader toggle={this._toggleModalHandler}>\n {this.showBackArrow && (\n <button\n type='button'\n className='msc-modal__back-button'\n aria-label={backToResultsText}\n onClick={this._onBackButtonClickHandler}\n />\n )}\n {addLineModalLinkText}\n </ModalHeader>\n {this._renderContent()}\n </Modal>\n <button\n type='button'\n className='msc-add-line-to-template__button msc-btn'\n aria-label={addLineModalLinkText}\n onClick={this._toggleModalHandler}\n ref={this.addLineButtonRef}\n >\n <span />\n {addLineModalLinkText}\n </button>\n </>\n );\n }\n\n private readonly _renderSearchForm = () => {\n const {\n resources: { searchButtonAriaLabel, searchModalPlaceholderText, selectCatalogTitleText }\n } = this.props;\n\n return (\n <form\n className='msc-add-line-to-template__search-form'\n aria-label={searchButtonAriaLabel}\n name='add-line-to-template-search-form'\n role='form'\n autoComplete='off'\n onSubmit={this._onSearchSubmit}\n >\n {this.state.productCatalogs && ArrayExtensions.hasElements(this.state.productCatalogs) && (\n <>\n <label className={`msc-add-line-to-template__catalogs_title`} htmlFor={`msc-add-line-to-template__catalogs_select`}>\n {selectCatalogTitleText}\n </label>\n <select\n id=' msc-add-line-to-template__catalogs_select'\n className='msc-form-control msc-dropdown__select msc-add-line-to-template__catalogs_select'\n onChange={this._onCatalogSelectionChange}\n >\n {this._getCatalogNodes()}\n </select>\n </>\n )}\n <div className='msc-form-control msc-add-line-to-template__search-input-container'>\n <input\n type='text'\n autoFocus\n aria-label={searchModalPlaceholderText}\n className='msc-form-control msc-add-line-to-template__search-input'\n placeholder={searchModalPlaceholderText}\n value={this.state.query}\n onChange={this._onInputChange}\n ref={this.searchTextInput}\n maxLength={200}\n />\n <button className='msc-add-line-to-template__search-button' aria-label={searchButtonAriaLabel} color='primary' />\n </div>\n </form>\n );\n };\n\n private readonly _onSearchSubmit = (event: React.FormEvent): void => {\n event.preventDefault();\n\n const query = get(this, 'searchTextInput.current.value', null);\n\n if (!query) {\n return;\n }\n\n this.setState({\n content: CONTENT.Loading\n });\n\n this._getSearchResults(query)\n .then(result => {\n if (result.length === 0) {\n this.setState({\n products: result,\n content: CONTENT.NotFound\n });\n } else {\n this.setState({\n products: result,\n content: CONTENT.ProductList\n });\n }\n })\n .catch(error => {\n this.setState({\n content: CONTENT.Error\n });\n });\n };\n\n private readonly _onQuantityChangeHandler = (event: React.ChangeEvent<HTMLInputElement>) => {\n this.setState({\n selectedQuantity: +event.target.value\n });\n };\n\n private readonly _onSelectItem = async (product: ProductSearchResult): Promise<ProductDimensionFull[]> => {\n const {\n actionContext,\n request: {\n apiSettings: { channelId }\n }\n } = this.props.context;\n const varianteInput = new SelectedVariantInput(product.RecordId, channelId, [], undefined, this.props.context.request);\n const productVariant = await getSelectedVariant(varianteInput, actionContext);\n\n if (!productVariant) {\n this.props.context.telemetry.error('Error retrieving product variant');\n return Promise.resolve([]);\n }\n\n const dimensions = await this._getProductDimensions(product as SimpleProduct);\n\n this.setState({\n selectedProductDimensions: dimensions,\n content: CONTENT.ProductConfiguration,\n selectedProduct: productVariant\n });\n\n return dimensions;\n };\n\n private readonly _onInputChange = (event: React.ChangeEvent<HTMLInputElement>): void => {\n this.setState({\n query: event.target.value\n });\n };\n\n private readonly _onBackButtonClickHandler = (): void => {\n this.setState({\n content: CONTENT.ProductList\n });\n };\n\n private readonly _highlightSearchTerm = (name: string) => {\n const parsedName = name && unescape(name.replace(new RegExp(this.state.query, 'i'), '<span>$&</span>'));\n\n return (\n <div\n className='msc-add-line-to-template__product__name'\n /* eslint-disable-next-line react/no-danger -- Implementation is a copy.*/\n dangerouslySetInnerHTML={{ __html: parsedName || '' }}\n />\n );\n };\n\n private readonly _resultCountText = (): string => {\n return this.props.resources.searchResultsCountVerbage\n .replace('{count}', this.state.products.length.toString())\n .replace('{subject}', `${this.props.resources.searchResultsCountSubject}${this.state.products.length > 1 ? 's' : ''}`);\n };\n\n private _renderContent(): React.ReactNode | null {\n switch (this.state.content) {\n case CONTENT.ProductConfiguration:\n const { selectedProduct, selectedProductDimensions } = this.state;\n const viewProps = {\n ...this.props,\n imageSettings: this.props.imageSettings || this.defaultImageSettings,\n product: selectedProduct!,\n dimensions: selectedProductDimensions!,\n addToTemplateHandler: this._addItemToTemplateHandler,\n onQuantityChangeHandler: this._onQuantityChangeHandler,\n highlightSearchTerm: this._highlightSearchTerm,\n searchForm: this._renderSearchForm()\n };\n\n return <ProductConfiguration {...viewProps} />;\n\n case CONTENT.ProductList:\n const productProps = {\n ...this.props,\n imageSettings: this.props.imageSettings || this.defaultImageSettings,\n clickHandler: this._onSelectItem,\n products: this.state.products,\n highlightSearchTerm: this._highlightSearchTerm,\n searchForm: this._renderSearchForm(),\n renderResultCountText: this._resultCountText\n };\n\n return (\n <ModalBody>\n <ProductList {...productProps} />\n </ModalBody>\n );\n\n case CONTENT.Loading:\n return (\n <ModalBody>\n {this._renderSearchForm()}\n <Spinner className='msc-add-line-to-template' msg={this.props.resources.progressNotificationText} />\n </ModalBody>\n );\n\n case CONTENT.NotFound:\n const { notFoundSearchErrorNotice, notFoundSearchErrorRedediation } = this.props.resources;\n\n return (\n <ModalBody>\n <p className='msc-add-line-to-template__search-result-count'>{this._resultCountText()}</p>\n {this._renderSearchForm()}\n <NotFoundComponent error={notFoundSearchErrorNotice} msg={notFoundSearchErrorRedediation} />\n </ModalBody>\n );\n\n case CONTENT.Error:\n return (\n <ModalBody>\n {this._renderSearchForm()}\n <div className='msc-alert-danger' aria-live='assertive'>\n {this.props.resources.searchErrorMessage}\n </div>\n </ModalBody>\n );\n\n default:\n return <ModalBody>{this._renderSearchForm()}</ModalBody>;\n }\n }\n\n private readonly _addItemToTemplateHandler = async (config: IProductConfigurationState): Promise<ProductListLine> => {\n const {\n orderTemplateId,\n context: { actionContext },\n isMultipleCatalogFeatureEnabledInHq\n } = this.props;\n const catalogId = this.state.selectedCatalogId;\n const input = isMultipleCatalogFeatureEnabledInHq\n ? new AddItemToOrderTemplateInput(\n orderTemplateId,\n config.product.RecordId,\n config.quantity,\n config.product.DefaultUnitOfMeasure || 'ea',\n isMultipleCatalogFeatureEnabledInHq,\n catalogId\n )\n : new AddItemToOrderTemplateInput(\n orderTemplateId,\n config.product.RecordId,\n config.quantity,\n config.product.DefaultUnitOfMeasure || 'ea'\n );\n const result = await addItemToOrderTemplate(input, actionContext);\n this.setState({\n isOpen: false,\n reloadPage: true\n });\n // reload when closing\n window.location.reload();\n return result;\n };\n\n /**\n *\n * Get all active product catalogs.\n */\n private _getCatalogs(): void {\n const { isMultipleCatalogFeatureEnabledInHq, catalogs } = this.props;\n\n // if Channel Multiple Catalogs Feature is enabled then show all catalogs.\n const productCatalogs = isMultipleCatalogFeatureEnabledInHq && catalogs ? catalogs : [];\n\n // get the current catalog id.\n const catalogId = getCatalogId(this.props.context.request);\n validateCatalogId(catalogId);\n // set the current catalog id as a default selected catalog id from the url\n this.setState({\n productCatalogs: productCatalogs,\n selectedCatalogId: catalogId\n });\n }\n\n private _getCatalogNodes(): JSX.Element[] | null {\n const { productCatalogs, selectedCatalogId } = this.state;\n if (productCatalogs && ArrayExtensions.hasElements(productCatalogs)) {\n return productCatalogs.map((productCatalog: ProductCatalog) => {\n // initially select default catalog in dropdown\n const isSelected = productCatalog.RecordId === selectedCatalogId;\n return (\n <option value={productCatalog.RecordId} key={productCatalog.RecordId} selected={isSelected} aria-selected={isSelected}>\n {productCatalog.Name}\n </option>\n );\n });\n }\n return [];\n }\n\n private readonly _onCatalogSelectionChange = (event: React.ChangeEvent<HTMLSelectElement>) => {\n this.setState({\n selectedCatalogId: Number.parseInt(event.target.value, 10)\n });\n };\n\n private _getSearchResults(searchText: string): Promise<ProductSearchResult[]> {\n const {\n context: {\n actionContext,\n request: {\n apiSettings: { channelId }\n }\n }\n } = this.props;\n const { selectedCatalogId } = this.state;\n const searchCriteriaInput: ProductSearchCriteria = {};\n\n searchCriteriaInput.Context = {\n ChannelId: channelId,\n CatalogId: selectedCatalogId\n };\n\n if (process.env.NODE_ENV === 'development' && process.env.ENABLE_CLOUD_SEARCH?.toLowerCase() !== 'true') {\n searchCriteriaInput.IncludeAttributes = false;\n } else {\n searchCriteriaInput.IncludeAttributes = true;\n }\n searchCriteriaInput.SearchCondition = searchText;\n\n return searchByCriteriaAsync({ callerContext: actionContext }, searchCriteriaInput);\n }\n\n private async _getProductDimensions(product: SimpleProduct): Promise<ProductDimensionFull[]> {\n const {\n context: {\n actionContext,\n request: {\n apiSettings: { channelId }\n }\n }\n } = this.props;\n const id = product.MasterProductId ? product.MasterProductId : product.RecordId;\n\n return getDimensionsForSelectedVariant(\n new GetDimensionsForSelectedVariantInput(id, channelId, [], this.props.context.request),\n actionContext\n );\n }\n\n private readonly _toggleModalHandler = () => {\n if (this.state.isOpen) {\n const payLoad = getPayloadObject('click', this.props.telemetryContent!, 'add-item-to-template', '');\n onTelemetryClick(this.props.telemetryContent!, payLoad, 'add-item-to-template');\n this._getCatalogs();\n this.addLineButtonRef.current!.focus();\n }\n\n this.setState({\n isOpen: !this.state.isOpen,\n content: CONTENT.Search\n });\n\n if (this.state.reloadPage) {\n window.location.reload();\n this.setState({\n reloadPage: false\n });\n }\n };\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\ninterface IDropdownState {\n /**\n * @friendlyName selectedIndex\n * @description Selected index.\n */\n selectedIndex: string;\n}\n\nexport interface IDropdownProps {\n dropdownId: number;\n dropdownName: string;\n dropdownList: IDropdownItemProps[];\n telemetryContent?: ITelemetryContent;\n onChange?(selection: IDropdownOnSelection): void;\n}\n\nexport interface IDropdownItemProps {\n value: string;\n id: number;\n}\n\nexport interface IDropdownOnSelection {\n dropdownId: number;\n selectId: string;\n selectedValue: string;\n}\n\n/**\n *\n * DropDown component.\n * @extends {React.PureComponent<IDropdownProps, IDropdownState>}\n */\nexport class Dropdown extends React.PureComponent<IDropdownProps, IDropdownState> {\n private readonly selectMenu: React.RefObject<HTMLSelectElement> = React.createRef<HTMLSelectElement>();\n\n constructor(props: IDropdownProps, state: IDropdownState) {\n super(props);\n this.state = {\n selectedIndex: ''\n };\n }\n\n public componentDidMount(): void {\n if (this.selectMenu.current) {\n this.selectMenu.current.selectedIndex = 0;\n }\n }\n\n public render(): JSX.Element {\n const { dropdownId, dropdownList, dropdownName } = this.props;\n\n return (\n <select\n id={`msc-dropdown__entry-${dropdownId}`}\n ref={this.selectMenu}\n aria-label={dropdownName}\n className='msc-dropdown__select'\n onChange={this._onChanged}\n >\n {dropdownList.map(\n (item: IDropdownItemProps) =>\n item && (\n <option\n value={item.id}\n key={item.id}\n selected={+this.state.selectedIndex === +item.id}\n aria-selected={+this.state.selectedIndex === +item.id}\n >\n {item.value}\n </option>\n )\n )}\n </select>\n );\n }\n\n private readonly _onChanged = (event: React.ChangeEvent<HTMLSelectElement>): void => {\n this.setState({ selectedIndex: event.target.value });\n\n if (this.props.onChange) {\n this.props.onChange({\n dropdownId: this.props.dropdownId,\n selectId: event.target.value,\n selectedValue: event.target.innerText\n });\n }\n };\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\nexport const NotFoundComponent = (props: { error: string; msg: string }) => (\n <>\n <div className='msc-add-line-to-template__not-found__icon' />\n <div className='msc-add-line-to-template__not-found__msg'>{props.error}</div>\n <div className='msc-add-line-to-template__not-found__remediation-instructions'>{props.msg}</div>\n </>\n);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { debounce } from 'lodash';\nimport { reaction } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\ninterface IQuantityProps {\n min?: number;\n max: number;\n currentCount?: number;\n disabled?: boolean;\n incrementGlyphClass?: string;\n decrementGlyphClass?: string;\n decrementButtonAriaLabel?: string;\n incrementButtonAriaLabel?: string;\n inputQuantityAriaLabel?: string;\n id?: string;\n onChange?(newValue: number): void;\n}\n\ninterface IQuantityState {\n currentInput: number;\n}\n\n/**\n * Quantity Component - This component is used to add or remove quantity.\n */\n@observer\nexport default class OrderTemplateQuantity extends React.PureComponent<IQuantityProps, IQuantityState> {\n public static defaultProps: Partial<IQuantityProps> = {\n min: 1,\n decrementGlyphClass: 'fas fa-minus',\n incrementGlyphClass: 'fas fa-plus'\n };\n\n private readonly inputRef: React.RefObject<HTMLInputElement> = React.createRef<HTMLInputElement>();\n\n constructor(props: IQuantityProps) {\n super(props);\n this.state = { currentInput: props.currentCount || 1 };\n this._handleChange = this._handleChange.bind(this);\n\n reaction(\n () => this.props.currentCount,\n () => {\n this.setState({ currentInput: this.props.currentCount || 1 });\n }\n );\n }\n\n public render(): JSX.Element {\n const glyphMinusClassName: string = `${this.props.decrementGlyphClass!} quantity__controls-glyph`;\n const glyphPlusClassName: string = `${this.props.incrementGlyphClass!} quantity__controls-glyph`;\n const disabled = this.props.currentCount === this.props.min;\n const incDisabled = this.props.currentCount === this.props.max;\n const currentValue = this.state.currentInput;\n let extraClass = '';\n if (disabled) {\n // The quantity has reached its boundaries (max or min)\n extraClass = 'disabled';\n } else if (this.props.disabled) {\n // This.props.disabled shows if the state is not succeded yet\n extraClass = 'transition';\n }\n const getChangeHandler = (amount: number) => () => {\n this._onIncrementalChange(amount);\n };\n\n return (\n <div className='quantity' /* Id={this.props.id}*/>\n <button\n disabled={this.props.disabled || disabled}\n title={disabled ? '' : this.props.decrementButtonAriaLabel}\n className={`decrement quantity__controls ${extraClass}`}\n onClick={getChangeHandler(-1)}\n aria-hidden\n aria-label={`${this.props.decrementButtonAriaLabel}`}\n tabIndex={-1}\n color='secondary'\n >\n <span className={glyphMinusClassName} />\n </button>\n <input\n type='number'\n className='quantity-input'\n pattern='[0-9]*'\n value={currentValue}\n onChange={this._handleChange}\n onBlur={this._validateMin}\n aria-live='polite'\n aria-label={`${this.props.inputQuantityAriaLabel}`}\n role='spinbutton'\n aria-valuemin={1}\n aria-valuemax={this.props.max}\n aria-valuenow={currentValue}\n ref={this.inputRef}\n disabled={this.props.disabled}\n />\n <button\n disabled={this.props.disabled || incDisabled}\n title={incDisabled ? '' : this.props.incrementButtonAriaLabel}\n className={`increment quantity__controls ${incDisabled ? 'disabled' : ''}`}\n onClick={getChangeHandler(1)}\n aria-hidden\n aria-label={`${this.props.incrementButtonAriaLabel}`}\n tabIndex={-1}\n color='secondary'\n >\n <span className={glyphPlusClassName} />\n </button>\n </div>\n );\n }\n\n private _onIncrementalChange(amount: number): void {\n const updatedQuantity = this.state.currentInput + amount;\n\n if (updatedQuantity >= 1 && updatedQuantity <= this.props.max) {\n this.props.onChange && this.props.onChange(updatedQuantity);\n }\n }\n\n private _handleChange(e: React.ChangeEvent<HTMLInputElement>): void {\n const currentValue = Number.parseInt(e.target.value, 10);\n const minValue = this.props.min === undefined ? 1 : this.props.min;\n const inputElement =\n this.inputRef && this.inputRef.current && this.inputRef.current instanceof HTMLInputElement && this.inputRef.current;\n\n if (currentValue > this.props.max) {\n this.setState({ currentInput: this.props.max });\n } else {\n this.setState({ currentInput: currentValue }, () => {\n debounce(() => {\n if (!isNaN(this.state.currentInput) && !(this.state.currentInput < minValue) && inputElement) {\n inputElement.setAttribute('aria-valuenow', currentValue.toString());\n inputElement.setAttribute('value', currentValue.toString());\n }\n }, 200)();\n });\n }\n }\n\n private readonly _validateMin = (): void => {\n const minValue = this.props.min === undefined ? 1 : this.props.min;\n\n if (isNaN(this.state.currentInput) || this.state.currentInput < minValue) {\n this.props.onChange && this.props.onChange(minValue);\n } else {\n this.props.onChange && this.props.onChange(this.state.currentInput);\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 { ProductDimensionFull } from '@msdyn365-commerce/commerce-entities';\nimport { IImageSettings, Image } from '@msdyn365-commerce/core';\nimport { ProductDimensionValue, ProductListLine } from '@msdyn365-commerce/retail-proxy';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport {\n getDimensionsForSelectedVariant,\n GetDimensionsForSelectedVariantInput,\n getFallbackImageUrl,\n getPriceForSelectedVariant,\n getProductAvailabilitiesForSelectedVariant,\n getSelectedVariant,\n IProductInventoryInformation,\n PriceForSelectedVariantInput,\n ProductAvailabilitiesForSelectedVariantInput,\n SelectedVariantInput\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { Alert, Button, ITelemetryContent, ModalBody, ModalFooter } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport React from 'react';\n\nimport OrderTemplateQuantity from '../common/order-template-quantity';\nimport { Dropdown, IAddLineToTemplateProps, IAddLineToTemplateResources, IDropdownItemProps, IDropdownOnSelection } from '.';\n\nexport interface IProductCnnfigurationProps extends IAddLineToTemplateProps {\n product: SimpleProduct;\n dimensions: ProductDimensionFull[];\n imageSettings: IImageSettings;\n telemetryContent?: ITelemetryContent;\n searchForm: React.ReactNode;\n addToTemplateHandler(params: IProductConfigurationState): Promise<ProductListLine>;\n highlightSearchTerm(name: string): React.ReactNode;\n}\n\nexport interface IProductConfigurationState {\n quantity: number;\n unitPrice: number;\n totalPrice: number;\n product: SimpleProduct;\n dimensions: ProductDimensionFull[];\n selectedDimensions: {};\n productAvailableQuantity?: IProductInventoryInformation;\n buttonDisabled: boolean;\n showAddConfirmation: boolean;\n errorMessage?: string;\n isBusy: boolean;\n errors: { dimension?: string[]; add?: string };\n}\n\n/**\n * Configure selected product for addition to order template.\n */\nexport class ProductConfiguration extends React.Component<IProductCnnfigurationProps, IProductConfigurationState> {\n private selectedDimensions: {} = {};\n\n constructor(props: IProductCnnfigurationProps) {\n super(props);\n\n this.state = {\n quantity: 1,\n unitPrice: props.product.Price,\n totalPrice: props.product.Price,\n product: props.product,\n dimensions: props.dimensions.sort((a, b) => a.DimensionTypeValue - b.DimensionTypeValue),\n selectedDimensions: {},\n buttonDisabled: false,\n showAddConfirmation: false\n } as IProductConfigurationState;\n }\n\n public shouldComponentUpdate(nextProps: IProductCnnfigurationProps, nextState: IProductConfigurationState): 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 {\n context: {\n actionContext: {\n requestContext: { apiSettings }\n },\n request: { gridSettings }\n },\n resources: {\n addItemToTemplateText,\n addLineProductUnitPricePrefix,\n decrementButtonAriaLabel,\n incrementButtonAriaLabel,\n quantitySelectLabel,\n addLineProductUnitOfMeasurePrefix,\n totalPriceLabel\n },\n imageSettings,\n highlightSearchTerm\n } = this.props;\n const { buttonDisabled, product, quantity, unitPrice, totalPrice, showAddConfirmation, errors } = this.state;\n const isMultipleCatalogSelect = this.props.isMultipleCatalogFeatureEnabledInHq ? 'isMultipleCatalogSelect' : '';\n return (\n <>\n <ModalBody>\n {this.props.searchForm}\n <div className='msc-add-line-to-template__product-config'>\n <div className='msc-add-line-to-template__product__positioning-container-2'>\n <div className='msc-add-line-to-template__product__positioning-container-1'>\n <Image\n altText={product.Name ?? 'image'}\n requestContext={this.props.context.actionContext.requestContext}\n src={product?.PrimaryImageUrl ?? ''}\n fallBackSrc={\n getFallbackImageUrl(\n product?.ItemId,\n apiSettings,\n this.props.context.request.app?.config?.OmniChannelMedia\n ) ?? ''\n }\n className='thumbnail'\n imageSettings={imageSettings}\n gridSettings={gridSettings!}\n loadFailureBehavior='empty'\n />\n <div className='msc-add-line-to-template__product__attributes'>\n <div className='msc-add-line-to-template__product__id'>{product?.ItemId}</div>\n {highlightSearchTerm(product?.Name ?? '')}\n <div className='msc-add-line-to-template__product__unit-price'>\n {addLineProductUnitPricePrefix}\n {` `}\n {this._formatPrice(unitPrice)}\n </div>\n <div className='msc-add-line-to-template__product__uom'>\n {addLineProductUnitOfMeasurePrefix}\n {` `}\n {product?.DefaultUnitOfMeasure}\n </div>\n </div>\n </div>\n <div className='msc-add-line-to-template__product-config__dimensions'>{this._getDimensionsNodes()}</div>\n </div>\n <div className='quantity-container'>\n <div>{quantitySelectLabel}</div>\n <OrderTemplateQuantity\n id='msc-add-line-to-template__product-config__quantity'\n currentCount={quantity}\n onChange={this._onQuantityChange}\n inputQuantityAriaLabel='Press to increment quantity by 1'\n max={10_000_000}\n decrementButtonAriaLabel={decrementButtonAriaLabel}\n incrementButtonAriaLabel={incrementButtonAriaLabel}\n />\n </div>\n </div>\n <div className={`msc-add-line-to-template__product__total-price ${isMultipleCatalogSelect}`}>\n {totalPriceLabel}\n {` `}\n {this._formatPrice(totalPrice)}\n </div>\n </ModalBody>\n <ModalFooter>\n {showAddConfirmation && (\n <div\n className='msc-add-line-to-template__add-success msc-alert-success msc-alert'\n aria-live='assertive'\n role='alert'\n >\n <span aria-hidden='true' />\n {this._getConfirmationMessage()}\n </div>\n )}\n {errors?.add && (\n <div className='msc-add-line-to-template__add-error msc-alert-danger msc-alert'>\n <span className='msi-exclamation-triangle' aria-hidden='true' />\n {errors.add}\n </div>\n )}\n <Button\n className={classnames('msc-add-line-to-template__add-configured-product-button', { 'is-busy': this.state.isBusy })}\n aria-label={addItemToTemplateText}\n onClick={this._addToTemplateHandler}\n disabled={buttonDisabled}\n >\n {addItemToTemplateText}\n </Button>\n </ModalFooter>\n </>\n );\n }\n\n private _getConfirmationMessage(): string {\n const selectedDimensionNames = this.state.dimensions\n .map(dimension => {\n let variant = dimension.DimensionValues?.find(\n value => value.RecordId === this.selectedDimensions[dimension.DimensionTypeValue]\n )?.Value;\n if (dimension.DimensionTypeValue === 3) {\n variant = `size ${variant}`;\n }\n return variant;\n })\n .filter(value => value);\n\n return this.props.resources.addToTemplateConfirmation\n .replace('{count}', this.state.quantity.toString())\n .replace('{productAndDimensions}', `${this.state.product.Name}, ${Object.values(selectedDimensionNames).join(', ')}`);\n }\n\n private _getDimensionsNodes(): React.ReactElement[] {\n const { dimensions } = this.state;\n const { resources } = this.props;\n\n return dimensions?.map((dimension: ProductDimensionFull) => {\n const { DimensionValues, DimensionTypeValue } = dimension;\n const mapDimensions = (value: ProductDimensionValue): IDropdownItemProps => ({\n id: value.RecordId,\n value: value.Value || ''\n });\n const dimensionName = this._getDropdownName(DimensionTypeValue, resources);\n const dropdownList: IDropdownItemProps[] = DimensionValues ? DimensionValues.map<IDropdownItemProps>(mapDimensions) : [];\n dropdownList.unshift({ id: 0, value: `Choose a ${dimensionName}` });\n\n return (\n <div key={DimensionTypeValue}>\n <div>{dimensionName}</div>\n {this.state.errors?.dimension?.includes(DimensionTypeValue.toString()) && (\n <Alert color='danger' assertive aria-label={this._getDimensionsError(dimensionName)}>\n <div className='msc-alert__header' aria-hidden='true'>\n <span className='msi-exclamation-triangle' />\n <span>{this._getDimensionsError(dimensionName)}</span>\n </div>\n </Alert>\n )}\n <Dropdown\n dropdownId={DimensionTypeValue}\n dropdownName={this._getDropdownName(DimensionTypeValue, resources)}\n dropdownList={dropdownList}\n onChange={this._onDimensionChanged}\n />\n </div>\n );\n });\n }\n\n private readonly _getDimensionsError = (dimensionName: string) =>\n this.props.resources.dimensionMissingError.replace(/{dimensionName}/g, dimensionName);\n\n private readonly _addToTemplateHandler = async (event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\n // Hide confirmation of previous addition when adding multiple items\n this.setState({\n isBusy: true,\n showAddConfirmation: false,\n errors: { ...this.state.errors, add: undefined }\n });\n\n const missingDimensions = this.state.dimensions\n .map(dimension => dimension.DimensionTypeValue.toString())\n .filter(type => !this.selectedDimensions[type]);\n\n this.setState({\n errors: { dimension: missingDimensions }\n });\n if (missingDimensions.length > 0) {\n this.setState({\n isBusy: false\n });\n return;\n }\n\n this.props\n .addToTemplateHandler({ ...this.state })\n .then(status => {\n // Validate against the existance of a ProductListId\n if (status.ProductListId) {\n this.setState({\n isBusy: false,\n showAddConfirmation: true\n });\n }\n })\n .catch(error => {\n const { addToTemplateDuplicateError, addToTemplateGenericError } = this.props.resources;\n let errorMessage;\n\n if (error.error.name === 'Microsoft_Dynamics_Commerce_Runtime_DuplicateObject') {\n errorMessage = addToTemplateDuplicateError;\n } else {\n errorMessage = addToTemplateGenericError;\n }\n\n this.setState({\n isBusy: false,\n errors: { ...this.state.errors, add: errorMessage }\n });\n this.props.context.telemetry.error('Error adding item to order template');\n });\n };\n\n private readonly _onQuantityChange = (newValue: number) => {\n this.setState({\n quantity: newValue,\n totalPrice: newValue * this.props.product.Price\n });\n };\n\n private readonly _updateDimensionValue = (\n productDimensionFull: ProductDimensionFull,\n newValueId: string | undefined\n ): ProductDimensionValue | undefined => {\n if (newValueId && productDimensionFull.DimensionValues) {\n return productDimensionFull.DimensionValues.find(dimension => dimension.RecordId === +newValueId);\n }\n\n return undefined;\n };\n\n // Rehydrate the selected variants price, available dimensions & sizes\n private readonly _onDimensionChanged = async (selection: IDropdownOnSelection): Promise<void> => {\n const { product, dimensions, context } = this.props;\n const {\n actionContext,\n request: {\n apiSettings: { channelId }\n }\n } = context;\n\n // Remaining error notifications for missing dimensions\n const remainingDimensionsErrors = this.state.errors?.dimension?.filter(id => id !== selection.dropdownId.toString());\n\n this.setState({\n isBusy: false,\n showAddConfirmation: false,\n buttonDisabled: true,\n errors: { add: undefined, dimension: remainingDimensionsErrors }\n });\n\n // Update currently selected dimensions\n this.selectedDimensions[selection.dropdownId] = +selection.selectId;\n\n const mappedDimensions = dimensions\n ?.map(dimension => {\n return {\n DimensionTypeValue: dimension.DimensionTypeValue,\n DimensionValue:\n this._updateDimensionValue(dimension, this.selectedDimensions[dimension.DimensionTypeValue]) ||\n dimension.DimensionValue,\n ExtensionProperties: dimension.ExtensionProperties\n };\n })\n .filter(dimension => {\n return dimension && dimension.DimensionValue;\n });\n\n const variantProduct = await getSelectedVariant(\n new SelectedVariantInput(\n product.MasterProductId ? product.MasterProductId : product.RecordId,\n channelId,\n mappedDimensions,\n undefined,\n this.props.context.request\n ),\n actionContext\n );\n\n if (!variantProduct) {\n this.props.context.telemetry.error(\n `Error retrieving variant product for product ${product.MasterProductId ? product.MasterProductId : product.RecordId}`\n );\n return;\n }\n\n const dimensionInput = new GetDimensionsForSelectedVariantInput(\n variantProduct.RecordId,\n channelId,\n mappedDimensions,\n this.props.context.request\n );\n const variantDimensions = await getDimensionsForSelectedVariant(dimensionInput, actionContext);\n\n if (!variantDimensions) {\n this.props.context.telemetry.error('Error retrieving dimensions for reconfigured product variant');\n this.setState({\n buttonDisabled: false\n });\n return;\n }\n\n const availabilityInput = new ProductAvailabilitiesForSelectedVariantInput(\n product.MasterProductId ? product.MasterProductId : product.RecordId,\n channelId\n );\n\n // @TODO sync UX quantity w/ actual availability\n const newAvailableQuantity = await getProductAvailabilitiesForSelectedVariant(availabilityInput, actionContext);\n const priceInput = new PriceForSelectedVariantInput(product.RecordId, channelId);\n const productPrice = await getPriceForSelectedVariant(priceInput, actionContext);\n\n if (!productPrice) {\n this.props.context.telemetry.error('Error retrieving price for reconfigured product variant');\n this.setState({\n buttonDisabled: false\n });\n return;\n }\n\n this.setState({\n buttonDisabled: false,\n productAvailableQuantity: (newAvailableQuantity && newAvailableQuantity[0]) || undefined,\n unitPrice: +(productPrice.BasePrice || product.Price),\n dimensions: variantDimensions.sort((a, b) => a.DimensionTypeValue - b.DimensionTypeValue),\n product: variantProduct\n });\n };\n\n private readonly _getDropdownName = (dimensionType: number, resources: IAddLineToTemplateResources): string => {\n switch (dimensionType) {\n case 1: // Color\n return resources.productDimensionTypeColor;\n case 2: // Configuration\n return resources.productDimensionTypeConfiguration;\n case 3: // Size\n return resources.productDimensionTypeSize;\n case 4: // Style\n return resources.productDimensionTypeStyle;\n default:\n return '';\n }\n };\n\n private _formatPrice(price: number): string {\n const {\n context: {\n cultureFormatter: {\n formatCurrency,\n\n // @ts-expect-error\n currencyCode\n }\n }\n } = this.props;\n\n return formatCurrency(price.toFixed(2), currencyCode);\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ProductDimensionFull } from '@msdyn365-commerce/commerce-entities';\nimport { IImageSettings, Image } from '@msdyn365-commerce/core';\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\nimport { getFallbackImageUrl, generateImageUrl } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport React, { useState } from 'react';\n\nimport { IAddLineToTemplateProps } from '.';\n\nexport interface IProductListProps extends IAddLineToTemplateProps {\n products: ProductSearchResult[];\n imageSettings: IImageSettings;\n searchForm: React.ReactNode;\n clickHandler(product: ProductSearchResult): Promise<ProductDimensionFull[]>;\n highlightSearchTerm(name: string): React.ReactNode;\n renderResultCountText(): string;\n}\n\nexport const ProductList = (props: IProductListProps) => {\n const {\n products,\n context: {\n actionContext: {\n requestContext: { apiSettings }\n },\n request: { gridSettings },\n cultureFormatter: {\n formatCurrency,\n\n // @ts-expect-error\n currencyCode\n }\n },\n clickHandler,\n highlightSearchTerm,\n renderResultCountText,\n resources: { selectProductButtonText },\n imageSettings\n } = props;\n\n return (\n <>\n <p className='msc-add-line-to-template__search-result-count' aria-live='assertive'>\n {renderResultCountText()}\n </p>\n {props.searchForm}\n <div className='msc-add-line-to-template__product-list'>\n {products.map((product: ProductSearchResult, index: number) => {\n const { Price, ItemId, Name, PrimaryImageUrl } = product;\n const price = formatCurrency(Price.toFixed(2), currencyCode);\n const primaryImageSource = generateImageUrl(PrimaryImageUrl ?? '', apiSettings) ?? '';\n const fallBackImg = getFallbackImageUrl(ItemId, apiSettings, props.context.request.app?.config?.OmniChannelMedia) ?? '';\n\n return (\n <div key={`product-${index}`} className='msc-add-line-to-template__product'>\n <div className='msc-add-line-to-template__product__positioning-container-1'>\n <Image\n altText={Name ?? 'image'}\n requestContext={props.context.actionContext.requestContext}\n src={primaryImageSource}\n fallBackSrc={fallBackImg}\n className='thumbnail'\n gridSettings={gridSettings!}\n imageSettings={imageSettings}\n loadFailureBehavior='empty'\n />\n <div className='msc-add-line-to-template__product__attributes' aria-live='polite'>\n <div className='msc-add-line-to-template__product__id'>{ItemId}</div>\n {highlightSearchTerm(Name ?? '')}\n </div>\n </div>\n <div className='msc-add-line-to-template__product__price-container'>\n <span>{price}</span>\n <ProductSelectButton product={product} buttonText={selectProductButtonText} clickHandler={clickHandler} />\n </div>\n </div>\n );\n })}\n </div>\n </>\n );\n};\n\ninterface IProductSelectButton {\n product: ProductSearchResult;\n buttonText: string;\n clickHandler(product: ProductSearchResult): Promise<ProductDimensionFull[]>;\n}\n\nconst ProductSelectButton = (props: IProductSelectButton) => {\n const [isBusy, setBusy] = useState(false);\n const { product, buttonText, clickHandler } = props;\n const getClickHandler = React.useCallback(async () => {\n setBusy(!isBusy);\n await clickHandler(product);\n setBusy(!isBusy);\n }, [clickHandler, isBusy, product]);\n\n return (\n <Button\n className={classnames('msc-add-line-to-template__product__select-button', { 'is-busy': isBusy })}\n aria-label={`${product.Name!} ${buttonText}`} // Announce as: 'Nooks surfboard' select product button\n onClick={getClickHandler}\n >\n {buttonText}\n </Button>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Button, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IOrderTemplateLineViewModel } from '../order-template';\nimport { IOrderTemplateData } from '../order-template.data';\nimport { IOrderTemplateProps } from '../order-template.props.autogenerated';\nimport { AddLineToTemplate } from '.';\n\ninterface IOrderTemplateBulkActionsProps extends IOrderTemplateProps<IOrderTemplateData> {\n orderTemplateId: string;\n selectedLines: IOrderTemplateLineViewModel[];\n isMinifiedView: boolean;\n isMultipleCatalogFeatureEnabledInHq: boolean;\n telemetryContent?: ITelemetryContent;\n onAddSelectionToBag(): void;\n onRemoveSelection(): void;\n}\n\ninterface IOrderTemplateBulkActionsState {\n isAddDisabled: boolean;\n isRemoveDisabled: boolean;\n}\n\n/**\n * Bulk Order Template line actions.\n */\nexport class OrderTemplateBulkActions extends React.PureComponent<IOrderTemplateBulkActionsProps, IOrderTemplateBulkActionsState> {\n public state: IOrderTemplateBulkActionsState = {\n isAddDisabled: true,\n isRemoveDisabled: true\n };\n\n public static getDerivedStateFromProps(\n props: IOrderTemplateBulkActionsProps,\n state: IOrderTemplateBulkActionsState\n ): IOrderTemplateBulkActionsState {\n const selectedLines = props.selectedLines.length;\n let nextState = { ...state };\n nextState = {\n isAddDisabled: selectedLines === 0,\n isRemoveDisabled: selectedLines === 0\n };\n return nextState;\n }\n\n public render(): JSX.Element {\n const {\n addLineModalLinkText,\n searchButtonAriaLabel,\n searchInputAriaLabel,\n searchModalPlaceholderText,\n selectCatalogTitleText,\n selectProductButtonText,\n addItemToTemplateText,\n addLineProductUnitPricePrefix,\n backButtonText,\n decrementButtonAriaLabel,\n incrementButtonAriaLabel,\n quantitySelectLabel,\n addLineProductUnitOfMeasurePrefix,\n notFoundSearchErrorNotice,\n notFoundSearchErrorRedediation,\n searchErrorMessage,\n productDimensionTypeColor,\n productDimensionTypeConfiguration,\n productDimensionTypeSize,\n productDimensionTypeStyle,\n addSelectedToBagButtonText,\n removeSelectedToBagButtonText,\n searchResultsCountVerbage,\n searchResultsCountSubject,\n addToTemplateConfirmation,\n totalPriceLabel,\n progressNotificationText,\n addToTemplateDuplicateError,\n addToTemplateGenericError,\n dimensionMissingError\n } = this.props.resources;\n\n const addLineProps = {\n context: this.props.context,\n telemetryContent: this.props.telemetryContent,\n resources: {\n addLineModalLinkText,\n searchButtonAriaLabel,\n searchInputAriaLabel,\n searchModalPlaceholderText,\n selectCatalogTitleText,\n selectProductButtonText,\n addItemToTemplateText,\n addLineProductUnitPricePrefix,\n backButtonText,\n decrementButtonAriaLabel,\n incrementButtonAriaLabel,\n quantitySelectLabel,\n addLineProductUnitOfMeasurePrefix,\n notFoundSearchErrorNotice,\n notFoundSearchErrorRedediation,\n searchErrorMessage,\n productDimensionTypeColor,\n productDimensionTypeConfiguration,\n productDimensionTypeSize,\n productDimensionTypeStyle,\n searchResultsCountVerbage,\n searchResultsCountSubject,\n addToTemplateConfirmation,\n totalPriceLabel,\n progressNotificationText,\n addToTemplateDuplicateError,\n addToTemplateGenericError,\n dimensionMissingError\n },\n imageSettings: this.props.config.imageSettings,\n orderTemplateId: this.props.orderTemplateId,\n isMultipleCatalogFeatureEnabledInHq: this.props.isMultipleCatalogFeatureEnabledInHq,\n catalogs: this.props.data.catalogs?.result\n };\n\n return (\n <>\n <AddLineToTemplate {...addLineProps} />\n <Button\n onClick={this.addHandler}\n disabled={this.state.isAddDisabled}\n className='add-selected-to-bag'\n aria-label={addSelectedToBagButtonText}\n >\n <span />\n {!this.props.isMinifiedView && addSelectedToBagButtonText}\n </Button>\n <Button\n onClick={this.removeHandler}\n disabled={this.state.isRemoveDisabled}\n className='remove-selected'\n aria-label={removeSelectedToBagButtonText}\n >\n <span />\n {!this.props.isMinifiedView && removeSelectedToBagButtonText}\n </Button>\n </>\n );\n }\n\n private readonly addHandler = (event: React.MouseEvent<HTMLElement>) => {\n this.setState({\n isAddDisabled: true\n });\n\n this.props.onAddSelectionToBag();\n\n this.setState({\n isAddDisabled: false\n });\n };\n\n private readonly removeHandler = (event: React.MouseEvent<HTMLElement>) => {\n this.setState({\n isRemoveDisabled: true\n });\n\n this.props.onRemoveSelection();\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 AddOrderTemplateToCartComponent,\n ILinesAddedToCartDialogResources,\n IOrderTemplateNameDialogResources,\n RenameOrderTemplateComponent,\n OrderTemplateNameDialog\n} from '@msdyn365-commerce/components';\nimport { IComponentProps, ICoreContext } from '@msdyn365-commerce/core';\nimport { ProductList } from '@msdyn365-commerce/retail-proxy';\nimport { OrderTemplate, Random } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, ITelemetryContent, Popover } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\nimport { useState } from 'react';\n\nexport interface IOrderTemplateActionsData {\n orderTemplate: OrderTemplate;\n}\n\nexport interface IOrderTemplateActionsProps extends IComponentProps<IOrderTemplateActionsData> {\n context: ICoreContext;\n telemetryContent?: ITelemetryContent;\n handlers: {\n onRemoveTemplate(orderTemplateId: string): void;\n onRenameTemplate(orderTemplate: ProductList): Promise<void>;\n };\n renameOrderTemplateDialogStrings: IOrderTemplateNameDialogResources;\n isMultipleCatalogFeatureEnabledInHq?: boolean;\n resources: {\n addTemplateToBagButtonText: string;\n renameTemplateButtonText: string;\n deleteTemplateButtonText: string;\n closeWindowButtonText: string;\n addToCartFailureMessage: string;\n addToCartSuccessMessage: string;\n addToCartProcessMessage: string;\n orderTemplateErrorMessage: string;\n linesAddedToCartDialogResources: ILinesAddedToCartDialogResources;\n };\n}\n\nexport interface IOrderTemplateActionsViewProps {\n addTemplateToBag: React.ReactNode;\n renameTemplate?: React.ReactNode;\n removeTemplate?: React.ReactNode;\n isMultipleCatalogsFeatureEnabled?: boolean;\n actionsSplitButton?: React.ReactNode;\n}\n\n/**\n * Remove Order Action.\n * @param props -Order template action props.\n * @returns Remove order template.\n */\nconst removeOrderActionHandler = (props: IOrderTemplateActionsProps) => () => {\n _removeOrderTemplate(props);\n};\n\nexport const OrderTemplateActionsView = (props: IOrderTemplateActionsProps): IOrderTemplateActionsViewProps => {\n const { resources, isMultipleCatalogFeatureEnabledInHq } = props;\n const { deleteTemplateButtonText } = resources;\n\n return {\n addTemplateToBag: _getOrderTemplateAddToCartDialog(props),\n renameTemplate: !isMultipleCatalogFeatureEnabledInHq && _getOrderTemplateRenameControl(props),\n removeTemplate: !isMultipleCatalogFeatureEnabledInHq && (\n <Button className='ms-order-template-action-bar__delete-template-button' onClick={removeOrderActionHandler(props)}>\n {deleteTemplateButtonText}\n </Button>\n ),\n actionsSplitButton: isMultipleCatalogFeatureEnabledInHq && <ActionsSplitButton {...props} />\n };\n};\n\nconst _removeOrderTemplate = (props: IOrderTemplateActionsProps): void => {\n const {\n data: { orderTemplate },\n handlers\n } = props;\n const { onRemoveTemplate } = handlers;\n\n if (onRemoveTemplate) {\n onRemoveTemplate(orderTemplate.productList.Id);\n }\n};\n\nconst _getOrderTemplateAddToCartDialog = (props: IOrderTemplateActionsProps): React.ReactNode => {\n const {\n data: { orderTemplate },\n typeName,\n id,\n context,\n telemetryContent,\n resources,\n isMultipleCatalogFeatureEnabledInHq\n } = props;\n const {\n addTemplateToBagButtonText,\n closeWindowButtonText,\n addToCartFailureMessage,\n addToCartSuccessMessage,\n addToCartProcessMessage,\n orderTemplateErrorMessage,\n linesAddedToCartDialogResources\n } = resources;\n\n const dialogStrings = {\n closeWindowButtonText,\n addToCartFailureMessage,\n addToCartSuccessMessage,\n addToCartProcessMessage,\n orderTemplateErrorMessage,\n linesAddedToCartDialogResources\n };\n\n return (\n <AddOrderTemplateToCartComponent\n context={context}\n id={id}\n typeName={typeName}\n data={{ orderTemplate }}\n className=''\n addToCartText={addTemplateToBagButtonText}\n dialogStrings={dialogStrings}\n telemetryContent={telemetryContent}\n isMultipleCatalogFeatureEnabledInHq={isMultipleCatalogFeatureEnabledInHq}\n />\n );\n};\n\nconst _getOrderTemplateRenameControl = (props: IOrderTemplateActionsProps): React.ReactNode => {\n const { renameOrderTemplateDialogStrings, resources, context, handlers } = props;\n return (\n <RenameOrderTemplateComponent\n onRenameTemplate={handlers.onRenameTemplate}\n className='msc-order-template-name-dialog'\n context={context}\n id={props.id}\n data={{ orderTemplate: props.data.orderTemplate.productList }}\n typeName={props.typeName}\n renameOrderTemplateDialogStrings={renameOrderTemplateDialogStrings}\n renameOrderTemplateButtonText={resources.renameTemplateButtonText}\n isMultipleCatalogFeatureEnabledInHq\n />\n );\n};\n\nlet buttonEventReference: HTMLButtonElement | undefined;\nexport const ActionsSplitButton: React.FC<IOrderTemplateActionsProps> = (props: IOrderTemplateActionsProps) => {\n const [isStatementRequestAdminDropdownOpen, setIsStatementRequestAdminDropdownOpen] = useState(false);\n const [renameOrderTemplateDialogOpen, setOrderTemplateNameDialogOpen] = React.useState(false);\n\n const onOrderTemplateNameCancel = () => {\n context.telemetry.debug('Rename of template was canceled.');\n buttonEventReference?.focus();\n };\n\n const onRenameButtonClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n buttonEventReference = event.target as HTMLButtonElement;\n setOrderTemplateNameDialogOpen(true);\n event.preventDefault();\n };\n const onToggleDropdown1 = () => {\n setIsStatementRequestAdminDropdownOpen(!isStatementRequestAdminDropdownOpen);\n };\n const {\n data: { orderTemplate },\n resources,\n renameOrderTemplateDialogStrings,\n context\n } = props;\n\n const className = 'ms-order-template-action-bar';\n\n const popoverReference = React.createRef<HTMLButtonElement>();\n const renderModalPopup = (\n <OrderTemplateNameDialog\n existingOrderTemplate={orderTemplate.productList}\n isUpdateDialog\n className='msc-order-template-name-dialog'\n modalOpen={renameOrderTemplateDialogOpen}\n setModalOpen={setOrderTemplateNameDialogOpen}\n context={context}\n id={props.id}\n data={props.data}\n orderTemplateName={props.data.orderTemplate.productList.Name}\n typeName={props.typeName}\n dialogStrings={renameOrderTemplateDialogStrings}\n onCancel={onOrderTemplateNameCancel}\n onSuccess={props.handlers.onRenameTemplate}\n />\n );\n const requestStatementDropdownString = `request-statement-dropdown-id-${Random.Guid.generateGuid()}`;\n\n return (\n <div className={`${className}__dropdown`}>\n {renderModalPopup}\n <Button\n className={\n isStatementRequestAdminDropdownOpen\n ? `${className}__action__requestStatement__toggleUp`\n : `${className}__action__requestStatement__toggleDown`\n }\n onClick={onToggleDropdown1}\n innerRef={popoverReference}\n aria-haspopup='true'\n aria-expanded={isStatementRequestAdminDropdownOpen}\n id={requestStatementDropdownString}\n >\n <span className={`${className}__action__requestStatement__buttonLabel`}>{'Options'}</span>\n </Button>\n <Popover\n aria-labelledby={requestStatementDropdownString}\n className={`${className}__action__requestStatement__dropdownVisible`}\n isOpen={isStatementRequestAdminDropdownOpen}\n placement='bottom'\n target={popoverReference}\n toggle={onToggleDropdown1}\n role='listbox'\n aria-hidden={!isStatementRequestAdminDropdownOpen}\n >\n <Button className={`${className}__action__requestStatement__dropdownOption rename`} onClick={onRenameButtonClick}>\n {resources.renameTemplateButtonText}\n </Button>\n\n <Button\n onClick={removeOrderActionHandler(props)}\n className={`${className}__action__requestStatement__dropdownOption delete`}\n role='option'\n >\n {'Delete'}\n </Button>\n </Popover>\n </div>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { PriceComponent } from '@msdyn365-commerce/components';\nimport { ICoreContext, IImageSettings, Image, ITelemetry } from '@msdyn365-commerce/core';\nimport { ProductListLine } from '@msdyn365-commerce/retail-proxy';\nimport { ProductCatalog, ProductPrice, SimpleProduct } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { ArrayExtensions, getFallbackImageUrl, validateCatalogId } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport React, { useState } from 'react';\n\nimport { IOrderTemplateLineViewModel } from '../order-template';\nimport OrderTemplateQuantity from './common/order-template-quantity';\n\nexport interface IOrderTemplateLineProps extends ProductListLine {\n orderTemplateLine: IOrderTemplateLineViewModel;\n productListLine: ProductListLine;\n price?: ProductPrice;\n context: ICoreContext;\n productUrl: string;\n imageSettings?: IImageSettings;\n telemetry: ITelemetry;\n moduleId: string;\n moduleTypeName: string;\n quantity: number;\n isQuantityDisabledForUpdate?: boolean;\n handlers: {\n onAddToBag(product: SimpleProduct, quantity: number, itemKey: string, catalogId?: number | undefined): void;\n onRemoveItem(line: IOrderTemplateLineViewModel): void;\n onChangeQuantity(orderTemplateLineId: string, quantity: number, props?: IOrderTemplateLineProps): void;\n onSelect(line: IOrderTemplateLineViewModel, isChecked: boolean): void;\n };\n resources: {\n selectOneRowText?: string;\n moreButtonText?: string;\n viewProductDetailsText?: string;\n productDimensionTypeColor: string;\n productDimensionTypeSize: string;\n productDimensionTypeStyle: string;\n originalPriceText: string;\n currentPriceText: string;\n freePriceText: string;\n inputQuantityAriaLabel: string;\n removeFromOrderTemplateLinesText: string;\n addToBagButtonText: string;\n deleteButtonText: string;\n incrementButtonAriaLabel?: string;\n decrementButtonAriaLabel?: string;\n editOrderTemplateLineQuantityError?: string;\n unavailableProductErrorMessage?: string;\n outOfStockProductErrorMessage?: string;\n };\n index: number;\n isMobile: boolean;\n productQuantityView?: React.ReactNode;\n addToBagButton?: React.ReactNode;\n removeButton?: React.ReactNode;\n toggleDetailsDisplayed(props: IOrderTemplateLineProps): void;\n isMultipleCatalogFeatureEnabledInHq?: boolean;\n catalogs?: ProductCatalog[];\n error?: string;\n shouldDisable?: boolean;\n}\n\nexport interface IOrderTemplateLineViewProps {\n key?: string;\n productImage: React.ReactNode;\n productPrice?: React.ReactNode;\n addToBagButton?: React.ReactNode;\n removeButton?: React.ReactNode;\n productName?: string;\n productNumber?: React.ReactNode;\n productInfo?: React.ReactNode;\n productLabel?: React.ReactNode;\n productUnitOfMeasure?: React.ReactNode;\n productQuantity?: number;\n productQuantityView?: React.ReactNode;\n productListId?: string;\n selectLine?: React.ReactNode;\n popUp?: JSX.Element;\n extraActionsPopup?: JSX.Element | null | undefined;\n isMobile?: boolean;\n isMultipleCatalogFeatureEnabledInHq?: boolean;\n productLineCatalog?: React.ReactNode;\n disabled?: boolean;\n}\n\ninterface IEventHandlerFactory {\n getAddToBag(): (event: React.MouseEvent<HTMLElement>) => void;\n getRemoveItem(): (event: React.MouseEvent<HTMLElement>) => void;\n}\n\nconst OrderTemplateLineActions = (props: IOrderTemplateLineProps): IEventHandlerFactory => {\n const { orderTemplateLine, productListLine, quantity, handlers } = props;\n const { LineId, CatalogId } = productListLine;\n const { onAddToBag, onRemoveItem } = handlers;\n\n return {\n getAddToBag: () => (event: React.MouseEvent<HTMLElement>) => {\n LineId &&\n orderTemplateLine.fullProduct &&\n onAddToBag(orderTemplateLine.fullProduct.ProductDetails, quantity, LineId, CatalogId);\n },\n getRemoveItem: () => (event: React.MouseEvent<HTMLElement>) => LineId && onRemoveItem(props.orderTemplateLine)\n };\n};\n\ninterface IPopupProps extends IOrderTemplateLineProps {\n addButtonClassName: string;\n removeButtonClassName: string;\n}\n\nconst PopUp = (props: IPopupProps): JSX.Element | null => {\n const { addToBagButtonText, removeFromOrderTemplateLinesText, moreButtonText, viewProductDetailsText } = props.resources;\n const [showMobile, setShowMobile] = useState(false);\n const componentClassName = 'ms-table';\n\n const getViewHandler = () => (event: React.MouseEvent<HTMLElement>) => {\n props.toggleDetailsDisplayed(props);\n };\n\n const toggle = React.useCallback(() => {\n setShowMobile(!showMobile);\n }, [showMobile]);\n\n return (\n <div className={`${componentClassName}__row-links-minified`}>\n <Button\n className={`${componentClassName}__row-links-toggle`}\n aria-label={moreButtonText}\n data-type={props.index}\n onClick={toggle}\n />\n {showMobile && (\n <div className={`${componentClassName}__row-links`}>\n <Button\n className='ms-table__row-links-view'\n onClick={getViewHandler()}\n title={viewProductDetailsText}\n aria-label={viewProductDetailsText}\n >\n View\n </Button>\n {getActionButton(\n props.isMobile,\n props.removeButtonClassName,\n removeFromOrderTemplateLinesText,\n OrderTemplateLineActions(props).getRemoveItem()\n )}\n {getActionButton(\n props.isMobile,\n props.addButtonClassName,\n addToBagButtonText,\n OrderTemplateLineActions(props).getAddToBag()\n )}\n </div>\n )}\n </div>\n );\n};\n\nconst getActionButton = (\n isMobile: boolean,\n className: string,\n buttonText: string,\n clickHandler: (event: React.MouseEvent<HTMLElement>) => void\n): React.ReactNode => (\n <Button aria-label={buttonText} className={className} onClick={clickHandler} title={buttonText}>\n {isMobile ? buttonText : ''}\n </Button>\n);\n\nconst getDesktopActionButton = (\n className: string,\n buttonText: string,\n clickHandler: (event: React.MouseEvent<HTMLElement>) => void\n): React.ReactNode => (\n <Button aria-label={buttonText} className={className} onClick={clickHandler} title={buttonText}>\n {buttonText}\n </Button>\n);\n/**\n * On Select line function.\n * @param orderTemplateLine -Order template line.\n * @param input -Order template line props.\n * @returns Set on select order template.\n */\nconst onSelectLineHandler = (orderTemplateLine: IOrderTemplateLineViewModel, input: IOrderTemplateLineProps) => (\n event: React.ChangeEvent<HTMLInputElement>\n) => {\n orderTemplateLine.isChecked = !orderTemplateLine.isChecked;\n\n input.handlers.onSelect(orderTemplateLine, event.target.checked);\n};\n\nexport const OrderTemplateLineView = (input: IOrderTemplateLineProps): IOrderTemplateLineViewProps | null => {\n const {\n orderTemplateLine,\n productListLine,\n price,\n context,\n imageSettings,\n quantity,\n resources,\n isMobile,\n isMultipleCatalogFeatureEnabledInHq\n } = input;\n const product = orderTemplateLine.fullProduct;\n const { LineId, UnitOfMeasure } = productListLine;\n const { removeFromOrderTemplateLinesText, addToBagButtonText, selectOneRowText } = resources;\n if (!product) {\n return null;\n }\n\n const { ItemId, PrimaryImageUrl } = product.ProductDetails;\n const fallbackImage = getFallbackImageUrl(\n ItemId,\n context.actionContext.requestContext.apiSettings,\n context.request.app?.config?.OmniChannelMedia\n );\n const addButtonClassName = input.isMobile ? 'ms-table__row-links-add' : 'ms-order-template-table-line__product-add-button';\n const removeButtonClassName = input.isMobile ? 'ms-table__row-links-delete' : 'ms-order-template-table-line__product-remove-button';\n\n return {\n isMobile,\n isMultipleCatalogFeatureEnabledInHq: isMultipleCatalogFeatureEnabledInHq,\n selectLine: (\n <label className='checkbox-container'>\n <input\n aria-label={selectOneRowText}\n className='checkbox-input'\n type='checkbox'\n checked={orderTemplateLine.isChecked}\n aria-checked={orderTemplateLine.isChecked}\n onChange={onSelectLineHandler(orderTemplateLine, input)}\n />\n <span className='checkmark' />\n </label>\n ),\n key: LineId!,\n productLineCatalog: isMultipleCatalogFeatureEnabledInHq && renderProductCatalog(input),\n productImage: _renderProductImage(\n 'ms-order-template-table-line__product-image',\n context,\n product.ProductDetails.Name!,\n PrimaryImageUrl,\n fallbackImage,\n imageSettings\n ),\n productInfo: renderProductInfo(input),\n productPrice: price && _renderPrice(input),\n productNumber: product && (\n <>\n <div className='ms-order-template-table-line__product-number'>{ItemId}</div>\n {input.error !== 'NONE' ? (\n <div className='ms-order-template-table-line__product-availability'>{_renderProductError(input)}</div>\n ) : (\n undefined\n )}\n </>\n ),\n productUnitOfMeasure: price ? (\n <div className='ms-order-template-table-line__product-unit-of-measure'>{UnitOfMeasure || price.UnitOfMeasure}</div>\n ) : (\n undefined\n ),\n productListId: LineId!,\n removeButton:\n !isMultipleCatalogFeatureEnabledInHq &&\n getActionButton(\n input.isMobile,\n removeButtonClassName,\n removeFromOrderTemplateLinesText,\n OrderTemplateLineActions(input).getRemoveItem()\n ),\n productQuantityView: <div>{_generateQuantity(input, LineId!)}</div>,\n productQuantity: quantity,\n addToBagButton:\n !isMultipleCatalogFeatureEnabledInHq &&\n getActionButton(input.isMobile, addButtonClassName, addToBagButtonText, OrderTemplateLineActions(input).getAddToBag()),\n extraActionsPopup:\n !isMobile && isMultipleCatalogFeatureEnabledInHq ? (\n <ExtraActionsPopup {...input} addButtonClassName={addButtonClassName} removeButtonClassName={removeButtonClassName} />\n ) : (\n undefined\n ),\n popUp: <PopUp {...input} addButtonClassName={addButtonClassName} removeButtonClassName={removeButtonClassName} />,\n disabled: input.shouldDisable\n };\n};\n\nconst ExtraActionsPopup = (props: IPopupProps): JSX.Element | null => {\n const [showActions, setShowActions] = useState(false);\n const toggle = React.useCallback(() => {\n setShowActions(!showActions);\n }, [showActions]);\n\n const className = 'ms-order-template-table-line__extra-actions-cell';\n const actionsContainerClassName = `${className}__actions-container`;\n return (\n <div className={className}>\n <Button className={`${className}__toggle`} aria-label={''} onClick={toggle} />\n {showActions && (\n <div className={actionsContainerClassName}>\n {getDesktopActionButton(\n 'ms-order-template-table-lines__products-add-button',\n 'Add to bag',\n OrderTemplateLineActions(props).getAddToBag()\n )}\n {getDesktopActionButton(\n 'ms-order-template-table-lines__products-remove-button',\n 'Remove item',\n OrderTemplateLineActions(props).getRemoveItem()\n )}\n </div>\n )}\n </div>\n );\n};\n\nexport const OrderTemplateMobileLineView = (input: IOrderTemplateLineProps): IOrderTemplateLineViewProps | undefined => {\n const { orderTemplateLine, productListLine, price, context, imageSettings, isMultipleCatalogFeatureEnabledInHq } = input;\n const product = orderTemplateLine.fullProduct;\n const { LineId, UnitOfMeasure } = productListLine;\n if (!product) {\n return;\n }\n const { ItemId, PrimaryImageUrl } = product.ProductDetails;\n const fallbackImage = getFallbackImageUrl(\n ItemId,\n context.actionContext.requestContext.apiSettings,\n context.request.app?.config?.OmniChannelMedia\n );\n\n return {\n productLineCatalog: isMultipleCatalogFeatureEnabledInHq && renderProductCatalog(input),\n productImage: _renderProductImage(\n 'thumbnail',\n context,\n product.ProductDetails.Name!,\n PrimaryImageUrl,\n fallbackImage,\n imageSettings\n ),\n productInfo: renderProductInfo(input),\n productPrice: price && _renderPrice(input),\n productNumber: ItemId,\n productUnitOfMeasure: UnitOfMeasure || price?.UnitOfMeasure,\n productQuantityView: _generateQuantity(input, LineId!)\n };\n};\n\nexport interface IOrderTemplateProductQuantityViewProps {\n ContainerProps: INodeProps;\n input: React.ReactNode;\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: (orderTemplateLineId: string, quantity: number, props?: IOrderTemplateLineProps | undefined) => void,\n itemKey: string,\n props: IOrderTemplateLineProps\n) => (newValue: number) => {\n if (onChangeQuantity) {\n onChangeQuantity(itemKey, newValue, props);\n }\n};\n\nconst _generateQuantity = (props: IOrderTemplateLineProps, itemKey: string): React.ReactNode => {\n const { handlers, resources, quantity } = props;\n const { onChangeQuantity } = handlers;\n return (\n <OrderTemplateQuantity\n currentCount={quantity}\n onChange={onChangeHandler(onChangeQuantity, itemKey, props)}\n max={999_999_999}\n inputQuantityAriaLabel={resources.inputQuantityAriaLabel}\n incrementButtonAriaLabel={resources.incrementButtonAriaLabel}\n decrementButtonAriaLabel={resources.decrementButtonAriaLabel}\n disabled={props.isQuantityDisabledForUpdate}\n />\n );\n};\n\nexport const _renderProductImage = (\n className: string,\n context: ICoreContext,\n heading: string,\n image?: string,\n fallbackImage?: string,\n imageSettings?: IImageSettings\n): JSX.Element | null => {\n const defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=64&h=64&m=6', w: 0, h: 0 },\n lg: { q: 'w=64&h=64&m=6', w: 0, h: 0 },\n xl: { q: 'w=64&h=64&m=6', w: 0, h: 0 }\n },\n lazyload: true\n };\n\n return (\n <Image\n requestContext={context?.actionContext?.requestContext}\n className={className}\n altText={heading}\n title={heading}\n src={image}\n fallBackSrc={fallbackImage}\n gridSettings={context?.request?.gridSettings!}\n imageSettings={imageSettings || defaultImageSettings}\n loadFailureBehavior='empty'\n tabIndex={0}\n />\n );\n};\n\nexport const renderProductCatalog = (props: IOrderTemplateLineProps) => {\n const catalogId = props.productListLine.CatalogId;\n validateCatalogId(catalogId);\n\n if (!props.context.request.user.isB2b || !catalogId || !ArrayExtensions.hasElements(props.catalogs)) {\n return null;\n }\n\n const catalog = props.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 _renderPrice = (props: IOrderTemplateLineProps): JSX.Element | null => {\n const { price, context, moduleId, moduleTypeName, resources } = props;\n\n if (price) {\n return (\n <PriceComponent\n id={moduleId}\n typeName={moduleTypeName}\n data={{ price }}\n className='ms-order-template-table-line__product-price'\n freePriceText={resources.freePriceText}\n originalPriceText={resources.originalPriceText}\n currentPriceText={resources.currentPriceText}\n context={context}\n />\n );\n }\n return null;\n};\n\nconst _renderProductDimensions = (props: IOrderTemplateLineProps): (string | undefined)[] => {\n const { orderTemplateLine } = props;\n\n if (!orderTemplateLine.fullProduct || !orderTemplateLine.fullProduct.ProductDetails.Dimensions) {\n return [];\n }\n\n return orderTemplateLine.fullProduct.ProductDetails.Dimensions.map(dimension => {\n if (!dimension.DimensionValue || !dimension.DimensionValue.Value) {\n return undefined;\n }\n\n return dimension.DimensionValue.Value;\n });\n};\n\nconst _renderProductError = (props: IOrderTemplateLineProps) => {\n const { error, resources } = props;\n\n if (!error) {\n return '';\n }\n\n const errorMessages = {\n OOS: resources.outOfStockProductErrorMessage,\n UNASSORTED: resources.unavailableProductErrorMessage,\n NONE: ''\n };\n\n return errorMessages[error];\n};\n\nexport const renderProductInfo = (props: IOrderTemplateLineProps): React.ReactNode | undefined => {\n const { orderTemplateLine, productUrl } = props;\n const name = orderTemplateLine.fullProduct?.ProductDetails.Name;\n\n const dimensions = _renderProductDimensions(props);\n if (!orderTemplateLine.fullProduct) {\n return [];\n }\n\n const productName = productUrl ? (\n <a className='ms-order-template-table-line__product-info-name' href={productUrl}>\n {name}\n </a>\n ) : (\n <div className='ms-order-template-table-line__product-info-name'>{name}</div>\n );\n\n const dimensionsLine: string = dimensions.join(', ');\n\n return (\n <div className='ms-order-template-table-line__product-info'>\n <div className='ms-order-template-table-line__product-info-name'>{productName}</div>\n <div className='ms-order-template-table-line__product-info-dimension'>{dimensionsLine}</div>\n </div>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { orderTemplateLinesStatus } from '../order-template';\n\nexport interface IOrderTemplateLinesStatusMessageProps {\n className?: string;\n errorType: orderTemplateLinesStatus;\n text?: string;\n}\n\nexport const OrderTemplateLinesStatusMessage: React.FC<IOrderTemplateLinesStatusMessageProps> = ({ className, errorType, text }) => {\n switch (errorType) {\n case 'EMPTY':\n return <p className={classnames('ms-order-template-lines__message-empty', className)}>{text}</p>;\n case 'FAILED':\n return <p className={classnames('ms-order-template-lines__message-failed', className)}>{text}</p>;\n case 'LOADING':\n default:\n return <p className='ms-order-template-lines__message-waiting'>{text}</p>;\n }\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\nimport { IOrderTemplateLineViewModel } from '../order-template';\n\nexport interface IOrderTemplateTableHeadingProps {\n selectAllRowsText?: string;\n productNumber: string;\n productName: string;\n productUnitPrice: string;\n productUOM: string;\n productQuantity: string;\n productActions: string;\n lines: IOrderTemplateLineViewModel[];\n isMobile: boolean;\n clickHandler(isChecked: boolean): void;\n productImage?: string;\n isMultipleCatalogFeatureEnabledInHq?: boolean;\n productLineCatalogName?: string;\n}\n\n/**\n * Order Template's table state.\n */\nexport interface IOrderTemplateTableHeadingState {\n isChecked: boolean;\n}\n\nexport interface IOrderTemplateTableShortHeading {\n productNumber: string;\n productActions: string;\n}\n\n/**\n * Order Template's table heading.\n */\nexport class OrderTemplateTableHeading extends React.PureComponent<IOrderTemplateTableHeadingProps> {\n public state: IOrderTemplateTableHeadingState = {\n isChecked: false\n };\n\n private readonly componentClassName: string = 'ms-table';\n\n public static getDerivedStateFromProps(\n props: IOrderTemplateTableHeadingProps,\n state: IOrderTemplateTableHeadingState\n ): IOrderTemplateTableHeadingState {\n const checkedLines = props.lines.filter(line => !line.isChecked).length;\n let nextState = { ...state };\n nextState = { isChecked: checkedLines === 0 };\n return nextState;\n }\n\n public getOnChange = () => (event: React.ChangeEvent<HTMLInputElement>) => {\n this.setState(\n {\n isChecked: this.state.isChecked\n },\n () => {\n this.props.clickHandler(!this.state.isChecked);\n }\n );\n };\n\n public render(): JSX.Element {\n return (\n <thead>\n <tr className={`${this.componentClassName}__heading-row`}>\n <th scope='col' aria-label={this.props.selectAllRowsText}>\n <label className='checkbox-container'>\n <input\n aria-label={this.props.selectAllRowsText}\n className='checkbox-input'\n type='checkbox'\n aria-checked={this.state.isChecked}\n checked={this.state.isChecked}\n onChange={this.getOnChange()}\n />\n <span className='checkmark' />\n </label>\n </th>\n {!this.props.isMobile && this.props.isMultipleCatalogFeatureEnabledInHq ? (\n <th scope='col'>{this.props.productLineCatalogName}</th>\n ) : null}\n {!this.props.isMobile ? <th scope='col'>{this.props.productImage}</th> : null}\n <th scope='col'>{this.props.productNumber}</th>\n {!this.props.isMobile ? <th scope='col'>{this.props.productName}</th> : null}\n {!this.props.isMobile ? <th scope='col'>{this.props.productUnitPrice}</th> : null}\n {!this.props.isMobile ? <th scope='col'>{this.props.productUOM}</th> : null}\n {!this.props.isMobile ? <th scope='col'>{this.props.productQuantity}</th> : null}\n {!this.props.isMobile ? <th scope='col'>{this.props.productActions}</th> : <td />}\n </tr>\n </thead>\n );\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n IItemAddedToCartDialogData,\n IItemAddedToCartDialogResources,\n ILinesAddedToCartDialogResources,\n IOrderTemplateNameDialogResources,\n ItemAddedToCartDialog\n} from '@msdyn365-commerce/components';\nimport MsDyn365, { AsyncResult, getCatalogId, getUrlSync, ICoreContext, IRequestContext } from '@msdyn365-commerce/core';\nimport { ICartActionResult } from '@msdyn365-commerce/global-state';\nimport { ProductList, ProductListLine } from '@msdyn365-commerce/retail-proxy';\nimport {\n deleteAsync,\n removeProductListLinesAsync,\n updateProductListLinesAsync\n} from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductListsDataActions.g';\nimport { FeatureState, SimpleProduct } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport {\n ArrayExtensions,\n createGetFeatureStateInput,\n getFeatureState,\n getPriceForSelectedVariant,\n getProductUrlSync,\n ObjectExtensions,\n OrderTemplate,\n OrderTemplateLine,\n PriceForSelectedVariantInput,\n StringExtensions\n} from '@msdyn365-commerce-modules/retail-actions';\nimport {\n Alert,\n getTelemetryObject,\n Heading,\n IModuleProps,\n INodeProps,\n ITelemetryContent,\n UncontrolledPagination\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport debounce from 'lodash/debounce';\nimport { action, computed, observable } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport {\n IOrderTemplateActionsProps,\n IOrderTemplateActionsViewProps,\n IOrderTemplateLineProps,\n IOrderTemplateLineViewProps,\n IOrderTemplateTableHeadingProps,\n OrderTemplateActionsView,\n OrderTemplateLinesStatusMessage,\n OrderTemplateLineView,\n OrderTemplateMobileLineView,\n OrderTemplateTableHeading\n} from '../..';\nimport { ActiveOrderTemplateLinesInput } from './actions/get-order-template';\nimport { OrderTemplateBulkActions } from './components/bulk-actions';\nimport { IOrderTemplateData } from './order-template.data';\nimport { IOrderTemplateProps, IOrderTemplateResources } from './order-template.props.autogenerated';\nimport Spinner from './components/add-line/spinner';\n\nexport interface IOrderTemplateLineActionMessageState {\n itemKey: string;\n userMessage: string;\n statusCssString: string;\n messageGlyph: string;\n isOpen: boolean;\n isItemAddedToOrderTemplateOpen: boolean;\n isConfirmAddSelectionToBagModalOpen: boolean;\n itemAddedToCartDialogData?: IItemAddedToCartDialogData;\n productSelection: IOrderTemplateLineViewModel[];\n isDetailsDisplayed: boolean;\n detailedProductView?: IOrderTemplateLineViewProps;\n isQuantityDisabledForUpdate?: boolean;\n}\n\nexport type orderTemplateLinesStatus = 'LOADING' | 'SUCCESS' | 'FAILED' | 'EMPTY';\ntype GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\nexport interface IOrderTemplateViewProps extends IOrderTemplateProps<IOrderTemplateData> {\n OrderTemplateLines: IModuleProps;\n callbacks?: IOrderTemplateLinesCallbacks;\n status?: orderTemplateLinesStatus;\n statusMessage?: React.ReactNode;\n heading?: React.ReactNode;\n OrderTemplateActions?: INodeProps;\n ProductsTable?: INodeProps;\n ProductsTableRow?: INodeProps;\n ProductsTableHeading?: React.ReactNode;\n ProductDetails?: INodeProps;\n orderLines?: IOrderTemplateLineViewProps[];\n productListLines?: ProductListLine[];\n productsStatusMessage?: React.ReactNode;\n orderActions?: IOrderTemplateActionsViewProps | null;\n resources: IOrderTemplateResources;\n pagination?: React.ReactNode;\n itemAddedToCartDialog?: React.ReactNode;\n bulkOrderLineActions?: React.ReactNode;\n isDetailsDisplayed?: boolean;\n detailedProduct?: IOrderTemplateLineProps;\n detailedProductView?: IOrderTemplateLineViewProps;\n productQuantityView?: React.ReactNode;\n addButton?: React.ReactNode;\n isMobile?: boolean;\n toggleDetailsDisplayed?(props: IOrderTemplateLineProps | undefined): void;\n}\n\nexport interface IOrderTemplateLinesCallbacks {\n updateQuantity(itemKey: string, quantity: number): void;\n}\n\nexport interface IOrderTemplateLineViewModel extends OrderTemplateLine {\n isChecked: boolean;\n productQuantityView: React.ReactNode;\n}\n\n/**\n *\n * OrderTemplateLines component.\n * @extends {React.PureComponent<IOrderTemplateProps<IOrderTemplateData>, IOrderTemplateLineActionMessageState>}\n */\n@observer\nclass OrderTemplateLines extends React.Component<IOrderTemplateProps<IOrderTemplateData>, IOrderTemplateLineActionMessageState> {\n private readonly className: string;\n\n private readonly telemetryContent?: ITelemetryContent;\n\n @observable\n private _viewport: GridSize;\n\n @computed get isMobile(): boolean {\n return this._viewport === 'xs' || this._viewport === 'sm';\n }\n\n constructor(props: IOrderTemplateProps<IOrderTemplateData>, state: IOrderTemplateLineActionMessageState) {\n super(props);\n this.className = 'ms-order-template';\n this._viewport =\n props.context.request && props.context.request.device && props.context.request.device.Type === 'Mobile' ? 'xs' : 'lg';\n this._updateViewport = this._updateViewport.bind(this);\n\n this.state = {\n itemKey: '',\n userMessage: '',\n statusCssString: 'success',\n messageGlyph: 'fas fa-check',\n isOpen: false,\n isItemAddedToOrderTemplateOpen: false,\n isConfirmAddSelectionToBagModalOpen: false,\n productSelection: [],\n isDetailsDisplayed: false,\n isQuantityDisabledForUpdate: false\n };\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n this._updateViewport();\n\n if (MsDyn365.isBrowser && !this.props.context.request.user.isAuthenticated && !this.props.context.request.params.isEditor) {\n window.location.assign(this.props.context.request.user.signInUrl || '/');\n }\n }\n\n @action\n public async componentDidMount(): Promise<void> {\n this.setState({});\n const orderTemplate = await this.props.data.orderTemplate;\n this.props.config.heading!.text = orderTemplate?.productList.Name || '';\n this.setState({\n productSelection: orderTemplate?.orderTemplateLines as IOrderTemplateLineViewModel[]\n });\n\n if (MsDyn365.isBrowser) {\n window.addEventListener('resize', this._updateViewport);\n this._updateViewport();\n }\n }\n\n public componentWillUnmount(): void {\n if (MsDyn365.isBrowser) {\n window.removeEventListener('resize', this._updateViewport);\n }\n }\n\n public shouldComponentUpdate(\n nextProps: IOrderTemplateProps<IOrderTemplateData>,\n nextState: IOrderTemplateLineActionMessageState\n ): boolean {\n if (this.state === nextState && this.props === nextProps) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element | null {\n const { heading, className } = this.props.config;\n const { emptyOrderTemplateLinesText, errorGettingOrderTemplateLines } = this.props.resources;\n const { orderTemplate, cart } = this.props.data;\n\n if (cart.status === 'LOADING' || ObjectExtensions.isNullOrUndefined(orderTemplate) || orderTemplate.status === 'LOADING') {\n const errorProps: IOrderTemplateViewProps = {\n ...(this.props as IOrderTemplateProps<IOrderTemplateData>),\n OrderTemplateLines: {\n moduleProps: this.props,\n className: classnames(this.className, className)\n },\n status: 'LOADING',\n statusMessage: <Spinner className={this.className} msg={this.props.resources.progressNotificationText} />,\n heading: heading && <Heading className={`${this.className}__heading`} {...heading} />,\n resources: this.props.resources\n };\n return this.props.renderView(errorProps);\n }\n\n if (cart.status === 'FAILED' || orderTemplate.status === 'FAILED') {\n const errorProps: IOrderTemplateViewProps = {\n ...(this.props as IOrderTemplateProps<IOrderTemplateData>),\n OrderTemplateLines: {\n moduleProps: this.props,\n className: classnames(`${this.className}`, className)\n },\n status: 'FAILED',\n statusMessage: <OrderTemplateLinesStatusMessage errorType='FAILED' text={errorGettingOrderTemplateLines} />,\n heading: heading && <Heading className={`${this.className}__heading`} {...heading} />,\n resources: this.props.resources\n };\n\n return this.props.renderView(errorProps);\n }\n\n const orderTemplateResult = orderTemplate && orderTemplate.result;\n const orderTemplateLines = orderTemplateResult && orderTemplateResult.orderTemplateLines;\n\n if (!orderTemplateResult || !orderTemplateLines || orderTemplateLines.length === 0) {\n if (orderTemplateResult && !this._isFirstPage() && MsDyn365.isBrowser) {\n window.location.href = this._getOrderTemplatePageUrl();\n return null;\n }\n\n const emptyViewProps: IOrderTemplateViewProps = {\n ...(this.props as IOrderTemplateProps<IOrderTemplateData>),\n OrderTemplateLines: {\n moduleProps: this.props,\n className: classnames(`${this.className}`, className)\n },\n status: 'EMPTY',\n statusMessage: <OrderTemplateLinesStatusMessage errorType='EMPTY' text={emptyOrderTemplateLinesText} />,\n heading: heading && <Heading className={`${this.className}__heading`} {...heading} />,\n resources: this.props.resources,\n orderActions:\n orderTemplateResult &&\n this._renderOrderTemplateActions(orderTemplateResult, this._isChannelMultipleCatalogsFeatureEnabled()),\n bulkOrderLineActions: orderTemplateResult && this._getOrderTemplateLineActions(orderTemplateResult.productList.Id),\n OrderTemplateActions: {\n className: `${this.className}-action-bar`,\n tag: 'div'\n }\n };\n\n return this.props.renderView(emptyViewProps);\n }\n\n const viewProps: IOrderTemplateViewProps = {\n ...(this.props as IOrderTemplateProps<IOrderTemplateData>),\n OrderTemplateLines: {\n moduleProps: this.props,\n className: classnames(`${this.className}`, className)\n },\n status: 'SUCCESS',\n productsStatusMessage: this.state.isOpen && (\n <div className={`${this.className}-products-status`}>\n <Alert color={this.state.statusCssString} isOpen={this.state.isOpen} toggle={this._onDismiss}>\n <span aria-live='assertive'>{this.state.userMessage}</span>\n </Alert>\n </div>\n ),\n heading: heading && <Heading className={`${this.className}__heading`} {...heading} />,\n OrderTemplateActions: {\n className: `${this.className}-action-bar`,\n tag: 'div'\n },\n ProductsTable: {\n className: `${this.className}__table`,\n tag: 'table',\n role: 'grid'\n },\n ProductsTableRow: {\n className: `${this.className}-table-line`,\n tag: 'tr'\n },\n ProductsTableHeading: this._renderProductListHeader(this.props.resources),\n ProductDetails: {\n className: `${this.className}-table-line__link`,\n tag: 'a'\n },\n orderLines: this._renderProductList(),\n callbacks: { updateQuantity: debounce(this._changeQuantity, 2000) },\n orderActions: this._renderOrderTemplateActions(orderTemplateResult, this._isChannelMultipleCatalogsFeatureEnabled()),\n pagination: this._renderPagination(),\n itemAddedToCartDialog: this._renderItemAddedToCartDialog(),\n bulkOrderLineActions: this._getOrderTemplateLineActions(orderTemplateResult.productList.Id),\n isDetailsDisplayed: this.state.isDetailsDisplayed,\n toggleDetailsDisplayed: this._toggleDetailsDisplayed,\n detailedProductView: this.state.detailedProductView,\n isMobile: this.isMobile\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n public onSelect(line: IOrderTemplateLineViewModel, isChecked: boolean): void {\n line.isChecked = isChecked;\n\n const updated =\n this.state.productSelection.map(product => {\n if (product.fullProduct?.ProductDetails.ItemId === line.fullProduct?.ProductDetails.ItemId) {\n line.isChecked = isChecked;\n }\n return product;\n }) || [];\n\n this.setState({\n productSelection: updated\n });\n }\n\n public onSelectAll(isChecked: boolean): void {\n const updated =\n this.state.productSelection.map(line => {\n line.isChecked = isChecked;\n return line;\n }) || [];\n\n this.setState({\n productSelection: updated\n });\n }\n\n private _renderProductListHeader(resources: IOrderTemplateResources): React.ReactNode {\n const {\n productImage,\n productNumberText,\n productText,\n productUnitPriceText,\n productUOMText,\n productQuantityText,\n productActionsText,\n selectAllRowsText,\n productLineCatalogName\n } = resources;\n const headers: IOrderTemplateTableHeadingProps = {\n productImage: productImage,\n productNumber: productNumberText,\n productName: productText,\n productUnitPrice: productUnitPriceText,\n productUOM: productUOMText,\n productQuantity: productQuantityText,\n productActions: productActionsText,\n selectAllRowsText,\n lines: this.state.productSelection,\n isMobile: this.isMobile,\n clickHandler: (isChecked: boolean) => {\n this.onSelectAll(isChecked);\n },\n isMultipleCatalogFeatureEnabledInHq: this._isChannelMultipleCatalogsFeatureEnabled(),\n productLineCatalogName: productLineCatalogName\n };\n\n return <OrderTemplateTableHeading {...headers} />;\n }\n\n private _getOrderTemplateLineActions(orderTemplateId: string): React.ReactNode {\n return (\n <OrderTemplateBulkActions\n {...this.props}\n orderTemplateId={orderTemplateId}\n selectedLines={this.state.productSelection && this.state.productSelection.filter(line => line.isChecked)}\n onAddSelectionToBag={this._onAddSelectionToBag}\n onRemoveSelection={this._onRemoveSelection}\n isMinifiedView={this.isMobile}\n isMultipleCatalogFeatureEnabledInHq={this._isChannelMultipleCatalogsFeatureEnabled()}\n telemetryContent={this.telemetryContent}\n />\n );\n }\n\n private _generateLinesAddedToCartDialogResources(): ILinesAddedToCartDialogResources {\n return {\n viewCartButtonText: this.props.resources.viewCartButtonText,\n orderTemplateCloseButtonText: this.props.resources.orderTemplateCloseButtonText,\n linesAddedToCartHeaderItemsOneText: this.props.resources.linesAddedToCartHeaderItemsOneText,\n linesAddedToCartHeaderLinesOneText: this.props.resources.linesAddedToCartHeaderLinesOneText,\n linesAddedToCartHeaderLinesFormatText: this.props.resources.linesAddedToCartHeaderLinesFormatText,\n linesAddedToCartHeaderMessageText: this.props.resources.linesAddedToCartHeaderMessageText\n };\n }\n\n private _generateItemAddedToCartDialogResources(): IItemAddedToCartDialogResources {\n return {\n viewCartButtonText: this.props.resources.viewCartButtonText,\n orderTemplateCloseButtonText: this.props.resources.orderTemplateCloseButtonText,\n itemAddedToCartHeaderItemOneText: this.props.resources.itemAddedToCartHeaderItemOneText,\n itemAddedToCartHeaderItemFormatText: this.props.resources.itemAddedToCartHeaderItemFormatText,\n itemAddedToCartHeaderMessageText: this.props.resources.itemAddedToCartHeaderMessageText,\n freePriceText: this.props.resources.freePriceText,\n originalPriceText: this.props.resources.originalPriceText,\n currentPriceText: this.props.resources.currentPriceText\n };\n }\n\n private readonly _isChannelMultipleCatalogsFeatureEnabled = (): boolean => {\n let isMultipleCatalogFeatureEnabledInHq = false;\n if (this.props.data.featureState) {\n isMultipleCatalogFeatureEnabledInHq =\n this.props.data.featureState.result?.find(\n feature => feature.Name === 'Dynamics.AX.Application.ChannelMultipleCatalogsFeature'\n )?.IsEnabled || false;\n }\n return isMultipleCatalogFeatureEnabledInHq;\n };\n\n private readonly _onRemoveSelection = (): void => {\n const { context, resources } = this.props;\n const { telemetry } = context;\n const { removeSelectedFailureMessage, removeSelectedSuccessMessage } = resources;\n const lines = this.state.productSelection;\n const productListLines = lines && lines.length && lines.filter(line => line.isChecked).map(line => line.productListLine);\n\n if (productListLines && productListLines.length > 0) {\n const productListId = productListLines[0].ProductListId;\n\n const maxWaitTimeInMilliSeconds: number = 1000;\n removeProductListLinesAsync({ callerContext: context.actionContext }, productListId!, productListLines)\n .then(async () => {\n this.setState({\n userMessage: removeSelectedSuccessMessage,\n statusCssString: 'success',\n messageGlyph: 'fas fa-check',\n isOpen: true\n });\n // eslint-disable-next-line no-promise-executor-return -- fix\n await new Promise(resolve => setTimeout(resolve, maxWaitTimeInMilliSeconds));\n window.location.reload();\n })\n .catch(error => {\n telemetry.warning('[order-template-lines] Unable remove items from the order template lines');\n telemetry.error(error);\n this.setState({\n userMessage: removeSelectedFailureMessage,\n statusCssString: 'success',\n messageGlyph: 'fas fa-check',\n isOpen: true\n });\n });\n }\n };\n\n private readonly _getOrderTemplatePageUrl = (): string => {\n let url = getUrlSync('ordertemplate', this.props.context.actionContext) || '';\n url = url.includes('?') ? url.substr(0, url.indexOf('?')) : url;\n if (this.props.data.orderTemplate?.result?.productList.Id) {\n return `${url}?id=${this.props.data.orderTemplate.result.productList.Id}`;\n }\n return '';\n };\n\n private readonly _onAddSelectionToBag = async (): Promise<void> => {\n const lines = this.state.productSelection;\n const selectedLines = lines.filter(line => line.isChecked);\n if (selectedLines.length > 0) {\n for (const productLine of selectedLines) {\n const itemKey = productLine.fullProduct?.ProductDetails.ItemId ?? '';\n const product = productLine.fullProduct?.ProductDetails ?? {\n RecordId: 0,\n ProductTypeValue: 0,\n BasePrice: 0,\n Price: 0,\n AdjustedPrice: 0\n };\n const quantity = productLine.productListLine.Quantity ?? 0;\n if (this._isChannelMultipleCatalogsFeatureEnabled()) {\n const catalogId = productLine.productListLine.CatalogId;\n await this._addItemToBag(product, quantity, itemKey, catalogId);\n } else {\n await this._addItemToBag(product, quantity, itemKey);\n }\n }\n }\n return Promise.resolve(void 0);\n };\n\n private _renderOrderTemplateActions(\n orderTemplate: OrderTemplate,\n isMultipleCatalogFeatureEnabledInHq: boolean\n ): IOrderTemplateActionsViewProps {\n const { id, typeName, context, resources } = this.props;\n const {\n addTemplateToBagButtonText,\n renameTemplateButtonText,\n deleteTemplateButtonText,\n closeWindowButtonText,\n addToCartFailureMessage,\n addToCartSuccessMessage,\n addToCartProcessMessage,\n orderTemplateErrorMessage\n } = resources;\n\n const orderTemplateActions: IOrderTemplateActionsProps = {\n data: { orderTemplate },\n id,\n typeName,\n context,\n telemetryContent: this.telemetryContent,\n handlers: {\n onRenameTemplate: this._renameTemplate,\n onRemoveTemplate: this._removeTemplate\n },\n isMultipleCatalogFeatureEnabledInHq,\n renameOrderTemplateDialogStrings: this._generateOrderTemplateNameDialogResources(resources),\n resources: {\n addTemplateToBagButtonText,\n renameTemplateButtonText,\n deleteTemplateButtonText,\n addToCartFailureMessage,\n addToCartSuccessMessage,\n addToCartProcessMessage,\n closeWindowButtonText,\n orderTemplateErrorMessage,\n linesAddedToCartDialogResources: this._generateLinesAddedToCartDialogResources()\n }\n };\n\n return OrderTemplateActionsView(orderTemplateActions);\n }\n\n private _generateOrderTemplateNameDialogResources(resources: IOrderTemplateResources): IOrderTemplateNameDialogResources {\n return {\n orderTemplateHeaderLabel: resources.renameOrderTemplateTitleText,\n orderTemplateTitleLabel: resources.orderTemplateTitle,\n orderTemplateNameAriaLabel: resources.orderTemplateTitle,\n orderTemplateDescription: '',\n defaultOrderTemplateName: resources.defaultOrderTemplateName,\n orderTemplateButtonLabel: resources.renameOrderTemplateButtonText,\n orderTemplateCancelButtonLabel: resources.cancelBtnLabel\n };\n }\n\n private readonly _getCurrentUrl = (reqContext: IRequestContext): URL => {\n if (MsDyn365.isBrowser) {\n return new URL(window.location.href);\n }\n return new URL(reqContext.url.requestUrl.href);\n };\n\n /**\n * On close handler.\n */\n private readonly onCloseHandler = () => {\n this.setState({\n itemKey: this.state.itemKey,\n userMessage: this.state.userMessage,\n statusCssString: this.state.statusCssString,\n messageGlyph: this.state.messageGlyph,\n isOpen: this.state.isOpen,\n isItemAddedToOrderTemplateOpen: false\n });\n };\n\n private readonly _renderItemAddedToCartDialog = (): React.ReactNode | null => {\n if (!this.state.itemAddedToCartDialogData) {\n return null;\n }\n const isMultipleCatalogFeatureEnabledInHq =\n this.props.data.featureState?.result?.find(feature => feature.Name === 'Dynamics.AX.Application.ChannelMultipleCatalogsFeature')\n ?.IsEnabled || false;\n\n return (\n <ItemAddedToCartDialog\n className='msc-item-added-to-cart-dialog'\n id={this.props.id}\n typeName={this.props.typeName}\n context={this.props.context}\n dialogStrings={this._generateItemAddedToCartDialogResources()}\n data={this.state.itemAddedToCartDialogData}\n modalOpen={this.state.isItemAddedToOrderTemplateOpen}\n onClose={this.onCloseHandler}\n isMultipleCatalogFeatureEnabledInHq={isMultipleCatalogFeatureEnabledInHq}\n />\n );\n };\n\n private _isFirstPage(): boolean {\n return this._getCurrentPageNumber() === 0;\n }\n\n private _getCurrentPageNumber(): number {\n const itemsPerPage = this.props.config.itemsPerPage || 50;\n return (this.props.context.request.query && +this.props.context.request.query.skip / itemsPerPage) || 0;\n }\n\n private readonly _renderPagination = (): React.ReactNode | null => {\n const { config, context, data, resources } = this.props;\n const orderTemplate = data && data.orderTemplate && data.orderTemplate.result;\n if (!orderTemplate) {\n return null;\n }\n\n const fullUrl = this._getCurrentUrl(context.request);\n const itemsPerPage = config.itemsPerPage || 50;\n const currentPageNumber = this._getCurrentPageNumber();\n const skipCount = currentPageNumber * itemsPerPage;\n const totalItems = orderTemplate && orderTemplate.totalLines;\n const previousText = resources.flipperPrevious;\n const nextText = resources.flipperNext;\n\n if (totalItems <= itemsPerPage) {\n return null;\n }\n\n return (\n <UncontrolledPagination\n className={`${this.className}__pagination`}\n role='navigation'\n aria-label={resources.paginationAriaLabel}\n url={fullUrl.href}\n qsp='skip'\n items={totalItems}\n itemsPerPage={itemsPerPage}\n startingItem={skipCount}\n previousText={this._renderPrev(previousText)}\n nextText={this._renderNext(nextText)}\n previousAriaLabel={previousText}\n nextAriaLabel={nextText}\n />\n );\n };\n\n private _renderProductList(): IOrderTemplateLineViewProps[] {\n const {\n selectOneRowText,\n moreButtonText,\n viewProductDetailsText,\n priceFree,\n originalPriceText,\n currentPriceText,\n addOrderTemplateItemToBagButtonText,\n removeItemFromOrderTemplateButtonText,\n productDimensionTypeColor,\n productDimensionTypeSize,\n productDimensionTypeStyle,\n inputQuantityAriaLabel,\n deleteButtonText,\n incrementButtonAriaLabel,\n decrementButtonAriaLabel,\n unavailableProductErrorMessage,\n outOfStockProductErrorMessage\n } = this.props.resources;\n\n const { context, telemetry, data } = this.props;\n const { catalogs } = data;\n const { imageSettings } = this.props.config;\n\n return this.state.productSelection.map((line, index) => {\n const currentProductProps: IOrderTemplateLineProps = {\n orderTemplateLine: line,\n productListLine: line.productListLine,\n price: line.fullProduct?.ProductPrice,\n error: line.error,\n shouldDisable: line.shouldDisable,\n context,\n isQuantityDisabledForUpdate: this.state.isQuantityDisabledForUpdate,\n productUrl: line.fullProduct\n ? this._updateProductUrlCatalog(line.fullProduct.ProductDetails, context, line.productListLine.CatalogId)\n : '',\n imageSettings,\n telemetry,\n moduleId: this.props.id,\n moduleTypeName: this.props.typeName,\n quantity: line.productListLine.Quantity!,\n handlers: {\n onAddToBag: this._addItemToBag,\n onRemoveItem: this._removeItemFromOrderTemplateLines,\n onChangeQuantity: this._changeQuantity,\n onSelect: this.onSelect.bind(this)\n },\n resources: {\n selectOneRowText,\n moreButtonText,\n viewProductDetailsText,\n productDimensionTypeColor,\n productDimensionTypeSize,\n productDimensionTypeStyle,\n freePriceText: priceFree,\n originalPriceText,\n currentPriceText,\n inputQuantityAriaLabel,\n removeFromOrderTemplateLinesText: removeItemFromOrderTemplateButtonText,\n addToBagButtonText: addOrderTemplateItemToBagButtonText,\n deleteButtonText,\n incrementButtonAriaLabel,\n decrementButtonAriaLabel,\n unavailableProductErrorMessage,\n outOfStockProductErrorMessage\n },\n index,\n isMobile: this.isMobile,\n toggleDetailsDisplayed: this._toggleDetailsDisplayed,\n isMultipleCatalogFeatureEnabledInHq: this._isChannelMultipleCatalogsFeatureEnabled(),\n catalogs: catalogs && catalogs.result\n };\n\n return OrderTemplateLineView(currentProductProps)!;\n });\n }\n\n private readonly _toggleDetailsDisplayed = (props: IOrderTemplateLineProps): void => {\n let state = {\n isDetailsDisplayed: !this.state.isDetailsDisplayed\n };\n if (props) {\n state = {\n ...state,\n ...{\n detailedProductView: OrderTemplateMobileLineView(props)\n }\n };\n }\n this.setState(state);\n };\n\n // This method is used to update the product url with the catalogId\n private readonly _updateProductUrlCatalog = (\n productDetails: SimpleProduct,\n context: ICoreContext,\n catalogId: number | undefined\n ): string => {\n const productUrl = getProductUrlSync(productDetails, context.actionContext, undefined);\n if (!StringExtensions.isNullOrWhitespace(productUrl) && catalogId !== undefined) {\n const absoluteUrl = new URL(productUrl, window.location.href);\n absoluteUrl.searchParams.set('catalogid', `${catalogId ?? 0}`);\n return absoluteUrl.href;\n }\n\n return productUrl;\n };\n\n // Dismiss alert when addingToCart/removeItem\n private readonly _onDismiss = () => {\n this.setState({\n isOpen: false\n });\n };\n\n private readonly _changeQuantity = async (itemKey: string, quantity: number, props?: IOrderTemplateLineProps) => {\n const { context, data, telemetry, config, resources } = this.props;\n const { orderTemplate } = data;\n\n if (context) {\n if (orderTemplate?.result) {\n const orderTemplateLinesData = orderTemplate.result.orderTemplateLines;\n if (orderTemplateLinesData) {\n const orderLineIndex = orderTemplateLinesData.findIndex(\n (lines: OrderTemplateLine) => lines.productListLine.LineId === itemKey\n );\n const newProductListLine = { ...orderTemplateLinesData[orderLineIndex] };\n if (orderTemplateLinesData[orderLineIndex].productListLine.Quantity === quantity) {\n return;\n }\n const prevQuantity = newProductListLine.productListLine.Quantity;\n newProductListLine.productListLine.Quantity = quantity;\n const { fullProduct, ...line } = newProductListLine;\n\n // Update mobile modal\n if (props) {\n props.quantity = quantity;\n this.setState({\n detailedProductView: OrderTemplateMobileLineView(props)\n });\n }\n\n this.setState({\n isQuantityDisabledForUpdate: true\n });\n\n updateProductListLinesAsync({ callerContext: context.actionContext }, orderTemplate.result.productList.Id, [\n line.productListLine\n ])\n .then(list => {\n this.setState({\n itemKey,\n userMessage: '',\n statusCssString: 'success',\n messageGlyph: 'fas fa-check',\n isQuantityDisabledForUpdate: false,\n isOpen: false\n });\n if (list) {\n const newLine = list.find(lines => lines.LineId === itemKey);\n orderTemplateLinesData[orderLineIndex].productListLine = newLine!;\n const updatedLines = [...orderTemplateLinesData];\n updatedLines[orderLineIndex] = { fullProduct, productListLine: newLine! };\n const updatedOrderTemplate = { ...orderTemplate.result, ProductListLines: updatedLines };\n context.actionContext.update(\n new ActiveOrderTemplateLinesInput(context.actionContext.requestContext, config),\n updatedOrderTemplate\n );\n }\n })\n .catch(error => {\n telemetry.warning('[order-template-lines] Unable to update product quantity.');\n telemetry.error(error);\n const userMessage = resources.editOrderTemplateLineQuantityError;\n if (props) {\n props && (props.productListLine.Quantity = prevQuantity);\n this.setState({\n itemKey,\n userMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isQuantityDisabledForUpdate: false,\n isOpen: true,\n detailedProductView: OrderTemplateMobileLineView(props)\n });\n } else {\n newProductListLine.productListLine.Quantity = prevQuantity;\n this.setState({\n itemKey,\n userMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isQuantityDisabledForUpdate: false,\n isOpen: true\n });\n }\n });\n }\n }\n }\n };\n\n private readonly _addItemToBag = async (\n product: SimpleProduct,\n quantity: number,\n itemKey: string,\n catalogId?: number | undefined\n ): Promise<void> => {\n const { context, data, resources, telemetry } = this.props;\n const { cart } = data;\n const { maxQuantityLimitText, addedToCartFailureMessage } = resources;\n\n if (context) {\n if (cart.result) {\n const addProductToCartInput = {\n product,\n count: quantity,\n catalogId\n };\n\n await cart.result\n .addProductToCart(addProductToCartInput)\n .then((result: ICartActionResult) => {\n if (result.status === 'SUCCESS') {\n return getPriceForSelectedVariant(\n new PriceForSelectedVariantInput(\n product.RecordId,\n this.props.context.actionContext.requestContext.apiSettings.channelId,\n product\n ),\n this.props.context.actionContext\n ).then(priceResult => {\n if (!priceResult) {\n return AsyncResult.reject('Failed to retrieve product price');\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- read config file.\n const isMiniCart = context.app.config.addToCartBehavior === 'showMiniCart';\n this.setState({\n itemKey,\n userMessage: '',\n statusCssString: 'success',\n messageGlyph: 'fas fa-check',\n isOpen: false,\n isItemAddedToOrderTemplateOpen: !isMiniCart,\n itemAddedToCartDialogData: {\n product,\n productPrice: priceResult,\n quantity\n },\n isDetailsDisplayed: false\n });\n return AsyncResult.resolve();\n });\n } else {\n switch (result.substatus) {\n case 'MAXQUANTITY':\n if (context.app.config.maxQuantityForCartLineItem) {\n const cartLineQuantity: number | undefined =\n cart.result?.cart.CartLines &&\n cart.result?.cart.CartLines.find(result => result.ProductId === product.RecordId)?.Quantity;\n const defaultMessage = `You can only add ${context.app.config.maxQuantityForCartLineItem} of this item to your shopping bag`;\n this.setState({\n itemKey,\n userMessage:\n cartLineQuantity !== undefined\n ? maxQuantityLimitText\n .replace('{curQuantity}', cartLineQuantity.toString())\n .replace(\n '{maxQuantity}',\n context.app.config.maxQuantityForCartLineItem.toString()\n ) || defaultMessage\n : defaultMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n return AsyncResult.resolve();\n } else {\n const defaultMessage = `Max quantity for cart line item is undefined. Please define in configuration settings.`;\n this.setState({\n itemKey,\n userMessage: defaultMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n return AsyncResult.resolve();\n }\n case 'INVOICEINCART': {\n this.setState({\n itemKey,\n userMessage: result.errorDetails?.LocalizedMessage || addedToCartFailureMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n return AsyncResult.resolve();\n }\n default:\n telemetry.debug('[order-template-lines] Unable to Update Cart Line from the order template lines');\n this.setState({\n itemKey,\n userMessage: addedToCartFailureMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n return AsyncResult.resolve();\n }\n }\n })\n .catch((error: Error) => {\n telemetry.warning(error.message);\n telemetry.debug('[order-template-lines] Error trying to Update Cart Line from the order template lines');\n if (StringExtensions.isNullOrWhitespace(error.message)) {\n this.setState({\n itemKey,\n userMessage: error.message,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n } else {\n this.setState({\n itemKey,\n userMessage: addedToCartFailureMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n }\n });\n }\n }\n };\n\n private readonly _removeItemFromOrderTemplateLines = async (line: IOrderTemplateLineViewModel) => {\n const { context, data, telemetry } = this.props;\n const { orderTemplate } = data;\n\n if (context && context.actionContext) {\n const maxWaitTimeInMilliSeconds: number = 1000;\n const userToken = context.request.user.isAuthenticated && context.request.user.token;\n if (userToken && orderTemplate?.result && line) {\n const featureStates = await getFeatureState(createGetFeatureStateInput(context.actionContext), context.actionContext);\n let isMultipleCatalogFeatureEnabledInHq = false;\n if (ArrayExtensions.hasElements(featureStates)) {\n isMultipleCatalogFeatureEnabledInHq =\n featureStates.find(\n (featureState: FeatureState) => featureState.Name === 'Dynamics.AX.Application.ChannelMultipleCatalogsFeature'\n )?.IsEnabled || false;\n }\n const catalogId = getCatalogId(context.actionContext.requestContext);\n if (isMultipleCatalogFeatureEnabledInHq) {\n line.productListLine.CatalogId = catalogId;\n }\n removeProductListLinesAsync({ callerContext: context.actionContext }, line.productListLine.ProductListId!, [\n line.productListLine\n ])\n .then(async () => {\n // eslint-disable-next-line no-promise-executor-return -- fix\n await new Promise(resolve => setTimeout(resolve, maxWaitTimeInMilliSeconds));\n window.location.reload();\n })\n .catch(error => {\n telemetry.warning('[order-template-lines] Unable remove items from the order template lines');\n telemetry.error(error);\n });\n } else {\n telemetry.warning(\n '[order-template-lines] Unable remove items from the order template lines user token or lineItemID was not found'\n );\n }\n }\n };\n\n private readonly _renameTemplate = async (_template: ProductList): Promise<void> => {\n window.location.reload();\n return Promise.resolve();\n };\n\n private readonly _removeTemplate = () => {\n const { context, data, telemetry, resources } = this.props;\n const { orderTemplate } = data;\n\n if (context && context.actionContext) {\n const userToken = context.request.user.isAuthenticated && context.request.user.token;\n if (userToken && orderTemplate && orderTemplate.result) {\n deleteAsync({ callerContext: context.actionContext }, orderTemplate.result.productList)\n .then()\n .catch((error: string) => {\n telemetry.warning('[order-template] Unable to delete order template.');\n telemetry.error(error);\n this.setState({\n itemKey: orderTemplate.result?.productList.Id || '',\n userMessage: resources.deleteOrderTemplateFailedText,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n });\n const newLink = getUrlSync('ordertemplatelist', this.props.context.actionContext);\n if (newLink) {\n window.location.assign(newLink);\n }\n } else {\n telemetry.warning('[order-template] Failed to delete order template. Order template was not found');\n }\n } else {\n telemetry.warning('[order-template] Failed to delete order template.');\n }\n };\n\n private _updateViewport(): void {\n this._viewport = this._getViewport();\n }\n\n private readonly _getViewport = (): GridSize => {\n const { context } = this.props;\n\n // Always render in mobile viewport on a mobile device\n if (context.request && context.request.device && context.request.device.Type === 'Mobile') {\n return 'xs';\n }\n\n if (MsDyn365.isBrowser && window.innerWidth) {\n const gridSettings = context.request.gridSettings;\n if (gridSettings) {\n if (gridSettings.xs && window.innerWidth <= gridSettings.xs.w) {\n return 'xs';\n } else if (gridSettings.sm && window.innerWidth <= gridSettings.sm.w) {\n return 'sm';\n } else if (gridSettings.md && window.innerWidth <= gridSettings.md.w) {\n return 'md';\n } else if (gridSettings.lg && window.innerWidth <= gridSettings.lg.w) {\n return 'lg';\n }\n return 'xl';\n }\n }\n\n return 'xs';\n };\n\n /**\n * Renders a Pagination previous text.\n * @param paginationPreviousText - Pagination previous text from resources.\n * @returns Previous text and flipper icon.\n */\n private readonly _renderPrev = (paginationPreviousText: string) => {\n return (\n <div className='msc-pagination__prev'>\n <span className={`${this.props.config.className}__pagination-left`} aria-hidden='true' />\n <span className='prev-text'>{paginationPreviousText}</span>\n </div>\n );\n };\n\n /**\n * Renders a Pagination next text.\n * @param paginationNextText - Pagination next text from resources.\n * @returns Next text and flipper icon.\n */\n private readonly _renderNext = (paginationNextText: string) => {\n return (\n <div className='msc-pagination__next'>\n <span className='next-text'>{paginationNextText}</span>\n <span className={`${this.props.config.className}__pagination-right`} aria-hidden='true' />\n </div>\n );\n };\n}\n\nexport default OrderTemplateLines;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Button, INodeProps, Modal, ModalBody, ModalFooter, ModalHeader, Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IOrderTemplateLineViewProps } from './components';\nimport { IOrderTemplateViewProps } from './order-template';\n\nconst OrderTemplateLinesView: React.FC<IOrderTemplateViewProps> = (props: IOrderTemplateViewProps) => {\n const {\n OrderTemplateLines,\n status,\n statusMessage,\n heading,\n ProductsTable,\n ProductsTableHeading,\n orderLines,\n ProductsTableRow,\n productsStatusMessage,\n OrderTemplateActions,\n orderActions,\n pagination,\n itemAddedToCartDialog,\n bulkOrderLineActions,\n isDetailsDisplayed,\n detailedProductView,\n toggleDetailsDisplayed,\n resources: {\n cancelBtnLabel,\n productNumberText,\n productText,\n productUnitPriceText,\n productUOMText,\n productQuantityText,\n productLineCatalogName\n }\n } = props;\n\n const toggleDetails = React.useCallback(() => {\n toggleDetailsDisplayed && toggleDetailsDisplayed(undefined);\n }, [toggleDetailsDisplayed]);\n\n return (\n <Module {...OrderTemplateLines}>\n {heading}\n {OrderTemplateActions && (\n <Node {...OrderTemplateActions}>\n {orderActions?.addTemplateToBag}\n {orderActions?.renameTemplate}\n {orderActions?.removeTemplate}\n {orderActions?.actionsSplitButton}\n {!isDetailsDisplayed && productsStatusMessage}\n </Node>\n )}\n {bulkOrderLineActions}\n {status !== 'SUCCESS' && statusMessage}\n {ProductsTable && orderLines && orderLines.length > 0 && (\n <Node className='ms-order-template__content'>\n <Node {...ProductsTable}>\n {ProductsTableHeading}\n <tbody>\n {orderLines &&\n orderLines.map(product => {\n return _renderItem(product, productQuantityText, ProductsTableRow);\n })}\n </tbody>\n </Node>\n {pagination}\n </Node>\n )}\n {itemAddedToCartDialog}\n <Modal\n wrapClassName='ms-order-template-mobile-view-modal'\n autoFocus\n fade={false}\n applicationNode='renderPage'\n isOpen={isDetailsDisplayed}\n toggle={toggleDetails}\n >\n <ModalHeader toggle={toggleDetails}>Product Details</ModalHeader>\n <ModalBody>\n <ul>\n <li>{detailedProductView?.productImage}</li>\n <li className='product-info'>\n <span>{productText}:</span>\n {detailedProductView?.productInfo}\n </li>\n <li>\n <span>{productLineCatalogName}:</span>\n {detailedProductView?.productLineCatalog}\n </li>\n <li>\n <span>{productNumberText}:</span>\n {detailedProductView?.productNumber}\n </li>\n <li>\n <span>{productUnitPriceText}:</span>\n {` `}\n {detailedProductView?.productPrice}\n </li>\n <li>\n <span>{productUOMText}:</span>\n {` `}\n {detailedProductView?.productUnitOfMeasure}\n </li>\n <li>\n <span>{productQuantityText}:</span>\n {detailedProductView?.productQuantityView}\n </li>\n {productsStatusMessage && <li>{productsStatusMessage}</li>}\n </ul>\n </ModalBody>\n <ModalFooter>\n <Button onClick={toggleDetails}>{cancelBtnLabel}</Button>\n </ModalFooter>\n </Modal>\n </Module>\n );\n};\n\nconst _renderItem = (product: IOrderTemplateLineViewProps, quantityLabel: string, ProductsTableRow?: INodeProps): JSX.Element | null => {\n if (!product) {\n return null;\n }\n\n const {\n key,\n selectLine,\n productLineCatalog,\n productImage,\n productPrice,\n productNumber,\n addToBagButton,\n removeButton,\n productInfo,\n productUnitOfMeasure,\n productQuantityView,\n productQuantity,\n popUp,\n isMobile,\n extraActionsPopup,\n isMultipleCatalogFeatureEnabledInHq,\n disabled\n } = product;\n\n const lineVisibility = disabled\n ? {\n pointerEvents: 'none',\n opacity: 0.5\n }\n : {\n pointerEvents: 'auto',\n opacity: 1\n };\n\n const disableElement: React.CSSProperties = lineVisibility as React.CSSProperties;\n\n return (\n <Node key={key} className={`${ProductsTableRow!.className}`} {...ProductsTableRow}>\n <td>{selectLine}</td>\n {!isMobile && isMultipleCatalogFeatureEnabledInHq && <td style={disableElement}>{productLineCatalog}</td>}\n <td style={disableElement}>{productImage}</td>\n {isMobile ? (\n <td>\n <div>{productNumber}</div>\n <div style={disableElement}>\n {quantityLabel}:{` `}\n {productQuantity}\n </div>\n </td>\n ) : (\n <td>{productNumber}</td>\n )}\n {!isMobile && <td style={disableElement}>{productInfo}</td>}\n {!isMobile && <td style={disableElement}>{productPrice}</td>}\n {!isMobile && <td style={disableElement}>{productUnitOfMeasure}</td>}\n {!isMobile && <td style={disableElement}>{productQuantityView}</td>}\n {isMobile && <td style={disableElement}>{popUp}</td>}\n {!isMobile && !isMultipleCatalogFeatureEnabledInHq && (\n <td style={disableElement}>\n {addToBagButton}\n {removeButton}\n </td>\n )}\n <td style={disableElement}>{extraActionsPopup}</td>\n </Node>\n );\n};\n\nexport default OrderTemplateLinesView;\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 { ITelemetry } from '@msdyn365-commerce/core';\nimport { AttributeDataType, DisplayTemplate, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\n\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport { DimensionTypes } from '@msdyn365-commerce-modules/retail-actions';\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\n\n/**\n * Types of product refiner values.\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\nexport enum ProductRefinerValueDataTypeValue {\n /**\n * Range slider is used for selections like price.\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Range = 1,\n\n /**\n * Range input is a different way to specify ranges and can be expressed with input boxes\n * as well as a set of discrete single-select type values.\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n RangeInput = 4,\n\n /**\n * This is a discrete list item, either multi-select or single-select.\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n List = 5,\n\n /**\n * Boolean types allows only single-select.\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Boolean = 6\n}\n\n/**\n * Types of product refiners.\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\nexport enum ProductRefinerTypeValue {\n /**\n * Refiner values are single-select.\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Single = 0,\n\n /**\n * Refiner values are multi-select.\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Multi = 1\n}\n\n/**\n * ProductRefinerSource enum type.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\nexport enum ProductRefinerSource {\n /**\n * The None member.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n None = 0,\n\n /**\n * The Attribute member.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Attribute = 1,\n\n /**\n * The Category member.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Category = 2,\n\n /**\n * The Price member.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Price = 3,\n\n /**\n * The Rating member.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Rating = 4\n}\n\nexport interface IRefineItemData {\n sourceValue?: number;\n swatchImageUrl?: string;\n swatchColorHexCode?: string;\n refinerItemId: number;\n dataTypeValue?: number;\n name: string;\n label: string;\n count?: number;\n isChecked: boolean;\n refineItemUrl?: string;\n minValue?: string;\n maxValue?: string;\n dimensionType?: DimensionTypes;\n rowNumber?: number;\n unitText?: string;\n updatedSliderMaxValue?: string;\n updatedSliderMinValue?: string;\n}\n/**\n * Checks if the data type value corresponds to a slider.\n * @param dataTypeValue\n */\nexport function isRangeType(dataTypeValue: number | undefined): boolean {\n return dataTypeValue === AttributeDataType.Currency || dataTypeValue === AttributeDataType.Decimal;\n}\n\n/**\n * Checks if the data type value corresponds to a range type integer.\n * @param dataTypeValue\n */\nexport function isRangeTypeForInteger(dataTypeValue: number | undefined): boolean {\n return (\n dataTypeValue === AttributeDataType.Currency ||\n dataTypeValue === AttributeDataType.Decimal ||\n dataTypeValue === AttributeDataType.Integer\n );\n}\n\n/**\n * Checks if the data type value corresponds to a custom input box Range.\n * @param dataTypeValue\n */\nexport function isCustomRangeTypeIntegerSelected(\n selectedRefinementCriterion: ProductRefinerValue,\n parentProductRefinerHierarchy: IProductRefinerHierarchy\n): boolean {\n return (\n selectedRefinementCriterion?.RowNumber !== undefined &&\n selectedRefinementCriterion?.RowNumber !== null &&\n selectedRefinementCriterion?.DataTypeValue === AttributeDataType.Integer &&\n parentProductRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Range\n );\n}\n\n/**\n * Checks if the selectedRefinementCriterion is siingle type with API va;ues or custom type.\n * If custom type then RowNumber is null\n * @param dataTypeValue\n */\nexport function isSingleSelectRangeTypeIntegerSelected(\n selectedRefinementCriterion: ProductRefinerValue,\n productRefinerValue: ProductRefinerValue\n): boolean {\n return (\n productRefinerValue.LeftValueBoundString === selectedRefinementCriterion?.LeftValueBoundString &&\n productRefinerValue.RightValueBoundString === selectedRefinementCriterion?.RightValueBoundString &&\n selectedRefinementCriterion?.RowNumber !== undefined &&\n selectedRefinementCriterion?.RowNumber !== null &&\n selectedRefinementCriterion !== undefined\n );\n}\n\n/**\n * Find the refinement criterion associated with this product refiner value.\n * @param productRefinerValue Product refiner value to match.\n * @param refinementCriteria Selected refinement criteria.\n */\nexport function findMatchingRefinementCriterion(\n productRefinerValue: ProductRefinerValue,\n refinementCriteria: ProductRefinerValue[]\n): ProductRefinerValue | undefined {\n // If the value is a range, then match only on data type value; otherwise match on item string\n return refinementCriteria.find((refinementCriterion: ProductRefinerValue) =>\n isMatchingRefinementCriterion(productRefinerValue, refinementCriterion)\n );\n}\n\n/**\n * Find the refinement criterion associated with this product refiner value.\n * @param productRefinerValue Product refiner value to match.\n * @param refinementCriteria Selected refinement criteria.\n * @param refinementCriterion\n */\nexport function isMatchingRefinementCriterion(\n productRefinerValue: ProductRefinerValue,\n refinementCriterion: ProductRefinerValue,\n parent?: IProductRefinerHierarchy\n): boolean {\n // If the value is a range, then match only on data type value; otherwise match on item string\n // Distinguish by displaytype also\n return (\n refinementCriterion.RefinerRecordId === productRefinerValue.RefinerRecordId &&\n refinementCriterion.RefinerSourceValue === productRefinerValue.RefinerSourceValue &&\n refinementCriterion.DataTypeValue === productRefinerValue.DataTypeValue &&\n ((parent?.DisplayTemplateValue === DisplayTemplate.Range\n ? isRangeType(refinementCriterion.DataTypeValue)\n : isRangeTypeForInteger(refinementCriterion.DataTypeValue)) ||\n refinementCriterion.LeftValueBoundString === productRefinerValue.LeftValueBoundString)\n );\n}\n\nexport function getIntegerRangeName(productRefinerValue: ProductRefinerValue): string {\n let rangeValue = '';\n\n if (productRefinerValue.LeftValueBoundString === '' && productRefinerValue.RightValueBoundString !== '') {\n rangeValue = `< ${productRefinerValue.RightValueBoundLocalizedString || productRefinerValue.RightValueBoundString}`;\n } else if (productRefinerValue.RightValueBoundString === '' && productRefinerValue.LeftValueBoundString !== '') {\n rangeValue = `> ${productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString}`;\n } else if (productRefinerValue.RightValueBoundString !== '' && productRefinerValue.LeftValueBoundString !== '') {\n rangeValue = `${productRefinerValue.LeftValueBoundLocalizedString ||\n productRefinerValue.LeftValueBoundString} - ${productRefinerValue.RightValueBoundString ||\n productRefinerValue.RightValueBoundString}`;\n }\n return rangeValue;\n}\n\n/**\n * Get input without formatting.\n * @param input - Input string.\n * @returns - Returns number.\n */\nexport function getInputWithoutFormatting(input: string): string {\n // First try to cast raw input to a number\n const inputAsNumber = Number(input);\n if (!Number.isNaN(inputAsNumber)) {\n return input;\n }\n\n // Otherwise try a reverse lookup and fall back to the raw input if all else fails\n // const reverseLookupResult = formattedPriceReverseLookup.get(input);\n // return reverseLookupResult || input;\n return input;\n}\n\nexport function getUpdatedRefinementCriteria(\n itemToggleNotification: IRefineItemToggleNotification,\n currentRefinementCriteria: ProductRefinerValue[]\n): ProductRefinerValue[] {\n const updatedRefinementCriteria: ProductRefinerValue[] = [];\n let toggledItemFound = false;\n\n // Keeping only itemToggled value for integer-range type in currentRefinementCriteria\n if (\n itemToggleNotification.parentProductRefinerHierarchy.DataTypeValue === AttributeDataType.Integer &&\n itemToggleNotification.parentProductRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Range\n ) {\n currentRefinementCriteria = currentRefinementCriteria.filter(r => {\n return r.RefinerRecordId !== itemToggleNotification.productRefinerValue.RefinerRecordId;\n });\n }\n\n currentRefinementCriteria.forEach((selectedCriterion: ProductRefinerValue) => {\n if (\n isMatchingRefinementCriterion(\n itemToggleNotification.productRefinerValue,\n selectedCriterion,\n itemToggleNotification.parentProductRefinerHierarchy\n )\n ) {\n toggledItemFound = true;\n if (itemToggleNotification.isSelecting) {\n const next = {\n ...selectedCriterion,\n LeftValueBoundString:\n (itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}`) ||\n selectedCriterion.LeftValueBoundString,\n RightValueBoundString:\n (itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}`) ||\n selectedCriterion.RightValueBoundString\n };\n updatedRefinementCriteria.push(next);\n } // Else the item is being de-selected, so omit it from the refinement criteria\n } else {\n // Keep existing criterion because it is not in the item toggle notification\n updatedRefinementCriteria.push(selectedCriterion);\n }\n });\n\n if (!toggledItemFound) {\n const next = {\n ...itemToggleNotification.productRefinerValue,\n LeftValueBoundString:\n (itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}`) ||\n itemToggleNotification.productRefinerValue.LeftValueBoundString,\n RightValueBoundString:\n (itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}`) ||\n itemToggleNotification.productRefinerValue.RightValueBoundString\n };\n updatedRefinementCriteria.push(next);\n\n // If single select, then deselect any others in the parent refiner group\n if (\n (itemToggleNotification.productRefinerValue.DataTypeValue === AttributeDataType.Text ||\n itemToggleNotification.productRefinerValue.DataTypeValue === AttributeDataType.TrueFalse) &&\n itemToggleNotification.parentProductRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect\n ) {\n itemToggleNotification.parentProductRefinerHierarchy.Values.forEach((child: ProductRefinerValue) => {\n if (child.RefinerRecordId === next.RefinerRecordId && child.LeftValueBoundString === next.LeftValueBoundString) {\n // Do nothing\n } else {\n const matchingIndex = updatedRefinementCriteria.findIndex((criterion: ProductRefinerValue) =>\n isMatchingRefinementCriterion(child, criterion, itemToggleNotification.parentProductRefinerHierarchy)\n );\n if (matchingIndex > -1) {\n updatedRefinementCriteria.splice(matchingIndex, 1);\n }\n }\n });\n }\n }\n\n return updatedRefinementCriteria;\n}\n\nexport function formatPrice(\n amount: string | undefined,\n currency: string | undefined,\n locale: string | undefined,\n telemetry: ITelemetry\n): string {\n if (!amount || !currency) {\n telemetry.trace(`[refine-menu.utilities.formatPrice] could not format price for ${amount} ${currency}`);\n return amount || '';\n }\n const priceAmount = (amount && Number(amount)) || 0;\n let result: string;\n\n try {\n result = new Intl.NumberFormat(locale, {\n style: 'currency',\n currencyDisplay: 'symbol',\n currency,\n minimumFractionDigits: 0\n }).format(priceAmount);\n } catch (error) {\n result = `${priceAmount} ${currency}`;\n telemetry.warning(`[refine-menu.utilities.formatPrice] Failed to format price for ${result}: ${error}`);\n }\n\n return result;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport { AttributeDataType, DisplayTemplate, ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\nimport { getPayloadObject, getTelemetryAttributes, IPayLoad } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { computed } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { ProductListInventoryFilteringOptions } from '../actions';\nimport { IChoiceSummaryProps } from './choice-summary.props';\nimport { getIntegerRangeName, isMatchingRefinementCriterion, isRangeType } from './utilities';\n\ninterface IRefinerMap {\n key: string;\n value: ProductRefinerValue;\n rangeDisplayType?: number | undefined;\n}\n\n/**\n * ChoiceSummary component.\n */\n@observer\nexport default class ChoiceSummary extends React.PureComponent<IChoiceSummaryProps> {\n private readonly closeButtonGlyph: string = 'msi-close-btn';\n\n private readonly payLoad: IPayLoad;\n\n @computed get selectedRefinersMap(): IRefinerMap[] {\n let { selectedChoices } = this.props;\n const { channelInventoryConfigurationId, refinerHierarchy } = this.props;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app configs are of generic type\n if (this.props.context?.app.config.productListInventoryDisplay === ProductListInventoryFilteringOptions.HideOOS) {\n selectedChoices = selectedChoices.filter(choice => {\n const parent = refinerHierarchy.find(\n (hierarchy: IProductRefinerHierarchy) =>\n !!hierarchy.Values.find((value: ProductRefinerValue) => isMatchingRefinementCriterion(value, choice))\n );\n return parent && parent.RecordId !== channelInventoryConfigurationId;\n });\n }\n return selectedChoices.map((selectedRefiner: ProductRefinerValue, index) => {\n const rangeParentDisplay = refinerHierarchy.filter(p => p.RecordId === selectedRefiner.RefinerRecordId);\n return {\n key: this._getKeyForRefinerValue(selectedRefiner, index.toString()),\n value: selectedRefiner,\n // parameter to store Display Template type\n rangeDisplayType: rangeParentDisplay[0]?.DisplayTemplateValue || undefined\n } as IRefinerMap;\n });\n }\n\n constructor(props: Readonly<IChoiceSummaryProps>) {\n super(props);\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, '');\n }\n\n public render(): JSX.Element {\n const { clearAllText, label, classNames, choiceAriaLabel, closeAriaLabel } = this.props;\n const items = this.selectedRefinersMap;\n this.payLoad.contentAction.etext = clearAllText;\n const clearAllAttributes = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\n return (\n <div className='msc-choice-summary'>\n {items.length > 0 && label && <span className='msc-choice-summary__label'>{label}</span>}\n <ul className={classnames(classNames, 'msc-choice-summary__list', 'list-unstyled')}>\n {items.map((item: IRefinerMap) => {\n this.payLoad.contentAction.etext = item.key;\n const attribute = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\n // Get range value for Range display and integer type only (not for Integer with TextBox(4) display)\n const rangeInteger =\n item.value.DataTypeValue === AttributeDataType.Integer &&\n item.rangeDisplayType &&\n item.rangeDisplayType === DisplayTemplate.Range &&\n item.value.RefinerRecordId !== 0;\n const newIntRange = rangeInteger\n ? item.key\n : item.value.LeftValueBoundString && item.value.LeftValueBoundLocalizedString === ''\n ? item.value.LeftValueBoundString\n : (item.value.LeftValueBoundLocalizedString || item.value.LeftValueBoundLocalizedString === undefined) &&\n item.value.RefinerRecordId === 0\n ? item.key\n : item.value.LeftValueBoundString;\n return (\n <li className='msc-choice-summary__list-item' key={item.key}>\n <a\n className='msc-choice-summary__item'\n href={this.props.urlBuilder(item.value, false)}\n aria-label={`${item.value.LeftValueBoundString} ${choiceAriaLabel}`}\n onClick={this._onClick}\n role='button'\n id={item.key}\n {...attribute}\n >\n {newIntRange}\n <span\n className={`${this.closeButtonGlyph} msc-choice-summary__glyph`}\n role='button'\n aria-label={closeAriaLabel}\n />\n </a>\n </li>\n );\n })}\n </ul>\n {items.length > 0 && clearAllText && (\n <a\n href={this.props.urlBuilder({}, true)}\n className='msc-choice-summary__clear-all'\n {...clearAllAttributes}\n onClick={this._onClick}\n >\n {clearAllText}\n </a>\n )}\n </div>\n );\n }\n\n private _getKeyForRefinerValue(productRefinerValue: ProductRefinerValue, index: string): string {\n const { choiceFormat, choiceRangeValueFormat, refinerHierarchy, telemetry, refinerValues } = this.props;\n const overallFormat = choiceFormat || '{1}';\n const rangeFormat = choiceRangeValueFormat;\n let refinerName = '';\n let parent: IProductRefinerHierarchy | undefined;\n if (refinerHierarchy && refinerHierarchy.find) {\n parent = refinerHierarchy.find(\n (hierarchy: IProductRefinerHierarchy) =>\n !!hierarchy.Values.find((value: ProductRefinerValue) => isMatchingRefinementCriterion(value, productRefinerValue))\n );\n\n if (!parent) {\n telemetry.warning('[choice-summary] could not find parent of selected refiner value');\n } else {\n refinerName = parent.KeyName || '';\n }\n }\n\n let refinerValueName: string;\n if (isRangeType(productRefinerValue.DataTypeValue)) {\n refinerValueName = rangeFormat\n .replace('{0}', this._formatPrice(productRefinerValue.LeftValueBoundString, productRefinerValue.UnitText))\n .replace('{1}', this._formatPrice(productRefinerValue.RightValueBoundString, productRefinerValue.UnitText));\n } else if (productRefinerValue.RefinerRecordId === 0) {\n const filterValue = refinerValues?.Values.find(\n refiner => refiner.LeftValueBoundString === productRefinerValue.LeftValueBoundString\n );\n refinerValueName = (filterValue ? filterValue.LeftValueBoundLocalizedString : productRefinerValue.LeftValueBoundString) || '';\n } else {\n refinerValueName = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\n }\n\n if (refinerName === 'Rating' || refinerName === 'Price') {\n return overallFormat.replace('{0}', refinerName).replace('{1}', `${refinerValueName}`);\n }\n // Adding integer range format\n if (\n productRefinerValue.DataTypeValue === AttributeDataType.Integer &&\n parent?.DisplayTemplateValue === DisplayTemplate.Range &&\n productRefinerValue.RefinerRecordId !== 0\n ) {\n refinerValueName = getIntegerRangeName(productRefinerValue);\n return refinerValueName;\n }\n return overallFormat.replace('{0}', refinerName).replace('{1}', `${refinerValueName}_${refinerName}_${index}`);\n }\n\n private _formatPrice(amount: string | undefined, currency: string | undefined): string {\n if (!amount || !currency) {\n this.props.telemetry.trace('[choice-summary] could not format price');\n return amount || '';\n }\n let result = amount;\n\n try {\n result = this.props.context!.cultureFormatter.formatCurrency(Number(amount), currency);\n } catch (error) {\n this.props.telemetry.warning(`Failed to format price for ${result}: ${error}`);\n }\n\n return result;\n }\n\n private readonly _onClick = (e: React.MouseEvent<HTMLAnchorElement>): void => {\n e.preventDefault();\n e.stopPropagation();\n\n const target = e.currentTarget as HTMLElement;\n const clearAll = target.getAttribute('class')!.includes('choice-summary__clear-all');\n const selectedRefiner = clearAll ? undefined : this._getSelectedRefinerChoice(target);\n\n if (this.props.onChoiceClicked) {\n this.props.onChoiceClicked({\n clearAll,\n itemClicked: target,\n choiceClicked: selectedRefiner,\n nextItemToFocus: target.nextSibling as HTMLElement\n });\n }\n };\n\n private _getSelectedRefinerChoice(itemClicked: HTMLElement): ProductRefinerValue | undefined {\n const result = this.selectedRefinersMap.find(selected => itemClicked.id === selected.key);\n return (result && result.value) || undefined;\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\ninterface IErrorMessage {\n text?: string;\n}\n\nexport const ErrorMessage: React.FC<IErrorMessage> = ({ text }) => {\n return (\n <span className='ms-search-result-container__no-results-message'>\n <h5 className='error-text'>\n {` `}\n {text}\n {` `}\n </h5>\n </span>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ICoreContext, IGridSettings, IImageData, IImageSettings, Image, IRequestContext } from '@msdyn365-commerce/core';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { getFallbackImageUrl, getProductPageUrlSync } from '@msdyn365-commerce-modules/retail-actions';\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, onTelemetryClick } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISearchResultContainerResources } from '../search-result-container.props.autogenerated';\n\n// Import { IComponent, IComponentProps, ICoreContext, IGridSettings, IImageData, IImageSettings, Image, msdyn365Commerce } from '@msdyn365-commerce/core';\n\ninterface IFeatureSearchResultItem {\n product: SimpleProduct | null;\n context: ICoreContext;\n resources: ISearchResultContainerResources;\n imageSettings?: IImageSettings;\n moduleType: string;\n moduleId: string;\n telemetryContent?: ITelemetryContent;\n recommendation?: string;\n}\n\nexport const FeatureSearchResultItem: React.FC<IFeatureSearchResultItem> = ({\n product,\n context,\n imageSettings,\n resources,\n telemetryContent,\n recommendation\n}) => {\n if (product === null) {\n return null;\n }\n\n const productName = product.Name;\n const productRecordId = product && product.RecordId ? product.RecordId : 0;\n const productUrl = getProductPageUrlSync(product.Name || '', productRecordId, context && context.actionContext, undefined);\n const fallbackImage = getFallbackImageUrl(\n product.ItemId,\n context.actionContext.requestContext.apiSettings,\n context.request.app?.config?.OmniChannelMedia\n );\n const heading =\n recommendation && recommendation === 'descriptions' ? resources.featureSimilarDescriptionTitle : resources.featureSimilarLooksTitle;\n\n // Construct telemetry attribute to render\n const payLoad = getPayloadObject('click', telemetryContent!, productName!, productRecordId.toString());\n\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\n return (\n <div className='ms-feature-search-result__item'>\n <a\n href={productUrl}\n onClick={onTelemetryClick(telemetryContent!, payLoad, product.Name!)}\n {...attribute}\n aria-label={product.Name}\n >\n <div className='msc-feature-search-result__item__image'>\n {renderProductPlacementImage(\n imageSettings,\n context.request.gridSettings,\n product.PrimaryImageUrl,\n product.Name,\n fallbackImage,\n context.actionContext.requestContext\n )}\n </div>\n </a>\n <div className='msc-feature-search-result__item__detail'>\n <p className='msc-feature-search-result__item__heading'>{heading}</p>\n {renderProductTitle(product?.Name)}\n </div>\n </div>\n );\n};\n\nfunction renderProductPlacementImage(\n imageSettings?: IImageSettings,\n gridSettings?: IGridSettings,\n imageUrl?: string,\n altText?: string,\n fallbackImage?: string,\n context?: IRequestContext\n): JSX.Element | null {\n if (!imageUrl || !gridSettings || !imageSettings) {\n return null;\n }\n const img: IImageData = {\n src: imageUrl,\n altText: altText ? altText : ''\n };\n const imageProps = {\n gridSettings,\n imageSettings,\n fallBackSrc: fallbackImage\n };\n return <Image {...img} {...imageProps} loadFailureBehavior='empty' requestContext={context} />;\n}\n\nfunction renderProductTitle(title?: string): JSX.Element | null {\n return <h1 className='msc-feature-search-result__item__product-title'>{title}</h1>;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\ninterface ILink {\n className?: string;\n text?: string;\n href?: string;\n ariaLabel?: string;\n}\n\nexport const Link: React.FC<ILink> = ({ text, className, href, ariaLabel }) => (\n <a className={className} href={href} aria-label={ariaLabel}>\n {' '}\n {text}{' '}\n </a>\n);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Button, Modal, ModalBody, ModalFooter, ModalHeader } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nexport interface ISearchResultModalViewProps {\n modal: React.ReactElement;\n modalHeader: React.ReactElement;\n modalFooter: React.ReactElement;\n modalBody: React.ReactElement;\n}\n\ninterface IModalToggleProps {\n innerRef: React.RefObject<HTMLButtonElement> | undefined;\n id: string;\n text: string;\n ariaLabel: string;\n onClick(): void;\n}\n\nexport interface ISearchResultModalResources {\n modalTitle: string;\n modalCloseButtonText: string;\n}\n\nexport interface ISearchResultModalProps {\n resources: ISearchResultModalResources;\n isOpen: boolean;\n returnRef: React.RefObject<HTMLButtonElement> | undefined;\n onModalToggle(): void;\n}\n\nexport const ModalToggle: React.FC<IModalToggleProps> = (props: IModalToggleProps) => {\n const { text, onClick, ariaLabel, innerRef, id } = props;\n return (\n <button id={id} className='msc-button' aria-label={ariaLabel} onClick={onClick} ref={innerRef}>\n {text}\n </button>\n );\n};\n\nexport const SearchResultModal = (props: ISearchResultModalProps): ISearchResultModalViewProps => {\n return {\n modal: modalNode(props),\n modalHeader: modalHeaderNode(props),\n modalFooter: modalFooterNode(props),\n modalBody: <ModalBody className='msc-review-modal-body' />\n };\n};\n\nconst modalNode = (props: ISearchResultModalProps) => {\n return (\n <Modal\n autoFocus\n applicationNode='renderPage'\n returnFocusRef={props.returnRef}\n isOpen={props.isOpen}\n toggle={props.onModalToggle}\n className='msc-search-result-modal'\n zIndex={1050}\n />\n );\n};\n\nconst modalHeaderNode = (props: ISearchResultModalProps) => {\n return <ModalHeader toggle={props.onModalToggle}>{props.resources.modalTitle}</ModalHeader>;\n};\n\nconst modalFooterNode = (props: ISearchResultModalProps) => {\n return (\n <ModalFooter>\n <Button onClick={props.onModalToggle} className='ms-sort-and-filter-modal-close'>\n {props.resources.modalCloseButtonText}\n </Button>\n </ModalFooter>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\nimport { IPriceComponentResources, ProductComponent } from '@msdyn365-commerce/components';\nimport { ICoreContext, IImageSettings } from '@msdyn365-commerce/core';\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISearchResultContainerResources } from '../search-result-container.props.autogenerated';\n\ninterface IProductSearchResultItems {\n products: ProductSearchResult[];\n context: ICoreContext;\n resources: ISearchResultContainerResources;\n imageSettings?: IImageSettings;\n moduleType: string;\n moduleId: string;\n allowBackNavigation?: boolean;\n telemetryContent: ITelemetryContent;\n quickviewSlot?: {} | null | undefined;\n productComparisonButton?: {} | null | undefined;\n channelInventoryConfigurationId?: number;\n isPriceMinMaxEnabled?: boolean;\n productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\n}\n\n/**\n * Returns the product inventory label.\n * @param channelInventoryConfigurationId - The channel configuration Id.\n * @param product - The product.\n * @returns The inventory label.\n */\nexport function getInventoryLabel(channelInventoryConfigurationId: number | undefined, product: ProductSearchResult): string | undefined {\n if (!channelInventoryConfigurationId || !ArrayExtensions.hasElements(product.AttributeValues)) {\n return undefined;\n }\n const inventoryAttribute = product.AttributeValues.find(attribute => attribute.RecordId === channelInventoryConfigurationId);\n if (inventoryAttribute) {\n return inventoryAttribute.TextValue;\n }\n return undefined;\n}\n\nexport const ProductSearchResultItems: React.FC<IProductSearchResultItems> = ({\n products,\n context,\n imageSettings,\n resources,\n moduleType,\n moduleId,\n allowBackNavigation,\n telemetryContent,\n quickviewSlot,\n productComparisonButton,\n channelInventoryConfigurationId,\n isPriceMinMaxEnabled,\n productsDimensionAvailabilities\n}) => {\n const priceResources: IPriceComponentResources = {\n priceRangeSeparator: resources.priceRangeSeparator\n };\n return (\n <ul className='list-unstyled'>\n {products.map((product: ProductSearchResult, index: number) => (\n <li className='ms-product-search-result__item' key={index}>\n <ProductComponent\n context={context}\n telemetryContent={telemetryContent}\n imageSettings={imageSettings}\n freePriceText={resources.priceFree}\n originalPriceText={resources.originalPriceText}\n currentPriceText={resources.currentPriceText}\n ratingAriaLabel={resources.ratingAriaLabel}\n allowBack={allowBackNavigation}\n id={moduleId}\n key={product.RecordId}\n typeName={moduleType}\n data={{ product }}\n quickViewButton={quickviewSlot}\n productComparisonButton={productComparisonButton}\n inventoryLabel={getInventoryLabel(channelInventoryConfigurationId, product)}\n isPriceMinMaxEnabled={isPriceMinMaxEnabled}\n priceResources={priceResources}\n swatchItemAriaLabel={resources.swatchItemAriaLabel}\n dimensionAvailabilities={productsDimensionAvailabilities?.find(\n dimensionAvailability =>\n ArrayExtensions.hasElements(dimensionAvailability) &&\n dimensionAvailability[0].masterProductId === product.MasterProductId\n )}\n />\n </li>\n ))}\n </ul>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ISliderLabel, ISliderThumbProps, Slider } from '@msdyn365-commerce-modules/utilities';\nimport debounce from 'lodash/debounce';\nimport { computed } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { IRefineItemProps, IRefineItemState } from './refine-item';\n\ntype InputType = 'Min' | 'Max';\n\nexport type RangeRefineItemType = 'slider' | 'input';\n\n/**\n * Range refine item properties.\n */\nexport interface IRangeRefineItemProps extends IRefineItemProps {\n rangeType: RangeRefineItemType;\n minValueSliderThumbAriaLabel?: string;\n maxValueSliderThumbAriaLabel?: string;\n sliderKey?: string;\n}\n\n/**\n * Range refine item state.\n */\nexport interface IRangeRefineItemState extends IRefineItemState {\n validationErrorMin: string | undefined;\n validationErrorMax: string | undefined;\n selectedMin: string | undefined;\n selectedMax: string | undefined;\n touchedMin: boolean;\n touchedMax: boolean;\n sliderId: string;\n minValue: string | undefined;\n maxValue: string | undefined;\n labels: ISliderLabel[];\n sliderThumbs: ISliderThumbProps[];\n}\n\n/**\n * RangeRefineItem component (controlled by RefineSubmenu).\n */\n@observer\nexport default class RangeRefineItem extends React.Component<IRangeRefineItemProps, IRangeRefineItemState> {\n private readonly _formattedPriceReverseLookup: Map<string, string> = new Map();\n\n private readonly minInput: React.RefObject<HTMLInputElement>;\n\n private readonly maxInput: React.RefObject<HTMLInputElement>;\n\n @computed get currencyCode(): string {\n return this.props.productRefinerValue.UnitText || '';\n }\n\n public constructor(props: IRangeRefineItemProps) {\n super(props);\n this._onRangeUpdate = this._onRangeUpdate.bind(this);\n this._onRangeUpdateEnd = this._onRangeUpdateEnd.bind(this);\n this._handleRangeTooltipText = this._handleRangeTooltipText.bind(this);\n this._changeMin = this._changeMin.bind(this);\n this._changeMax = this._changeMax.bind(this);\n this._finishChangeMin = this._finishChangeMin.bind(this);\n this._finishChangeMax = this._finishChangeMax.bind(this);\n\n this.minInput = React.createRef<HTMLInputElement>();\n this.maxInput = React.createRef<HTMLInputElement>();\n\n const { selectedRefinementCriterion } = this.props;\n const initialMin = selectedRefinementCriterion?.LeftValueBoundString ?? '0';\n const initialMax = selectedRefinementCriterion?.RightValueBoundString;\n const sliderId = `slider_${String(this.props.parentProductRefinerHierarchy.RecordId)}_${String(\n this.props.productRefinerValue.RefinerRecordId\n )}`;\n const minValue = this.props.productRefinerValue.LeftValueBoundString;\n const maxValue = this.props.productRefinerValue.RightValueBoundString;\n const minPrice = this._formatPrice(minValue);\n const maxPrice = this._formatPrice(maxValue);\n const labels: ISliderLabel[] = this.getLabels(sliderId, minPrice, maxPrice);\n const selectedMin =\n this.props.selectedRefinementCriterion?.LeftValueBoundString ?? this.props.productRefinerValue.LeftValueBoundString ?? '0';\n const selectedMax =\n this.props.selectedRefinementCriterion?.RightValueBoundString ??\n this.props.productRefinerValue.RightValueBoundString ??\n maxValue;\n const selectedMinPrice = this._formatPrice(selectedMin);\n const selectedMaxPrice = this._formatPrice(selectedMax);\n const sliderKeyString = this.props.sliderKey ? `_${String(this.props.sliderKey)}` : '';\n const sliderThumbs: ISliderThumbProps[] = this.getSliderThumbs(\n sliderId,\n sliderKeyString,\n selectedMin,\n selectedMinPrice,\n selectedMax,\n selectedMaxPrice,\n maxPrice\n );\n this.state = {\n isChecked: false,\n validationErrorMin: undefined,\n validationErrorMax: undefined,\n selectedMin: initialMin,\n selectedMax: initialMax,\n touchedMin: false,\n touchedMax: false,\n sliderId,\n minValue,\n maxValue,\n labels,\n sliderThumbs\n };\n }\n\n public shouldComponentUpdate(nextProps: IRangeRefineItemProps, nextState: IRangeRefineItemState): boolean {\n if (this.state === nextState && this.props === nextProps) {\n return false;\n }\n return true;\n }\n\n public componentDidUpdate(previousProps: IRangeRefineItemProps): void {\n if (previousProps !== this.props) {\n this.updateSliderProps();\n }\n }\n\n public render(): JSX.Element | undefined {\n const { productRefinerValue, parentProductRefinerHierarchy, refineItemCommonProps } = this.props;\n\n if (!productRefinerValue || !parentProductRefinerHierarchy) {\n refineItemCommonProps.telemetry.error(\n 'Cannot render refine value range without productRefinerValue and parentProductRefinerHierarchy'\n );\n return undefined;\n }\n\n if (this.props.rangeType === 'input') {\n return this._renderInputFields();\n }\n\n return this._renderSlider();\n }\n\n /**\n * Function to update slider props.\n */\n private updateSliderProps(): void {\n const sliderId = `slider_${String(this.props.parentProductRefinerHierarchy.RecordId)}_${String(\n this.props.productRefinerValue.RefinerRecordId\n )}`;\n const minValue = this.props.productRefinerValue.LeftValueBoundString;\n const maxValue = this.props.productRefinerValue.RightValueBoundString;\n const minPrice = this._formatPrice(minValue);\n const maxPrice = this._formatPrice(maxValue);\n const labels: ISliderLabel[] = this.getLabels(sliderId, minPrice, maxPrice);\n const selectedMin =\n this.props.selectedRefinementCriterion?.LeftValueBoundString ?? this.props.productRefinerValue.LeftValueBoundString ?? '0';\n const selectedMax =\n this.props.selectedRefinementCriterion?.RightValueBoundString ??\n this.props.productRefinerValue.RightValueBoundString ??\n maxValue;\n const selectedMinPrice = this._formatPrice(selectedMin);\n const selectedMaxPrice = this._formatPrice(selectedMax);\n const sliderKeyString = this.props.sliderKey ? `_${String(this.props.sliderKey)}` : '';\n const sliderThumbs: ISliderThumbProps[] = this.getSliderThumbs(\n sliderId,\n sliderKeyString,\n selectedMin,\n selectedMinPrice,\n selectedMax,\n selectedMaxPrice,\n maxPrice\n );\n this.setState({ sliderId, minValue, maxValue, labels, sliderThumbs });\n }\n\n /**\n * Function to create the labels for slider.\n * @param sliderId - Slider element id for the DOM.\n * @param minPrice - Slider min value.\n * @param maxPrice - Slider max value.\n * @returns Array labels.\n */\n private readonly getLabels = (sliderId: string, minPrice: string, maxPrice: string): ISliderLabel[] => {\n return [\n {\n labelId: `${sliderId}_start`,\n labelString: `${minPrice}`,\n labelPositioning: 'start'\n },\n {\n labelId: `${sliderId}_end`,\n labelString: `${maxPrice}`,\n labelPositioning: 'end'\n }\n ];\n };\n\n /**\n * Function to create the slider thumbs for slider.\n * @param sliderId - Slider element id for the DOM.\n * @param sliderKey - Unique key for slider.\n * @param selectedMin - Slider selected min value.\n * @param selectedMinPrice - Slider selected min price.\n * @param selectedMax - Slider selected max value.\n * @param selectedMaxPrice - Slider selected max price..\n * @param maxPrice - Slider max price..\n * @returns Slider Thumb Props.\n */\n private readonly getSliderThumbs = (\n sliderId: string,\n sliderKey: string,\n selectedMin: string,\n selectedMinPrice: string,\n selectedMax: string | undefined,\n selectedMaxPrice: string,\n maxPrice: string\n ): ISliderThumbProps[] => {\n const sliderThumbDefaultValue = 0;\n return [\n {\n id: `${sliderId}${sliderKey}_slider_thumb_start`,\n value: (selectedMin && Number(selectedMin)) || sliderThumbDefaultValue,\n ariaLabel: `${this.props.minValueSliderThumbAriaLabel ?? ''} ${this.currencyCode}`,\n ariaValueText: `${selectedMinPrice}`\n },\n {\n id: `${sliderId}${sliderKey}_slider_thumb_end`,\n value: Number(selectedMax) || Number(maxPrice),\n ariaLabel: `${this.props.maxValueSliderThumbAriaLabel ?? ''} ${this.currencyCode}`,\n ariaValueText: `${selectedMaxPrice}`\n }\n ];\n };\n\n private _renderInputFields(): JSX.Element | undefined {\n const { isDisabled, parentProductRefinerHierarchy, refineItemCommonProps } = this.props;\n const { selectedMin, selectedMax, touchedMin, touchedMax, validationErrorMin, validationErrorMax } = this.state;\n\n const rangeAriaLabel = (refineItemCommonProps.rangeNameFormat || '{0}').replace('{0}', parentProductRefinerHierarchy.KeyName || '');\n const formAttrs = {\n 'aria-label': rangeAriaLabel,\n 'aria-disabled': isDisabled\n };\n\n // To enable price formatting of selected fields, this is the approach:\n // initial value: min=0 formatted as price, max=undefined\n // onFocus/onChange: convert to number (unformat) and mark as touched to indicate value is being edited\n // onBlur: validate and format entered value as price\n const minInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-min ${\n validationErrorMin ? 'refine-submenu__input-range--error' : ''\n }`;\n const maxInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-max ${\n validationErrorMax ? 'refine-submenu__input-range--error' : ''\n }`;\n const minLabelClassName = 'ms-refine-submenu__input-range-label refine-submenu__input-range-label-min';\n const maxLabelClassName = 'ms-refine-submenu__input-range-label refine-submenu__input-range-label-max';\n const formattedSelectedMin = this._getFormattedSelectedValue(selectedMin, touchedMin, validationErrorMin);\n const formattedSelectedMax = this._getFormattedSelectedValue(selectedMax, touchedMax, validationErrorMax);\n return (\n <form className='ms-refine-submenu__input-range-refiner' {...formAttrs}>\n <label className={minLabelClassName}>\n {refineItemCommonProps.minLabel}\n <input\n className={minInputClassName}\n onChange={this._changeMin}\n onFocus={this._changeMin}\n onBlur={this._finishChangeMin}\n value={formattedSelectedMin}\n ref={this.minInput}\n />\n </label>\n <label className={maxLabelClassName}>\n {refineItemCommonProps.maxLabel}\n <input\n className={maxInputClassName}\n placeholder={formattedSelectedMax ? undefined : refineItemCommonProps.placeholderTextMax}\n onChange={this._changeMax}\n onFocus={this._changeMax}\n onBlur={this._finishChangeMax}\n value={formattedSelectedMax}\n ref={this.maxInput}\n />\n </label>\n {validationErrorMin && (\n <span className='ms-refine-submenu__input-range-error-text refine-submenu__input-range-min-error-text'>\n {validationErrorMin}\n </span>\n )}\n {validationErrorMax && validationErrorMin !== validationErrorMax && (\n <span className='ms-refine-submenu__input-range-error-text refine-submenu__input-range-max-error-text'>\n {validationErrorMax}\n </span>\n )}\n </form>\n );\n }\n\n private _renderSlider(): JSX.Element | undefined {\n const { isDisabled, sliderKey } = this.props;\n const ariaAttributes = {\n 'aria-disabled': isDisabled\n };\n\n return (\n <Slider\n className='ms-refine-submenu__range-refiner'\n key={this.state.sliderId}\n sliderKey={sliderKey}\n id={this.state.sliderId}\n inForm={false}\n min={(this.state.minValue && Number(this.state.minValue)) || undefined}\n max={(this.state.maxValue && Number(this.state.maxValue)) || undefined}\n step={1}\n orientation='horizontal'\n labels={this.state.labels}\n showLabels\n showTooltip\n sliderThumbs={this.state.sliderThumbs}\n onChangeEnd={this._onRangeUpdateEnd}\n onChange={debounce(this._onRangeUpdate, 500)}\n handleTooltipText={this._handleRangeTooltipText}\n {...ariaAttributes}\n />\n );\n }\n\n private _changeMin(event: React.FocusEvent<HTMLInputElement>): void {\n this._changeValue(event, 'Min');\n }\n\n private _changeMax(event: React.FocusEvent<HTMLInputElement>): void {\n this._changeValue(event, 'Max');\n }\n\n private _changeValue(event: React.FocusEvent<HTMLInputElement>, inputType: InputType): void {\n const selectedKey = `selected${inputType}`;\n const touchedKey = `touched${inputType}`;\n this.setState({\n [selectedKey]: this._getInputWithoutFormatting(event.currentTarget.value),\n [touchedKey]: true\n });\n }\n\n private _finishChangeMin(event: React.FocusEvent<HTMLInputElement>): boolean {\n const selectedMinValue = this._getInputWithoutFormatting(event.currentTarget.value);\n this.setState({\n selectedMin: selectedMinValue,\n minTouched: false\n });\n const minInput = Number(selectedMinValue);\n const {\n onToggle,\n parentProductRefinerHierarchy,\n productRefinerValue,\n refineItemCommonProps,\n selectedRefinementCriterion\n } = this.props;\n const max = (selectedRefinementCriterion && selectedRefinementCriterion.RightValueBoundString) || undefined;\n\n const maxNum = max ? Number(max) : undefined;\n\n if (isNaN(minInput)) {\n this.setState({ validationErrorMin: refineItemCommonProps.validationErrorNaN });\n this._focus('Min');\n return false;\n }\n\n if (this._validateRange(minInput, maxNum)) {\n onToggle({\n parentProductRefinerHierarchy,\n productRefinerValue,\n isSelecting: true,\n rangeStart: minInput,\n rangeEnd: maxNum\n });\n return true;\n }\n this._focus('Min');\n\n return false;\n }\n\n private _finishChangeMax(event: React.FocusEvent<HTMLInputElement>): boolean {\n const selectedMaxValue = this._getInputWithoutFormatting(event.currentTarget.value);\n this.setState({\n selectedMax: selectedMaxValue,\n maxTouched: false\n });\n const maxInput = Number(selectedMaxValue);\n const {\n onToggle,\n parentProductRefinerHierarchy,\n productRefinerValue,\n refineItemCommonProps,\n selectedRefinementCriterion\n } = this.props;\n const min = (selectedRefinementCriterion && selectedRefinementCriterion.LeftValueBoundString) || '0';\n\n const minNum = Number(min);\n\n if (isNaN(maxInput)) {\n this.setState({ validationErrorMax: refineItemCommonProps.validationErrorNaN });\n this._focus('Max');\n return false;\n }\n\n if (this._validateRange(minNum, maxInput)) {\n if (productRefinerValue) {\n onToggle({\n parentProductRefinerHierarchy,\n productRefinerValue,\n isSelecting: true,\n rangeStart: minNum,\n rangeEnd: maxInput\n });\n } else {\n this._focus('Max');\n }\n return true;\n }\n\n return false;\n }\n\n private _focus(inputType: InputType): void {\n const ref = inputType === 'Max' ? this.maxInput : this.minInput;\n\n setTimeout(() => {\n if (ref && ref.current) {\n ref.current.focus();\n }\n }, 50);\n }\n\n private _getFormattedSelectedValue(\n selected: string | undefined,\n touched: boolean,\n validationError: string | undefined\n ): string | undefined {\n if (touched || validationError || selected === undefined) {\n return selected;\n }\n return this._formatPrice(selected);\n }\n\n private _validateRange(min: number, max: number | undefined): boolean {\n const { refineItemCommonProps } = this.props;\n if (max === undefined) {\n return true;\n }\n\n if (min > max) {\n this.setState({\n validationErrorMin: refineItemCommonProps.validationErrorRange,\n validationErrorMax: refineItemCommonProps.validationErrorRange\n });\n return false;\n }\n\n return true;\n }\n\n private _formatPrice(amount: string | undefined): string {\n if (this.props.productRefinerValue.RefinerRecordId === 0) {\n const result = this.props.context.cultureFormatter.formatCurrency(Number(amount), this.currencyCode);\n return result;\n }\n return amount || '';\n }\n\n private _getInputWithoutFormatting(input: string): string {\n // First try to cast raw input to a number\n const inputAsNum = Number(input);\n if (!isNaN(inputAsNum)) {\n return input;\n }\n\n // Otherwise try a reverse lookup and fall back to the raw input if all else fails\n const reverseLookupResult = this._formattedPriceReverseLookup.get(input);\n return reverseLookupResult || input;\n }\n\n // NOTE: Fix types once Shared Components build pipeline bug fixed\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private _onRangeUpdate(sliderChangeNotification: any): void {\n // Need to filter out mousemove events as these cause errors after the menu updates and slider re-renders\n if (sliderChangeNotification.eventType !== 'mousemove') {\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\n if (productRefinerValue && sliderChangeNotification) {\n onToggle({\n parentProductRefinerHierarchy,\n productRefinerValue,\n isSelecting: true,\n rangeStart: sliderChangeNotification.firstThumbValue,\n rangeEnd: sliderChangeNotification.secondThumbValue\n });\n\n this._focusOnSliderThumb(sliderChangeNotification);\n }\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private _onRangeUpdateEnd(sliderChangeNotification: any): void {\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\n if (productRefinerValue && sliderChangeNotification) {\n onToggle({\n parentProductRefinerHierarchy,\n productRefinerValue,\n isSelecting: true,\n rangeStart: sliderChangeNotification.firstThumbValue,\n rangeEnd: sliderChangeNotification.secondThumbValue\n });\n\n this._focusOnSliderThumb(sliderChangeNotification);\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private _focusOnSliderThumb(sliderChangeNotification: any): void {\n if (sliderChangeNotification.id) {\n const element = document.getElementById(`${sliderChangeNotification.id}range`);\n if (element) {\n setTimeout(() => {\n element.focus();\n }, 0);\n }\n }\n }\n\n private _handleRangeTooltipText(tooltip: number): string {\n return this._formatPrice(`${tooltip}`);\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport { RatingComponent, SwatchComponent } from '@msdyn365-commerce/components';\nimport { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\nimport {\n AttributeDataType,\n DisplayTemplate,\n ProductRefinerSource,\n ProductRefinerValue,\n RefinerType\n} from '@msdyn365-commerce/retail-proxy';\nimport { checkIfShouldDisplayAsSwatch, DimensionTypes, IDimensionsApp, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { format, getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { IRefineItemCommonProps } from './refine-item.props.common';\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\nimport { getIntegerRangeName, isSingleSelectRangeTypeIntegerSelected } from './utilities';\n\n/**\n * RefineItem properties.\n */\nexport interface IRefineItemProps {\n parentProductRefinerHierarchy: IProductRefinerHierarchy;\n productRefinerValue: ProductRefinerValue;\n selectedRefinementCriterion: ProductRefinerValue | undefined;\n selectedRefinerValues?: ProductRefinerValue[];\n refineItemCommonProps: IRefineItemCommonProps;\n isDisabled: boolean;\n context: ICoreContext<IGeneric<IAny>>;\n moduleId: string;\n moduleTypeName: string;\n index?: number;\n productCountAriaLabel?: string;\n singleProductCountAriaLabel?: string;\n refineItemAriaLabel?: string;\n refineItemsAriaLabel?: string;\n isMobileView?: boolean;\n\n /**\n * The telemetry content\n */\n telemetryContent?: ITelemetryContent;\n onToggle(notfication: Readonly<IRefineItemToggleNotification>): void;\n urlBuilder(refiner: IRefineItemToggleNotification): string;\n}\n\n/**\n * Refine item state.\n */\nexport interface IRefineItemState extends React.ComponentState {\n isChecked: boolean;\n renderingError?: object;\n}\n\n/**\n * Single-select and multi-select refine item component (controlled by RefineSubmenu).\n */\nexport default class RefineItem extends React.Component<IRefineItemProps, IRefineItemState> {\n private readonly anchorType: React.RefObject<HTMLAnchorElement>;\n\n private readonly payLoad: IPayLoad;\n\n public constructor(props: IRefineItemProps) {\n super(props);\n this._onClick = this._onClick.bind(this);\n this.state = {\n isChecked: !!this.props.selectedRefinementCriterion\n };\n this.anchorType = React.createRef();\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, '');\n }\n\n public shouldComponentUpdate(nextProps: IRefineItemProps, nextState: IRefineItemState): boolean {\n if (this.state === nextState && this.props === nextProps) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element | undefined {\n const {\n isDisabled,\n refineItemCommonProps,\n parentProductRefinerHierarchy,\n productRefinerValue,\n selectedRefinementCriterion,\n productCountAriaLabel,\n singleProductCountAriaLabel,\n index,\n children,\n onToggle,\n context,\n telemetryContent,\n refineItemAriaLabel,\n refineItemsAriaLabel,\n ...attrs\n } = this.props;\n if (!productRefinerValue) {\n refineItemCommonProps.telemetry.error('[refine-item] Cannot render refineItem without productRefinerValue');\n return undefined;\n }\n if (!productRefinerValue.LeftValueBoundString) {\n refineItemCommonProps.telemetry.warning(\n `[refine-item] RefineItem without LeftValueBoundString: ${JSON.stringify(productRefinerValue)}`\n );\n }\n const isSingleSelect = parentProductRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect;\n let itemTypeClassName = isSingleSelect ? 'single-select' : 'multi-select';\n itemTypeClassName = `ms-refine-submenu-item ${itemTypeClassName}`;\n const inputType = isSingleSelect ? 'radio' : 'checkbox';\n const isChecked = !!selectedRefinementCriterion;\n itemTypeClassName = isChecked ? `${itemTypeClassName}-checked` : itemTypeClassName;\n if (parentProductRefinerHierarchy.SourceValue === ProductRefinerSource.Rating) {\n return this._renderRating(\n productRefinerValue,\n parentProductRefinerHierarchy,\n isChecked,\n context,\n index,\n telemetryContent,\n productCountAriaLabel,\n singleProductCountAriaLabel\n );\n }\n this.payLoad.contentAction.etext = productRefinerValue.LeftValueBoundLocalizedString ?? productRefinerValue.LeftValueBoundString;\n const attribute = getTelemetryAttributes(telemetryContent!, this.payLoad);\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\n const productText = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\n const productCount = productRefinerValue.Count || 0;\n let refineMenuItemAriaLabel;\n if (productCount === 1) {\n refineMenuItemAriaLabel = refineItemAriaLabel\n ? format(refineItemAriaLabel, parentProductRefinerHierarchy.KeyName, productText)\n : '';\n } else {\n refineMenuItemAriaLabel = refineItemsAriaLabel\n ? format(refineItemsAriaLabel, parentProductRefinerHierarchy.KeyName, productText, productCount)\n : '';\n }\n\n const dimensionType = (this.props.parentProductRefinerHierarchy.KeyName?.toLocaleLowerCase() ?? '') as DimensionTypes;\n const shouldDisplayAsSwatch = this._getShouldDisplayAsSwatch(dimensionType);\n\n let className = 'ms-refine-submenu-item';\n if (shouldDisplayAsSwatch) {\n className = classnames(className, `ms-refine-submenu-item__dimension__${dimensionType}`);\n }\n\n // If the swatch has no color or image specified, it should be displayed as text.\n // We don't use swatch logic to display the number of the results found together with the text.\n const hasColor = !StringExtensions.isNullOrWhitespace(productRefinerValue.SwatchColorHexCode);\n const hasImage = !StringExtensions.isNullOrWhitespace(productRefinerValue.SwatchImageUrl);\n const hasContentSwatch = hasColor || hasImage;\n if (\n parentProductRefinerHierarchy.DataTypeValue === AttributeDataType.Integer &&\n parentProductRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Range\n ) {\n const rangeValue = getIntegerRangeName(productRefinerValue);\n return (\n <li className={className} id={`${parentProductRefinerHierarchy.KeyName!}_${index}`}>\n <a\n key={selectedRefinementCriterion ? 'true' : 'false'}\n ref={this.anchorType}\n href={this._getRefinerUrl()}\n tabIndex={hasColor ? -1 : 0}\n onClick={this._onClick}\n className={\n isSingleSelectRangeTypeIntegerSelected(selectedRefinementCriterion!, productRefinerValue)\n ? `ms-refine-submenu-item ${itemTypeClassName}-selected`\n : `ms-refine-submenu-item ${itemTypeClassName}-range`\n }\n role='radio'\n aria-label={refineMenuItemAriaLabel}\n aria-checked={!!selectedRefinementCriterion}\n {...attribute}\n {...attrs}\n >\n <span className='ms-refine-submenu-item__label' aria-hidden='true'>\n {rangeValue}\n {productRefinerValue.Count !== undefined && ` (${productRefinerValue.Count})`}\n </span>\n </a>\n </li>\n );\n } else {\n return (\n <li className={className} id={`${parentProductRefinerHierarchy.KeyName!}_${index}`}>\n <a\n key={selectedRefinementCriterion ? 'true' : 'false'}\n ref={this.anchorType}\n href={this._getRefinerUrl()}\n tabIndex={hasColor ? -1 : 0}\n onClick={this._onClick}\n className={itemTypeClassName}\n role={inputType}\n aria-label={refineMenuItemAriaLabel}\n aria-checked={!!selectedRefinementCriterion}\n {...attribute}\n {...attrs}\n >\n {hasContentSwatch && shouldDisplayAsSwatch && this._renderSwatch(dimensionType)}\n <span className='ms-refine-submenu-item__label' aria-hidden='true'>\n {/* eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string. */}\n {productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString}\n {productRefinerValue.Count !== undefined && ` (${productRefinerValue.Count})`}\n </span>\n </a>\n </li>\n );\n }\n }\n\n private _getShouldDisplayAsSwatch(dimensionType: DimensionTypes) {\n const shouldDisplayAsSwatch = checkIfShouldDisplayAsSwatch(dimensionType, this.props.context as ICoreContext<IDimensionsApp>);\n return shouldDisplayAsSwatch;\n }\n\n private _renderSwatch(dimensionType: DimensionTypes): JSX.Element | null {\n const productRefinerValue = this.props.productRefinerValue;\n\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\n const text = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\n const swatchItems = [\n {\n itemId: `${productRefinerValue.RefinerRecordId ?? ''}-${dimensionType}-${text}`,\n value: text,\n dimensionType,\n colorHexCode: productRefinerValue.SwatchColorHexCode,\n imageUrl: productRefinerValue.SwatchImageUrl\n }\n ];\n\n return (\n <SwatchComponent\n className='ms-refine-submenu-item__swatch'\n apiSettings={this.props.context.request.apiSettings}\n list={swatchItems}\n isSelectionEnabled={false}\n isRefineItem\n />\n );\n }\n\n private _getRefinerUrl(): string {\n const { urlBuilder, parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\n\n if (productRefinerValue) {\n return urlBuilder({\n parentProductRefinerHierarchy,\n productRefinerValue,\n isSelecting: !selectedRefinementCriterion\n });\n }\n\n return '';\n }\n\n private readonly _onClick = (e: React.MouseEvent<HTMLAnchorElement | HTMLInputElement>): void => {\n e.preventDefault();\n\n const { parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\n if (productRefinerValue) {\n this.props.onToggle({\n parentProductRefinerHierarchy,\n productRefinerValue,\n isSelecting: !selectedRefinementCriterion\n });\n\n setTimeout(() => {\n this.anchorType.current && this.anchorType.current.focus();\n }, 0);\n }\n };\n\n private _renderRating(\n productRefinerValue: ProductRefinerValue,\n parentProductRefinerHierarchy: IProductRefinerHierarchy,\n isChecked: boolean,\n context: ICoreContext,\n index?: number,\n telemetryContent?: ITelemetryContent,\n ratingUserCountAriaLabel?: string,\n ratingSingleUserCountAriaLabel?: string\n ): JSX.Element | undefined {\n if (productRefinerValue.LeftValueBoundString) {\n this.payLoad.contentAction.etext = productRefinerValue.LeftValueBoundLocalizedString;\n const attribute = getTelemetryAttributes(telemetryContent!, this.payLoad);\n const refinerRating = Number.parseInt(productRefinerValue.LeftValueBoundString, 10);\n const ratingRefiner = this.props.selectedRefinerValues?.find(\n value => value.DataTypeValue === productRefinerValue.DataTypeValue\n );\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\n const selectedRating = Number.parseInt(ratingRefiner?.LeftValueBoundString || '0', 10);\n const defaultChkProductCount = 1;\n let ratingComponentClass: string = 'ms-rating-component';\n if (refinerRating > selectedRating) {\n ratingComponentClass = `${ratingComponentClass}__up`;\n } else if (refinerRating < selectedRating) {\n ratingComponentClass = `${ratingComponentClass}__down`;\n } else {\n ratingComponentClass = `${ratingComponentClass}__current`;\n }\n const productCountAriaLabelValue =\n productRefinerValue.Count !== undefined && productRefinerValue.Count === defaultChkProductCount\n ? ratingSingleUserCountAriaLabel && format(ratingSingleUserCountAriaLabel, productRefinerValue.Count)\n : ratingUserCountAriaLabel && format(ratingUserCountAriaLabel, productRefinerValue.Count);\n return (\n <li\n className='ms-refine-submenu-item ms-refine-submenu-item__rating'\n role={!this.props.isMobileView ? 'presentation' : undefined}\n id={`${parentProductRefinerHierarchy.KeyName!}_${index!}`}\n >\n <a\n href={this._getRefinerUrl()}\n role='option'\n aria-selected={isChecked}\n aria-label={`${parentProductRefinerHierarchy.KeyName!}_${productRefinerValue.LeftValueBoundLocalizedString!}\n ${productCountAriaLabelValue!}`}\n onClick={this._onClick}\n {...attribute}\n >\n <RatingComponent\n className={ratingComponentClass}\n avgRating={refinerRating}\n ratingCount={productRefinerValue.LeftValueBoundLocalizedString ?? productRefinerValue.LeftValueBoundString}\n hideCount={false}\n readOnly\n ariaLabel=''\n context={context}\n id={this.props.moduleId}\n typeName={this.props.moduleTypeName}\n data={{}}\n />\n <span className='refine-submenu-item__rating' aria-hidden={this.props.isMobileView ? 'true' : undefined}>\n {productRefinerValue.Count !== undefined && `(${productRefinerValue.Count})`}\n </span>\n </a>\n </li>\n );\n }\n return undefined;\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { isUndefined } from 'lodash';\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\nimport { Button } from '@msdyn365-commerce-modules/utilities';\nimport { IRefineItemState } from './refine-item';\nimport { isCustomRangeTypeIntegerSelected } from './utilities';\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport { IRefineItemCommonProps } from './refine-item.props.common';\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\n\nexport type RangeRefineItemInputType = 'slider' | 'input';\n\n/**\n * Range refine item properties.\n */\nexport interface IRangeRefineItemInputProps {\n parentProductRefinerHierarchy: IProductRefinerHierarchy;\n selectedRefinementCriterion: ProductRefinerValue | undefined;\n refineItemCommonProps: IRefineItemCommonProps;\n isDisabled: boolean;\n rangeType: RangeRefineItemInputType;\n\n /**\n * The telemetry content\n */\n onToggle(notfication: Readonly<IRefineItemToggleNotification>): void;\n}\n\n/**\n * Range refine item state.\n */\nexport interface IRangeRefineItemInputState extends IRefineItemState {\n validationErrorMin: string | undefined;\n validationErrorMax: string | undefined;\n selectedMin: string | undefined;\n selectedMax: string | undefined;\n invalidData: boolean | undefined;\n}\n\n/**\n * RangeRefineItem component (controlled by RefineSubmenu).\n */\n@observer\nexport default class RangeRefineItemInput extends React.Component<IRangeRefineItemInputProps, IRangeRefineItemInputState> {\n private readonly _formattedPriceReverseLookup: Map<string, string> = new Map();\n\n private readonly minInput: React.RefObject<HTMLInputElement>;\n\n private readonly maxInput: React.RefObject<HTMLInputElement>;\n\n public constructor(props: IRangeRefineItemInputProps) {\n super(props);\n this._changeMinInputRange = this._changeMinInputRange.bind(this);\n this._changeMaxInputRange = this._changeMaxInputRange.bind(this);\n this._applyCustom = this._applyCustom.bind(this);\n\n this.minInput = React.createRef<HTMLInputElement>();\n this.maxInput = React.createRef<HTMLInputElement>();\n let initialMin = '';\n let initialMax = '';\n const { selectedRefinementCriterion, parentProductRefinerHierarchy } = this.props;\n if (selectedRefinementCriterion) {\n initialMin = isCustomRangeTypeIntegerSelected(selectedRefinementCriterion, parentProductRefinerHierarchy)\n ? ''\n : selectedRefinementCriterion?.LeftValueBoundString || '';\n initialMax = isCustomRangeTypeIntegerSelected(selectedRefinementCriterion, parentProductRefinerHierarchy)\n ? ''\n : selectedRefinementCriterion?.RightValueBoundString || '';\n }\n\n this.state = {\n validationErrorMin: undefined,\n validationErrorMax: undefined,\n selectedMin: initialMin,\n selectedMax: initialMax,\n invalidData: !(initialMin && initialMax),\n isChecked: false\n };\n }\n\n public shouldComponentUpdate(nextProps: IRangeRefineItemInputProps, nextState: IRangeRefineItemInputState): boolean {\n if (this.state === nextState && this.props === nextProps) {\n return false;\n }\n nextState.invalidData = !(nextState.selectedMin && nextState.selectedMax);\n return true;\n }\n\n public componentDidUpdate(previousProps: IRangeRefineItemInputProps): void {\n if (previousProps !== this.props) {\n this.updateInputRangerProps();\n }\n }\n\n public render(): JSX.Element | undefined {\n if (this.props.rangeType === 'input') {\n return this._renderInputFields();\n }\n return undefined;\n }\n\n // /**\n // * Function to update slider props.\n // */\n private updateInputRangerProps(): void {\n const selectedMin = !isUndefined(this.props.selectedRefinementCriterion?.RowNumber)\n ? ''\n : this.props.selectedRefinementCriterion?.LeftValueBoundString;\n const selectedMax = !isUndefined(this.props.selectedRefinementCriterion?.RowNumber)\n ? ''\n : this.props.selectedRefinementCriterion?.RightValueBoundString;\n this.setState({ selectedMin, selectedMax });\n }\n\n private _renderInputFields(): JSX.Element | undefined {\n const { isDisabled, parentProductRefinerHierarchy, refineItemCommonProps } = this.props;\n const { validationErrorMin, validationErrorMax } = this.state;\n\n const rangeAriaLabel = (refineItemCommonProps.rangeNameFormat || '{0}').replace('{0}', parentProductRefinerHierarchy.KeyName || '');\n const formAttrs = {\n 'aria-label': rangeAriaLabel,\n 'aria-disabled': isDisabled\n };\n\n const minInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-min ${\n validationErrorMin ? 'refine-submenu__input-range--error' : ''\n }`;\n const maxInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-max ${\n validationErrorMax ? 'refine-submenu__input-range--error' : ''\n }`;\n return (\n <li className='ms-refine-submenu-item list-group-item refine-submenu__item--range--custom'>\n <form className={`ms-refine-submenu__input-range-refiner`} {...formAttrs}>\n <div>\n <input\n className={minInputClassName}\n placeholder={'Min'}\n onChange={this._changeMinInputRange}\n value={this.state.selectedMin}\n ref={this.minInput}\n />\n <span>{' - '}</span>\n <input\n className={maxInputClassName}\n placeholder={'Max'}\n onChange={this._changeMaxInputRange}\n value={this.state.selectedMax}\n ref={this.maxInput}\n />\n {validationErrorMin && (\n <span className='ms-refine-submenu__input-range-error-text refine-submenu__input-range-min-error-text'>\n {validationErrorMin}\n </span>\n )}\n {validationErrorMax && validationErrorMin !== validationErrorMax && (\n <span className='ms-refine-submenu__input-range-error-text refine-submenu__input-range-max-error-text'>\n {validationErrorMax}\n </span>\n )}\n </div>\n <div>\n <Button title={'Apply'} className='applyBtn' onClick={this._applyCustom} disabled={this.state.invalidData}>\n {'Apply'}\n </Button>\n </div>\n </form>\n </li>\n );\n }\n\n private _applyCustom(event: React.MouseEvent<HTMLElement>): void {\n const selectedMinValue = this._getInputWithoutFormatting(this.state.selectedMin || '');\n this.setState({\n selectedMin: selectedMinValue,\n minTouched: false\n });\n const minInput = Number(selectedMinValue);\n const { onToggle, parentProductRefinerHierarchy } = this.props;\n const max = this.state.selectedMax;\n\n const maxNum = max ? Number(max) : undefined;\n const productRefinerValue: ProductRefinerValue = {\n RefinerRecordId: parentProductRefinerHierarchy.Values[0].RefinerRecordId,\n LeftValueBoundString: this.state.selectedMin,\n RightValueBoundString: this.state.selectedMax,\n DataTypeValue: parentProductRefinerHierarchy.DataTypeValue,\n RefinerSourceValue: parentProductRefinerHierarchy.Values[0].RefinerSourceValue\n };\n\n if (this._validateRange(minInput, maxNum)) {\n onToggle({\n parentProductRefinerHierarchy,\n productRefinerValue,\n isSelecting: true\n });\n }\n }\n\n private _changeMinInputRange(event: React.ChangeEvent<HTMLInputElement>): void {\n this.setState({\n selectedMin: event.target.value.trim()\n });\n }\n\n private _changeMaxInputRange(event: React.ChangeEvent<HTMLInputElement>): void {\n this.setState({\n selectedMax: event.target.value.trim()\n });\n }\n\n private _validateRange(min: number, max: number | undefined): boolean {\n const { refineItemCommonProps } = this.props;\n if (max === undefined) {\n return true;\n }\n\n if (min > max) {\n this.setState({\n validationErrorMin: refineItemCommonProps.validationErrorRange,\n validationErrorMax: refineItemCommonProps.validationErrorRange\n });\n return false;\n }\n\n return true;\n }\n\n private _getInputWithoutFormatting(input: string): string {\n // First try to cast raw input to a number\n const inputAsNum = Number(input);\n if (!isNaN(inputAsNum)) {\n return input;\n }\n\n // Otherwise try a reverse lookup and fall back to the raw input if all else fails\n const reverseLookupResult = this._formattedPriceReverseLookup.get(input);\n return reverseLookupResult || input;\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\nimport {\n AttributeDataType,\n DisplayTemplate,\n ProductRefinerSource,\n ProductRefinerValue,\n RefinerType\n} from '@msdyn365-commerce/retail-proxy';\nimport { Button, Collapse, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport RangeRefineItem, { RangeRefineItemType } from './range-refine-item';\nimport RefineItem from './refine-item';\nimport { IRefineItemCommonProps } from './refine-item.props.common';\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\nimport { findMatchingRefinementCriterion, isRangeTypeForInteger } from './utilities';\nimport RangeRefineItemInput from './range-refine-item-input';\n\n/**\n * Properties associated with the RefineSubmenu component.\n */\nexport interface IRefineSubmenuProps {\n tempRangeTypeTODO: RangeRefineItemType;\n minValueSliderThumbAriaLabel?: string;\n maxValueSliderThumbAriaLabel?: string;\n productRefinerHierarchy: IProductRefinerHierarchy;\n selectedRefinerValues: ProductRefinerValue[];\n refineItemCommonProps: IRefineItemCommonProps;\n isDisabled: boolean;\n isExpandedOnInitialLoad: boolean;\n context: ICoreContext<IGeneric<IAny>>;\n moduleId: string;\n moduleTypeName: string;\n productCountAriaLabel?: string;\n singleProductCountAriaLabel?: string;\n refineItemAriaLabel?: string;\n refineItemsAriaLabel?: string;\n isMobile?: boolean;\n\n /**\n * The telemetry content\n */\n telemetryContent?: ITelemetryContent;\n onUpdateRefiners(notfication: Readonly<IRefineItemToggleNotification>): void;\n urlBuilder(refiner: IRefineItemToggleNotification): string;\n}\n\n/**\n * Refine submenu state.\n */\nexport interface IRefineSubmenuState extends React.ComponentState {\n expanded: boolean;\n}\n\n/**\n *\n * The RefineSubmenu component renders the submenu category and child items.\n * This computed observes the stateful category hierarchy object.\n * @extends {React.PureComponent<IRefineSubmenuProps>}\n */\nclass RefineSubmenu extends React.Component<IRefineSubmenuProps, IRefineSubmenuState> {\n constructor(props: IRefineSubmenuProps) {\n super(props);\n\n this._onToggleItem = this._onToggleItem.bind(this);\n this._onToggleSubmenu = this._onToggleSubmenu.bind(this);\n\n const isExpanded = this.props.isExpandedOnInitialLoad;\n\n this.state = {\n expanded: isExpanded\n };\n }\n\n public shouldComponentUpdate(nextProps: IRefineSubmenuProps, nextState: IRefineSubmenuState): boolean {\n if (this.state === nextState && this.props === nextProps) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element | null {\n const { productRefinerHierarchy, refineItemCommonProps } = this.props;\n\n if (!productRefinerHierarchy) {\n refineItemCommonProps.telemetry.error('Cannot render submenu without refiner hierarchy data');\n }\n\n if (productRefinerHierarchy.SourceValue === ProductRefinerSource.Rating && this.props.context.app.config.hideRating) {\n return null;\n }\n\n const className = classnames(\n 'ms-refine-submenu',\n 'list-group',\n productRefinerHierarchy.KeyName // Deprecated because of the localization issues. Leaving for backward compatibility reasons.\n );\n\n return (\n <div className={className}>\n <Button\n className={this.state.expanded ? 'ms-refine-submenu__toggle_expanded' : 'ms-refine-submenu__toggle_collapsed'}\n aria-label={productRefinerHierarchy.KeyName}\n onClick={this._onToggleSubmenu}\n aria-expanded={this.state.expanded}\n >\n {productRefinerHierarchy.KeyName}\n </Button>\n <Collapse isOpen={this.state.expanded} timeout={350}>\n {this._renderChildItems(productRefinerHierarchy)}\n </Collapse>\n </div>\n );\n }\n\n private _renderChildItems(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\n if (\n productRefinerHierarchy.DataTypeValue === AttributeDataType.Integer &&\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Range\n ) {\n return this._renderSingleMultiSelect(productRefinerHierarchy);\n }\n // Check if is of integer range type\n if (isRangeTypeForInteger(productRefinerHierarchy.DataTypeValue)) {\n return this._renderRange(productRefinerHierarchy);\n }\n return this._renderSingleMultiSelect(productRefinerHierarchy);\n }\n\n private _renderSingleMultiSelect(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\n const {\n isDisabled,\n refineItemCommonProps,\n selectedRefinerValues,\n context,\n productCountAriaLabel,\n singleProductCountAriaLabel,\n refineItemAriaLabel,\n refineItemsAriaLabel,\n isMobile\n } = this.props;\n const isSingleSelect =\n productRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect &&\n productRefinerHierarchy.SourceValue === ProductRefinerSource.Rating;\n const role = isSingleSelect ? { role: 'listbox' } : undefined;\n let selectedRefinementCriterion: ProductRefinerValue | undefined = {};\n const refinerValuesList = productRefinerHierarchy.Values || [];\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\n if (!child) {\n refineItemCommonProps.telemetry.error(\n `[refine-submenu] Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\n );\n return null;\n }\n\n selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\n return (\n <RefineItem\n parentProductRefinerHierarchy={productRefinerHierarchy}\n productRefinerValue={child}\n selectedRefinementCriterion={selectedRefinementCriterion}\n selectedRefinerValues={selectedRefinerValues.filter(selectedValue =>\n refinerValuesList.find(value => value.RefinerRecordId === selectedValue.RefinerRecordId)\n )}\n refineItemCommonProps={refineItemCommonProps}\n onToggle={this._onToggleItem}\n urlBuilder={this.props.urlBuilder}\n isDisabled={isDisabled}\n key={index}\n index={index}\n context={context}\n moduleId={this.props.moduleId}\n moduleTypeName={this.props.moduleTypeName}\n telemetryContent={this.props.telemetryContent}\n productCountAriaLabel={productCountAriaLabel}\n refineItemAriaLabel={refineItemAriaLabel}\n refineItemsAriaLabel={refineItemsAriaLabel}\n singleProductCountAriaLabel={singleProductCountAriaLabel}\n isMobileView={isMobile}\n />\n );\n });\n return (\n <ul\n className={`ms-refine-submenu__list ${productRefinerHierarchy.KeyName}`}\n {...role}\n aria-label={productRefinerHierarchy.KeyName}\n >\n {listItems}\n {productRefinerHierarchy.DataTypeValue === AttributeDataType.Integer &&\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Range && (\n <RangeRefineItemInput\n parentProductRefinerHierarchy={productRefinerHierarchy}\n selectedRefinementCriterion={selectedRefinementCriterion}\n refineItemCommonProps={refineItemCommonProps}\n onToggle={this._onToggleItem}\n isDisabled={isDisabled}\n rangeType={'input'}\n key={productRefinerHierarchy.KeyName}\n />\n )}\n </ul>\n );\n }\n\n private _getRangeType(productRefinerHierarchy: IProductRefinerHierarchy): 'input' | 'slider' {\n if (\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Range ||\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Slider ||\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.SliderWithBars\n ) {\n return 'slider';\n }\n return 'input';\n }\n\n private _renderRange(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\n const {\n isDisabled,\n refineItemCommonProps,\n selectedRefinerValues,\n context,\n minValueSliderThumbAriaLabel,\n maxValueSliderThumbAriaLabel\n } = this.props;\n const submenuClassNamePrefix = 'ms-refine-submenu__item list-group-item refine-submenu__item';\n const refinerValuesList = productRefinerHierarchy.Values || [];\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\n if (!child) {\n refineItemCommonProps.telemetry.error(\n `Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\n );\n return null;\n }\n\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\n\n const rangeType = this._getRangeType(productRefinerHierarchy);\n const key = selectedRefinementCriterion\n ? `${selectedRefinementCriterion.LeftValueBoundString}-${selectedRefinementCriterion.RightValueBoundString}`\n : `not-selected-${index}`;\n return (\n <li className={`${submenuClassNamePrefix}--range`} key={index}>\n <RangeRefineItem\n parentProductRefinerHierarchy={productRefinerHierarchy}\n productRefinerValue={child}\n selectedRefinementCriterion={selectedRefinementCriterion}\n refineItemCommonProps={refineItemCommonProps}\n onToggle={this._onToggleItem}\n urlBuilder={this.props.urlBuilder}\n isDisabled={isDisabled}\n rangeType={rangeType}\n key={key}\n sliderKey={key}\n context={context}\n minValueSliderThumbAriaLabel={minValueSliderThumbAriaLabel}\n maxValueSliderThumbAriaLabel={maxValueSliderThumbAriaLabel}\n moduleId={this.props.moduleId}\n moduleTypeName={this.props.moduleTypeName}\n />\n </li>\n );\n });\n return <ul className={`ms-refine-submenu__list list-unstyled ${productRefinerHierarchy.KeyName}`}>{listItems}</ul>;\n }\n\n private _onToggleItem(itemToggleNotification: IRefineItemToggleNotification): void {\n this.props.onUpdateRefiners(itemToggleNotification);\n }\n\n private _onToggleSubmenu(): void {\n this.setState(prevState => ({\n expanded: !prevState.expanded\n }));\n }\n}\n\nexport default RefineSubmenu;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\ninterface ISeparator {\n separator: string;\n}\n\nexport const Separator: React.FC<ISeparator> = ({ separator }) => (\n <span>\n {` `}\n {separator}\n {` `}\n </span>\n);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\ninterface ITitle {\n className: string;\n text: string;\n}\n\nexport const Title: React.FC<ITitle> = ({ text, className }) => (\n <span className={className}>\n {` `}\n {text}\n {` `}\n </span>\n);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CategoryHierarchy as CategoryHierarchyData,\n IProductRefinerHierarchy,\n IProductsDimensionsAvailabilities\n} from '@msdyn365-commerce/commerce-entities';\nimport MsDyn365, { getCatalogId, ICoreContext } from '@msdyn365-commerce/core';\nimport {\n ChannelInventoryConfiguration,\n format,\n ProductPrice,\n ProductRefinerValue,\n SortColumn,\n StoreOperationsDataActions,\n TextValueTranslation\n} from '@msdyn365-commerce/retail-proxy';\nimport {\n ArrayExtensions,\n DimensionAvailabilitiesForProductSearchResultInput,\n DimensionTypes,\n DimensionSwatchDisplayTypes,\n getDimensionAvailabilitiesForProductSearchResultAction,\n getPriceForProductSearchResult,\n IDimensionsApp,\n PriceForProductSearchResultInput,\n ObjectExtensions\n} from '@msdyn365-commerce-modules/retail-actions';\nimport {\n getTelemetryObject,\n ILabeledDropdownOnChangeNotification,\n ILabeledDropdownOption,\n IModuleProps,\n INodeProps,\n isMobile,\n ITelemetryContent,\n LabeledDropdown,\n UncontrolledPagination,\n VariantType\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { action, computed, observable, reaction, transaction } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport {\n buildListPageUrl,\n getCollectionProducts,\n getCollectionRefinersAction,\n getCurrentUrl,\n GetFullProductsByCollectionInput,\n IFullProductsSearchResultsWithCount,\n parseQueryParam,\n ProductListInventoryFilteringOptions,\n RefinersByCollectionInput,\n sortOptions\n} from './actions';\nimport { hydrateRefinersFromUrl } from './actions/url-utils';\nimport {\n ErrorMessage,\n FeatureSearchResultItem,\n getUpdatedRefinementCriteria,\n IChoiceSummaryClickNotification,\n IRefineItemCommonProps,\n IRefineItemToggleNotification,\n ISearchResultModalViewProps,\n isMatchingRefinementCriterion,\n Link,\n ModalToggle,\n ProductSearchResultItems,\n SearchResultModal,\n Separator,\n Title\n} from './components';\nimport ChoiceSummary from './components/choice-summary';\nimport RefineSubmenu from './components/refine-submenu';\nimport { ListPageState } from './list-page-state';\nimport { ISearchResultContainerData } from './search-result-container.data';\nimport { expandRefinersCount, ISearchResultContainerProps } from './search-result-container.props.autogenerated';\n\nexport interface ISearchResultContainerViewProps extends ISearchResultContainerProps<ISearchResultContainerData> {\n products?: React.ReactNode;\n className?: string;\n SearchResultContainer: IModuleProps;\n TitleViewProps: ITitleViewProps;\n categoryHierarchy: ICategoryHierarchyViewProps;\n pagination?: React.ReactNode;\n ProductsContainer: INodeProps;\n ProductSectionContainer: INodeProps;\n refineMenu: IRefineMenuViewProps;\n sortByOptions: ISortByViewProps;\n choiceSummary?: React.ReactNode;\n modalToggle: React.ReactNode;\n searchResultModal: ISearchResultModalViewProps;\n isMobile: boolean;\n CategoryNavContainer: INodeProps;\n RefineAndProductSectionContainer: INodeProps;\n errorMessage: React.ReactNode;\n FeatureSearchContainer: INodeProps;\n similarLookProduct?: React.ReactNode;\n productPrices?: ProductPrice[];\n productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\n}\n\nexport interface ITitleViewProps {\n TitleContainer: INodeProps;\n title: ISearchResultTitle;\n}\n\nexport interface IRefineMenuViewProps {\n RefineMenuContainer: INodeProps;\n RefinerSectionContainer: INodeProps;\n refiners?: React.ReactNode[];\n}\n\nexport interface ICategoryHierarchyViewProps {\n categoryHierarchyList?: React.ReactNode[];\n categoryHierarchySeparator?: React.ReactNode;\n CategoryHierarchyContainer: INodeProps;\n}\n\nexport interface ISortByViewProps {\n SortingContainer: INodeProps;\n sortByDropDown?: React.ReactNode;\n}\n\nexport type GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\n/**\n * Title component for search result container.\n */\nexport interface ISearchResultTitle {\n titlePrefix?: React.ReactNode;\n titleText?: React.ReactNode;\n titleCount?: React.ReactNode;\n}\n\nexport interface ISearchResultContainerState {\n sortingState: ISortByCollectionState;\n modalIsOpen: boolean;\n refiners: IProductRefinerHierarchy[];\n productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\n channelInventoryConfiguration?: ChannelInventoryConfiguration;\n}\n\ninterface ISortByCollectionState {\n selectedSortByOption: ILabeledDropdownOption;\n pending: boolean;\n}\n\n/**\n *\n * SearchResultContainer component.\n * @extends {React.PureComponent<ISearchResultContainerProps<ISearchResultContainerData>>}\n */\n@observer\nexport default class SearchResultContainer extends React.PureComponent<\n ISearchResultContainerProps<ISearchResultContainerData>,\n ISearchResultContainerState\n> {\n @computed get isMobile(): boolean {\n return this._viewport === 'xs' || this._viewport === 'sm';\n }\n\n private readonly sortByDropdownOptions: ILabeledDropdownOption[] = [\n { key: sortOptions.sortByOptionRelevanceDesc, value: this.props.resources.sortByOptionRelevanceDesc },\n { key: sortOptions.sortByOptionNameAsc, value: this.props.resources.sortByOptionNameAsc },\n { key: sortOptions.sortByOptionNameDesc, value: this.props.resources.sortByOptionNameDesc },\n { key: sortOptions.sortByOptionPriceAsc, value: this.props.resources.sortByOptionPriceAsc },\n { key: sortOptions.sortByOptionPriceDesc, value: this.props.resources.sortByOptionPriceDesc },\n { key: sortOptions.sortByOptionRatingDesc, value: this.props.resources.sortByOptionRatingDesc },\n { key: sortOptions.sortByOptionBestSelling, value: this.props.resources.sortByOptionBestSelling },\n { key: sortOptions.sortByOptionNewScore, value: this.props.resources.sortByOptionNewScore },\n { key: sortOptions.sortByOptionTrendingScore, value: this.props.resources.sortByOptionTrendingScore }\n ];\n\n private readonly _refineItemCommonProps: IRefineItemCommonProps;\n\n private readonly _pageType: string | undefined = this.props.context.request.urlTokens.pageType;\n\n @observable\n private _viewport: GridSize = 'lg';\n\n private readonly _modalToggleRef: React.RefObject<HTMLButtonElement>;\n\n private readonly _sortAndFilterContainerRef: React.RefObject<LabeledDropdown>;\n\n private expandrefinerCount: number | undefined = 0;\n\n private readonly telemetryContent: ITelemetryContent;\n\n private readonly productPrices: ProductPrice[];\n\n private readonly defaultPageNumber = 0;\n\n private readonly catalogId = getCatalogId(this.props.context.request);\n\n private isListPageStateUpdated: boolean = false;\n\n private _isMounted: boolean = false;\n\n public static getFriendlyName(locale: string, nameTranslations?: TextValueTranslation[]): string | undefined {\n let nameTranslation: TextValueTranslation | undefined;\n if (locale && nameTranslations && ArrayExtensions.hasElements(nameTranslations)) {\n nameTranslation = nameTranslations.find(item => item.Language!.toLowerCase() === locale.toLowerCase());\n }\n\n return nameTranslation?.Text;\n }\n\n public constructor(props: ISearchResultContainerProps<ISearchResultContainerData>, state: ISearchResultContainerState) {\n super(props);\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Check required.\n this._viewport = props.context.request?.device?.Type === 'Mobile' ? 'xs' : 'lg';\n this._modalToggleRef = React.createRef<HTMLButtonElement>();\n this._sortAndFilterContainerRef = React.createRef<LabeledDropdown>();\n this._toggleModal = this._toggleModal.bind(this);\n this._updateViewport = this._updateViewport.bind(this);\n this.productPrices = [];\n this.state = {\n sortingState: {\n pending: false,\n selectedSortByOption: this.sortByDropdownOptions[0]\n },\n modalIsOpen: false,\n refiners: [],\n channelInventoryConfiguration: undefined\n };\n const { placeholderTextMax, minLabel, maxLabel, rangeNameFormat } = this.props.resources;\n\n const locale = this.props.context.request.locale;\n const telemetry = this.props.telemetry;\n const validationErrorNaN = this.props.resources.validationErrorNotNumber;\n const validationErrorRange = this.props.resources.validationErrorNotRange;\n this._refineItemCommonProps = {\n telemetry,\n locale,\n placeholderTextMax,\n minLabel,\n maxLabel,\n rangeNameFormat,\n validationErrorNaN,\n validationErrorRange\n };\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n this._updateViewport();\n }\n public async componentDidMount(): Promise<void> {\n this._isMounted = true;\n if (MsDyn365.isBrowser && window.addEventListener) {\n window.addEventListener('resize', this._updateViewport);\n this._updateViewport();\n }\n\n const listPageState = await this.props.data.listPageState;\n const products = await this.props.data.products;\n const channelInventoryConfiguration = await StoreOperationsDataActions.getInventoryConfigurationAsync({\n callerContext: this.props.context.actionContext\n });\n if (this._isMounted) {\n this.setState({ channelInventoryConfiguration });\n }\n\n this._updateListPageState(listPageState, products);\n\n // Initialize reaction based on listPageState properties\n reaction(\n () => {\n return [\n listPageState.activeFilters?.length,\n listPageState.currentPageNumber,\n ArrayExtensions.hasElements(listPageState.sortingCritera?.Columns)\n ];\n },\n async () => {\n const newListPageState = await this.props.data.listPageState;\n const input = new GetFullProductsByCollectionInput(\n newListPageState.pageType,\n this.props.context.request.apiSettings,\n {\n Paging: {\n Top: this.props.config.itemsPerPage,\n Skip: Math.max(newListPageState.pageSize * (newListPageState.currentPageNumber ?? 0), 0)\n },\n count: true,\n Sorting: newListPageState.sortingCritera ?? {}\n },\n newListPageState.activeFilters ?? [],\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- RecordId is string. Check required.\n +(this.props.context.request.urlTokens.recordId || 0),\n\n // eslint-disable-next-line max-len -- existing code\n this.props.context.request.query?.q\n ? this.props.context.request.query.q\n : JSON.stringify({\n ProductId: this.props.context.request.query?.productId,\n Recommendation: this.props.context.request.query?.recommendation\n }),\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Required check.\n !!this.props?.config?.includeAttributes,\n this.props.config.updateRefinerPanel,\n this.props.context.request.locale,\n this.catalogId,\n channelInventoryConfiguration\n );\n\n const productResults = await getCollectionProducts(input, this.props.context.actionContext);\n newListPageState.totalProductCount = productResults.count;\n newListPageState.activeProducts = productResults.products;\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- check is required.\n if (\n this.props.config.enableAffiliationBasedPricing &&\n this.props.context.actionContext.requestContext?.user?.isAuthenticated\n ) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Call api to retrieve the availabilities data without blocking the UI.\n this._getActivePrice();\n }\n\n await this._updateVariantAvailability();\n\n if (this.props.config.updateRefinerPanel) {\n const refinerInput = new RefinersByCollectionInput(\n newListPageState.pageType,\n this.props.context.request.apiSettings,\n {\n Paging: {\n Top: this.props.config.itemsPerPage,\n Skip: Math.max(\n newListPageState.pageSize * (newListPageState.currentPageNumber ?? this.defaultPageNumber),\n this.defaultPageNumber\n )\n },\n count: true,\n Sorting: newListPageState.sortingCritera ?? {}\n },\n newListPageState.activeFilters ?? [],\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- RecordId is string. Check required.\n +(this.props.context.request.urlTokens.recordId || 0),\n this.props.context.request.query?.q\n ? this.props.context.request.query.q\n : this.props.context.request.query?.productId,\n false,\n this.props.config.updateRefinerPanel,\n undefined,\n this.catalogId,\n channelInventoryConfiguration\n );\n\n const refiners = await getCollectionRefinersAction(refinerInput, this.props.context.actionContext);\n this.setState({ refiners });\n }\n }\n );\n\n if (\n this.props.config.enableAffiliationBasedPricing &&\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Condition required.\n this.props.context.actionContext.requestContext?.user?.isAuthenticated\n ) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Call api to retrieve the availabilities data without blocking the UI.\n this._getActivePrice();\n }\n await this._updateVariantAvailability();\n }\n\n public componentWillUnmount(): void {\n this._isMounted = false;\n if (MsDyn365.isBrowser && window.removeEventListener) {\n window.removeEventListener('resize', this._updateViewport);\n }\n }\n\n public render(): JSX.Element {\n const {\n config: { imageSettings, className },\n resources,\n data: { listPageState, products: productCollection, featureProduct }\n } = this.props;\n\n if (!this.isListPageStateUpdated && listPageState.result && productCollection.result) {\n this._updateListPageState(listPageState.result, productCollection.result);\n this.isListPageStateUpdated = true;\n }\n\n const products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\n const searchProduct = listPageState.result?.featureProduct ?? featureProduct.result ?? null;\n let errorText = '';\n if (!ArrayExtensions.hasElements(products)) {\n errorText = this._pageType === 'Category' ? resources.resultCategoryNotFoundText : resources.resultSearchNotFoundText;\n }\n const productsComponent = this._getProducts();\n const featureComponent = (\n <FeatureSearchResultItem\n product={searchProduct}\n context={this.props.context}\n imageSettings={imageSettings}\n resources={resources}\n moduleType={this.props.typeName}\n moduleId={this.props.id}\n telemetryContent={this.telemetryContent}\n recommendation={this.props.context.request.query?.recommendation}\n />\n );\n\n const searchResultContainerViewProps = {\n ...this.props,\n products: productsComponent,\n TitleViewProps: this._getCollectionTitle(),\n categoryHierarchy: !this.props.config.disableHierarchy && this._getCategoryHierarchy(),\n refineMenu: this._getRefineMenu(),\n className: classnames('ms-search-result-container', className),\n SearchResultContainer: {\n moduleProps: this.props,\n className: classnames('ms-search-result-container', className)\n },\n sortByOptions: this.props.data.listPageState.result?.totalProductCount !== 0 ? this._getSortingDropDown() : null,\n pagination: this._getPagination(),\n ProductsContainer: { className: 'ms-search-result-container__Products' },\n ProductSectionContainer: { className: 'ms-search-result-container__product-section' },\n CategoryNavContainer: { className: 'ms-search-result-container__category-nav-section' },\n RefineAndProductSectionContainer: { className: 'ms-search-result-container__refine-product-section' },\n choiceSummary: this._getChoiceSummary(),\n modalToggle:\n this.props.data.listPageState.result?.totalProductCount !== 0 ? (\n <ModalToggle\n text={resources.modalTitle}\n ariaLabel={resources.modalTitle}\n innerRef={this._modalToggleRef}\n onClick={this._toggleModal}\n id='search-result-modal'\n />\n ) : null,\n searchResultModal: this._getSearchResultModal(),\n isMobile: this.isMobile,\n errorMessage: errorText && <ErrorMessage text={errorText} />,\n FeatureSearchContainer: { className: 'ms-feature-search-result' },\n similarLookProduct: searchProduct ? featureComponent : null,\n productPrices: this.productPrices,\n productsDimensionAvailabilities: this.state.productsDimensionAvailabilities\n };\n return this.props.renderView(searchResultContainerViewProps) as React.ReactElement;\n }\n\n /**\n * Get products variants dimension availabilities.\n * @returns Void.\n */\n private readonly _updateVariantAvailability = async (): Promise<void> => {\n const context = this.props.context as ICoreContext<IDimensionsApp>;\n const dimensionsToDisplayOnProductCard = context.app.config.dimensionsInProductCard;\n const dimensionsToDisplayAsSwatch = context.app.config.dimensionsAsSwatchType;\n if (\n ArrayExtensions.hasElements(dimensionsToDisplayOnProductCard) &&\n !dimensionsToDisplayOnProductCard.includes(DimensionTypes.none) &&\n ArrayExtensions.hasElements(dimensionsToDisplayAsSwatch) &&\n !dimensionsToDisplayAsSwatch.includes(DimensionTypes.none) &&\n this.props.config.includeAttributes\n ) {\n await this._getProductsDimensionsAvailabilities();\n }\n };\n\n /**\n * Update the list page state with initial data.\n * @param listPageState -- List page State.\n * @param products -- Products.\n */\n @action\n private readonly _updateListPageState = (listPageState: ListPageState, products: IFullProductsSearchResultsWithCount): void => {\n let querySorting: SortColumn[] = [];\n const defaultPageNumber: number = 10;\n\n if (this._pageType === 'Category') {\n listPageState.pageType = 'Category';\n } else {\n listPageState.pageType = 'Search';\n }\n\n if (this.props.context.request.query?.sorting) {\n querySorting = JSON.parse(decodeURIComponent(this.props.context.request.query.sorting)) as SortColumn[];\n }\n\n listPageState.currentPageNumber =\n (this.props.context.request.query?.skip &&\n +this.props.context.request.query.skip / (this.props.config.itemsPerPage ?? defaultPageNumber)) ||\n 0;\n listPageState.sortingCritera = { Columns: querySorting };\n listPageState.pageSize = this.props.config.itemsPerPage ?? defaultPageNumber;\n listPageState.activeProducts = products.products;\n listPageState.totalProductCount = products.count;\n listPageState.activeFilters = hydrateRefinersFromUrl(this.props.context.request) || [];\n if (this.props.context.request.query?.productId) {\n const featureProduct = this.props.data.featureProduct.result;\n if (featureProduct) {\n listPageState.featureProduct = featureProduct;\n }\n }\n };\n\n /**\n * Get products dimension availabilities.\n * @returns Void.\n */\n private readonly _getProductsDimensionsAvailabilities = async (): Promise<void> => {\n const productsList = this.props.data.listPageState.result?.activeProducts ?? [];\n\n const productsDimensionAvailabilities = await getDimensionAvailabilitiesForProductSearchResultAction(\n new DimensionAvailabilitiesForProductSearchResultInput(\n productsList,\n this.props.context as ICoreContext<IDimensionsApp>,\n DimensionSwatchDisplayTypes.productCard\n ),\n this.props.context.actionContext\n );\n\n if (ArrayExtensions.hasElements(productsDimensionAvailabilities)) {\n this.setState({ productsDimensionAvailabilities });\n }\n };\n\n /**\n * Get the active price for the products.\n */\n private readonly _getActivePrice = async (): Promise<void> => {\n const productsList = this.props.data.listPageState.result?.activeProducts ?? [];\n const products = await getPriceForProductSearchResult(\n new PriceForProductSearchResultInput(productsList),\n this.props.context.actionContext\n );\n\n const listPageState = await this.props.data.listPageState;\n listPageState.activeProducts = products;\n };\n\n private readonly _getSearchResultModal = (): ISearchResultModalViewProps => {\n const { resources } = this.props;\n return SearchResultModal({\n resources: {\n modalCloseButtonText: resources.modalCloseButtonText,\n modalTitle: resources.modalTitle\n },\n isOpen: this.state.modalIsOpen,\n returnRef: this._modalToggleRef,\n onModalToggle: this._toggleModal\n });\n };\n\n private readonly _getCollectionTitle = (): ITitleViewProps => {\n const { data, context, resources } = this.props;\n\n let collectionTitle: string | undefined = '';\n if (context && context.request && context.request.query && context.request.query.q) {\n collectionTitle = `\"${context.request.query.q}\"`;\n } else {\n collectionTitle =\n (data.category.result &&\n SearchResultContainer.getFriendlyName(context.request.locale, data.category.result.NameTranslations)) ||\n (data.category.result && data.category.result.Name) ||\n this.props.context.request.query?.title ||\n '';\n }\n let productCountText = '';\n let productCountNumber: number | undefined;\n if (data.listPageState && data.listPageState.result && data.listPageState.result.totalProductCount !== undefined) {\n productCountNumber = data.listPageState.result.totalProductCount;\n } else if (data.products && data.products.result) {\n productCountNumber = data.products.result.count;\n }\n\n if (productCountNumber && productCountNumber !== 0) {\n productCountText =\n productCountNumber !== 1\n ? format(this.props.resources.numberOfProducts, productCountNumber)\n : this.props.resources.oneProduct;\n } else {\n productCountText = format(this.props.resources.numberOfProducts, 0);\n }\n const pageName = context.request.telemetryPageName ? `result-count-${context.request.telemetryPageName.toLowerCase()}` : '';\n const titlePrefix = <Title className='ms-search-result__collection-title-prefix' text={resources.searchTextPrefix} />;\n const titleText = collectionTitle && <Title className='ms-search-result__collection-title-text' text={collectionTitle} />;\n const titleCount = <Title className='ms-search-result__collection-title-count' text={productCountText} />;\n\n return {\n TitleContainer: { className: `ms-search-result-container__title ${pageName}` },\n title: {\n titlePrefix,\n titleText,\n titleCount\n }\n };\n };\n\n private readonly _getCategoryHierarchy = (): ICategoryHierarchyViewProps => {\n const { data } = this.props;\n const categoryHierarchy = data.categoryHierarchy.result;\n const categoryLinks =\n categoryHierarchy &&\n categoryHierarchy.map((value: CategoryHierarchyData, index: number) => {\n return (\n <Link\n key={index}\n text={value.Name}\n ariaLabel={`${this.props.resources.categoryLinkAriaLabel} ${value.Name}`}\n href={value.Url}\n />\n );\n });\n const categoryLinkSeparator = <Separator separator='/' />;\n\n return {\n CategoryHierarchyContainer: { tag: 'nav', className: 'ms-search-result-container__category-hierarchy' },\n categoryHierarchyList: categoryLinks,\n categoryHierarchySeparator: categoryLinkSeparator\n };\n };\n\n private readonly _getSortingDropDown = (): ISortByViewProps => {\n const { resources } = this.props;\n const activeDropdown = this._getCurrentlySelectedOption() || this.state.sortingState.selectedSortByOption;\n let dropdownOptions = this._getAllSortByOptions();\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- App config settings are of \"any\" value.\n if (this.props.context.app.config.hideRating) {\n dropdownOptions = dropdownOptions.filter(dropdownOption => dropdownOption.key !== sortOptions.sortByOptionRatingDesc);\n }\n\n const dropdown = (\n <LabeledDropdown\n labelClassname='reviews-list-sort-by'\n labelText={resources.sortByDropdownLabel}\n dropdownId='categorySortByDropdown'\n dropdownClassname='reviews-list-dropdown'\n toggleColor='link'\n dropdownOptions={dropdownOptions}\n selectedOption={activeDropdown}\n onSelectOption={this._updateSortByDropdown}\n ref={this._sortAndFilterContainerRef}\n />\n );\n return {\n SortingContainer: { className: 'ms-search-result-container__Sort-by-category' },\n sortByDropDown: dropdown\n };\n };\n\n private readonly _getPagination = (): React.ReactNode => {\n const { config, context, data, resources } = this.props;\n const listPageState = data.listPageState.result;\n const fullUrl = getCurrentUrl(context.request);\n const itemsPerPage = config.itemsPerPage || 10;\n // eslint-disable-next-line max-len -- existing code\n const skipCount = !ObjectExtensions.isNullOrUndefined(listPageState?.currentPageNumber)\n ? listPageState!.currentPageNumber * (this.props.config.itemsPerPage || 10)\n : (this.props.context.request.query && +this.props.context.request.query.skip) || 0;\n const totalItems = listPageState?.totalProductCount || 0;\n const previousText = resources.flipperPrevious;\n const nextText = resources.flipperNext;\n\n if (totalItems <= itemsPerPage) {\n return null;\n }\n return (\n <UncontrolledPagination\n className='ms-search-result-container__pagination'\n role='navigation'\n aria-label={resources.paginationAriaLabel}\n url={fullUrl.href}\n qsp='skip'\n items={totalItems}\n itemsPerPage={itemsPerPage}\n startingItem={skipCount}\n previousText={this._renderPrev(previousText)}\n nextText={this._renderNext(nextText)}\n previousAriaLabel={previousText}\n nextAriaLabel={nextText}\n telemetryContent={this.telemetryContent}\n />\n );\n };\n\n private readonly _getRefineMenu = (): IRefineMenuViewProps => {\n const { data, context, config } = this.props;\n const tempRangeTypeTODO = context.request.query && context.request.query.inputRange ? 'input' : 'slider';\n const validRefiners =\n this.props.config.updateRefinerPanel && ArrayExtensions.hasElements(this.state.refiners)\n ? this.state.refiners.filter(refiner => {\n return ArrayExtensions.hasElements(refiner.Values) && !this._shouldHideFromRefiners(refiner);\n })\n : data.refiners.result &&\n data.refiners.result.filter(refiner => {\n return ArrayExtensions.hasElements(refiner.Values) && !this._shouldHideFromRefiners(refiner);\n });\n\n const activeRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\n\n this._getexpandRefinerCount(validRefiners && validRefiners.length, config.expandRefinersCount);\n const expandedRefiners = this.expandrefinerCount;\n const subMenus =\n validRefiners &&\n validRefiners.map((productRefinerHierarchy: IProductRefinerHierarchy, index: number) => {\n return (\n <RefineSubmenu\n productRefinerHierarchy={productRefinerHierarchy}\n selectedRefinerValues={activeRefiners}\n refineItemCommonProps={this._refineItemCommonProps}\n minValueSliderThumbAriaLabel={this.props.resources.minValueSliderThumbAriaLabel}\n maxValueSliderThumbAriaLabel={this.props.resources.maxValueSliderThumbAriaLabel}\n key={index}\n onUpdateRefiners={this._onUpdateRefiners}\n urlBuilder={this._buildRefinerUrl}\n isDisabled={false}\n isExpandedOnInitialLoad={!!(expandedRefiners && expandedRefiners > index)}\n tempRangeTypeTODO={tempRangeTypeTODO}\n context={context}\n moduleId={this.props.id}\n moduleTypeName={this.props.typeName}\n telemetryContent={this.telemetryContent}\n productCountAriaLabel={this.props.resources.productCountAriaLabel}\n refineItemAriaLabel={this.props.resources.refineItemAriaLabel}\n refineItemsAriaLabel={this.props.resources.refineItemsAriaLabel}\n singleProductCountAriaLabel={this.props.resources.singleProductCountAriaLabel}\n isMobile={this.isMobile}\n />\n );\n });\n\n return {\n RefineMenuContainer: { className: 'ms-search-result-container__refine-menu' },\n RefinerSectionContainer: { className: 'ms-search-result-container__refiner-section' },\n refiners: subMenus\n };\n };\n\n /**\n * Should hide from refiners.\n * @param refiner - The refiner.\n * @returns ShouldHideFromRefiners.\n */\n private readonly _shouldHideFromRefiners = (refiner: IProductRefinerHierarchy): boolean => {\n const { channelInventoryConfiguration } = this.state;\n const isInventorySortableAttribute =\n (this.props.data.products.result?.inventoryAwareSortableAttributeId !== 0 &&\n refiner.RecordId === this.props.data.products.result?.inventoryAwareSortableAttributeId) ||\n (channelInventoryConfiguration?.ProductAvailabilitySortableAttributeRecordId !== 0 &&\n refiner.RecordId === channelInventoryConfiguration?.ProductAvailabilitySortableAttributeRecordId);\n\n const isInventoryProductAttribute =\n (this.props.data.products.result?.channelInventoryConfigurationId !== 0 &&\n refiner.RecordId === this.props.data.products.result?.channelInventoryConfigurationId) ||\n (channelInventoryConfiguration?.InventoryProductAttributeRecordId !== 0 &&\n refiner.RecordId === channelInventoryConfiguration?.InventoryProductAttributeRecordId);\n\n // Always hide sortable attribute since it's just for sorting products in Azure search, not for customers\n return (\n isInventorySortableAttribute ||\n (this.props.context.app.config.productListInventoryDisplay === ProductListInventoryFilteringOptions.HideOOS &&\n isInventoryProductAttribute)\n );\n };\n\n private readonly _getChoiceSummary = (): React.ReactNode => {\n const { resources, data, telemetry } = this.props;\n const { channelInventoryConfiguration } = this.state;\n const selectedRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\n const refinerValueName = this.props.data.refiners.result?.find(rating => rating.KeyName === 'Rating');\n return (\n <ChoiceSummary\n classNames='ms-choice-summary-by-category'\n clearAllText={resources.clearAllText}\n label={resources.choiceSummaryLabel}\n closeAriaLabel={resources.closeAriaLabel}\n selectedChoices={selectedRefiners}\n // @ts-expect-error: NOTE Type-unsafe line below, null refinersByCategoryHierarchy case not handled\n refinerHierarchy={data.refiners.result}\n choiceFormat={resources.choiceFormat}\n choiceRangeValueFormat={resources.choiceRangeValueFormat}\n telemetry={telemetry}\n onChoiceClicked={this._onChoiceClicked}\n urlBuilder={this._buildRefinerUrlForChoiceSummary}\n choiceAriaLabel={resources.choiceAriaLabel}\n telemetryContent={this.telemetryContent}\n context={this.props.context}\n channelInventoryConfigurationId={channelInventoryConfiguration?.InventoryProductAttributeRecordId}\n refinerValues={refinerValueName}\n />\n );\n };\n\n /**\n * Get Active products.\n * @returns - JSX Elements.\n */\n private readonly _getProducts = (): JSX.Element => {\n const {\n config: { imageSettings, allowBackNavigation: shouldAllowBackNavigation }\n } = this.props;\n const { resources } = this.props;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- Reading config value.\n const breadCrumbType: string = this.props.context.app.config.breadcrumbType;\n const shouldAllowBack = shouldAllowBackNavigation && (breadCrumbType === 'back' || breadCrumbType === 'categoryAndBack');\n\n const products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\n const quickviewSlot = this.props.slots?.quickview?.[0];\n const productComparisonButton = ArrayExtensions.hasElements(this.props.slots.productComparisonButton)\n ? this.props.slots.productComparisonButton[0]\n : null;\n\n const isPriceMinMaxFeatureState = this.props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailSearchPriceRangeFeature'\n );\n return (\n <ProductSearchResultItems\n products={products}\n context={this.props.context}\n imageSettings={imageSettings}\n resources={resources}\n moduleType={this.props.typeName}\n moduleId={this.props.id}\n allowBackNavigation={shouldAllowBack}\n telemetryContent={this.telemetryContent}\n quickviewSlot={quickviewSlot}\n productComparisonButton={productComparisonButton}\n channelInventoryConfigurationId={this.props.data.products.result?.channelInventoryConfigurationId}\n isPriceMinMaxEnabled={isPriceMinMaxFeatureState?.IsEnabled}\n productsDimensionAvailabilities={this.state.productsDimensionAvailabilities}\n />\n );\n };\n\n private readonly _updateSortByDropdown = (notification: ILabeledDropdownOnChangeNotification): void => {\n const {\n context: { request: requestContext, actionContext }\n } = this.props;\n\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\n // eslint-disable-next-line max-len -- existing code\n const error = `[sort-by-category] cannot sort without context: ${!requestContext ? 'requestContext ' : ''} ${\n !actionContext ? 'actionContext ' : ''\n } could not be found`;\n this.props.telemetry.warning(error);\n return;\n }\n\n window.history.pushState(\n {},\n '',\n buildListPageUrl(\n getCurrentUrl(this.props.context.request),\n undefined,\n [this._getSortColumnFromSelectedOption(notification.selectedOption)],\n undefined\n )\n );\n transaction(() => {\n this.props.data.listPageState.result!.currentPageNumber = 0;\n this.props.data.listPageState.result!.sortingCritera = {\n Columns: [this._getSortColumnFromSelectedOption(notification.selectedOption)]\n };\n });\n };\n\n private readonly _getSortColumnFromSelectedOption = (option: ILabeledDropdownOption): SortColumn => {\n const { data } = this.props;\n\n if (!data.searchConfiguration.result) {\n return {};\n }\n\n const mappedConfiguration = data.searchConfiguration.result.find(searchConfiguration => {\n return searchConfiguration.key === option.key;\n });\n\n if (mappedConfiguration) {\n return mappedConfiguration.sortColumn;\n }\n\n return {};\n };\n\n /**\n * Retrieves current sort criteria.\n * @returns Sort criteria column which is currently active or undefined if it's not specified.\n */\n private readonly _getSortCriteriaColumn = (): SortColumn | undefined => {\n const sortCriteria = this.props.data.listPageState.result?.sortingCritera;\n if (ArrayExtensions.hasElements(sortCriteria?.Columns)) {\n return sortCriteria!.Columns[0];\n }\n\n const queryColumns = parseQueryParam<SortColumn[]>('sorting', this.props.context.request);\n if (ArrayExtensions.hasElements(queryColumns)) {\n return queryColumns[0];\n }\n\n return undefined;\n };\n\n /**\n * Retrieves dropdown options.\n * @returns All dropdown options.\n */\n private readonly _getAllSortByOptions = (): ILabeledDropdownOption[] => {\n const searchConfiguration = this.props.data.searchConfiguration.result;\n\n if (!searchConfiguration) {\n return [];\n }\n\n const mappedSearchConfiguration = this.sortByDropdownOptions.filter(mappedSearchConfig =>\n searchConfiguration.find(item => mappedSearchConfig.key === item.key)\n );\n\n return ArrayExtensions.validValues(mappedSearchConfiguration);\n };\n\n /**\n * Retrieves current selected dropdown option based on the sort criteria.\n * @returns Current dropdown option.\n */\n private readonly _getCurrentlySelectedOption = (): ILabeledDropdownOption | undefined => {\n const activeSortColumn = this._getSortCriteriaColumn();\n\n const searchConfiguration = this.props.data.searchConfiguration.result;\n\n if (!activeSortColumn || !searchConfiguration) {\n return undefined;\n }\n\n const activeMappedConfig = searchConfiguration.find(\n mappedSearchConfig =>\n mappedSearchConfig.sortColumn.ColumnName === activeSortColumn.ColumnName &&\n mappedSearchConfig.sortColumn.IsDescending === activeSortColumn.IsDescending\n );\n if (!activeMappedConfig) {\n return undefined;\n }\n\n return this.sortByDropdownOptions.find(dropdownOption => dropdownOption.key === activeMappedConfig.key);\n };\n\n private readonly _onUpdateRefiners = (itemToggleNotification: IRefineItemToggleNotification): void => {\n const {\n context: { request: requestContext, actionContext }\n } = this.props;\n\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\n const error = `Refine menu cannot refine search criteria: \n ${!requestContext ? 'requestContext ' : ''} ${!actionContext ? 'actionContext ' : ''} could not be found`;\n this.props.telemetry.warning(error);\n return;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Server side the list PageState will not be called.\n const updatedRefinementCriteria = getUpdatedRefinementCriteria(\n itemToggleNotification,\n this.props.data.listPageState.result?.activeFilters || []\n );\n\n window.history.pushState({}, '', buildListPageUrl(getCurrentUrl(this.props.context.request), updatedRefinementCriteria));\n transaction(() => {\n this.props.data.listPageState.result!.currentPageNumber = 0;\n this.props.data.listPageState.result!.activeFilters = updatedRefinementCriteria;\n });\n };\n\n private readonly _buildRefinerUrl = (itemToggleNotification: IRefineItemToggleNotification): string => {\n if (this.props.data.listPageState.result) {\n const newRefinementCriteria = getUpdatedRefinementCriteria(\n itemToggleNotification,\n this.props.data.listPageState.result.activeFilters || []\n );\n\n return buildListPageUrl(getCurrentUrl(this.props.context.request), newRefinementCriteria);\n }\n this.props.telemetry.warning('[buildRefinerQueryString]List Page State Not available, unable to build refiner URL');\n return '';\n };\n\n private readonly _onChoiceClicked = (notification: IChoiceSummaryClickNotification): void => {\n const { data, telemetry } = this.props;\n\n if (!data.listPageState.result) {\n telemetry.warning('[choice-summary-by-category._onChoiceClicked]ListPageState unavailable, unable to update refiners.');\n return;\n }\n\n let currentRefinementCriteria = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\n\n if (!notification.clearAll) {\n const selectedChoice = notification.choiceClicked;\n if (!selectedChoice) {\n telemetry.warning('[choice-summary-by-category._onChoiceClicked] Choice could not be determined');\n return;\n }\n currentRefinementCriteria = currentRefinementCriteria.filter(\n (selectedCriterion: ProductRefinerValue) => !isMatchingRefinementCriterion(selectedChoice, selectedCriterion)\n );\n } else {\n currentRefinementCriteria = [];\n\n // Set focus to sort and filter\n const dropdownElementId = this._sortAndFilterContainerRef.current && this._sortAndFilterContainerRef.current.props.dropdownId;\n const dropdownElement = dropdownElementId && document.getElementById(dropdownElementId);\n setTimeout(() => {\n dropdownElement && dropdownElement.focus();\n }, 50);\n }\n\n const fullUrl = getCurrentUrl(this.props.context.request);\n window.history.pushState({}, '', buildListPageUrl(fullUrl, currentRefinementCriteria));\n data.listPageState.result.currentPageNumber = 0;\n data.listPageState.result.activeFilters = currentRefinementCriteria;\n };\n\n private readonly _buildRefinerUrlForChoiceSummary = (selectedRefiner: ProductRefinerValue, isClearAll: boolean): string => {\n const { data, telemetry } = this.props;\n const fullUrl = getCurrentUrl(this.props.context.request);\n\n if (!data.listPageState.result) {\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl]ListPageState unavailable, unable to create refiner URL.');\n return fullUrl.href;\n }\n\n let currentRefinementCriteria = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\n\n if (!isClearAll) {\n if (!selectedRefiner) {\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl] URL for Choice could not be determined');\n return fullUrl.href;\n }\n currentRefinementCriteria = currentRefinementCriteria.filter(\n (selectedCriterion: ProductRefinerValue) => !isMatchingRefinementCriterion(selectedRefiner, selectedCriterion)\n );\n } else {\n currentRefinementCriteria = [];\n }\n\n return buildListPageUrl(fullUrl, currentRefinementCriteria);\n };\n\n private _getViewport(): GridSize {\n if (MsDyn365.isBrowser) {\n return isMobile({ variant: VariantType.Browser, context: this.props.context.request });\n }\n return isMobile({ variant: VariantType.Viewport, context: this.props.context.request });\n }\n\n private _toggleModal(): void {\n this.setState({\n modalIsOpen: !this.state.modalIsOpen\n });\n }\n\n private _updateViewport(): void {\n this._viewport = this._getViewport();\n\n if (this.state.modalIsOpen && !this.isMobile) {\n this._toggleModal();\n }\n }\n\n private readonly _getexpandRefinerCount = (validRefiners?: number, refinerCount?: expandRefinersCount): void => {\n switch (refinerCount) {\n case expandRefinersCount.all:\n this.expandrefinerCount = validRefiners;\n break;\n case expandRefinersCount.one:\n this.expandrefinerCount = 1;\n break;\n case expandRefinersCount.two:\n this.expandrefinerCount = 2;\n break;\n case expandRefinersCount.three:\n this.expandrefinerCount = 3;\n break;\n case expandRefinersCount.four:\n this.expandrefinerCount = 4;\n break;\n default:\n this.expandrefinerCount = 0;\n }\n };\n\n /**\n * Renders a Pagination previous text.\n * @param paginationPreviousText - Pagination previous text from resources.\n * @returns Previous text and flipper icon.\n */\n private readonly _renderPrev = (paginationPreviousText: string) => {\n return (\n <div className='msc-pagination__prev'>\n <span className='ms-search-result__pagination-left' aria-hidden='true' />\n <span className='prev-text'>{paginationPreviousText}</span>\n </div>\n );\n };\n\n /**\n * Renders a Pagination next text.\n * @param paginationNextText - Pagination next text from resources.\n * @returns Next text and flipper icon.\n */\n private readonly _renderNext = (paginationNextText: string) => {\n return (\n <div className='msc-pagination__next'>\n <span className='next-text'>{paginationNextText}</span>\n <span className='ms-search-result__pagination-right' aria-hidden='true' />\n </div>\n );\n };\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISearchResultModalViewProps } from './components';\nimport {\n ICategoryHierarchyViewProps,\n IRefineMenuViewProps,\n ISearchResultContainerViewProps,\n ISortByViewProps,\n ITitleViewProps\n} from './search-result-container';\n\nconst SearchResultContainerView: React.FC<ISearchResultContainerViewProps> = props => {\n const {\n SearchResultContainer,\n products,\n pagination,\n ProductsContainer,\n ProductSectionContainer,\n choiceSummary,\n isMobile,\n modalToggle,\n searchResultModal,\n TitleViewProps,\n refineMenu,\n categoryHierarchy,\n sortByOptions,\n CategoryNavContainer,\n RefineAndProductSectionContainer,\n errorMessage,\n FeatureSearchContainer,\n similarLookProduct\n } = props;\n const isRecoSearchPage = props.context.actionContext.requestContext.query?.recommendation;\n if (isMobile) {\n return (\n <Module {...SearchResultContainer}>\n {renderCategoryHierarchy(categoryHierarchy)}\n {renderTitle(TitleViewProps)}\n {choiceSummary}\n {modalToggle}\n {createSearchResultModal(searchResultModal, refineMenu, sortByOptions, isRecoSearchPage)}\n <Node {...FeatureSearchContainer}>{similarLookProduct}</Node>\n <Node {...ProductsContainer}>\n {errorMessage}\n {products}\n </Node>\n {pagination}\n </Module>\n );\n }\n return (\n <Module {...SearchResultContainer}>\n <Node {...CategoryNavContainer}>\n {categoryHierarchy && renderCategoryHierarchy(categoryHierarchy)}\n {TitleViewProps && renderTitleCount(TitleViewProps)}\n </Node>\n <Node {...RefineAndProductSectionContainer}>\n {refineMenu && renderRefiner(refineMenu)}\n <Node {...ProductSectionContainer}>\n {TitleViewProps && renderTitle(TitleViewProps)}\n {choiceSummary}\n {sortByOptions && !isRecoSearchPage && renderSort(sortByOptions)}\n <Node {...FeatureSearchContainer}>{similarLookProduct}</Node>\n <Node {...ProductsContainer}>\n {errorMessage}\n {products}\n </Node>\n {pagination}\n </Node>\n </Node>\n </Module>\n );\n};\n\nconst createSearchResultModal = (\n modalProps: ISearchResultModalViewProps,\n refineMenu: IRefineMenuViewProps,\n sortByDropDown: ISortByViewProps,\n isRecoSearchPage?: string\n): JSX.Element => {\n return React.cloneElement(\n modalProps.modal,\n {},\n modalProps.modalHeader,\n createModalBody(modalProps, refineMenu, sortByDropDown, isRecoSearchPage),\n modalProps.modalFooter\n );\n};\n\nconst createModalBody = (\n props: ISearchResultModalViewProps,\n refineMenu: IRefineMenuViewProps,\n sortByDropDown: ISortByViewProps,\n isRecoSearchPage?: string\n): JSX.Element | null => {\n if (sortByDropDown) {\n return React.cloneElement(props.modalBody, {}, renderSort(sortByDropDown, isRecoSearchPage), renderRefiner(refineMenu));\n }\n return null;\n};\n\nconst renderRefiner = (props: IRefineMenuViewProps): JSX.Element | null => {\n const { refiners, RefineMenuContainer, RefinerSectionContainer } = props;\n if (refiners) {\n return (\n <Node {...RefinerSectionContainer}>\n <Node {...RefineMenuContainer}>\n {refiners.map((submenu, index) => (\n <React.Fragment key={index}>{submenu}</React.Fragment>\n ))}\n </Node>\n </Node>\n );\n }\n return null;\n};\n\nconst renderSort = (props: ISortByViewProps, isRecoSearchPage?: string): JSX.Element | null => {\n const { SortingContainer, sortByDropDown } = props;\n if (sortByDropDown && !isRecoSearchPage) {\n return <Node {...SortingContainer}>{sortByDropDown}</Node>;\n }\n return null;\n};\n\nconst renderCategoryHierarchy = (props: ICategoryHierarchyViewProps): JSX.Element | null => {\n const { CategoryHierarchyContainer, categoryHierarchyList, categoryHierarchySeparator } = props;\n if (categoryHierarchyList) {\n return (\n <Node {...CategoryHierarchyContainer}>\n {categoryHierarchyList.map((category, index) => (\n <React.Fragment key={index}>\n {category}\n {categoryHierarchyList && categoryHierarchyList[index + 1] && categoryHierarchySeparator}\n </React.Fragment>\n ))}\n </Node>\n );\n }\n\n return null;\n};\n\nconst renderTitle = (props: ITitleViewProps): JSX.Element | null => {\n const { title, TitleContainer } = props;\n if (title) {\n return (\n <Node {...TitleContainer}>\n <h2>\n {title.titlePrefix}\n {title.titleText}\n </h2>\n </Node>\n );\n }\n return null;\n};\n\nconst renderTitleCount = (props: ITitleViewProps): JSX.Element | null => {\n const { title, TitleContainer } = props;\n if (title) {\n return (\n <Node {...TitleContainer}>\n <h5>{title.titleCount}</h5>\n </Node>\n );\n }\n return null;\n};\n\nexport default SearchResultContainerView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\nexport interface IWishlistItemDimension {\n key: string;\n className?: string;\n dimensionType: string;\n dimensionValue: string;\n}\n\nexport const WishlistItemDimension: React.FC<IWishlistItemDimension> = ({ key, className, dimensionType, dimensionValue }) => (\n <div key={key} className={className}>\n <span className='msc-wishlist-dimension__label'>{dimensionType}:</span>\n <span className='msc-wishlist-dimension__value'>{dimensionValue}</span>\n </div>\n);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { PriceComponent } from '@msdyn365-commerce/components';\nimport { IAny, ICoreContext, IGeneric, IImageSettings, Image, ITelemetry, msdyn365Commerce } from '@msdyn365-commerce/core';\nimport {\n CommerceListLine,\n ProductPrice,\n ReleasedProductType,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport {\n convertProductDimensionTypeToDimensionTypes,\n getFallbackImageUrl,\n StringExtensions\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { Alert, Button, getPayloadObject, getTelemetryAttributes, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IWishlistItemActionMessageState } from '../wishlist-items';\nimport { WishlistItemDimension } from './wishlist-items-dimensions';\n\nexport interface IWishlistItemProps extends CommerceListLine {\n product: SimpleProduct;\n wishlistState: IWishlistItemActionMessageState;\n price?: ProductPrice;\n context: ICoreContext<IGeneric<IAny>>;\n productUrl: string;\n imageSettings?: IImageSettings;\n removeFromWishlistText: string;\n isInStock: boolean;\n addToCartText: string;\n outOfStockText: string;\n index: number;\n itemKey: string;\n telemetry: ITelemetry;\n moduleId: string;\n moduleTypeName: string;\n enableImageProductLink?: boolean;\n inventoryInformationLabel?: string;\n inventoryLabelClassName?: string;\n telemetryContent?: ITelemetryContent;\n handlers: {\n onAddToCart(product: SimpleProduct, itemKey: string): void;\n onRemoveItem(productId: number): void | undefined;\n onDismiss(): void;\n };\n resources: {\n productDimensionTypeColor: string;\n productDimensionTypeSize: string;\n productDimensionTypeStyle: string;\n originalPriceText: string;\n currentPriceText: string;\n freePriceText: string;\n };\n}\n\nexport interface IWishlistItemViewProps {\n key: string;\n productImage: React.ReactNode;\n productLink: React.ReactNode;\n productDimensions?: React.ReactNode[];\n productPrice?: React.ReactNode;\n addToCartButton?: React.ReactNode;\n removeButton?: React.ReactNode;\n productStatusMessage?: React.ReactNode;\n productName?: React.ReactNode;\n productAriaLabel?: string;\n entireProductLink?: string;\n inventoryInformation?: React.ReactNode;\n productUnitOfMeasure?: React.ReactNode;\n}\n\nconst _addItemToCart = (props: IWishlistItemProps): void => {\n const { product, itemKey, handlers } = props;\n const { onAddToCart } = handlers;\n\n onAddToCart && product && itemKey && onAddToCart(product, itemKey);\n};\n\nconst _removeItemFromWishlist = (props: IWishlistItemProps): void => {\n const { onRemoveItem } = props.handlers;\n const { RecordId } = props.product;\n\n onRemoveItem && RecordId && onRemoveItem(RecordId);\n};\n\nconst WishListItemActions = {\n addToCart: _addItemToCart,\n removeItem: _removeItemFromWishlist\n};\n\nconst _getFullProductLink = (props: IWishlistItemProps): string => {\n if (!msdyn365Commerce.isBrowser) {\n return '';\n }\n\n const fullUrl = new URL(props.productUrl, window.location.href);\n for (const dimension of props.product.Dimensions ?? []) {\n const dimensionValue = dimension.DimensionValue?.Value;\n if (!StringExtensions.isNullOrWhitespace(dimensionValue)) {\n const dimensionName = convertProductDimensionTypeToDimensionTypes(dimension.DimensionTypeValue);\n fullUrl.searchParams.set(dimensionName, dimensionValue!);\n }\n }\n return fullUrl.href;\n // return updateProductUrl(productUrl, context, swatch);\n};\n\nconst _renderAriaLabel = (props: IWishlistItemProps): string => {\n const { product, price, context, resources } = props;\n\n const { Name, Dimensions } = product;\n const { productDimensionTypeColor, productDimensionTypeSize, productDimensionTypeStyle } = resources;\n\n let formattedPrice = 'Free';\n let dimensions = null;\n\n if (price) {\n formattedPrice =\n price.BasePrice === 0 ? resources.freePriceText : context.cultureFormatter.formatCurrency(price.BasePrice!, price.CurrencyCode);\n }\n\n if (Dimensions) {\n dimensions = Dimensions.map(productDimension => {\n switch (productDimension.DimensionTypeValue) {\n case 1:\n return `${productDimensionTypeColor}${productDimension.DimensionValue && productDimension.DimensionValue.Value}`;\n case 3:\n return `${productDimensionTypeSize}${productDimension.DimensionValue && productDimension.DimensionValue.Value}`;\n case 4:\n return `${productDimensionTypeStyle}${productDimension.DimensionValue && productDimension.DimensionValue.Value}`;\n default:\n return '';\n }\n });\n }\n\n return `${Name} ${formattedPrice} ${(dimensions && dimensions.join('')) || ''}`;\n};\n\n/**\n * Renders a link to a product based on the given props.\n * @param input - Wishlist item props with the info about the product.\n * @param productUrl - The url to the product.\n * @returns React component with a link to a product.\n */\nconst renderProductLink = (input: IWishlistItemProps, productUrl: string) => {\n const { telemetryContent } = input;\n const { RecordId: recordId, Name: productName } = input.product;\n const payLoad = getPayloadObject('click', telemetryContent!, '', recordId.toString());\n const productAttributes = getTelemetryAttributes(telemetryContent!, payLoad);\n const productPageUrlWithSwatch = productUrl;\n return (\n !StringExtensions.isNullOrWhitespace(productPageUrlWithSwatch) && (\n <a\n href={productPageUrlWithSwatch}\n className='ms-wishlist-items__product-link'\n {...productAttributes}\n aria-label={_renderAriaLabel(input)}\n >\n {productName}\n </a>\n )\n );\n};\n\n/**\n * Renders a product name box.\n * @param productName - The text to display.\n * @returns React component with a name of a product.\n */\nconst renderProductName = (productName: string) => {\n return <div className='ms-wishlist-items__product-title'>{productName}</div>;\n};\n\n/**\n * Renders inventory information.\n * @param inventoryInformationLabel - The text to display.\n * @param inventoryLabelClassName - The component class name.\n * @returns React component.\n */\nconst renderInventoryInformationLabel = (inventoryInformationLabel: string | undefined, inventoryLabelClassName: string | undefined) => {\n const inventoryCssName = inventoryLabelClassName\n ? `ms-wishlist-items__inventory-label ${inventoryLabelClassName}`\n : 'ms-wishlist-items__inventory-label';\n return (\n !StringExtensions.isNullOrWhitespace(inventoryInformationLabel) && (\n <span className={inventoryCssName}>{inventoryInformationLabel}</span>\n )\n );\n};\n\n/**\n * Renders add to cart button.\n * @param input - Wishlist item props with the configuration.\n * @returns React component.\n */\nconst WishlistItemAddToCartButtonComponent = (input: IWishlistItemProps) => {\n const { isInStock, addToCartText, outOfStockText } = input;\n\n // Check if the product is service or not by product type.\n const isServiceItem = input.product.ItemTypeValue === ReleasedProductType.Service;\n\n const addItemAction = React.useCallback(() => {\n WishListItemActions.addToCart(input);\n }, [input]);\n\n return (\n <Button\n className='ms-wishlist-items__product-add-button'\n title={((isServiceItem || isInStock) && addToCartText) || outOfStockText}\n onClick={addItemAction}\n disabled={!(isServiceItem || isInStock)}\n >\n {((isServiceItem || isInStock) && addToCartText) || outOfStockText}\n </Button>\n );\n};\n\n/**\n * Renders remove from wishlist button.\n * @param input - Wishlist item props with the configuration.\n * @returns React component.\n */\nconst WishlistItemRemoveFromWishlistButtonComponent = (input: IWishlistItemProps) => {\n const { removeFromWishlistText } = input;\n\n const removeItemAction = React.useCallback(() => {\n WishListItemActions.removeItem(input);\n }, [input]);\n\n return <button className='ms-wishlist-items__product-remove-button' aria-label={removeFromWishlistText} onClick={removeItemAction} />;\n};\n\n/**\n * Gets the react node for product unit of measure display.\n * @param context - Module context.\n * @param unitOfMeasure - Product unit of measure.\n * @returns The node representing markup for unit of measure component.\n */\nconst renderUnitOfMeasure = (context: ICoreContext<IGeneric<IAny>>, unitOfMeasure?: string) => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Do not need type check for appsettings\n if (context.app.config && (!context.app.config.unitOfMeasureDisplayType || context.app.config.unitOfMeasureDisplayType === 'none')) {\n return undefined;\n }\n\n if (!unitOfMeasure) {\n return undefined;\n }\n\n return (\n <div className='msc-wishlistitems__product-unit-of-measure'>\n <span>{unitOfMeasure}</span>\n </div>\n );\n};\n\nexport const WishlistItem = (input: IWishlistItemProps): IWishlistItemViewProps | null => {\n const {\n product,\n price,\n context,\n imageSettings,\n wishlistState,\n itemKey,\n handlers,\n inventoryInformationLabel,\n enableImageProductLink,\n inventoryLabelClassName\n } = input;\n\n if (!product) {\n return null;\n }\n\n const { RecordId, Name, PrimaryImageUrl, Dimensions } = product;\n if (product.RecordId) {\n const fallbackImage = getFallbackImageUrl(\n product.ItemId,\n context.actionContext.requestContext.apiSettings,\n context.request.app?.config?.OmniChannelMedia\n );\n const productUrl = _getFullProductLink(input);\n const productImage =\n Name &&\n _renderProductImage(\n context,\n product.Name!,\n PrimaryImageUrl === undefined ? fallbackImage : PrimaryImageUrl,\n fallbackImage,\n imageSettings\n );\n return {\n key: `${RecordId}-item`,\n productImage,\n productLink: renderProductLink(input, productUrl),\n productDimensions: Dimensions && _renderProductDimensions(input),\n productPrice: price && _renderPrice(input),\n productUnitOfMeasure: product.DefaultUnitOfMeasure && renderUnitOfMeasure(context, product.DefaultUnitOfMeasure),\n entireProductLink: enableImageProductLink ? productUrl : undefined,\n productAriaLabel: enableImageProductLink ? _renderAriaLabel(input) : undefined,\n productName: enableImageProductLink && Name && renderProductName(Name),\n\n addToCartButton: <WishlistItemAddToCartButtonComponent {...input} />,\n inventoryInformation: renderInventoryInformationLabel(inventoryInformationLabel, inventoryLabelClassName),\n removeButton: <WishlistItemRemoveFromWishlistButtonComponent {...input} />,\n productStatusMessage: wishlistState &&\n wishlistState.isOpen &&\n wishlistState.productId === RecordId &&\n wishlistState.itemKey === itemKey && (\n <div className='ms-wishlist-items__product-status'>\n <Alert color={wishlistState.statusCssString} isOpen={wishlistState.isOpen} toggle={handlers.onDismiss}>\n <span>{wishlistState.userMessage}</span>\n </Alert>\n </div>\n )\n };\n }\n return null;\n};\n\nconst _renderProductImage = (\n context: ICoreContext,\n heading: string,\n image?: string,\n fallbackImage?: string,\n imageSettings?: IImageSettings\n): JSX.Element | null => {\n const defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=315&h=315&m=6', w: 0, h: 0 },\n lg: { q: 'w=315&h=315&m=6', w: 0, h: 0 },\n xl: { q: 'w=315&h=315&m=6', w: 0, h: 0 }\n },\n lazyload: true,\n cropFocalRegion: true\n };\n\n if (imageSettings) {\n imageSettings.cropFocalRegion = true;\n }\n\n if (image) {\n return (\n <Image\n requestContext={context.actionContext.requestContext}\n className='ms-wishlist-items__product-image'\n altText={heading}\n title={heading}\n src={image}\n fallBackSrc={fallbackImage}\n gridSettings={context.request.gridSettings!}\n imageSettings={imageSettings || defaultImageSettings}\n loadFailureBehavior='empty'\n />\n );\n }\n return null;\n};\n\nconst _renderPrice = (props: IWishlistItemProps): JSX.Element | null => {\n const { price, context, moduleId, moduleTypeName, resources } = props;\n\n if (price) {\n return (\n <PriceComponent\n id={moduleId}\n typeName={moduleTypeName}\n data={{ price }}\n className='ms-wishlist-items__product-price'\n freePriceText={resources.freePriceText}\n originalPriceText={resources.originalPriceText}\n currentPriceText={resources.currentPriceText}\n context={context}\n />\n );\n }\n return null;\n};\n\nconst _renderProductDimensions = (props: IWishlistItemProps): (React.ReactNode | undefined)[] => {\n const { product, resources } = props;\n\n if (!product || !product.Dimensions) {\n return [];\n }\n\n return product.Dimensions.map((dimension, index) => {\n if (!dimension.DimensionValue || !dimension.DimensionValue.Value) {\n return undefined;\n }\n\n let type = '';\n\n switch (dimension.DimensionTypeValue) {\n case 1: {\n type = resources.productDimensionTypeColor;\n break;\n }\n case 3: {\n type = resources.productDimensionTypeSize;\n break;\n }\n case 4: {\n type = resources.productDimensionTypeStyle;\n break;\n }\n default:\n return undefined;\n }\n\n return (\n <WishlistItemDimension\n key={`${product.RecordId}-dimensions-${index}`}\n className='msc-price ms-wishlist-items__product-dimension'\n dimensionType={type}\n dimensionValue={dimension.DimensionValue.Value}\n />\n );\n });\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { wishlistStatus } from '../wishlist-items';\n\nexport interface IWishlistItemsStatusMessageProps {\n className?: string;\n errorType: wishlistStatus;\n text?: string;\n}\n\nexport const WishlistItemsStatusMessage: React.FC<IWishlistItemsStatusMessageProps> = ({ className, errorType, text }) => {\n switch (errorType) {\n case 'EMPTY':\n return <p className={classnames('ms-wishlist-items__message-empty', className)}>{text}</p>;\n case 'FAILED':\n return <p className={classnames('ms-wishlist-items__message-failed', className)}>{text}</p>;\n case 'LOADING':\n default:\n return <p className={className ? 'ms-wishlist-items__message-exists-product' : 'ms-wishlist-items__message-waiting'}>{text}</p>;\n }\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { FullProduct } from '@msdyn365-commerce/commerce-entities';\nimport * as MsDyn365 from '@msdyn365-commerce/core';\nimport { AsyncResult, CommerceList, CommerceListLine, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { createGetByCustomerInput, removeLinesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CommerceListsDataActions.g';\nimport { getDeliveryOptionsAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\nimport {\n ArrayExtensions,\n getProductUrlSync,\n IProductInventoryInformation,\n QueryResultSettingsProxy\n} from '@msdyn365-commerce-modules/retail-actions';\nimport {\n getTelemetryObject,\n IModuleProps,\n INodeProps,\n ITelemetryContent,\n updateMaxQuantityForCartLineItem\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport getItemsInWishlists, { ActiveWishlistInput } from './actions/get-items-in-wishlists';\nimport { IWishlistItemViewProps, WishlistItem, WishlistItemsStatusMessage } from './components';\nimport { IWishlistItemsData } from './wishlist-items.data';\nimport { IHeadingData, IWishlistItemsProps } from './wishlist-items.props.autogenerated';\n\nexport interface IWishlistItemActionMessageState {\n productId: number;\n itemKey: string;\n userMessage: string;\n statusCssString: string;\n messageGlyph: string;\n isOpen: boolean;\n isError: boolean;\n}\n\nexport type wishlistStatus = 'LOADING' | 'SUCCESS' | 'FAILED' | 'EMPTY';\n\nexport interface IWishlistItemsViewProps extends IWishlistItemsProps<IWishlistItemsData> {\n WishlistItems: IModuleProps;\n status?: wishlistStatus;\n statusMessage?: React.ReactNode;\n heading?: React.ReactNode;\n Products?: INodeProps;\n Product?: INodeProps;\n ProductDetails?: INodeProps;\n ProductDimensions?: INodeProps;\n products?: IWishlistItemViewProps[];\n telemetryContent?: ITelemetryContent;\n statusNotExistsMessage?: React.ReactNode;\n}\n\n/**\n *\n * WishlistItems component.\n * @extends {React.PureComponent<IWishlistItemsProps<IWishlistItemsData>, IWishlistItemActionMessageState>}\n */\n@observer\nclass WishlistItems extends React.Component<IWishlistItemsProps<IWishlistItemsData>, IWishlistItemActionMessageState> {\n private readonly telemetryContent: ITelemetryContent;\n constructor(props: IWishlistItemsProps<IWishlistItemsData>) {\n super(props);\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n }\n\n public async componentDidMount(): Promise<void> {\n this.setState({ isError: false });\n }\n\n public shouldComponentUpdate(nextProps: IWishlistItemsProps<IWishlistItemsData>, nextState: IWishlistItemActionMessageState): boolean {\n if (this.state === nextState && this.props.data === nextProps.data) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element | null {\n const { heading, className } = this.props.config;\n const { emptyWishlistText, wishlistErrorGettingWishlist, noLongerExitsWishlistItemText } = this.props.resources;\n const { cart, productAvailability, wishlists, products } = this.props.data;\n\n if (cart.status === 'LOADING' || productAvailability.status === 'LOADING' || wishlists.status === 'LOADING') {\n const errorProps: IWishlistItemsViewProps = {\n ...(this.props as IWishlistItemsProps<IWishlistItemsData>),\n WishlistItems: {\n moduleProps: this.props,\n className: classnames('ms-wishlist-items', className)\n },\n status: 'LOADING',\n\n statusMessage: <WishlistItemsStatusMessage errorType='LOADING' text='Loading...' />,\n heading: this._renderHeading(heading)\n };\n return this.props.renderView(errorProps);\n }\n\n if (cart.status === 'FAILED' || productAvailability.status === 'FAILED' || wishlists.status === 'FAILED') {\n const errorProps: IWishlistItemsViewProps = {\n ...(this.props as IWishlistItemsProps<IWishlistItemsData>),\n WishlistItems: {\n moduleProps: this.props,\n className: classnames('ms-wishlist-items', className)\n },\n status: 'FAILED',\n statusMessage: <WishlistItemsStatusMessage errorType='FAILED' text={wishlistErrorGettingWishlist} />,\n heading: this._renderHeading(heading)\n };\n\n return this.props.renderView(errorProps);\n }\n\n const productsList = products && (products as AsyncResult<FullProduct[]>).result;\n\n if (productsList && productsList.length === 0) {\n const emptyViewProps: IWishlistItemsViewProps = {\n ...(this.props as IWishlistItemsProps<IWishlistItemsData>),\n WishlistItems: {\n moduleProps: this.props,\n className: classnames('ms-wishlist-items', className)\n },\n status: 'EMPTY',\n statusMessage: <WishlistItemsStatusMessage errorType='EMPTY' text={emptyWishlistText} />,\n heading: this._renderHeading(heading)\n };\n\n return this.props.renderView(emptyViewProps);\n }\n\n const viewProps: IWishlistItemsViewProps = {\n ...(this.props as IWishlistItemsProps<IWishlistItemsData>),\n WishlistItems: {\n moduleProps: this.props,\n className: classnames('ms-wishlist-items', className)\n },\n status: 'SUCCESS',\n heading: this._renderHeading(heading),\n Products: {\n className: 'ms-wishlist-items__products',\n tag: 'ul'\n },\n Product: {\n className: 'ms-wishlist-items__product',\n tag: 'li'\n },\n ProductDetails: {\n className: 'ms-wishlist-items__product-link',\n tag: 'a'\n },\n telemetryContent: this.telemetryContent,\n ProductDimensions: {\n className: 'ms-wishlist-items__product-dimensions'\n },\n products: productsList && this._renderProductList(productsList),\n statusNotExistsMessage:\n productsList && this._getProductNotExists(productsList, emptyWishlistText, noLongerExitsWishlistItemText)\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n public handleHeadingChange = (event: MsDyn365.ContentEditableEvent) => (this.props.config.heading!.text = event.target.value);\n\n private _getProductNotExists(products: FullProduct[], emptytext: string, noLongerExisttext: string): JSX.Element | null {\n if (this.state && this.state.isError) {\n if (products.length === 0) {\n return <WishlistItemsStatusMessage errorType='SUCCESS' text={emptytext} />;\n }\n return (\n <WishlistItemsStatusMessage\n className={'ms-wishlist-items__message-exists-product'}\n errorType='SUCCESS'\n text={noLongerExisttext}\n />\n );\n }\n return null;\n }\n private _renderProductList(products: FullProduct[]): IWishlistItemViewProps[] {\n const {\n priceFree,\n originalPriceText,\n currentPriceText,\n addToCartButtonText,\n outOfStockText,\n removeButtonText,\n productDimensionTypeColor,\n productDimensionTypeSize,\n productDimensionTypeStyle,\n productDimensionTypeAmount\n } = this.props.resources;\n const { context, telemetry } = this.props;\n const { imageSettings, enableImageProductLink } = this.props.config;\n\n return products.map((product: FullProduct, index) => {\n const currentProductProps = {\n product: product.ProductDetails,\n price: product.ProductPrice,\n context,\n wishlistState: this.state,\n productUrl: getProductUrlSync(product.ProductDetails, context.actionContext, undefined),\n imageSettings,\n removeFromWishlistText: removeButtonText,\n isInStock: this._isProductInStock(product),\n addToCartText: addToCartButtonText,\n outOfStockText,\n index,\n itemKey: `${product.ProductDetails.RecordId}-${product.ProductDetails.ItemId}-${index}`,\n telemetry,\n moduleId: this.props.id,\n moduleTypeName: this.props.typeName,\n enableImageProductLink,\n inventoryInformationLabel: this._inventoryLabel(product),\n inventoryLabelClassName: this._inventoryClassName(product),\n telemetryContent: this.telemetryContent,\n handlers: {\n onAddToCart: this._addItemToCart,\n onRemoveItem: this._removeItemFromWishlist,\n onDismiss: this._onDismiss\n },\n resources: {\n productDimensionTypeColor,\n productDimensionTypeSize,\n productDimensionTypeStyle: product.ProductDetails.IsGiftCard ? productDimensionTypeAmount : productDimensionTypeStyle,\n freePriceText: priceFree,\n originalPriceText,\n currentPriceText\n }\n };\n return WishlistItem(currentProductProps)!;\n });\n }\n\n // Dismiss alert when addingToCart/removeItem\n private readonly _onDismiss = () => {\n this.setState({\n isOpen: false\n });\n };\n\n private readonly _renderHeading = (heading?: IHeadingData): JSX.Element | undefined => {\n if (!heading) {\n return undefined;\n }\n return (\n <MsDyn365.Text\n className='ms-wishlist-items__heading'\n tag={heading.tag || 'h2'}\n text={heading.text}\n editProps={{ onEdit: this.handleHeadingChange, requestContext: this.props.context.request }}\n />\n );\n };\n\n private readonly _addItemToCart = async (product: SimpleProduct, itemKey: string): Promise<void> => {\n const { context, data, resources, telemetry } = this.props;\n const { cart, productAvailability } = data;\n const { addedToCartSuccessMessage, addedToCartFailureMessage, invoiceInCartErrorMessage } = resources;\n\n const productInventoryInformation = this._getProductInventory({ ProductDetails: product }, productAvailability.result);\n\n if (context) {\n if (cart.result) {\n // Check if the product delivery mode is electronic\n const emailDeliveryModeCode = this.props.context.actionContext.requestContext.channel?.EmailDeliveryModeCode;\n\n const deliveryOptions = await getDeliveryOptionsAsync(\n {\n callerContext: this.props.context.actionContext,\n queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(this.props.context.actionContext)\n },\n [product.RecordId]\n );\n const validateQuantity = this.isQuantityValidationRequired();\n const quantity = this.respectQuantityLimits() ? product?.Behavior?.MinimumQuantity ?? 1 : 1;\n\n const addProductToCartInput = {\n product,\n count: quantity,\n enableStockCheck: context.app.config.enableStockCheck,\n availableQuantity: productInventoryInformation\n ? productInventoryInformation.ProductAvailableQuantity.AvailableQuantity\n : 0,\n additionalProperties: { validateQuantity: validateQuantity },\n isAddEmailDeliveryItemToCart:\n ArrayExtensions.hasElements(deliveryOptions) &&\n ArrayExtensions.hasElements(deliveryOptions[0].DeliveryOptions) &&\n deliveryOptions[0].DeliveryOptions[0].Code === emailDeliveryModeCode\n };\n\n cart.result\n .addProductToCart(addProductToCartInput)\n .then(async result => {\n if (result.status === 'SUCCESS') {\n this.setState({\n productId: product.RecordId,\n itemKey,\n userMessage: addedToCartSuccessMessage,\n statusCssString: 'success',\n messageGlyph: 'fas fa-check',\n isOpen: true\n });\n } else if (result.substatus === 'MAXQUANTITY') {\n const curQuantity =\n (await cart).cart?.CartLines?.find(item => item.ProductId === product.RecordId)?.Quantity || 0;\n const maxQtyLimitReachedMessage = this._getInventoryValueMessage(productInventoryInformation, curQuantity);\n\n this.setState({\n productId: product.RecordId,\n itemKey,\n userMessage: maxQtyLimitReachedMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n } else if (result.substatus === 'QUANTITYLIMITS' && validateQuantity) {\n const maxQtyLimitReachedMessage = result.errorDetails?.LocalizedMessage!;\n\n this.setState({\n productId: product.RecordId,\n itemKey,\n userMessage: maxQtyLimitReachedMessage || addedToCartFailureMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n } else if (result.substatus === 'INVOICEINCART') {\n this.setState({\n productId: product.RecordId,\n itemKey,\n userMessage: result.errorDetails?.LocalizedMessage || invoiceInCartErrorMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n } else {\n this.props.telemetry.debug('[wishlist-items] Unable to Update Cart Line from the wishlist');\n this.setState({\n productId: product.RecordId,\n itemKey,\n userMessage: addedToCartFailureMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n }\n })\n .catch(error => {\n telemetry.warning(error);\n telemetry.debug('[wishlist-items] Error trying to Update Cart Line from the wishlist');\n this.setState({\n productId: product.RecordId,\n itemKey,\n userMessage: addedToCartFailureMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n });\n }\n }\n };\n\n private isQuantityValidationRequired = (): boolean => {\n const isChannelQuantityLimitsFeatureEnabledInHq =\n this.props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.EcommerceQuantityLimitConfigurationsFeature'\n )?.IsEnabled || false;\n\n const isOrderQuantityLimitsFeatureEnabled = this.isOrderQuantityLimitsFeatureEnabled();\n return isOrderQuantityLimitsFeatureEnabled || isChannelQuantityLimitsFeatureEnabledInHq;\n };\n\n private respectQuantityLimits = (): boolean => {\n const isOrderQuantityLimitsFeatureEnabled = this.isOrderQuantityLimitsFeatureEnabled();\n const validateLimitsPerLine = this.props.data.cartConfiguration?.result?.ValidateDefaultOrderSettingsPerLine ?? false;\n return isOrderQuantityLimitsFeatureEnabled && validateLimitsPerLine;\n };\n\n private isOrderQuantityLimitsFeatureEnabled = (): boolean => {\n const isOrderQuantityLimitsFeatureEnabledInHq =\n this.props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature'\n )?.IsEnabled || false;\n\n if (!isOrderQuantityLimitsFeatureEnabledInHq) {\n return false;\n }\n\n const useSiteBuilderSettings = this.props.data.featureState.result?.find(\n featureState => featureState.Name === 'RevertToSiteBuilderOrderQuantityLimitsSettings'\n )?.IsEnabled;\n\n if (useSiteBuilderSettings) {\n const defaultOrderQuantityLimitsFeatureConfig = this.props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits;\n\n const customerInfo = this.props.data.customerInformation.result;\n\n const isOrderQuantityLimitsFeatureEnabledInSiteSettings =\n defaultOrderQuantityLimitsFeatureConfig === 'all' ||\n ((customerInfo &&\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b))) ??\n false);\n\n return isOrderQuantityLimitsFeatureEnabledInSiteSettings;\n } else {\n const cartConfiguration = this.props.data.cartConfiguration?.result;\n return !(cartConfiguration?.IgnoreOrderSettings ?? false);\n }\n };\n\n private readonly _removeItemFromWishlist = (productId: number): void => {\n const { context, data, telemetry } = this.props;\n const { wishlists } = data;\n let noLongerLineExist: CommerceListLine[] | undefined = [];\n if (context && context.actionContext) {\n const userToken = context.request.user.isAuthenticated && context.request.user.token;\n const wishlistLineId = this._getWishlistLineIdFromProductId(productId);\n if (userToken && wishlists.result && wishlists.result[0] && wishlistLineId) {\n removeLinesAsync({ callerContext: context.actionContext }, wishlists.result[0].Id, [{ LineId: wishlistLineId }])\n .then(commerceList => {\n const castCommerceList: CommerceList | null = commerceList as CommerceList | null;\n\n if (castCommerceList && castCommerceList.Id && context.request.user.isAuthenticated) {\n noLongerLineExist = this._getProductsNoLongerExists(castCommerceList);\n if (noLongerLineExist && noLongerLineExist.length > 0) {\n this._removeNoLongerExistsLines(noLongerLineExist);\n } else {\n context.actionContext.update(createGetByCustomerInput({}, null), [castCommerceList]);\n getItemsInWishlists(new ActiveWishlistInput(), context.actionContext)\n .then(products => {\n const castSimpleProducts: FullProduct[] | null = products as FullProduct[] | null;\n if (castSimpleProducts && castSimpleProducts.length > 0) {\n this.setState({ isError: false });\n context.actionContext.update(new ActiveWishlistInput(), castSimpleProducts);\n }\n })\n .catch(error => {\n telemetry.warning('[wishlist-items] Unable to hyderate the wishlist with product information');\n telemetry.error(error);\n });\n }\n }\n })\n .catch(error => {\n telemetry.warning('[wishlist-items] Unable remove items from the wishlist');\n telemetry.error(error);\n });\n } else {\n telemetry.warning(\"[wishlist-items] Unable remove items from the wishlist user token or lineItemID wasn't found\");\n }\n }\n };\n\n private _getInventoryValueMessage(product: IProductInventoryInformation | undefined, curQuantity: number): string {\n const { context, resources } = this.props;\n const { maxQuantityLimitText } = resources;\n\n const maxQuantityForLineItem = updateMaxQuantityForCartLineItem(context.app.config.maxQuantityForCartLineItem);\n\n if (!product || !product.ProductAvailableQuantity.AvailableQuantity || !context.app.config.enableStockCheck) {\n return maxQuantityLimitText\n .replace('{maxQuantity}', maxQuantityForLineItem.toString())\n .replace('{curQuantity}', curQuantity.toString());\n }\n\n const minInventory = Math.min(maxQuantityForLineItem, product.ProductAvailableQuantity.AvailableQuantity);\n\n return maxQuantityLimitText.replace('{maxQuantity}', minInventory.toString()).replace('{curQuantity}', curQuantity.toString());\n }\n\n private _getProductInventory(\n product: FullProduct,\n productInventoryCollection: IProductInventoryInformation[] | undefined\n ): IProductInventoryInformation | undefined {\n if (productInventoryCollection && productInventoryCollection.length > 0) {\n for (const productResult of productInventoryCollection) {\n if (product.ProductDetails.RecordId === productResult.ProductAvailableQuantity.ProductId) {\n return productResult;\n }\n }\n }\n return undefined;\n }\n\n private readonly _inventoryLabel = (product: FullProduct): string | undefined => {\n const { productAvailability } = this.props.data;\n if (productAvailability && productAvailability.result) {\n const productInventoryInformation = this._getProductInventory(product, productAvailability.result);\n if (productInventoryInformation) {\n return productInventoryInformation.StockLevelLabel;\n }\n }\n\n return undefined;\n };\n\n private readonly _inventoryClassName = (product: FullProduct): string | undefined => {\n const { productAvailability } = this.props.data;\n if (productAvailability && productAvailability.result) {\n const productInventoryInformation = this._getProductInventory(product, productAvailability.result);\n if (productInventoryInformation && productInventoryInformation.StockLevelCode) {\n return `ms-wishlist-items__${productInventoryInformation.StockLevelCode.toLowerCase()}`;\n }\n }\n\n return undefined;\n };\n\n private readonly _isProductInStock = (product: FullProduct): boolean => {\n const { data, context } = this.props;\n const { productAvailability } = data;\n\n if (!context.app.config.enableStockCheck) {\n return true;\n }\n\n if (!productAvailability.result || !product.ProductDetails) {\n return false;\n }\n\n for (const productResult of productAvailability.result) {\n if (\n productResult.ProductAvailableQuantity &&\n productResult.ProductAvailableQuantity.ProductId &&\n productResult.ProductAvailableQuantity.ProductId === product.ProductDetails.RecordId\n ) {\n return productResult.IsProductAvailable;\n }\n }\n\n return false;\n };\n\n private readonly _getWishlistLineIdFromProductId = (productId: number): number | null => {\n const { wishlists } = this.props.data;\n\n if (\n !wishlists.result ||\n wishlists.result.length === 0 ||\n !wishlists.result[0].CommerceListLines ||\n wishlists.result[0].CommerceListLines.length === 0\n ) {\n this.props.telemetry.error('Wishlist content is empty, module wont render.');\n return null;\n }\n\n const foundWishlistItem = wishlists.result[0].CommerceListLines.filter(commerceListLine => {\n return commerceListLine.ProductId === productId;\n });\n\n if (foundWishlistItem && foundWishlistItem[0].LineId) {\n return foundWishlistItem[0].LineId;\n }\n return null;\n };\n\n private readonly _getProductsNoLongerExists = (castCommerceList: CommerceList): CommerceListLine[] | undefined => {\n const noLongerExist: CommerceListLine[] | undefined = [];\n castCommerceList.CommerceListLines?.map(line => {\n const { products } = this.props.data;\n const productsList = products && (products as AsyncResult<FullProduct[]>).result!;\n\n const skipRemove = productsList.filter(product => product.ProductDetails.RecordId === line.ProductId);\n if (skipRemove.length === 0) {\n noLongerExist?.push({ LineId: line.LineId });\n }\n });\n return noLongerExist;\n };\n\n private readonly _removeNoLongerExistsLines = (noLongerLineExist: CommerceListLine[]) => {\n const { context, data, telemetry } = this.props;\n const { wishlists } = data;\n if (context && context.actionContext) {\n const userToken = context.request.user.isAuthenticated && context.request.user.token;\n if (userToken && wishlists.result && wishlists.result[0]) {\n removeLinesAsync({ callerContext: context.actionContext }, wishlists.result[0].Id, noLongerLineExist)\n .then(commerceList => {\n const castCommerceList: CommerceList | null = commerceList as CommerceList | null;\n if (castCommerceList && castCommerceList.Id && context.request.user.isAuthenticated) {\n context.actionContext.update(createGetByCustomerInput({}, null), [castCommerceList]);\n getItemsInWishlists(new ActiveWishlistInput(), context.actionContext)\n .then(products => {\n const castSimpleProducts: FullProduct[] | null = products as FullProduct[] | null;\n if (castSimpleProducts && castSimpleProducts.length > 0) {\n this.setState({ isError: true });\n context.actionContext.update(new ActiveWishlistInput(), castSimpleProducts);\n }\n })\n .catch(error => {\n telemetry.warning('[wishlist-items] Unable to hyderate the wishlist with product information');\n telemetry.error(error);\n });\n }\n })\n .catch(error => {\n telemetry.warning('[wishlist-items] Unable remove items from the wishlist');\n telemetry.error(error);\n });\n } else {\n telemetry.warning(\"[wishlist-items] Unable remove items from the wishlist user token or lineItemID wasn't found\");\n }\n }\n };\n}\n\nexport default WishlistItems;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n getPayloadObject,\n getTelemetryAttributes,\n INodeProps,\n ITelemetryContent,\n Module,\n Node\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { IWishlistItemViewProps } from '../..';\nimport { IWishlistItemsViewProps } from './wishlist-items';\n\nconst WishlistItemsView: React.FC<IWishlistItemsViewProps> = props => {\n const {\n WishlistItems,\n status,\n statusMessage,\n heading,\n Products,\n products,\n Product,\n ProductDetails,\n ProductDimensions,\n telemetryContent,\n statusNotExistsMessage\n } = props;\n\n return (\n <Module {...WishlistItems}>\n {heading}\n {statusNotExistsMessage}\n {status !== 'SUCCESS' && statusMessage}\n {Products && products && products.length > 0 && (\n <Node {...Products}>\n {products &&\n products.map(product => {\n return product && _renderItem(product, Product, ProductDimensions, ProductDetails, telemetryContent);\n })}\n </Node>\n )}\n </Module>\n );\n};\n\nconst _renderItem = (\n product: IWishlistItemViewProps,\n Product?: INodeProps,\n ProductDimensions?: INodeProps,\n ProductDetails?: INodeProps,\n telemetryContent?: ITelemetryContent\n): JSX.Element | null => {\n const {\n key,\n productImage,\n productLink,\n productPrice,\n productDimensions,\n addToCartButton,\n removeButton,\n productStatusMessage,\n entireProductLink,\n productName,\n productAriaLabel,\n inventoryInformation,\n productUnitOfMeasure\n } = product;\n const payLoad = getPayloadObject('click', telemetryContent!, '', key);\n const productAttributes = getTelemetryAttributes(telemetryContent!, payLoad);\n if (entireProductLink) {\n return (\n <Node key={key} className={Product!.className} {...Product}>\n <Node\n href={entireProductLink}\n className={classnames('entire-product-link ', ProductDetails!.className)}\n {...productAttributes}\n aria-label={productAriaLabel}\n tag={ProductDetails!.tag}\n >\n {productImage}\n {productName}\n {productDimensions && ProductDimensions && (\n <Node {...ProductDimensions}>\n {productDimensions.map(dimension => {\n return dimension;\n })}\n </Node>\n )}\n {productPrice}\n {productUnitOfMeasure}\n </Node>\n {inventoryInformation}\n {addToCartButton}\n {removeButton}\n {productStatusMessage}\n </Node>\n );\n }\n return (\n <Node key={key} className={Product!.className} {...Product}>\n {productImage}\n {productLink}\n {productDimensions && ProductDimensions && (\n <Node {...ProductDimensions}>\n {productDimensions.map(dimension => {\n return dimension;\n })}\n </Node>\n )}\n {productPrice}\n {addToCartButton}\n {removeButton}\n {productStatusMessage}\n </Node>\n );\n};\n\nexport default WishlistItemsView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { 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 { IImageData, IImageSettings, Image, Video } from '@msdyn365-commerce/core';\nimport {\n IMediaData,\n IMediaGalleryThumbnailItemViewProps,\n IMediaGalleryThumbnailsViewProps,\n IMediaGalleryViewProps,\n MediaType\n} from '@msdyn365-commerce-modules/media-gallery';\nimport { ArrayExtensions, getFallbackImageUrl } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, KeyCodes, Module, Node, NodeTag } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport React from 'react';\nimport { IPlayerData, IPlayerOptions, IVideoMetadata, Player } from '@msdyn365-commerce-modules/video-player-utilities';\n\ninterface IMediaGalleryItemsProps extends IMediaGalleryThumbnailItemViewProps {\n Video?: React.ReactElement;\n}\n\n/**\n * Render the thumbnail item images.\n * @param thumbnail - The carousel thumbnail line props.\n * @returns Return HTML having thumbnail container props with image.\n */\nconst renderThumbnailItem = (thumbnail: IMediaGalleryItemsProps): JSX.Element => {\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from media-gallery.tsx file\n const { ThumbnailItemContainerProps, Picture, Video } = thumbnail;\n\n return <Node {...ThumbnailItemContainerProps}>{Video ? Video : Picture}</Node>;\n};\n\n/**\n * Gets the thumbnail item to display media gallery images.\n * @param image - The media gallery images.\n * @param imageSettings - Image settings for the image gallery items.\n * @param imageId - Image id.\n * @param modifiedActiveIndex - Modified Index of the images when selection changes.\n * @param props - The Media gallery view props from business layer.\n * @returns Return thumbnail view props which will be used to render images.\n */\nconst GetThumbnailItemComponent = (\n image: IImageData,\n imageSettings: IImageSettings,\n imageId: number,\n modifiedActiveIndex: number,\n props: IMediaGalleryViewProps,\n mediaTypeValue?: MediaType\n): IMediaGalleryThumbnailItemViewProps => {\n let fallbackImage: string | undefined = '';\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Site level config can be of any type.\n const emptyPlaceHolderImage = props.context.app.config?.placeholderImageName as string;\n if (props.data.product.result) {\n fallbackImage = getFallbackImageUrl(\n props.data.product.result.ItemId,\n props.context.request.apiSettings,\n props.context.request.app?.config?.OmniChannelMedia\n );\n }\n if (emptyPlaceHolderImage && fallbackImage) {\n fallbackImage = `${fallbackImage},${emptyPlaceHolderImage}`;\n }\n\n /**\n * OnClick method of media gallery item.\n */\n const onClick = () => {\n props.callbackToggle?.();\n props.callbackThumbnailClick?.(imageId);\n props.state.activeIndex = imageId;\n };\n\n const classes = classnames(\n 'ms-media-gallery__thumbnail-item',\n modifiedActiveIndex === imageId ? 'ms-media-gallery__thumbnail-item-active' : ''\n );\n\n /**\n * Keydown event of media gallery item.\n * @param event - React.KeyboardEvent.\n */\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if (event.keyCode === KeyCodes.Enter) {\n event.preventDefault();\n onClick();\n }\n };\n const defaultIndex = 0;\n return {\n ThumbnailItemContainerProps: {\n tag: 'li' as NodeTag,\n className: classes,\n role: 'listitem',\n key: imageId\n },\n Picture: (\n <Node className='ms-fullscreen-section'>\n <Button\n aria-label={image.altText}\n className='msc-ss-carousel-vert-button-wrapper'\n onClick={onClick}\n onKeyDown={handleKeyDown}\n >\n <Image\n requestContext={props.context.actionContext.requestContext}\n className='ms-media-gallery__thumbnail'\n {...image}\n gridSettings={props.context.request.gridSettings!}\n imageSettings={props.config.thumbnailImageSettings ?? imageSettings}\n loadFailureBehavior='hide'\n imageFallbackOptimize={props.state.shouldUseOptimizedImage}\n fallBackSrc={\n props.context.request.app?.config?.OmniChannelMedia ? '' : imageId === defaultIndex ? fallbackImage : image.src\n }\n bypassHideOnFailure={imageId === defaultIndex}\n />\n </Button>\n <Node\n className={\n mediaTypeValue === MediaType.Video ? 'ms-fullscreen-section__video-overlay' : 'ms-fullscreen-section__overlay'\n }\n >\n <Button\n onKeyDown={handleKeyDown}\n title={\n mediaTypeValue === MediaType.Video ? props.resources.playVideoTitleText : props.resources.fullScreenTitleText\n }\n role='button'\n className={\n mediaTypeValue === MediaType.Video\n ? 'ms-fullscreen-section__video-play-icon'\n : 'ms-fullscreen-section__magnifying-glass-icon'\n }\n onClick={onClick}\n />\n </Node>\n </Node>\n )\n };\n};\n\n/**\n * Render the video player.\n * @param mediaData - Media Data\n * @param index - Index of the video\n * @param activeIndex - Active Index\n * @param imageSettings - Image settings\n * @param props - Media gallery view props\n * @returns - JSX.Element.\n */\nconst RenderVideo = (\n mediaData: IMediaData,\n index: number,\n activeIndex: number,\n imageSettings: IImageSettings,\n props: IMediaGalleryViewProps\n): IMediaGalleryItemsProps => {\n const videoData = mediaData.videoData;\n if (videoData) {\n const options: IPlayerOptions = props.config as IPlayerOptions;\n const playerResources = props.resources;\n const videoMetaData: IVideoMetadata = {};\n videoMetaData.videoId = videoData.id;\n videoMetaData.title = videoData.title;\n videoMetaData.duration = videoData.playTime;\n if (videoData.thumbnail) {\n videoMetaData.posterframeUrl = videoData.thumbnail.src;\n }\n if (videoData._links?.binaryReferences) {\n videoMetaData.videoBinaryReferences = videoData._links.binaryReferences;\n }\n const videoPlayerData: IPlayerData = { options, metaData: videoMetaData };\n\n const classes = classnames(\n 'ms-media-gallery__thumbnail-item',\n index === activeIndex ? 'ms-media-gallery__thumbnail-item-active' : ''\n );\n\n return {\n ThumbnailItemContainerProps: {\n tag: 'li' as NodeTag,\n className: classes,\n role: 'listitem',\n key: index\n },\n Picture: <></>,\n Video: (\n <Video className='ms-media-gallery__player' editProps={{ key: videoData, requestContext: props.context.request }}>\n <Player\n playerData={videoPlayerData}\n isEditor={props.context.request.params.isEditor}\n playerResources={playerResources}\n />\n </Video>\n )\n };\n }\n return GetEmptyThumbnailItemComponent(imageSettings, props);\n};\n\n/**\n * Gets the empty thumbnail item to display media gallery images.\n * @param imageSettings - Image settings for the image gallery items.\n * @param props - The Media gallery view props from business layer.\n * @returns Return thumbnail view props which will be used to render empty images.\n */\nconst GetEmptyThumbnailItemComponent = (\n imageSettings: IImageSettings,\n props: IMediaGalleryViewProps\n): IMediaGalleryThumbnailItemViewProps => {\n let fallbackImage: string | undefined = '';\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Site level config can be of any type.\n const emptyPlaceHolderImage = props.context.app.config?.placeholderImageName as string;\n\n if (props.data.product.result) {\n fallbackImage = getFallbackImageUrl(\n props.data.product.result.ItemId,\n props.context.request.apiSettings,\n props.context.request.app?.config?.OmniChannelMedia\n );\n }\n if (emptyPlaceHolderImage && fallbackImage) {\n fallbackImage = `${fallbackImage},${emptyPlaceHolderImage}`;\n }\n\n return {\n ThumbnailItemContainerProps: {\n tag: 'li' as NodeTag,\n className: 'ms-media-gallery__thumbnail-item',\n role: 'listitem',\n tabIndex: 0,\n key: 0,\n 'aria-label': ''\n },\n Picture: (\n <Image\n requestContext={props.context.actionContext.requestContext}\n className='ms-media-gallery__thumbnail-item__image'\n src='empty'\n gridSettings={props.context.request.gridSettings!}\n imageSettings={props.config.thumbnailImageSettings ?? imageSettings}\n loadFailureBehavior='empty'\n imageFallbackOptimize={!!props.config.skipImageValidation}\n fallBackSrc={fallbackImage}\n />\n )\n };\n};\n\n/**\n * Update media gallery items method.\n * @param items - The media gallery thumbnail item view props.\n * @returns The IImageData array.\n */\nconst getMediaGalleryItems = (items?: IMediaData[]): IMediaData[] | undefined => {\n return items?.map(item => {\n return {\n displayOrder: item.displayOrder,\n mediaTypeValue: item.mediaTypeValue,\n altText: item.altText,\n src: item.src,\n videoData: item.videoData\n };\n });\n};\n\nconst defaultThumbnailImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=295&h=295&q=80&m=6&f=jpg', w: 295, h: 295 },\n xl: { q: 'w=295&h=295&q=80&m=6&f=jpg', w: 295, h: 295 }\n },\n lazyload: true,\n cropFocalRegion: true\n};\n\n/**\n * Render the Media gallery thumbnails to represent images in grid view.\n * @param thumbnails - The thumbnail view props.\n * @param props - The media gallery view props.\n * @returns - The single slide carousel component to render as media gallery image.\n */\nconst renderThumbnails = (thumbnails: IMediaGalleryThumbnailsViewProps, props: IMediaGalleryViewProps): JSX.Element => {\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from media-gallery.tsx file\n const { ThumbnailsContainerProps, SingleSlideCarouselComponentProps } = thumbnails;\n const { state } = props;\n const mediaGalleryItems = getMediaGalleryItems(state.mediaGalleryItems);\n\n const items: IMediaGalleryItemsProps[] | undefined =\n // eslint-disable-next-line multiline-ternary -- need multiline for easy code reading\n state.lastUpdate && ArrayExtensions.hasElements(mediaGalleryItems) && mediaGalleryItems[0].src === 'empty'\n ? [GetEmptyThumbnailItemComponent(defaultThumbnailImageSettings, props)]\n : // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from media-gallery\n mediaGalleryItems?.map((item: IMediaData, id: number) => {\n if (item.mediaTypeValue === MediaType.Video) {\n if (props.config.allowFullScreen) {\n const videoThumbnail = item.videoData?.thumbnail;\n if (videoThumbnail) {\n return GetThumbnailItemComponent(\n videoThumbnail,\n defaultThumbnailImageSettings,\n id,\n state.activeIndex,\n props,\n item.mediaTypeValue\n );\n } else {\n return GetEmptyThumbnailItemComponent(defaultThumbnailImageSettings, props);\n }\n } else {\n return RenderVideo(item, id, state.activeIndex, defaultThumbnailImageSettings, props);\n }\n } else {\n return GetThumbnailItemComponent(item, defaultThumbnailImageSettings, id, state.activeIndex, props);\n }\n });\n\n return (\n <Node {...ThumbnailsContainerProps}>\n <Node {...SingleSlideCarouselComponentProps}>{items?.map(renderThumbnailItem)}</Node>\n </Node>\n );\n};\n\n/**\n * Render the Media gallery items using viewprops.\n * @param props - The media gallery view props.\n * @returns The media gallery module wrapping up images node.\n */\nconst mediaGalleryView: React.FC<IMediaGalleryViewProps> = props => {\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from media-gallery.tsx file\n const { CarouselProps, Thumbnails, MediaGallery, Modal } = props;\n\n // The thumbnails in AW theme aren't used as tabs\n const NewSingleSlideCarouselComponentProps = { ...Thumbnails.SingleSlideCarouselComponentProps, useTabList: false };\n const NewThumbnails = { ...Thumbnails, SingleSlideCarouselComponentProps: NewSingleSlideCarouselComponentProps };\n\n return (\n <Module {...MediaGallery}>\n <Node {...CarouselProps} />\n {Modal}\n {renderThumbnails(NewThumbnails, props)}\n </Module>\n );\n};\n\nexport default mediaGalleryView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { 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","cartLineItemFunctions","renderProductDimensions","dimensionStrings","Dimensions","productDimension","_productDimension$Dim","_productDimension$Dim2","_productDimension$Dim3","_productDimension$Dim4","DimensionTypeValue","ProductDimensionType","Color","colorString","DimensionValue","Configuration","configString","Size","sizeString","Style","IsGiftCard","amountString","styleString","PriceComponent","Quantity","CustomerContextualPrice","DiscountLines","discountLine","_discountLine$OfferId","OfferId","OfferName","isSalesLine","PeriodicDiscount","EffectiveAmount","Percentage","discountPercent","_discountLine$Percent","updatedPercent","DiscountLineTypeValue","DiscountLineType","TenderTypeDiscount","_discountLine$Effecti","effectiveAmount","toFixed","inventoryCssName","inventoryLabelClassName","inventoryInformationLabel","_cartline$ChargeLines","pickupDeliveryModeCode","channel","PickupDeliveryModeCode","channelDeliveryOptionConfig","hasShippingMethod","_channelDeliveryOptio","DeliveryMode","PickupDeliveryModeCodes","deliveryMode","shippingChargeLines","ChargeLines","chargeLine","IsShipping","freightFee","reduce","chargeTotal","_chargeLine$Calculate","CalculatedAmount","shippingChargesText","_cartline$ChargeLines2","_otherCharges$map","otherCharges","chargeline","otherCharge","itemIndex","Description","_product$Name","_props$primaryImageUr","destructDimensionStrings","productDimensions","renderProductUnitPrice","renderDiscountLines","renderInventoryLabel","renderShippingLabel","renderOtherCharges","productAttribute","imgeClassName","IsInvoiceLine","cartLineContentClassName","newValue","quantityOnChange","generateErrorMessage","renderUnitOfMeasure","unitOfMeasureDisplayType","DefaultUnitOfMeasure","primaryImageUrl","NetAmount","NetAmountWithoutTax","NetPrice","showShippingChargesForLineItems","generateQuantityAndPrice","nodes","unitOfMeasure","_props$maxQuantity","_props$data$product$I","isQuantityEditable","quantityDisplayString","IncrementalQuantity","LineId","maxQuantity","currentCount","currentQuantity","inputQuantityAriaLabel","decrementButtonAriaLabel","incrementButtonAriaLabel","isCartStateReady","isGiftCard","isOutOfStock","priceEditorResources","CartLinePriceEditor","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","renderLabel","name","rating","ratingAriaLabelText","reviewCount","ratingCountAriaLabelText","reviewCountArialableText","getReviewAriaLabel","getRatingAriaLabel","roundedRating","renderPrice","basePrice","adjustedPrice","savingsText","console","log","msdyn365Commerce","createComponentOverride","_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","AverageRating","TotalRatings","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","convertDimensionTypeToProductDimensionType","selectedProductId","renderQuickView","PromoCode","_onInputChangeHandler","promoCodeInputValue","canApply","_applyPromotion","appliedPromo","addPromoCode","promoCode","substatus","duplicatePromoCodeErrorText","invalidPromoCodeErrorText","failedToAddPromoCodeErrorText","_onSubmitHandler","applyPromotionHandler","_renderForm","promoPlaceholderText","promoCodeApplyButtonText","attributes","onSubmit","_removePromotion","_event$currentTarget$","code","removePromoCodes","promoCodes","failedToRemovePromoCodeErrorText","_renderAppliedPromoCode","Coupons","removePromotionHandler","coupon","removePromoAriaLabelFormat","removePromoText","Code","ApplyPromoCode","promoCodeHeadingText","_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","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","checkoutAsSignInUserButton","checkoutAsGuestButton","COUPON_ATTRIBUTE_KEY","getCouponCodeMap","enteredCode","foundCode","couponMapping","c","_c$fromCouponCode","fromCouponCode","toUpperCase","_foundCode$toCouponCo","mondaysDate","formatDate","getMondayOfCurrentWeek","toCouponCode","tcc","date","_onInputChange","_cart","addAttributeToCart","attrKey","attrValue","attributeArray","attributeObj","TextValueTranslations","attrIdx","a","_a$Name","removeAttributeFromCart","_a$Name2","additionalProperties","_calculateDiscount","discountAmount","line","DiscountCode","DiscountCost","totalCouponDiscountAmount","_coupon$Code","appliedPromoCodeHeadingText","isCollapseOpen","getFullYear","getMonth","padStart","getDate","today","Date","day","getDay","diff","setDate","PromoCodeComponent","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","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","updateLineResult","updateCartLineQuantity","message","getProductByProductId","getProductByProductIdAndWarehouse","warehouseId","targetWarehouseValue","WarehouseId","_product$Behavior","InventoryLocationId","_renderDeliveryLocation","deliverylocation","FulfillmentStoreId","_foundProductDelivery","orgUnitName","_getOrgUnitName","orgUnitLocations","foundProductDeliveryOption","productDeliveryOptions","deliveryOption","delivery","DeliveryOptions","shippingText","_renderStoreLocation","fulfillmentStoreId","foundLocation","orgUnitLocation","OrgUnitNumber","OrgUnitName","_assembleCartlines","reactNodes","foundProductAvailability","_foundProductAvailabi","productAvailabilites","productAvailability","_productAvailability$","ProductAvailableQuantity","_assembleNode","foundProductDeliveryOptions","removeButtonText","removeItemClickHandler","availableQuantityInStock","isStockCheckEnabled","outOfStockThreshold","AvailableQuantity","_getCartItemAvailableQuantity","_getCartItemMaxQuantity","maxQuantityByConfig","maxByQuantityLimitsFeature","maxByQuantityLimitsFeatureResult","maxCartlineQuantity","isServiceItem","ItemTypeValue","ReleasedProductType","Service","onRemoveClickHandler","onRemoveClickFunction","RemoveCartItem","removeCartItemAttribute","getProductUrlSync","isChannelTypeB2B","_cartline$CatalogId","CatalogId","CartLineItemComponent","catalogs","displayMode","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","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","FlyoutCartLineItems","cartLinesSortOrder","updateMaxQuantityForCartLineItem","maxQuantityForCartLineItem","productDimensionTypeSize","productDimensionTypeColor","productDimensionTypeConfiguration","productDimensionTypeStyle","quantityDisplayText","salesAgreementPricePrompt","discountStringText","removeCartButtonText","outOfStockText","outOfRangeOneText","outOfRangeFormatText","_featureStatuses$find","_featureStatuses$find2","featureStatuses","defaultOrderQuantityLimitsFeatureConfig","platform","enableDefaultOrderQuantityLimits","_featureStatuses$find3","customerInformation","customerInfo","IsB2b","_cartConfiguration$Ig","cartConfiguration","IgnoreOrderSettings","_renderCartlines","CatalogLabelComponent","validateCatalogId","isB2b","catalog","CartLineItemFunctions","Product","DimensionStrings","priceCurrency","EffectivePercentage","SalesAgreementLineRecordId","_props$context$reques2","OmniChannelMedia","renderDisountLines","renderSalesAgreementPrompt","lineIndex","NetAmountWithAllInclusiveTax","GrossAmount","ExtendedPrice","salesAgreementLineId","_generateQuantityandPrice","DiscountAmount","MediaGallery","_this","_props$config$zoomedI","_inlineZoomDivRef","fullScreenOverlayButtonRef","player","defaultGalleryImageSettings","defaultThumbnailImageSettings","onExiting","onExited","removeInlineZoomStyle","isLastItem","goToIndex","updateZoomedInImage","images","mediaGalleryItems","isFirstItem","currentIndex","mediaItems","_mediaItems","_this$player$current","mediaTypeValue","MediaType","Video","play","_this$player$current2","getImagesData","skipImageValidation","_this$props$config$im","_this$props$config$im2","source","imageSource","mediaLocations","mediaLocationsForSelectedVariant","mediaLocation","_mediaLocation$Uri","Uri","getAltText","shouldUseCmsAltText","AltText","IsApplicableForChildEntities","isApplicableForChildEntities","curatedImages","_filterMasterImageFromVariant","_renderCarouselItemVideo","mediaData","videoData","_videoData$_links","options","playerResources","videoMetaData","videoId","duration","playTime","thumbnail","posterframeUrl","_links","binaryReferences","videoBinaryReferences","videoPlayerData","metaData","editProps","Player","playerData","isEditor","params","_renderEmptyImage","_getCarouselItem","isInPopup","shouldSkipToMainImage","bypassHideOnFailure","_getThumbnailItem","modifiedActiveIndex","ThumbnailItemContainerProps","_generateOnThumbnailClick","onKeyDown","_generateOnThumbnailKeyDown","Picture","imageFallbackOptimize","shouldUseOptimizedImage","getVideoThumbNailItem","classes","_refHandler","divRef","which","Enter","Space","_renderVideoThumbnail","fullScreenTitleText","openModalDialog","imageModalSlider","ZoomView","_mapProductToImageData","carouselprops","_renderCarouselItemImageView","_zoomedImageSettings","previousScreenshotFlipperText","nextScreenshotFlipperText","showPaginationTooltip","hideIndicator","isDisabledFunctionality","isMobileImageZoomed","carousel","imageModalSliderProps","ontoggle","galleryCarousel","ImagefullView","altTextSource","mediaGalleryImages","isImageZoomed","isInitialLoad","zoomedImageSettings","galleryImageSettings","_onImageMouseOut","_inlineZoomImageOnHover","_onInlineImageClick","_onContainerZoomImageClick","_onMouseOutLensContainer","_this$props$config$im3","shouldUpdateOnPartialDimensionSelection","_setRenderType","_this$props$config$th","validateProductImages","thumbnailImageSettings","_setImages","_this$props$config$th2","getValidProductImages","channelId","productVariant","_product$productVaria","_this$props$config$th3","getProductImages","fireImmediately","_this$props$config$th4","isVertical","thumbnailsOrientation","isFullscreenAllowed","allowFullScreen","zoomViewMode","imageZoom","emptyPlaceHolderImage","placeholderImageName","mediaGalleryCarouselItems","_getMediaGalleryItems","mediaGalleryThumbnailCarouselItems","_getMediaGalleryThumbnailItems","callbackToggle","callbackThumbnailClick","callbackThumbnailKeyDown","CarouselProps","keys","Thumbnails","ThumbnailsContainerProps","SingleSlideCarouselComponentProps","SingleSlideCarousel","vertical","flipperPrevLabel","flipperNextLabel","parentId","useTabList","lastUpdate","defaultKey","_getEmptyThumbnailItem","zoomView","curatedImage","mediaToSet","Promise","getVideoMetadataFromApi","now","media","_renderImageInContainerOnZoom","_renderImageFullScreenOnZoom","_renderImageInlineOnZoom","_this$props$config$sh","shouldHidePrimaryImages","shouldHideMasterProductImagesForVariant","variantImages","isVariantProduct","ObjectExtensions","isNullOrUndefined","_item$additionalPrope","_this$props$config$da","dataScale","defaultDataScale","onMouseOver","onMouseMove","inlineZoomImageOnMouseMove","_this$props$config$da2","inlineZoomImageOnHover","_handleMobileViewZoomedImageClick","mobileZoomedInImageClassName","transform","classList","parentElement","overflow","_this$props$config$da3","bounds","getBoundingClientRect","positionX","clientX","left","positionY","clientY","top","scaledPositionX","scaledPositionY","scrollTo","_this$props$config$da4","innerWidth","inlineZoomInitClick","inlineZoomImageOnMouseOut","onContainerZoomInit","onMouseOutLensContainer","_this$props$config$da5","onMouseOut","onMouseMoveLensContainer","onMouseOverImageContainer","_product$PrimaryImage","_this$fullScreenOverl","parentDiv","querySelector","removeAttribute","removeContainerZoomStyle","_renderThumbnails","thumbnails","_renderThumbnailItem","imageAltText","_context$app","validateMediaLocationAsync","imageData","http","XMLHttpRequest","open","send","_unused","selectedProduct","actionInput","MediaLocationsForSelectedVariantInput","getMediaLocationsForSelectedVariant","pairs","pair","_actionContext$reques","isPreview","commerceApiRequest","previewImageData","displayOrder","DisplayOrder","MediaTypeValue","_mediaLocation$Uri2","commerceVideoMetadataRequest","OrderTemplateActions","onRemoveOrderTemplate","handlers","itemKey","removeOrderTemplateActionHandler","OrderTemplateRender","removeFromOrderTemplateListText","orderTemplateState","enableImageProductLink","onDismiss","_renderOrderTemplateImages","orderTemplateLines","orderTemplateAriaLabel","_renderAriaLabel","_getOrderTemplatePageUrl","_getUrlSync","totalLines","AddOrderTemplateToCartComponent","addToBagText","isMultipleCatalogFeatureEnabledInHq","userMessage","Alert","statusCssString","onClickHandler","defaultImageSettings","xl","slice","_line$productListLine","_line$fullProduct$Pro","_line$fullProduct","_line$fullProduct2","_line$fullProduct$Pro2","_line$fullProduct3","_getFallbackImageUrl","_line$fullProduct4","_context$request$app","fullProduct","_updateProductUrlCatalog","ProductDetails","productListLine","productDetails","OrderTemplateListStatusMessage","errorType","_isChannelMultipleCatalogsFeatureEnabled","_onDismiss","_onRemoveFromOrderTemplateList","productListId","token","productList","deleteAsync","headerStatusMessage","deleteOrderTemplateFailedText","messageGlyph","_heading$text","_heading$tag3","emptyOrderTemplateText","orderTemplatesData","orderTemplateListHeading","orderTemplateListTitle","_heading$tag","errorProps","Spinner","msg","progressNotificationText","Heading","_heading$tag2","emptyViewProps","_generateOrderTemplateNameDialogResources","_renderOrderTemplateList","currentTemplateProps","addToBagButtonText","closeWindowButtonText","addToCartFailureMessage","addToCartSuccessMessage","addToCartProcessMessage","orderTemplateErrorMessage","linesAddedToCartDialogResources","viewCartButtonText","orderTemplateCloseButtonText","linesAddedToCartHeaderItemsOneText","linesAddedToCartHeaderLinesOneText","linesAddedToCartHeaderLinesFormatText","linesAddedToCartHeaderMessageText","OrderTemplateListView","_renderOrderTemplate","CONTENT","AddLineToTemplate","productCatalogs","Search","selectedCatalogId","searchTextInput","addLineButtonRef","_renderSearchForm","searchButtonAriaLabel","searchModalPlaceholderText","selectCatalogTitleText","autoComplete","_onSearchSubmit","htmlFor","_onCatalogSelectionChange","_getCatalogNodes","maxLength","_get","Loading","_getSearchResults","NotFound","ProductList","_onQuantityChangeHandler","selectedQuantity","_onSelectItem","varianteInput","SelectedVariantInput","getSelectedVariant","dimensions","_getProductDimensions","selectedProductDimensions","ProductConfiguration","_onBackButtonClickHandler","_highlightSearchTerm","parsedName","unescape","RegExp","dangerouslySetInnerHTML","__html","_resultCountText","searchResultsCountVerbage","searchResultsCountSubject","_addItemToTemplateHandler","orderTemplateId","AddItemToOrderTemplateInput","addItemToOrderTemplate","reloadPage","_toggleModalHandler","_getCatalogs","onComponentDidMount","_this$searchTextInput","onComponentDidUpdate","_this$searchTextInput2","showBackArrow","addLineModalLinkText","backToResultsText","_renderContent","addToTemplateHandler","onQuantityChangeHandler","highlightSearchTerm","searchForm","productProps","clickHandler","renderResultCountText","notFoundSearchErrorNotice","notFoundSearchErrorRedediation","NotFoundComponent","searchErrorMessage","productCatalog","isSelected","searchText","searchCriteriaInput","Context","ChannelId","IncludeAttributes","SearchCondition","searchByCriteriaAsync","getDimensionsForSelectedVariant","GetDimensionsForSelectedVariantInput","Dropdown","selectMenu","_onChanged","selectedIndex","selectId","innerText","dropdownList","dropdownName","OrderTemplateQuantity","inputRef","_validateMin","currentInput","_handleChange","glyphMinusClassName","decrementGlyphClass","glyphPlusClassName","incrementGlyphClass","incDisabled","currentValue","extraClass","getChangeHandler","_onIncrementalChange","pattern","updatedQuantity","inputElement","HTMLInputElement","_debounce","setAttribute","defaultProps","_getDimensionsError","dimensionName","dimensionMissingError","_addToTemplateHandler","isBusy","showAddConfirmation","errors","missingDimensions","dimension","ProductListId","addToTemplateDuplicateError","addToTemplateGenericError","_onQuantityChange","_updateDimensionValue","productDimensionFull","newValueId","DimensionValues","_onDimensionChanged","_this$state$errors","remainingDimensionsErrors","selection","buttonDisabled","mappedDimensions","variantProduct","dimensionInput","variantDimensions","availabilityInput","ProductAvailabilitiesForSelectedVariantInput","newAvailableQuantity","getProductAvailabilitiesForSelectedVariant","priceInput","PriceForSelectedVariantInput","productPrice","getPriceForSelectedVariant","productAvailableQuantity","unitPrice","b","_getDropdownName","_product$Name2","addItemToTemplateText","addLineProductUnitPricePrefix","quantitySelectLabel","addLineProductUnitOfMeasurePrefix","totalPriceLabel","isMultipleCatalogSelect","_getDimensionsNodes","_getConfirmationMessage","selectedDimensionNames","_dimension$DimensionV","addToTemplateConfirmation","values","join","_this$state$errors2","assertive","selectProductButtonText","_generateImageUrl","primaryImageSource","fallBackImg","ProductSelectButton","buttonText","setBusy","getClickHandler","OrderTemplateBulkActions","isAddDisabled","isRemoveDisabled","addHandler","onAddSelectionToBag","removeHandler","onRemoveSelection","selectedLines","searchInputAriaLabel","backButtonText","addSelectedToBagButtonText","removeSelectedToBagButtonText","addLineProps","isMinifiedView","removeOrderActionHandler","_removeOrderTemplate","onRemoveTemplate","_getOrderTemplateAddToCartDialog","addTemplateToBagButtonText","_getOrderTemplateRenameControl","renameOrderTemplateDialogStrings","RenameOrderTemplateComponent","onRenameTemplate","renameOrderTemplateButtonText","renameTemplateButtonText","buttonEventReference","ActionsSplitButton","isStatementRequestAdminDropdownOpen","setIsStatementRequestAdminDropdownOpen","renameOrderTemplateDialogOpen","onToggleDropdown1","popoverReference","renderModalPopup","existingOrderTemplate","onOrderTemplateNameCancel","_buttonEventReference","requestStatementDropdownString","Random","Guid","generateGuid","Popover","OrderTemplateLineActions","orderTemplateLine","onAddToBag","onRemoveItem","getAddToBag","getRemoveItem","PopUp","removeFromOrderTemplateLinesText","moreButtonText","viewProductDetailsText","showMobile","setShowMobile","toggleDetailsDisplayed","getActionButton","removeButtonClassName","addButtonClassName","getDesktopActionButton","onSelectLineHandler","onSelect","checked","ExtraActionsPopup","showActions","setShowActions","actionsContainerClassName","OrderTemplateMobileLineView","_context$request$app2","UnitOfMeasure","productLineCatalog","renderProductCatalog","productImage","_renderProductImage","productInfo","renderProductInfo","_renderPrice","productNumber","productUnitOfMeasure","productQuantityView","_generateQuantity","onChangeHandler","onChangeQuantity","isQuantityDisabledForUpdate","_context$actionContex","_context$request","_renderProductError","OOS","outOfStockProductErrorMessage","UNASSORTED","unavailableProductErrorMessage","NONE","_orderTemplateLine$fu","_renderProductDimensions","dimensionsLine","OrderTemplateLinesStatusMessage","OrderTemplateTableHeading","componentClassName","getOnChange","checkedLines","scope","selectAllRowsText","productLineCatalogName","productUnitPrice","productUOM","productActions","OrderTemplateLines","_onRemoveSelection","removeSelectedFailureMessage","removeSelectedSuccessMessage","productSelection","productListLines","maxWaitTimeInMilliSeconds","removeProductListLinesAsync","_this$props$data$orde","substr","indexOf","_onAddSelectionToBag","productLine","_productLine$fullProd","_productLine$fullProd2","_productLine$fullProd3","_productLine$fullProd4","_productLine$productL","_addItemToBag","_getCurrentUrl","reqContext","requestUrl","onCloseHandler","isItemAddedToOrderTemplateOpen","_renderItemAddedToCartDialog","_this$props$data$feat2","itemAddedToCartDialogData","ItemAddedToCartDialog","_generateItemAddedToCartDialogResources","onClose","_renderPagination","_getCurrentPageNumber","_toggleDetailsDisplayed","isDetailsDisplayed","detailedProductView","absoluteUrl","_changeQuantity","orderTemplateLinesData","orderLineIndex","newProductListLine","prevQuantity","updateProductListLinesAsync","newLine","updatedLines","updatedOrderTemplate","ProductListLines","update","ActiveOrderTemplateLinesInput","editOrderTemplateLineQuantityError","maxQuantityLimitText","addedToCartFailureMessage","addProductToCartInput","priceResult","reject","isMiniCart","cartLineQuantity","defaultMessage","_result$errorDetails","errorDetails","LocalizedMessage","_removeItemFromOrderTemplateLines","userToken","featureStates","getFeatureState","createGetFeatureStateInput","_featureStates$find","_renameTemplate","_removeTemplate","_orderTemplate$result","newLink","isConfirmAddSelectionToBagModalOpen","emptyOrderTemplateLinesText","errorGettingOrderTemplateLines","orderTemplateResult","_isFirstPage","orderActions","_renderOrderTemplateActions","bulkOrderLineActions","_getOrderTemplateLineActions","productsStatusMessage","ProductsTable","ProductsTableRow","ProductsTableHeading","_renderProductListHeader","orderLines","_renderProductList","callbacks","updateQuantity","itemAddedToCartDialog","updated","_product$fullProduct","onSelectAll","productNumberText","productUnitPriceText","productUOMText","productQuantityText","productActionsText","headers","_generateLinesAddedToCartDialogResources","itemAddedToCartHeaderItemOneText","itemAddedToCartHeaderItemFormatText","itemAddedToCartHeaderMessageText","deleteTemplateButtonText","addTemplateToBag","renameTemplate","removeTemplate","actionsSplitButton","OrderTemplateActionsView","renameOrderTemplateTitleText","cancelBtnLabel","selectOneRowText","addOrderTemplateItemToBagButtonText","removeItemFromOrderTemplateButtonText","deleteButtonText","selectLine","addToBagButton","extraActionsPopup","popUp","shouldDisable","OrderTemplateLineView","ProductPrice","_renderItem","quantityLabel","disableElement","pointerEvents","opacity","toggleDetails","fade","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","_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","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","dimensionValue","convertProductDimensionTypeToDimensionTypes","removeFromComparisonButton","RemoveFromComparisonButtonComponent","productLink","viewport","productComparisonMobileProductsLimit","productComparisonDesktopProductsLimit","defaultImageSettingQ","_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","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","tableHeaderLockedClassName","_handleScroll","_this$_tableHeaderRef","_tableHeaderReference","scrollLeft","_checkClickersState","_handleScrollClick","direction","_this$_tableBodyRefer","_this$_tableCellRefer","_document$body$parent","tableBody","_tableBodyReference","newLeftPosition","cellWidth","_tableCellReference","clientWidth","_getCellWidth","scrollPosition","ceil","minLeftPosition","maxScroll","scrollWidth","body","currentClickerPosition","change","hoverStateLastUpdate","hoveringCellItemId","_handlePreviousClick","_document$body$parent2","right","_handleNextClick","_document$body$parent3","_this$_tableBodyRefer2","floor","_this$_tableBodyRefer3","_document$body$parent4","_shouldShowNextClicker","forceUpdate","_shouldShowPreviousClicker","newClickerPosition","_handleHoverIn","_hoveringCellItemId","_handleHoverOut","_goBack","backToShoppingUrl","referrer","back","specifications","_product$specificatio","specificationsList","allSpecifications","flatten","specificationNames","AttributeValueId","uniqueSpecificationNames","unique","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","productComparisonProductItemColorDimension","productComparisonProductItemSizeDimension","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","productComparisonTitle","productComparisonLoadingText","productComparisonClearAllButtonAriaLabel","productComparisonClearAllButtonText","tableClickerClassName","onKeyUp","productComparisonPreviousProduct","productComparisonNextProduct","_renderRemoveFromComparisonButton","productRowClassName","currentCatalogId","productUrlLink","_product$productInfo$2","_dimension$DimensionV2","isFromCurrentCatalog","productPriceClassName","cellNewWidth","width","minWidth","maxWidth","cellContainerProps","productComparisonProductItemFreePrice","productComparisonProductItemOriginalPrice","productComparisonProductItemCurrentPrice","quickView","goToProductDetailsButton","productComparisonGoToProductDetailsButtonText","tableCellProps","tableHeaderProps","productRating","productDescription","_renderProductDescription","tableBodyClassName","tableRowContentClassName","tableRowContentInformationClassName","renderDynamicHeaderCells","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","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","onErrorMessage","removeActionHandler","removeProductList","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","addToListBtn","stateMessage","messageText","QuickOrderGridProduct","QuickOrderGridDesktopHeaderCellsComponent","columnWithNumberClassName","quickOrderGridProductNumberText","quickOrderGridProductText","quickOrderGridUnitPriceText","quickOrderGridUnitOfMeasureText","quickOrderGridQuantityText","quickOrderGridActionsText","QuickOrderGridMobileHeaderCellsComponent","QuickOrderGridTableHeaderComponent","rowClassName","headerCells","QuickOrderGridTableRowProductImageComponent","_props$data$product$p","_props$imageSettings","setShowPreviousActions","onRemoveHandler","quickOrderGridProductKey","QuickOrderGridExtraActionsPopupComponent","_props$data$product$p2","quickOrderGridViewDetailsButtonAriaLabel","quickOrderGridViewDetailsButtonText","shouldShowActions","onClickViewDetails","shouldShowActionsNewValue","quickOrderGridRemoveItemButtonAriaLabel","QuickOrderGridDesktopTableRowCellComponent","_props$data$product$p3","_productListLine$Line","quickOrderGridProductDimensionsSeparator","renderProductPrice","quickOrderGridInputQuantityAriaLabel","quickOrderGridDecrementButtonAriaLabel","quickOrderGridIncrementButtonAriaLabel","QuickOrderGridMobileTableRowCellComponent","_props$data$product$p4","_productListLine$Line2","QuickOrderGridTableRowComponent","QuickOrderGridTableComponent","setIsMobile","quickOrderGridProducts","isOrderQuantityLimitsFeatureEnabled","updateViewport","quickOrderProduct","_product$ProductDetai","_quickOrderProduct$pr","_quickOrderProduct$pr2","behavior","MinimumQuantity","callBacks","QuickOrderGrid","_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","changeUpdatingDimension","isUpdatingDimension","_quickOrderGridRowCallbacks","_removeItemRowFromTable","productListLineId","_changeRowQuantity","_removeProductList","ProductListsDataActions","_updateStatusState","quickOrderGridDeleteProductListFailedText","_handleInputChange","productResponse","_cancellabelDebounce","cancel","isQuickOrderGridFormExpanded","getScanResult","GetScanResultInput","results","ProductDimensionFull","_updateQuantitiesInState","_handleQuantityChange","_this$state$productRe","_quantityInput","minimumQuantity","needToUpdateUIValue","_behavior$MinimumQuan","newCurrentValue","_this$state$productRe2","productDimensionTypeAmount","hasProductDimensions","dimensionsToUpdate","productDimensionErrorState","otherError","clearOtherErrorState","dimensionKey","configureErrors","errorState","_this$_updateDimensio","newProduct","_getDimensionErrorString","amountErrorMessage","quickOrderGridproductDimensionTypeAmountErrorMessage","quickOrderGridproductDimensionTypeColorErrorMessage","quickOrderGridproductDimensionTypeConfigurationErrorMessage","quickOrderGridproductDimensionTypeSizeErrorMessage","quickOrderGridproductDimensionTypeStyleErrorMessage","_productResponse$Dime","_getConfigureErrors","quickOrderGridWrongQuantityErrorMsg","quickOrderTemplateLinesData","previousQuantity","updatedProductList","ActiveProductListInput","_addItemToProductListLine","quickOrderGridAddedToGridSuccessMessage","quickOrderGridAddedToGridFailureMessage","quickOrderGridAddedToGridDuplicateError","_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","_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","select","renderConfigure","dropdowns","renderForm","quickOrderForm","quickOrderProductContent","quickOrderMessageContent","isRangeTypeForInteger","isCustomRangeTypeIntegerSelected","RowNumber","isSingleSelectRangeTypeIntegerSelected","getIntegerRangeName","rangeValue","RightValueBoundLocalizedString","_rangeParentDisplay$","rangeParentDisplay","rangeDisplayType","newIntRange","_parent","refinerValues","filterValue","productComparisonButton","shouldDisplayAsSwatch","_getShouldDisplayAsSwatch","hasContentSwatch","RangeRefineItemInput","_changeMinInputRange","_changeMaxInputRange","_applyCustom","invalidData","updateInputRangerProps","_isUndefined","_isMounted","_updateVariantAvailability","DimensionSwatchDisplayTypes","productCard","channelInventoryConfiguration","isInventorySortableAttribute","ProductAvailabilitySortableAttributeRecordId","isInventoryProductAttribute","InventoryProductAttributeRecordId","_this$props$data$refi","_this$props$data$prod5","StoreOperationsDataActions","_this$props$context$r9","_this$props$context$r10","WishlistItemDimension","WishListItemActions","formattedPrice","renderProductLink","productAttributes","renderInventoryInformationLabel","WishlistItemAddToCartButtonComponent","isInStock","addItemAction","WishlistItemRemoveFromWishlistButtonComponent","removeFromWishlistText","removeItemAction","WishlistItem","wishlistState","_props$product$Dimens","_getFullProductLink","entireProductLink","productAriaLabel","inventoryInformation","productStatusMessage","WishlistItemsStatusMessage","WishlistItems","handleHeadingChange","onEdit","_addItemToCart","addedToCartSuccessMessage","invoiceInCartErrorMessage","productInventoryInformation","_getProductInventory","_product$Behavior$Min","getDeliveryOptionsAsync","queryResultSettings","QueryResultSettingsProxy","getPagingFromInputDataOrDefaultValue","validateQuantity","isQuantityValidationRequired","respectQuantityLimits","isAddEmailDeliveryItemToCart","_await$cart$cart","curQuantity","maxQtyLimitReachedMessage","_getInventoryValueMessage","_result$errorDetails2","isChannelQuantityLimitsFeatureEnabledInHq","validateLimitsPerLine","_removeItemFromWishlist","wishlists","noLongerLineExist","wishlistLineId","_getWishlistLineIdFromProductId","removeLinesAsync","commerceList","castCommerceList","_getProductsNoLongerExists","_removeNoLongerExistsLines","createGetByCustomerInput","getItemsInWishlists","ActiveWishlistInput","castSimpleProducts","isError","_inventoryLabel","StockLevelLabel","_inventoryClassName","StockLevelCode","_isProductInStock","productResult","IsProductAvailable","CommerceListLines","foundWishlistItem","commerceListLine","_castCommerceList$Com","noLongerExist","emptyWishlistText","wishlistErrorGettingWishlist","noLongerExitsWishlistItemText","ProductDimensions","statusNotExistsMessage","_getProductNotExists","emptytext","noLongerExisttext","currentProductProps","maxQuantityForLineItem","minInventory","productInventoryCollection","getDefaultSwatchSelected","_productData$Attribut","_attributeSwatches$fi","attributeSwatches","productSearchResult","IsMasterProduct","ProductType","Master","Standalone","MaxVariantPrice","MinVariantPrice","_context$app$config","contextConfig","fallbackImageSource","swatchProductImageUrls","getProductImageUrlFromDefaultSwatch","encodeURIComponent","renderProductComparisonButton","renderThumbnailItem","GetThumbnailItemComponent","imageId","_props$context$app$co","_props$config$thumbna","_props$callbackToggle","_props$callbackThumbn","call","handleKeyDown","playVideoTitleText","GetEmptyThumbnailItemComponent","_props$context$app$co2","_props$config$thumbna2","_props$context$reques3","renderThumbnails","getMediaGalleryItems","_item$videoData","videoThumbnail","RenderVideo","NewSingleSlideCarouselComponentProps","NewThumbnails","configureStickyFilter","isStickyHeader","headerContainer","headerHeight","offsetHeight","bannerHeights","headerElement","defaultContainer","refinerElement","clientHeight","renderRefinerFooter","doneAriaLabel","doneText","useEffect","useStickyFilter","stickyFilterSetup","enableStickyHeader","wrapperRefiner","refinerRefernce","handleClickOutside","contains","useOutsideClick"],"sourceRoot":""}