{"version":3,"file":"static/js/13.c375c3ec39d426f67fbe.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/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/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/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/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/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/search-result-container.view.tsx?c8d6","webpack://Msdyn365.Commerce.Online/./src/modules/active-image-utilities/active-product.tsx?69b2","webpack://Msdyn365.Commerce.Online/./src/modules/active-image-utilities/additional-content.tsx?6946","webpack://Msdyn365.Commerce.Online/./src/modules/active-image-utilities/image-mapper.tsx?dd86","webpack://Msdyn365.Commerce.Online/./src/modules/active-image/active-image.tsx?00d3","webpack://Msdyn365.Commerce.Online/./src/modules/active-image/active-image.view.tsx?a935","webpack://Msdyn365.Commerce.Online/./src/modules/bulk-purchase/bulk-purchase.tsx?9fd5","webpack://Msdyn365.Commerce.Online/./src/modules/bulk-purchase/bulk-purchase.view.tsx?feac","webpack://Msdyn365.Commerce.Online/./src/validate-cart.ts?cd50","webpack://Msdyn365.Commerce.Online/./src/Common/get-product.ts?0a21","webpack://Msdyn365.Commerce.Online/./src/modules/cart/actions/get-pickup-options-for-cartlines.ts?acad","webpack://Msdyn365.Commerce.Online/./src/modules/cart/components/cart-pick-up-in-store.tsx?dca8","webpack://Msdyn365.Commerce.Online/./src/modules/cart/components/cart-line-items.tsx?f6b2","webpack://Msdyn365.Commerce.Online/./src/modules/cart/components/cart-line-groups.tsx?f076","webpack://Msdyn365.Commerce.Online/./src/modules/cart/utils/get-promotion-in-cart.ts?4195","webpack://Msdyn365.Commerce.Online/./src/modules/cart/cart.tsx?d4e4","webpack://Msdyn365.Commerce.Online/./src/modules/cart/components/cart-line-items-promotion.tsx?80d9","webpack://Msdyn365.Commerce.Online/./src/modules/cart/cart.view.tsx?d8c2","webpack://Msdyn365.Commerce.Online/./src/modules/fabrikam/views/components/promocode.component.tsx?d9d6","webpack://Msdyn365.Commerce.Online/./src/invoice-summary-lineitem.tsx?5f61","webpack://Msdyn365.Commerce.Online/./src/order-summary-lineitem.tsx?8a98","webpack://Msdyn365.Commerce.Online/./src/modules/product-collection/product-collection.tsx?4008","webpack://Msdyn365.Commerce.Online/./src/modules/product-collection/product-collection.view.tsx?5d36","webpack://Msdyn365.Commerce.Online/./src/modules/quick-order/components/quick-order-drawer.tsx?f8b4","webpack://Msdyn365.Commerce.Online/./src/modules/quick-order/components/quick-order-form.tsx?eb54","webpack://Msdyn365.Commerce.Online/./src/modules/quick-order/components/quick-order-product.ts?7702","webpack://Msdyn365.Commerce.Online/./src/modules/quick-order/components/quick-order-table/components/quick-order-table-header-component.tsx?49e7","webpack://Msdyn365.Commerce.Online/./src/modules/quick-order/components/quick-order-table/components/quick-order-table-row-component.tsx?e487","webpack://Msdyn365.Commerce.Online/./src/modules/quick-order/components/quick-order-table/quick-order-table-component.tsx?46c1","webpack://Msdyn365.Commerce.Online/./src/modules/quick-order/quick-order.tsx?ef21","webpack://Msdyn365.Commerce.Online/./src/modules/quick-order/quick-order.view.tsx?a96d","webpack://Msdyn365.Commerce.Online/./src/actions/submit-user-review.ts?ac78","webpack://Msdyn365.Commerce.Online/./src/actions/inputs/submit-user-review-input.ts?3afb","webpack://Msdyn365.Commerce.Online/./src/common/review-modal.tsx?54a9","webpack://Msdyn365.Commerce.Online/./src/common/rnrInterface.ts?f761","webpack://Msdyn365.Commerce.Online/./src/modules/ratings-histogram/component/components.tsx?f324","webpack://Msdyn365.Commerce.Online/./src/modules/ratings-histogram/ratings-histogram.tsx?f6bc","webpack://Msdyn365.Commerce.Online/./src/modules/ratings-histogram/ratings-histogram.view.tsx?5bff","webpack://Msdyn365.Commerce.Online/./src/actions/report-review-concern.ts?bf43","webpack://Msdyn365.Commerce.Online/./src/actions/submit-helpfulness-vote.ts?a8ab","webpack://Msdyn365.Commerce.Online/./src/actions/inputs/report-review-concern-input.ts?b071","webpack://Msdyn365.Commerce.Online/./src/modules/reviews-list/components/components.tsx?033b","webpack://Msdyn365.Commerce.Online/./src/modules/reviews-list/components/report-review-modal.tsx?53d3","webpack://Msdyn365.Commerce.Online/./src/modules/reviews-list/components/review-card.tsx?6bbd","webpack://Msdyn365.Commerce.Online/./src/actions/inputs/submit-helpfulness-vote-input.ts?07aa","webpack://Msdyn365.Commerce.Online/./src/modules/reviews-list/reviews-list.tsx?37e8","webpack://Msdyn365.Commerce.Online/./src/modules/reviews-list/reviews-list.view.tsx?0e4a","webpack://Msdyn365.Commerce.Online/./src/modules/write-review/components/components.tsx?3575","webpack://Msdyn365.Commerce.Online/./src/modules/write-review/write-review.tsx?9afc","webpack://Msdyn365.Commerce.Online/./src/modules/write-review/write-review.view.tsx?b867","webpack://Msdyn365.Commerce.Online/./src/search-state.ts?dd10","webpack://Msdyn365.Commerce.Online/./src/modules/search/actions/get-auto-suggest-suggestions.ts?4735","webpack://Msdyn365.Commerce.Online/./src/modules/search/components/search.categorysuggest.tsx?c65d","webpack://Msdyn365.Commerce.Online/./src/modules/search/components/search.form.tsx?25a5","webpack://Msdyn365.Commerce.Online/./src/modules/search/components/search.keywordsuggest.tsx?297c","webpack://Msdyn365.Commerce.Online/./src/modules/search/components/search.label.tsx?0c17","webpack://Msdyn365.Commerce.Online/./src/modules/search/components/search.productsuggest.tsx?2af9","webpack://Msdyn365.Commerce.Online/./src/modules/search/search.tsx?72fb","webpack://Msdyn365.Commerce.Online/./src/modules/search/search.view.tsx?1505","webpack://Msdyn365.Commerce.Online/./src/modules/social-share-item/social-share-item.tsx?bbcb","webpack://Msdyn365.Commerce.Online/./src/modules/social-share-item/social-share-item.view.tsx?2d3e","webpack://Msdyn365.Commerce.Online/./src/modules/video-player/components/additional-content.tsx?b368","webpack://Msdyn365.Commerce.Online/./src/modules/video-player/video-player.tsx?53e5","webpack://Msdyn365.Commerce.Online/./src/modules/video-player/video-player.view.tsx?fedb","webpack://Msdyn365.Commerce.Online/./src/modules/adventureworks/views/ratings-histogram.view.tsx?bb5b"],"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 (\r\n <>\r\n <Node {...TitleContainer}>{title.titleCount}</Node>\r\n Not finding what you are looking for?\r\n </>\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 &\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","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 { IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\r\nimport { ISwatchItem, PriceComponent, ProductComponentSwatchComponent, RatingComponent } from '@msdyn365-commerce/components';\r\nimport { IPriceComponentResources } from './price.component';\r\nimport {\r\n IComponent,\r\n IComponentProps,\r\n ICoreContext,\r\n IGridSettings,\r\n IImageData,\r\n IImageSettings,\r\n Image,\r\n msdyn365Commerce\r\n} from '@msdyn365-commerce/core';\r\nimport {\r\n AttributeSwatch,\r\n AttributeValue,\r\n ProductDimension,\r\n ProductPrice,\r\n ProductSearchResult,\r\n ProductWarehouseInventoryAvailability\r\n} from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n ArrayExtensions,\r\n convertDimensionTypeToProductDimensionType,\r\n Dictionary,\r\n DimensionTypes,\r\n generateImageUrl,\r\n getProductPageUrlSync,\r\n IDimensionsApp,\r\n StringExtensions\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n format,\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n ITelemetryContent,\r\n onTelemetryClick\r\n} 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 estimatedAvailabilites?: ProductWarehouseInventoryAvailability[];\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(\r\n attributeValue => attributeValue.KeyName?.toLocaleLowerCase() === DimensionTypes.color\r\n );\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)\r\n ? generateImageUrl(defaultSwatch.ProductImageUrls[0], coreContext.request.apiSettings)\r\n : 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>{unitOfMeasure}</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>{inventoryAvailabilityLabel}</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(\r\n coreContext: ICoreContext,\r\n productUrl: string,\r\n productData?: ProductSearchResult\r\n): 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 estimatedAvailabilites\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(\r\n (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)\r\n ? swatchItem.productImageUrls[0]\r\n : undefined;\r\n const newImageUrl = generateImageUrl(swatchProductImageUrl, coreContext.request.apiSettings);\r\n setProductImageUrl(newImageUrl);\r\n }\r\n },\r\n [selectedSwatchItems, context, productPageUrl]\r\n );\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 (\r\n 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 /**\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 {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 =\r\n 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:\r\n enableStockCheck &&\r\n dimensionAvailabilities?.find(\r\n dimensionAvailability => dimensionAvailability.value === (swatchItem.SwatchValue ?? '')\r\n )?.isDisabled\r\n };\r\n }) ?? [];\r\n if (\r\n dimensionToPreSelectInProductCard !== DimensionTypes.none &&\r\n ArrayExtensions.hasElements(swatches) &&\r\n !swatches.some(swatch => swatch.isDefault) &&\r\n dimensionType === DimensionTypes.color\r\n ) {\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 </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 const invenLabel = estimatedAvailabilites?.find(pr => pr.ProductId === product.RecordId)?.TotalAvailableInventoryLevelLabel || '';\r\n return (\r\n <>\r\n {isEnabledProductDescription ? (\r\n <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,\r\n ratingAriaLabel,\r\n product.TotalRatings,\r\n ratingCountAriaLabel\r\n )}\r\n className='msc-product'\r\n {...attribute}\r\n >\r\n <div className='msc-product__image__description'>\r\n <div className='msc-product__image'>\r\n {renderProductPlacementImage(\r\n imageSettings,\r\n context.request.gridSettings,\r\n productImageUrl,\r\n product.PrimaryImageUrl,\r\n product.Name,\r\n context\r\n )}\r\n </div>\r\n <div className='msc-product__title_description'>\r\n <h5 className='msc-product__title__text'>{product.Name}</h5>\r\n {renderPrice(\r\n context,\r\n typeName,\r\n id,\r\n product.BasePrice,\r\n product.Price,\r\n savingsText,\r\n freePriceText,\r\n originalPriceText,\r\n currentPriceText,\r\n isPriceMinMaxEnabled,\r\n priceResources\r\n )}\r\n <p className='msc-product__inventory-label'>{estimatedAvailabilites && invenLabel}</p>\r\n {isUnitOfMeasureEnabled && renderProductUnitOfMeasure(product.DefaultUnitOfMeasure)}\r\n {renderDescription(product.Description)}\r\n </div>\r\n </div>\r\n </a>\r\n ) : (\r\n <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,\r\n ratingAriaLabel\r\n )}\r\n className='msc-product'\r\n {...attribute}\r\n >\r\n <div className='msc-product__image'>\r\n {renderProductPlacementImage(\r\n imageSettings,\r\n context.request.gridSettings,\r\n productImageUrl,\r\n product.PrimaryImageUrl,\r\n product.Name,\r\n context\r\n )}\r\n </div>\r\n <div className='msc-product__details'>\r\n <h5 className='msc-product__title'>{product.Name}</h5>\r\n <p className='msc-product__inventory-label'>SKU: {product.ItemId}</p>\r\n {renderPrice(\r\n context,\r\n typeName,\r\n id,\r\n product.BasePrice,\r\n product.Price,\r\n savingsText,\r\n freePriceText,\r\n originalPriceText,\r\n currentPriceText,\r\n isPriceMinMaxEnabled,\r\n priceResources\r\n )}\r\n <p className='msc-product__inventory-label'>{estimatedAvailabilites && invenLabel}</p>\r\n <h5 className='msc-product__title'>VIEW DETAILS</h5>\r\n {isUnitOfMeasureEnabled && renderProductUnitOfMeasure(product.DefaultUnitOfMeasure)}\r\n </div>\r\n </a>\r\n )}\r\n {renderProductDimensions(product.AttributeValues)}\r\n {!context.app.config.hideRating &&\r\n 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\r\n): string {\r\n const reviewCountArialableText = getReviewAriaLabel(reviewCount, ratingCountAriaLabelText ?? '');\r\n return `${name ?? ''} ${price ?? ''} ${getRatingAriaLabel(rating, ratingAriaLabelText)}${\r\n reviewCountArialableText ? ` ${reviewCountArialableText}` : ''\r\n }`;\r\n}\r\n\r\nfunction renderDescription(description?: string): JSX.Element | null {\r\n return <p className='msc-product__text'>{description}</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(\r\n coreContext: ICoreContext,\r\n moduleTypeName: string,\r\n moduleId: string,\r\n avgRating?: number,\r\n totalRatings?: number,\r\n ariaLabel?: string,\r\n ratingCountAriaLabel?: string\r\n): 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(\r\n context: ICoreContext,\r\n typeName: string,\r\n id: string,\r\n basePrice?: number,\r\n adjustedPrice?: number,\r\n savingsText?: string,\r\n freePriceText?: string,\r\n originalPriceText?: string,\r\n currentPriceText?: string,\r\n isPriceMinMaxEnabled?: boolean,\r\n priceResources?: IPriceComponentResources\r\n): 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(\r\n imageSettings?: IImageSettings,\r\n gridSettings?: IGridSettings,\r\n imageUrl?: string,\r\n fallbackImageUrl?: string,\r\n altText?: string,\r\n context?: ICoreContext\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 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 <Image requestContext={context?.actionContext.requestContext} {...img} {...imageProps} loadFailureBehavior='empty' />;\r\n}\r\n\r\nexport const ProductComponent: React.FunctionComponent<IProductComponentProps> = msdyn365Commerce.createComponentOverride<\r\n IProductComponent\r\n>('Product', { component: ProductCard, ...PriceComponentActions });\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 { IPriceComponentResources } from './components/price.component';\r\nimport { ProductPrice, ProductSearchResult, ProductWarehouseInventoryAvailability, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n ArrayExtensions,\r\n createInventoryAvailabilitySearchCriteria,\r\n getProductPageUrlSync\r\n} 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 { _getGlobalState } from 'mobx';\r\nimport { ISearchResultContainerProps } from '../definition-extensions/search-result-container.ext.props.autogenerated';\r\nimport { ProductComponent } from './components/product.component';\r\nimport { getUrlSync, IGridSettings, IImageData, IImageProps, IImageSettings, Image, IRequestContext } 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\nimport { getEstimatedAvailabilityAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\n// import { LoginToViewPricingComponent } from \"../../../components/LoginToViewPricing.component\";\r\nimport { Tooltip } from 'reactstrap';\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 estimatedAvailabilites: ProductWarehouseInventoryAvailability[]\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) =>\r\n renderProductCardsDescription(props, product, index, estimatedAvailabilites, false)\r\n )}\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\r\n if (inventoryAttribute) {\r\n return inventoryAttribute.TextValue;\r\n }\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 estimatedAvailabilites: ProductWarehouseInventoryAvailability[],\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\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 estimatedAvailabilites={estimatedAvailabilites}\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 estimatedAvailabilites: ProductWarehouseInventoryAvailability[]\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, estimatedAvailabilites, true)\r\n : renderProductCardsDescription(props, product, index, estimatedAvailabilites, 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\nfunction boNote(text: string | undefined, inventoryCode: string, RecordId: number) {\r\n const [isToolTipOpen, setIsToolTipOpen] = React.useState<boolean>(false);\r\n const toggleTooltip = () => setIsToolTipOpen(!isToolTipOpen);\r\n\r\n if (inventoryCode !== 'BO') {\r\n return null;\r\n }\r\n\r\n return (\r\n <>\r\n <a\r\n href='javascript:void(0)'\r\n className='readMore-toolTip'\r\n id={`tooltip-${RecordId}`}\r\n data-toggle='tooltip'\r\n onClick={toggleTooltip}\r\n />\r\n\r\n <Tooltip className='qo-tooltip' placement='top' isOpen={isToolTipOpen} target={`tooltip-${RecordId}`} toggle={toggleTooltip}>\r\n {text}\r\n </Tooltip>\r\n </>\r\n );\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 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 const [estimatedAvailabilites, setEstimatedAvailabilites] = React.useState<ProductWarehouseInventoryAvailability[]>([]);\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 const getEsimatedAvailability = async (): Promise<void> => {\r\n const itemIds = Array.from(new Set(props.data.products?.result?.products.map((product: any) => product.RecordId)));\r\n const searchCriteria = createInventoryAvailabilitySearchCriteria(props.context.actionContext, itemIds, true);\r\n const response = await getEstimatedAvailabilityAsync({ callerContext: props.context.actionContext }, searchCriteria);\r\n setEstimatedAvailabilites(response.ProductWarehouseInventoryAvailabilities ?? []);\r\n };\r\n\r\n React.useEffect(() => {\r\n if (isAuthenticated || !props.config.onlyShowPriceWhenAuthenticated) {\r\n void getInvProfs();\r\n void getEsimatedAvailability();\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\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) => {\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 =\r\n invProfOos?.hasOwnProperty('UpperBoundInclusive') && invProfOos?.UpperBoundInclusive !== undefined\r\n ? invProfOos.UpperBoundInclusive\r\n : 0;\r\n const isOutOfStock = currentInventory <= OosUpperBound;\r\n\r\n return !isOutOfStock ? (\r\n <AddToCartListComponent productId={pr.RecordId} onAddToCart={handleAddToCart} 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 getInventory = (ItemId: number): { Inventorylabel: string; Inventorycode: string } => {\r\n const product = estimatedAvailabilites.find(product => product.ProductId === ItemId);\r\n\r\n return {\r\n Inventorylabel: product?.TotalAvailableInventoryLevelLabel || '',\r\n Inventorycode: product?.TotalAvailableInventoryLevelCode || ''\r\n };\r\n };\r\n\r\n const _renderProductsListView = () => {\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 label = getInventoryLabel(configurationObject?.result?.channelInventoryConfigurationId, pr);\r\n console.log(label);\r\n\r\n const { Inventorylabel, Inventorycode } = getInventory(pr.RecordId!);\r\n\r\n // const priceComponent = <span>{cultureFormatter.formatCurrency(pr.Price)}</span>;\r\n\r\n return (\r\n <tr key={pr.RecordId}>\r\n <td>\r\n {renderProductPlacementImage(\r\n imageSettings,\r\n gridSettings,\r\n pr.PrimaryImageUrl,\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 </td>\r\n <td>{pr.Name}</td>\r\n <td>\r\n {Inventorylabel} {boNote(props.config.backOrderShippingText, Inventorycode, pr.RecordId)}\r\n </td>\r\n\r\n {/* <td>\r\n {LoginToViewPricingComponent(props.context.request, loginToViewPricing,\r\n priceComponent, props.config.onlyShowPriceWhenAuthenticated ?? false)}</td> */}\r\n <td>\r\n {isAuthenticated || !props.config.onlyShowPriceWhenAuthenticated\r\n ? cultureFormatter.formatCurrency(pr.Price)\r\n : null}\r\n </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 const showFilterDropdown = props.config.showFilterDropdown;\r\n const showSortDropdown = props.config.showSortDropdown;\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'>{showFilterDropdown && showSortDropdown && modalToggle}</Node>\r\n {createSearchResultModal(searchResultModal, refineMenu, sortByOptions, isRecoSearchPage)}\r\n <Node {...FeatureSearchContainer}>{similarLookProduct}</Node>\r\n {errorMessage}\r\n\r\n {enableProdutDescription\r\n ? renderProducts(props, estimatedAvailabilites)\r\n : renderProductCards(props, estimatedAvailabilites)}\r\n {pagination}\r\n </Module>\r\n );\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 {(showFilterDropdown || showSortDropdown) && (\r\n <Node className='ms-refiner-heading'>\r\n <Node className='ms-refiner-heading_title'>\r\n {showFilterDropdown && (\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 )}\r\n <div className='ms-search-result-wrapper-title-choice-summary'>{choiceSummary}</div>\r\n {showSortDropdown && (\r\n <div className='ms-search-result-wrapper-sort-by-category'>\r\n {sortByOptions && !isRecoSearchPage && renderSort(sortByOptions)}\r\n </div>\r\n )}\r\n </Node>\r\n {refineMenu && isExpanded && renderRefiner(refineMenu)}\r\n </Node>\r\n )}\r\n <Node {...ProductSectionContainer}>\r\n {errorMessage}\r\n {/*{enableProdutDescription ? renderProducts(props) : renderProductCards(props)}*/}\r\n {listView\r\n ? _renderProductsListView()\r\n : enableProdutDescription\r\n ? renderProducts(props, estimatedAvailabilites)\r\n : renderProductCards(props, estimatedAvailabilites)}\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","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","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 { 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 { 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 MsDyn365 from '@msdyn365-commerce/core';\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 { getUrlSync, IGridSettings, IImageData, IImageProps, IImageSettings, Image, IRequestContext } 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, { 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\nconst renderExpandOrRefineResults = (\r\n props:\r\n | React.PropsWithChildren<ISearchResultContainerViewProps & ISearchResultContainerProps<IProductSearchResultExtensionData>>\r\n | undefined\r\n) => {\r\n if (MsDyn365.isBrowser && typeof window !== 'undefined') {\r\n const url = new URL(window.location.href);\r\n\r\n // Check if 'find-products' exists in the URL\r\n if (url.href.includes('find-products')) {\r\n return null;\r\n }\r\n\r\n const query = url.searchParams.get('q');\r\n\r\n if (!query) {\r\n return undefined;\r\n }\r\n\r\n // Check if the query has multiple terms (spaces or dashes)\r\n const hasMultipleTerms = /\\s|-/g.test(query);\r\n\r\n // Only render the \"Expand\" or \"Refine\" option if multiple terms are detected\r\n if (!hasMultipleTerms) {\r\n return undefined;\r\n }\r\n\r\n let link;\r\n if (!url.searchParams.has('expand') && hasMultipleTerms) {\r\n // Render \"Expand\" link only if multiple terms are present\r\n url.searchParams.append('expand', 'true');\r\n link = <a href={url?.toString() || '#'}>{props?.resources.expandResultsText}</a>;\r\n } else {\r\n if (url.searchParams.has('skip')) {\r\n url.searchParams.delete('skip');\r\n }\r\n url.searchParams.delete('expand');\r\n link = <a href={url?.toString() || '#'}>{props?.resources.refineResultsText}</a>;\r\n }\r\n\r\n return (\r\n <span>\r\n {props?.resources.notFindingText} {link}\r\n </span>\r\n );\r\n }\r\n return undefined;\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 = (\r\n titleProps: ITitleViewProps,\r\n enableSearchWrap: boolean,\r\n props:\r\n | React.PropsWithChildren<ISearchResultContainerViewProps & ISearchResultContainerProps<IProductSearchResultExtensionData>>\r\n | undefined\r\n): JSX.Element | null => {\r\n const { title, TitleContainer } = titleProps;\r\n return (\r\n <Node {...TitleContainer}>\r\n {title.titleCount}\r\n {enableSearchWrap ? renderExpandOrRefineResults(props) : undefined}\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 &\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 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: { cart, listPageState: productSearchResults, manufacturerCodes },\r\n config: { enableProdutDescription, listView, imageSettings }\r\n } = props;\r\n\r\n const [activeProducts, setActiveProducts] = React.useState<ProductSearchResult[]>([]);\r\n\r\n // Fix for issue 8251: Boost relevance of Part Number matches\r\n // This change prioritizes matched products by ItemId and manufacturer codes\r\n // to improve search relevance and address the issue of items flipping\r\n\r\n React.useEffect(() => {\r\n if (request.query) {\r\n const searchTerm = request.query['q'];\r\n const codes = manufacturerCodes?.result as any;\r\n\r\n const matchedProducts: ProductSearchResult[] = [];\r\n const unmatchedProducts: ProductSearchResult[] = [];\r\n\r\n productSearchResults.result?.activeProducts.forEach(p => {\r\n let matched = false;\r\n\r\n // Check for direct match by ItemId\r\n if (\r\n searchTerm &&\r\n (p.ItemId?.toLowerCase() === searchTerm.toLowerCase() ||\r\n p.ItemId?.substring(3, p.ItemId.length).toLowerCase() === searchTerm.toLowerCase())\r\n ) {\r\n matched = true;\r\n } else {\r\n // Check for manufacturer code match\r\n for (let i = 0; i < codes.manufacturerCodes.length; i++) {\r\n if (codes.manufacturerCodes[i].GDNManufacturerCode + searchTerm === p.ItemId) {\r\n matched = true;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (matched) {\r\n matchedProducts.push(p);\r\n } else {\r\n unmatchedProducts.push(p);\r\n }\r\n });\r\n setActiveProducts([...matchedProducts, ...unmatchedProducts]);\r\n }\r\n }, [request.query, manufacturerCodes, productSearchResults.result]);\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 = 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 })\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 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 =\r\n invProfOos?.hasOwnProperty('UpperBoundInclusive') && invProfOos?.UpperBoundInclusive !== undefined\r\n ? invProfOos.UpperBoundInclusive\r\n : 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 (\r\n <td>\r\n <div className='eduerrors'>{props.resources.invoiceInCartText}</div>\r\n </td>\r\n );\r\n }\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 return <AddToCartListComponent productId={pr.RecordId} onAddToCart={handleAddToCart} addToCartButtonText={addToCartText} />;\r\n } else {\r\n return (\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\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\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 ? <th>{availabilityHeading}</th> : 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 {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>\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 {supersededFromText} {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 {supersededFromText} {getProductSupersessionProperty(pr, SupersessionKey.SupersededName)}\r\n </p>\r\n ) : null}\r\n </td>\r\n {isAuthenticated ? <td>{getProductSupersessionProperty(pr, SupersessionKey.Inventory)}</td> : 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(\r\n props.context.request,\r\n loginToViewPricingAndAvailabilityText,\r\n <>{cultureFormatter.formatCurrency(pr.Price)}</>,\r\n isAuthenticated || !props.config.onlyShowPriceWhenAuthenticated\r\n )}\r\n {/* {(isAuthenticated || !props.config.onlyShowPriceWhenAuthenticated) ? cultureFormatter.formatCurrency(pr.Price) : null} */}\r\n </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 const showFilterDropdown = props.config.showFilterDropdown;\r\n const showSortDropdown = props.config.showSortDropdown;\r\n\r\n const enableSearchWrap = props.context.app.config.enableSearchWrap;\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, enableSearchWrap, props)}\r\n </Node>\r\n )}\r\n {choiceSummary}\r\n <Node className='msc-sort-filter-wrapper'>{showFilterDropdown && showSortDropdown && 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\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, enableSearchWrap, props)}\r\n </Node>\r\n )}\r\n <Node {...FeatureSearchContainer}>{similarLookProduct}</Node>\r\n <Node {...RefineAndProductSectionContainer}>\r\n {(showFilterDropdown || showSortDropdown) && (\r\n <Node className='ms-refiner-heading'>\r\n <Node className='ms-refiner-heading_title'>\r\n {showFilterDropdown && (\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 )}\r\n <div className='ms-search-result-wrapper-title-choice-summary'>{choiceSummary}</div>\r\n {showSortDropdown && (\r\n <div className='ms-search-result-wrapper-sort-by-category'>\r\n {sortByOptions && !isRecoSearchPage && renderSort(sortByOptions)}\r\n </div>\r\n )}\r\n </Node>\r\n {refineMenu && isExpanded && renderRefiner(refineMenu)}\r\n </Node>\r\n )}\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","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { PriceComponent, RatingComponent } from '@msdyn365-commerce/components';\nimport {\n IComponent,\n IComponentProps,\n ICoreContext,\n IGridSettings,\n IImageData,\n IImageSettings,\n Image,\n IRequestContext\n} from '@msdyn365-commerce/core';\nimport { ProductPrice, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\nimport { format } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\n/**\n * IActiveProductProps interface.\n */\nexport interface IActiveProductProps extends IComponentProps<{ product?: ProductSearchResult }> {\n className?: string;\n imageSettings?: IImageSettings;\n savingsText?: string;\n freePriceText?: string;\n originalPriceText?: string;\n currentPriceText?: string;\n ratingAriaLabel?: string;\n}\n\n/**\n * IActiveProduct interface.\n */\nexport interface IActiveProduct extends IComponent<IActiveProductProps> {}\n\n/**\n * RenderDescription function.\n * @param description - Product description string.\n * @returns - Returns JSX.Element | null.\n */\nfunction renderDescription(description?: string): JSX.Element | null {\n return <p className='msc-active-image-product__text'>{description}</p>;\n}\n\n/**\n * GetRatingAriaLabel function.\n * @param rating - Product rating number.\n * @param ratingAriaLabel - Product rating aria label.\n * @returns - Returns string.\n */\nfunction getRatingAriaLabel(rating?: number, ratingAriaLabel?: string): string {\n const numberTwo: number = 2;\n if (rating && ratingAriaLabel) {\n const roundedRating = rating.toFixed(numberTwo);\n return format(ratingAriaLabel || '', roundedRating, '5');\n }\n return '';\n}\n\n/**\n * RenderRating function.\n * @param context - The core context.\n * @param typeName - The type name of the module.\n * @param ratingId - The rating id.\n * @param avgRating - The average rating.\n * @param totalRatings - The total ratings.\n * @param ariaLabel - The rating aria label.\n * @returns - Returns JSX.Element | null.\n */\nfunction renderRating(\n context: ICoreContext,\n typeName: string,\n ratingId: string,\n avgRating?: number,\n totalRatings?: number,\n ariaLabel?: string\n): JSX.Element | null {\n if (!avgRating) {\n return null;\n }\n\n const numberRatings = totalRatings?.toString() ?? undefined;\n const ratingAriaLabel = getRatingAriaLabel(avgRating, ariaLabel);\n\n return (\n <RatingComponent\n context={context}\n id={ratingId}\n typeName={typeName}\n avgRating={avgRating}\n ratingCount={numberRatings}\n readOnly\n ariaLabel={ratingAriaLabel}\n data={{}}\n />\n );\n}\n\n/**\n * RenderPrice function.\n * @param context - The core context.\n * @param typeName - The type name of the module.\n * @param productId - The product id.\n * @param basePrice - The base price of the product.\n * @param adjustedPrice - The adjusted price of the product.\n * @param savingsText - The savings text of the product.\n * @param freePriceText - The free price text.\n * @param originalPriceText - The original price text.\n * @returns - Returns JSX.Element | null.\n */\nfunction renderPrice(\n context: ICoreContext,\n typeName: string,\n productId: string,\n basePrice?: number,\n adjustedPrice?: number,\n savingsText?: string,\n freePriceText?: string,\n originalPriceText?: string\n): JSX.Element | null {\n const price: ProductPrice = {\n BasePrice: basePrice,\n AdjustedPrice: adjustedPrice,\n CustomerContextualPrice: adjustedPrice\n };\n\n return (\n <PriceComponent\n context={context}\n id={productId}\n typeName={typeName}\n data={{ price }}\n savingsText={savingsText}\n freePriceText={freePriceText}\n originalPriceText={originalPriceText}\n />\n );\n}\n\n/**\n * RenderProductPlacementImage function.\n * @param requestContext - RequestContext.\n * @param imageSettings - The product image settings.\n * @param gridSettings - The viewport gird settings.\n * @param imageUrl - The product image url.\n * @param altText - The product image alt text.\n * @returns - Returns JSX.Element | null.\n */\nfunction renderProductPlacementImage(\n requestContext: IRequestContext,\n imageSettings?: IImageSettings,\n gridSettings?: IGridSettings,\n imageUrl?: string,\n altText?: string\n): JSX.Element | null {\n if (!imageUrl || !gridSettings || !imageSettings) {\n return null;\n }\n const imgData: IImageData = {\n src: imageUrl,\n altText: altText ? altText : ''\n };\n const imageProps = {\n gridSettings,\n imageSettings\n };\n imageProps.imageSettings.cropFocalRegion = true;\n return <Image {...imgData} {...imageProps} requestContext={requestContext} loadFailureBehavior='empty' />;\n}\n\n/**\n * ActiveProduct constant.\n * @param props - The active product props.\n * @param props.data - The product search result data.\n * @param props.context - The core context.\n * @param props.imageSettings - The prodcut image settings.\n * @param props.savingsText - The product savings text.\n * @param props.freePriceText - The free price text.\n * @param props.originalPriceText - The original price text.\n * @param props.ratingAriaLabel - The product rating aria label.\n * @param props.typeName - The type name of the module.\n * @param props.id - The id of the product.\n * @returns - Returns JSX.Element | null.\n */\nexport const ActiveProductComponent: React.FC<IActiveProductProps> = ({\n data,\n context,\n imageSettings,\n savingsText,\n freePriceText,\n originalPriceText,\n ratingAriaLabel,\n typeName,\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Do not need naming convention check for library prameters\n id\n}) => {\n const product = data.product;\n if (!product) {\n return null;\n }\n\n return (\n <>\n <div className='msc-active-image-product'>\n <div className='msc-active-image-product__image'>\n {renderProductPlacementImage(\n context.actionContext.requestContext,\n imageSettings,\n context.request.gridSettings,\n product.PrimaryImageUrl,\n product.Name\n )}\n </div>\n <div className='msc-active-image-product__details'>\n <h4 className='msc-active-image-product__title'>{product.Name}</h4>\n {renderPrice(context, typeName, id, product.BasePrice, product.Price, savingsText, freePriceText, originalPriceText)}\n {renderDescription(product.Description)}\n {!context.app.config.hideRating &&\n renderRating(context, typeName, id, product.AverageRating, product.TotalRatings, ratingAriaLabel)}\n </div>\n </div>\n </>\n );\n};\n\nexport default ActiveProductComponent;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\n/**\n * ILinksData: Interface for\n * Additional content.\n */\ninterface ILinksData {\n linkText?: string;\n linkUrl: Msdyn365.ILinkData;\n ariaLabel?: string;\n isOpenInNewTab?: boolean;\n}\n\n/**\n * IAdditionalContentData: Interface for\n * Active content.\n */\ninterface IAdditionalContentData {\n heading?: string;\n subtext?: string;\n links?: ILinksData[];\n}\n\n/**\n * IActiveImageAdditionalContentProps: Interface for\n * Active Image Additional Content Component props.\n */\nexport interface IActiveImageAdditionalContentProps {\n requestContext: Msdyn365.IRequestContext;\n additionalContent: IAdditionalContentData | undefined;\n handleAdditionalTextChange(event: Msdyn365.ContentEditableEvent): void;\n handleAdditionalParagraphChange(event: Msdyn365.ContentEditableEvent): void;\n handleAdditionalLinkTextChange(linkIndex: number, event: Msdyn365.ContentEditableEvent): void;\n}\n\n/**\n * IActiveImageAdditionalContentViewProps: Interface for\n * Active Image Additional Content view props.\n */\nexport interface IActiveImageAdditionalContentViewProps {\n additionalContentNode: INodeProps;\n heading: React.ReactNode;\n text: React.ReactNode;\n links: React.ReactNode;\n additionalContentContainer: INodeProps;\n additionalContentItemLinks: INodeProps;\n}\n\n/**\n * Renders additional content heading.\n * @param additionalContentHeading - Additional content heading.\n * @param props - Active Image Additional content component props.\n * @returns Heading Node.\n */\nconst renderHeading = (additionalContentHeading: string, props: IActiveImageAdditionalContentProps) => {\n const requestContext = props.requestContext;\n return (\n <Msdyn365.Text\n text={additionalContentHeading}\n tag='p'\n className='msc-active-image__details__additional-content__text'\n editProps={{\n /**\n * On edit event for heading text change.\n * @param event - Change event.\n */\n onEdit: event => {\n props.handleAdditionalTextChange(event);\n },\n requestContext\n }}\n />\n );\n};\n\n/**\n * Renders additional content heading.\n * @param additionalContentParagraphText - Additional content paragraph text.\n * @param props - Active Image Additional content component props.\n * @returns Paragraph Node.\n */\nconst renderParagraph = (additionalContentParagraphText: string, props: IActiveImageAdditionalContentProps) => {\n const requestContext = props.requestContext;\n return (\n <Msdyn365.Text\n text={additionalContentParagraphText}\n tag='p'\n className='msc-active-image__details__additional-content__paragraph'\n editProps={{\n /**\n * On edit event for heading text change.\n * @param event - Change event.\n */\n onEdit: event => {\n props.handleAdditionalTextChange(event);\n },\n requestContext\n }}\n />\n );\n};\n\n/**\n * Renders additional content heading.\n * @param ctaLink - Additional content link.\n * @param props - Active Image Additional content component props.\n * @param linkIndex - Additional content link index.\n * @returns Link Node.\n */\nconst renderLinks = (ctaLink: ILinksData, props: IActiveImageAdditionalContentProps, linkIndex: number) => {\n const editableLink: Msdyn365.ILinksData = {\n ariaLabel: ctaLink.ariaLabel,\n className: 'msc-active-image__details__additional-content__cta__links',\n linkText: ctaLink.linkText,\n linkUrl: ctaLink.linkUrl.destinationUrl,\n openInNewTab: ctaLink.isOpenInNewTab,\n role: 'button'\n };\n const requestContext = props.requestContext;\n return (\n <Msdyn365.Link\n key={linkIndex}\n link={editableLink}\n editProps={{\n /**\n * Handle additional Link Text change.\n * @param event - The keyboard event.\n */\n onTextChange: event => {\n props.handleAdditionalLinkTextChange(linkIndex, event);\n },\n requestContext\n }}\n />\n );\n};\n\n/**\n * Create node for each additonal content item.\n * @param item - Active Image additonal content item props.\n * @param props - Active Image Additional content component props.\n * @returns IActiveImageAdditionalContentItemViewProps.\n */\nconst assembleNode = (item: IAdditionalContentData, props: IActiveImageAdditionalContentProps): IActiveImageAdditionalContentViewProps => {\n const headingNode = item.heading && renderHeading(item.heading, props);\n const paragraphNode = item.subtext && renderParagraph(item.subtext, props);\n const linksNode = item.links?.map((ctaLink: ILinksData, index: number) => {\n return renderLinks(ctaLink, props, index);\n });\n\n return {\n additionalContentNode: { className: 'msc-active-image__details__additional-content' },\n heading: headingNode,\n text: paragraphNode,\n links: linksNode,\n additionalContentContainer: { className: 'msc-active-image__details__additional-content__container' },\n additionalContentItemLinks: { className: 'msc-active-image__details__additional__content__cta' }\n };\n};\n\n/**\n * ActiveImageAdditionalContent component.\n * @param props - Active Image Additional content component props.\n * @returns Active Image Additional content view props.\n */\nexport const activeImageAdditionalContent = (\n props: IActiveImageAdditionalContentProps\n): IActiveImageAdditionalContentViewProps | undefined => {\n const { additionalContent } = props;\n if (!additionalContent) {\n return undefined;\n }\n\n return assembleNode(additionalContent, props);\n};\n\nexport default activeImageAdditionalContent;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport MsDyn365, { IImageData, Image, IRequestContext } from '@msdyn365-commerce/core';\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\nimport React from 'react';\n\n/**\n * @type AreaEvent for active points\n */\ntype AreaEvent = Event | React.MouseEvent<HTMLAreaElement, MouseEvent> | React.FocusEvent<HTMLAreaElement>;\n\n/**\n * @interface IRgbColor\n * @description - The IRgbColor interface contract.\n */\nexport interface IRgbColor {\n rValue: number;\n gValue: number;\n bValue: number;\n}\n\n/**\n * @interface IArea\n * @description - The IArea interface contract.\n */\nexport interface IArea {\n areaId: string;\n coords: number[];\n href?: string;\n center?: number[];\n primaryImageUrl?: string;\n productUrl: string;\n productSearchResult?: ProductSearchResult;\n}\n\n/**\n * @interface IArea\n * @description - The IArea interface contract.\n */\nexport interface IAreaMap {\n name: string;\n areas: IArea[];\n}\n\n/**\n * @enum CanvasCalculations\n * @description - The canvas calculations enum.\n */\nexport enum CanvasCalculations {\n defaultWidth = 0,\n defaultHeight = 0,\n defaultPositionX = 0,\n defaultPositionY = 0,\n defaultScale = 1,\n halfDivisor = 2,\n doubleMultiplier = 2,\n buttonHeight = 30,\n buttonPadding = 30,\n paddingAdjustment = 3,\n expandAnimationStartWidth = 10,\n expandAnimationEndWidth = 40,\n collapseAnimationStartWidth = 40,\n collapseAnimationEndWidth = 8,\n expandRadius = 12,\n collapseRadius = 8,\n rotation = 1.57,\n startAngle = 0,\n endAngle = 7,\n clearMargin = 50,\n clearHeight = 100,\n clearWidth = 100,\n textFadeInStartValue = 0,\n textFadeOutStartValue = 0.5,\n textFadeInterval = 0.01\n}\n\n/**\n * @enum CanvasStyles\n * @description - The canvas styles enum.\n */\nexport enum CanvasStyles {\n color = '#FFFFFF',\n buttonTextClor = '#000000'\n}\n\n/**\n * @enum\n * @description - The canvas styles enum.\n */\nexport interface IImageMapperResources {\n buttonText?: string;\n altText?: string;\n}\n\n/**\n * @interface IImageMapperProps\n * @description - The IImageMapperProps interface contract.\n */\nexport interface IImageMapperProps {\n imageData: IImageData;\n areaMap: IAreaMap;\n viewPort: string;\n requestContext: IRequestContext;\n color?: string;\n buttonTextClor?: string;\n width?: number;\n imgWidth?: number;\n activeImageRefs: React.RefObject<HTMLDivElement>;\n imageMapperResources?: IImageMapperResources;\n onLoad?(): void;\n onClick?(area: IArea, index: number, event: AreaEvent): void;\n onFocus?(area: IArea, index: number, event: AreaEvent): void;\n onMouseEnter?(area: IArea, index: number, event: AreaEvent): void;\n onMouseLeave?(area: IArea, index: number, event: AreaEvent): void;\n}\n\n/**\n * ImageMapper.\n */\nexport class ImageMapper extends React.Component<IImageMapperProps> {\n private readonly _backgroundImage: React.RefObject<Image>;\n\n private readonly _container: React.RefObject<HTMLDivElement>;\n\n private readonly _canvas: React.RefObject<HTMLCanvasElement>;\n\n private _isDesktopViewPort: boolean = false;\n\n private _context: CanvasRenderingContext2D | null | undefined = null;\n\n public constructor(props: IImageMapperProps) {\n super(props);\n this._backgroundImage = React.createRef();\n this._container = React.createRef();\n this._canvas = React.createRef();\n }\n\n /**\n * ComponentDidMount method.\n */\n public componentDidMount(): void {\n const { viewPort } = this.props;\n this.initCanvas();\n this._isDesktopViewPort = viewPort === 'lg' || viewPort === 'xl';\n this.renderAreas();\n this._context = null;\n }\n\n /**\n * ComponentDidUpdate method.\n */\n public componentDidUpdate(): void {\n const { viewPort } = this.props;\n this.initCanvas();\n this._isDesktopViewPort = viewPort === 'lg' || viewPort === 'xl';\n }\n\n /**\n * ShouldComponentUpdate method.\n * @param nextProps - Next props.\n * @returns Returns boolean.\n */\n public shouldComponentUpdate(nextProps: IImageMapperProps): boolean {\n let shouldRender = false;\n if (nextProps !== this.props) {\n shouldRender = true;\n }\n return shouldRender;\n }\n\n /**\n * GetActiveImageWidth method - Gets the active image width.\n * @returns Returns number | undefined.\n */\n public getActiveImageWidth = (): number | undefined => {\n if (MsDyn365.isBrowser) {\n const activeImageReferenceValue = this.props.activeImageRefs;\n if (activeImageReferenceValue.current !== null) {\n return activeImageReferenceValue.current.clientWidth;\n }\n }\n return undefined;\n };\n\n /**\n * GetActiveImageHeight method - Gets the active image height.\n * @returns Returns number | undefined.\n */\n public getActiveImageHeight = (): number | undefined => {\n if (MsDyn365.isBrowser) {\n const activeImageReferenceValue = this.props.activeImageRefs;\n if (activeImageReferenceValue.current !== null) {\n return activeImageReferenceValue.current.clientHeight;\n }\n }\n return undefined;\n };\n\n /**\n * ConvertHexToRgb method - This method takes color in HEX format and returns IRgbColor color object.\n * @param hexColor -The color hex value.\n * @returns -Returns IRgbColor object.\n */\n public convertHexToRgb = (hexColor: string): IRgbColor => {\n // RegEx used to execute the conversion of the hex color to rgb value.\n const regEx = new RegExp('^#?([a-f\\\\d]{2})([a-f\\\\d]{2})([a-f\\\\d]{2})$', 'u');\n\n // RegEx.exec method executes a search for a match in a specified string. Returns a result array, or null.\n const result = regEx.exec(hexColor);\n const defaultValue = 0;\n return result\n ? {\n rValue: Number.parseInt(result[1], 16),\n gValue: Number.parseInt(result[2], 16),\n bValue: Number.parseInt(result[3], 16)\n }\n : {\n rValue: defaultValue,\n gValue: defaultValue,\n bValue: defaultValue\n };\n };\n\n /**\n * ApplyFadingTransition method - Applys fading transition to button text.\n * @param text -The button text.\n * @param coords -The coordinates.\n * @param rgbColor -The RGB color object.\n * @param alpha -The alpha value of the button text.\n */\n public applyFadingTransition = (text: string, coords: number[], rgbColor: IRgbColor, alpha: number): void => {\n const halfDivisor: number = CanvasCalculations.halfDivisor;\n const context = this._canvas.current?.getContext('2d') ?? this._context;\n if (context && this._isDesktopViewPort) {\n const buttonPadding = CanvasCalculations.buttonPadding;\n const paddingAdjustment = CanvasCalculations.paddingAdjustment;\n const buttonWidth = context.measureText(text).width + buttonPadding;\n context.fillStyle = `rgba(${rgbColor.rValue}, ${rgbColor.gValue}, ${rgbColor.bValue}, ${alpha} )`;\n if (MsDyn365.isBrowser && document.body.parentElement && document.body.parentElement.getAttribute('dir') === 'rtl') {\n context.fillText(text, coords[0] + buttonWidth / halfDivisor - buttonPadding / halfDivisor, coords[1] + paddingAdjustment);\n } else {\n context.fillText(text, coords[0] - buttonWidth / halfDivisor + buttonPadding / halfDivisor, coords[1] + paddingAdjustment);\n }\n }\n };\n\n /**\n * Draw button method - Draws button and contains fixed hight, padding values.\n * @param text -The button text.\n * @param coords -The coordinates.\n */\n public drawButton = (text: string, coords: number[]): void => {\n const { color = CanvasStyles.color, buttonTextClor = CanvasStyles.buttonTextClor } = this.props;\n const halfDivisor: number = CanvasCalculations.halfDivisor;\n const context = this._canvas.current?.getContext('2d') ?? this._context;\n if (context && this._isDesktopViewPort) {\n const buttonHeight = CanvasCalculations.buttonHeight;\n const buttonPadding = CanvasCalculations.buttonPadding;\n const paddingAdjustment = CanvasCalculations.paddingAdjustment;\n const buttonWidth = context.measureText(text).width + buttonPadding;\n const buttonPositionX = coords[0] - buttonWidth / halfDivisor;\n const buttonPositionY = coords[1] - buttonHeight / halfDivisor;\n const arcsize = buttonHeight / halfDivisor;\n\n context.beginPath();\n context.moveTo(buttonPositionX + arcsize, buttonPositionY);\n context.lineTo(buttonPositionX + buttonWidth - arcsize, buttonPositionY);\n context.arcTo(\n buttonPositionX + buttonWidth,\n buttonPositionY,\n buttonPositionX + buttonWidth,\n buttonPositionY + arcsize,\n arcsize\n );\n context.lineTo(buttonPositionX + buttonWidth, buttonPositionY + buttonHeight - arcsize);\n context.arcTo(\n buttonPositionX + buttonWidth,\n buttonPositionY + buttonHeight,\n buttonPositionX + buttonWidth - arcsize,\n buttonPositionY + buttonHeight,\n arcsize\n );\n context.lineTo(buttonPositionX + arcsize, buttonPositionY + buttonHeight);\n context.arcTo(buttonPositionX, buttonPositionY + buttonHeight, buttonPositionX, buttonPositionY - arcsize, arcsize);\n context.lineTo(buttonPositionX, buttonPositionY + arcsize);\n context.arcTo(buttonPositionX, buttonPositionY, buttonPositionX + arcsize, buttonPositionY, arcsize);\n context.lineTo(buttonPositionX + arcsize, buttonPositionY);\n context.stroke();\n context.closePath();\n context.fillStyle = color;\n context.fill();\n context.fillStyle = buttonTextClor;\n if (MsDyn365.isBrowser && document.body.parentElement && document.body.parentElement.getAttribute('dir') === 'rtl') {\n context.fillText(text, coords[0] + buttonWidth / halfDivisor - buttonPadding / halfDivisor, coords[1] + paddingAdjustment);\n } else {\n context.fillText(text, coords[0] - buttonWidth / halfDivisor + buttonPadding / halfDivisor, coords[1] + paddingAdjustment);\n }\n }\n };\n\n /**\n * ExpandAnimation method - Shows expand animation and contains fixed values to draw the circle and ellipse shapes.\n * @param coords -Coordinates.\n */\n public expandAnimation = (coords: number[]): void => {\n const { color = CanvasStyles.color, buttonTextClor = CanvasStyles.buttonTextClor } = this.props;\n const buttonText = this.props.imageMapperResources?.buttonText;\n let animationStartWidth = CanvasCalculations.expandAnimationStartWidth;\n const pointPositionX = coords[0];\n const pointPositionY = coords[1];\n const animationEndWidth = CanvasCalculations.expandAnimationEndWidth;\n const radius = CanvasCalculations.expandRadius;\n const rotation = CanvasCalculations.rotation;\n const startAngle = CanvasCalculations.startAngle;\n const endAngle = CanvasCalculations.endAngle;\n let textFadeInValue = CanvasCalculations.textFadeInStartValue;\n const buttonTextClorInRgb = this.convertHexToRgb(buttonTextClor.toLocaleLowerCase());\n\n /**\n * Animate method - Reders expand animation.\n */\n const animate = () => {\n const context = this._canvas.current?.getContext('2d') ?? this._context;\n if (!context) {\n return;\n }\n context.beginPath();\n context.ellipse(pointPositionX, pointPositionY, radius, animationStartWidth, rotation, startAngle, endAngle);\n context.fillStyle = color;\n context.fill();\n context.fillStyle = color;\n if (buttonText) {\n if (animationStartWidth < animationEndWidth) {\n requestAnimationFrame(animate);\n this.applyFadingTransition(buttonText, coords, buttonTextClorInRgb, textFadeInValue);\n textFadeInValue += CanvasCalculations.textFadeInterval;\n animationStartWidth++;\n } else {\n this.drawButton(buttonText, [pointPositionX, pointPositionY]);\n }\n }\n };\n\n if (this._isDesktopViewPort) {\n animate();\n }\n };\n\n /**\n * CollapseAnimation method - Shows collapse animation and contains fixed values to draw the circle and ellipse shapes.\n * @param coords -Coordinates.\n */\n public collapseAnimation = (coords: number[]): void => {\n const { color = CanvasStyles.color, buttonTextClor = CanvasStyles.buttonTextClor } = this.props;\n const buttonText = this.props.imageMapperResources?.buttonText;\n let animationStartWidth = CanvasCalculations.collapseAnimationStartWidth;\n const pointPositionX = coords[0];\n const pointPositionY = coords[1];\n const animationEndWidth = CanvasCalculations.collapseAnimationEndWidth;\n const rotation = CanvasCalculations.rotation;\n const clearMargin = CanvasCalculations.clearMargin;\n const clearHeight = CanvasCalculations.clearHeight;\n const clearWidth = CanvasCalculations.clearWidth;\n const radius = CanvasCalculations.collapseRadius;\n const startAngle = CanvasCalculations.startAngle;\n const endAngle = CanvasCalculations.endAngle;\n let textFadeOutValue = CanvasCalculations.textFadeOutStartValue;\n const buttonTextClorInRgb = this.convertHexToRgb(buttonTextClor.toLocaleLowerCase());\n\n /**\n * Animate method - Renders collapse animation.\n */\n const animate = () => {\n const context = this._canvas.current?.getContext('2d') ?? this._context;\n if (!context) {\n return;\n }\n context.beginPath();\n context.clearRect(pointPositionX - clearMargin, pointPositionY - clearMargin, clearWidth, clearHeight);\n context.ellipse(pointPositionX, pointPositionY, radius, animationStartWidth, rotation, startAngle, endAngle);\n context.fillStyle = color;\n context.fill();\n if (animationEndWidth < animationStartWidth && buttonText) {\n requestAnimationFrame(animate);\n this.applyFadingTransition(buttonText, coords, buttonTextClorInRgb, textFadeOutValue);\n textFadeOutValue -= CanvasCalculations.textFadeInterval;\n animationStartWidth--;\n }\n };\n\n if (this._isDesktopViewPort) {\n animate();\n }\n };\n\n /**\n * DrawCircle method - Renders active points.\n * @param coords -Coordinates.\n */\n public drawCircle = (coords: number[]): void => {\n const { color = CanvasStyles.color, viewPort } = this.props;\n const doubleMultiplier: number = CanvasCalculations.doubleMultiplier;\n const startAngle: number = CanvasCalculations.startAngle;\n const context = this._canvas.current?.getContext('2d') ?? this._context;\n const radius = viewPort === 'xs' || viewPort === 'sm' ? coords[2] * doubleMultiplier : coords[2];\n if (!context) {\n return;\n }\n context.fillStyle = color;\n context.beginPath();\n context.strokeStyle = color;\n context.arc(coords[0], coords[1], radius, startAngle, Math.PI * doubleMultiplier);\n context.closePath();\n context.stroke();\n context.fill();\n };\n\n /**\n * ScaleCoords method - To scale the active point coordinates based on the window size.\n * @param coords -Coordinates.\n * @returns -Returns number[].\n */\n public scaleCoords = (coords: number[]): number[] => {\n const { imgWidth } = this.props;\n const defaultWidth: number = CanvasCalculations.defaultWidth;\n const defaultScale: number = CanvasCalculations.defaultScale;\n\n // Calculate scale based on current 'width' and the original 'imgWidth'\n const width = this.getActiveImageWidth();\n const scale = width && imgWidth && imgWidth > defaultWidth ? width / imgWidth : defaultScale;\n return coords.map(coord => coord * scale);\n };\n\n /**\n * RenderPrefilledAreas method - To render active points in case of events.\n */\n public renderPrefilledAreas = (): void => {\n const { areaMap } = this.props;\n areaMap.areas.map(area => {\n this.drawCircle(this.scaleCoords(area.coords));\n return null;\n });\n };\n\n /**\n * ComputeCenter method - To re-calculate the center of active point based on window size.\n * @param area -IArea.\n * @returns -Returns number[].\n */\n public computeCenter = (area: IArea): number[] => {\n const scaledCoords = this.scaleCoords(area.coords);\n return [scaledCoords[0], scaledCoords[1]];\n };\n\n /**\n * HandleHoverOn method - To handle mouse hover on event.\n * @param area -IArea.\n */\n public handleHoverOn = (area: IArea): void => {\n if (area.center && this._canvas.current) {\n this.drawCircle(this.scaleCoords(area.coords));\n this.expandAnimation(area.center);\n }\n };\n\n /**\n * HandleHoverOff method - To handle mouse hover off event.\n * @param area -IArea.\n */\n public handleHoverOff = (area: IArea): void => {\n if (this._canvas.current) {\n const context = this._canvas.current.getContext('2d') ?? this._context;\n const canvasPositionX: number = CanvasCalculations.defaultPositionX;\n const canvasPositionY: number = CanvasCalculations.defaultPositionY;\n\n if (!context) {\n return;\n }\n context.clearRect(canvasPositionX, canvasPositionY, this._canvas.current.width, this._canvas.current.height);\n this.renderPrefilledAreas();\n if (area.center) {\n this.collapseAnimation(area.center);\n }\n }\n };\n\n /**\n * Click method - Mouse click event.\n * @param area -IArea.\n * @param index - Number.\n * @returns - Void.\n */\n public click = (area: IArea, index: number) => (event: AreaEvent): void => {\n const { onClick } = this.props;\n if (onClick) {\n event.preventDefault();\n onClick(area, index, event);\n }\n };\n\n /**\n * HoverOn method - Mouse hover on event.\n * @param area -IArea.\n * @param index - Number.\n * @returns - Void.\n */\n public hoverOn = (area: IArea, index: number) => (event: AreaEvent): void => {\n const { onMouseEnter } = this.props;\n this.handleHoverOn(area);\n if (onMouseEnter) {\n onMouseEnter(area, index, event);\n }\n };\n\n /**\n * HoverOff method - Mouse hover off event.\n * @param area - IArea.\n * @param index - Number.\n * @returns - Void.\n */\n public hoverOff = (area: IArea, index: number) => (event: AreaEvent): void => {\n const { onMouseLeave } = this.props;\n\n this.handleHoverOff(area);\n\n if (onMouseLeave) {\n onMouseLeave(area, index, event);\n }\n };\n\n /**\n * RenderAreas method - Renders active points at given coordinates.\n * @returns -Returns JSX.Element[].\n */\n public renderAreas = (): JSX.Element[] => {\n const { areaMap, viewPort } = this.props;\n const buttonText = this.props.imageMapperResources?.buttonText ? this.props.imageMapperResources.buttonText : '';\n const altText = this.props.imageMapperResources?.altText ? this.props.imageMapperResources.altText : '';\n const doubleMultiplier: number = CanvasCalculations.doubleMultiplier;\n\n return areaMap.areas.map((area, index) => {\n const scaledCoords = this.scaleCoords(area.coords);\n const xsRadius = area.coords[2] * doubleMultiplier;\n if (viewPort === 'xs') {\n scaledCoords[2] = xsRadius;\n }\n const center = this.computeCenter(area);\n const extendedArea = { ...area, scaledCoords, center };\n const areaKey = `area-${index}`;\n const altTextWithProductName = altText\n .replace('{buttonText}', buttonText ? buttonText : '')\n .replace('{productName}', area.productSearchResult?.Name ? area.productSearchResult.Name : '');\n return (\n <area\n key={areaKey}\n shape='circle'\n coords={scaledCoords.join(',')}\n onMouseEnter={this.hoverOn(extendedArea, index)}\n onMouseLeave={this.hoverOff(extendedArea, index)}\n onClick={this.click(extendedArea, index)}\n onFocus={this.hoverOn(extendedArea, index)}\n onBlur={this.hoverOff(extendedArea, index)}\n href={area.productUrl}\n tabIndex={0}\n alt={altTextWithProductName}\n aria-label={altTextWithProductName}\n />\n );\n });\n };\n\n /**\n * InitCanvas method - To render the canvas.\n */\n public initCanvas = (): void => {\n if (!this._canvas.current || !this._backgroundImage.current || !this._container.current) {\n return;\n }\n\n const { color, onLoad } = this.props;\n const defaultWidth: number = CanvasCalculations.defaultWidth;\n const defaultHeight: number = CanvasCalculations.defaultHeight;\n\n const canvasWidth = this.getActiveImageWidth() ?? defaultWidth;\n const canvasHeight = this.getActiveImageHeight() ?? defaultHeight;\n\n this._canvas.current.width = canvasWidth;\n this._canvas.current.height = canvasHeight;\n this._container.current.style.width = `${canvasWidth}px`;\n\n const context = this._canvas.current.getContext('2d') ?? this._context;\n if (!context) {\n return;\n }\n context.fillStyle = color ?? '';\n\n if (onLoad) {\n onLoad();\n }\n\n this.renderPrefilledAreas();\n };\n\n /**\n * Render method - To render the image mapper component with active image, canvas and active points.\n * @returns -Returns JSX.Element | null.\n */\n public render(): JSX.Element | null {\n const { imageData, areaMap, requestContext } = this.props;\n\n return (\n <div className='msc-active-image-container' ref={this._container}>\n <Image\n src={imageData.src}\n useMap={`#${areaMap.name}`}\n alt={areaMap.name}\n ref={this._backgroundImage}\n height={imageData.height}\n width={imageData.width}\n className='msc-active-image-img'\n imageSettings={imageData.imageSettings}\n gridSettings={requestContext.gridSettings ?? {}}\n requestContext={requestContext}\n />\n <canvas ref={this._canvas} className='msc-active-image-canvas' />\n <map name={areaMap.name} className='msc-active-image-map'>\n {this.renderAreas()}\n </map>\n </div>\n );\n }\n}\n\nexport default ImageMapper;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as MsDyn365 from '@msdyn365-commerce/core';\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions, getProductPageUrlSync } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n getPayloadObject,\n getTelemetryAttributes,\n getTelemetryObject,\n IModuleProps,\n INodeProps,\n isMobile,\n ITelemetryContent,\n VariantType\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport {\n activeImageAdditionalContent,\n ActiveProductComponent,\n IActiveImageAdditionalContentViewProps,\n IArea,\n IAreaMap,\n IImageMapperProps,\n ImageMapper\n} from '../active-image-utilities';\nimport { IActiveImageData } from './active-image.data';\nimport { IActiveImageProps } from './active-image.props.autogenerated';\n\n/**\n * @type AreaEvent for active points\n */\ntype AreaEvent = Event | React.MouseEvent<HTMLAreaElement, MouseEvent> | React.FocusEvent<HTMLAreaElement>;\n\n/**\n * @interface IActiveImageViewProps\n * @classdesc - The IActiveImageViewProps interface contract.\n */\nexport interface IActiveImageViewProps extends IActiveImageProps<{}>, IImageMapperProps {\n activePointContainer: IModuleProps;\n activePointDetailsContainer: INodeProps;\n imageMapper: React.ReactNode;\n overlay: React.ReactNode;\n productCard: React.ReactNode;\n title?: React.ReactNode;\n text?: React.ReactNode;\n links?: React.ReactNode;\n detailsContainer?: INodeProps;\n detailsContainerCta?: INodeProps;\n additionalContent?: IActiveImageAdditionalContentViewProps;\n productCardleftPosition: number;\n productCardtopPosition: number;\n handleAdditionalText?(event: MsDyn365.ContentEditableEvent): void;\n handleAdditionalParagraph?(event: MsDyn365.ContentEditableEvent): void;\n handleAdditionalLinkText?(event: MsDyn365.ContentEditableEvent): void;\n}\n\n/**\n * @interface IActiveImageLinksData\n * @classdesc - The IActiveImageLinksData interface contract.\n */\nexport interface IActiveImageLinksData {\n linkText?: string;\n linkUrl: MsDyn365.ILinkData;\n ariaLabel?: string;\n willOpenInNewTab?: boolean;\n}\n\n/**\n * @interface IActiveImageState\n * @classdesc - The IActiveImageState interface contract.\n */\ninterface IActiveImageState {\n clientWidth: number;\n area: IArea | null;\n viewport: string;\n overlayClass: string;\n}\n\n/**\n * @enum ActiveImageConstants\n * @description - The active image constants enum.\n */\nexport enum ActiveImageConstants {\n timeoutInterval = 200,\n enterKey = 'Enter',\n escKey = 'Escape'\n}\n\n/**\n *\n * ActiveImage class.\n * @extends {React.PureComponent<IActiveImageProps<{}> & IImageMapperProps, IActiveImageState>}\n */\nexport class ActiveImage extends React.PureComponent<IActiveImageProps<IActiveImageData> & IImageMapperProps, IActiveImageState> {\n private readonly _telemetryContent: ITelemetryContent;\n\n private _isDesktopViewPort: boolean;\n\n private readonly _defaultProductCardWidth: number = 315;\n\n private readonly _defaultProdutCardHight: number = 490;\n\n private readonly _activePoints: IArea[] = [];\n\n private readonly _activeImageRefs: React.RefObject<HTMLDivElement>;\n\n private readonly _activeImageClass: string;\n\n private readonly _productCardDivRef: React.RefObject<HTMLDivElement>;\n\n public constructor(props: IActiveImageProps<IActiveImageData> & IImageMapperProps) {\n super(props);\n this._telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n const viewport = isMobile({ variant: VariantType.Browser, context: this.props.context.request });\n this._activeImageClass = `msc-active-image-${this.getActiveImageId()}`;\n this.state = {\n clientWidth: 0,\n area: null,\n viewport,\n overlayClass: ''\n };\n this._isDesktopViewPort = viewport === 'lg' || viewport === 'xl';\n this._activeImageRefs = React.createRef();\n this._productCardDivRef = React.createRef();\n }\n\n public componentDidMount(): void {\n if (MsDyn365.msdyn365Commerce.isBrowser) {\n window.addEventListener('resize', this.updateClientWidth);\n document.addEventListener('keydown', this.keyDown, false);\n document.addEventListener('mousedown', this._handleOutsideClick);\n }\n setTimeout(() => {\n this.updateClientWidth();\n }, ActiveImageConstants.timeoutInterval);\n\n if (MsDyn365.msdyn365Commerce.isBrowser && this._activeImageRefs.current) {\n const images: HTMLCollectionOf<Element> = this._activeImageRefs.current.getElementsByClassName(\n 'msc-thumbnail_image msc-active-image-img'\n );\n if (ArrayExtensions.hasElements(Array.from(images))) {\n images[0].removeAttribute('usemap');\n }\n }\n }\n\n /**\n * AddActivePoints method - To handle add Active Points.\n * @param area - IArea.\n * @param product - ProductSearchResult.\n * @param coords - Coords.\n * @param productUrl - String.\n */\n public addActivePoints = (area: IArea | undefined, product: ProductSearchResult, coords: number[], productUrl: string): void => {\n if (!area) {\n this._activePoints.push({\n areaId: product.RecordId.toString(),\n coords,\n primaryImageUrl: product.PrimaryImageUrl ?? '',\n productUrl,\n productSearchResult: product\n });\n }\n };\n\n /**\n * ComponentWillUnmount method.\n */\n public componentWillUnmount(): void {\n if (MsDyn365.msdyn365Commerce.isBrowser) {\n window.removeEventListener('resize', this.updateClientWidth);\n document.removeEventListener('keydown', (this.keyDown as unknown) as EventListener, false);\n document.removeEventListener('mousedown', this._handleOutsideClick, false);\n }\n }\n\n /**\n * UpdateClientWidth method to update client width in state.\n */\n public updateClientWidth = (): void => {\n const viewport = isMobile({ variant: VariantType.Browser, context: this.props.context.request });\n this.setState({ clientWidth: this.getActiveImageWidth(), viewport });\n this._isDesktopViewPort = viewport === 'lg' || viewport === 'xl';\n };\n\n /**\n * Render method.\n * @returns - Returns JSX.Element | null.\n */\n public render(): JSX.Element | null {\n const viewProps: IActiveImageViewProps = {\n ...(this.props as IImageMapperProps & IActiveImageProps<{}>),\n activePointContainer: {\n moduleProps: this.props,\n className: classnames('msc-active-image', this._activeImageClass, this.props.config.className)\n },\n activePointDetailsContainer: {\n tag: 'div',\n className: classnames('msc-active-image-wrapper', this._activeImageClass, this.props.config.className),\n ref: this._activeImageRefs\n },\n imgWidth: this.props.config.canvasWidth,\n imageMapper: this.renderImageMapper(),\n overlay: this.renderOverlay(),\n productCard: this.renderProductCard(),\n productCardleftPosition: this.getProductCardPositionX(),\n productCardtopPosition: this.getProductCardPositionY(),\n title: this.renderActiveImageDetailsHeading(),\n text: this.renderActiveImageDetailsParagraph(),\n links: this.renderActiveImageDetailsLinks(),\n detailsContainer: { className: 'msc-active-image__details' },\n detailsContainerCta: { className: 'msc-active-image__details__cta' },\n additionalContent: activeImageAdditionalContent({\n requestContext: this.props.context.request,\n additionalContent: this.props.config.additionalContent,\n handleAdditionalTextChange: this.handleAdditionalTextChange,\n handleAdditionalParagraphChange: this.handleAdditionalParagraphChange,\n handleAdditionalLinkTextChange: this.handleAdditionalLinkTextChange\n }),\n handleAdditionalText: this.handleAdditionalTextChange,\n handleAdditionalParagraph: this.handleAdditionalParagraphChange,\n handleAdditionalLinkText: this.handleAdditionalTextChange\n };\n\n return this.props.renderView(viewProps);\n }\n\n /**\n * RenderImageMapper method - To render image mapper.\n * @returns - Returns React.ReactNode | null.\n */\n public renderImageMapper = (): React.ReactNode | null => {\n const { config, context } = this.props;\n const defaultPosition: number = 0;\n const defaultLength: number = 0;\n const productResults = this.props.data.products.result;\n if (config.activePoints && productResults) {\n for (const product of productResults) {\n for (const configProduct of config.activePoints) {\n if (product.ItemId === configProduct.itemId) {\n const productUrl = getProductPageUrlSync(product.Name ?? '', product.RecordId, context.actionContext, undefined);\n const coords = [\n configProduct.xPosition ?? defaultPosition,\n configProduct.yPosition ?? defaultPosition,\n configProduct.radius ?? defaultPosition\n ];\n const area = this._activePoints.find(activePoint => JSON.stringify(activePoint.coords) === JSON.stringify(coords));\n this.addActivePoints(area, product, coords, productUrl);\n }\n }\n }\n }\n const mappedArea: IAreaMap = {\n name: `map-${this._activeImageClass}`,\n areas: this._activePoints.length > defaultLength ? this._activePoints : []\n };\n\n // If image is null, we want to render the placeholder SVG - by passing image data with empty src\n return (\n <ImageMapper\n viewPort={this.state.viewport}\n requestContext={this.props.context.actionContext.requestContext}\n width={this.state.clientWidth}\n imgWidth={this.props.config.canvasWidth}\n onClick={this.enterArea}\n onFocus={this.enterArea}\n onMouseEnter={this.enterArea}\n onMouseLeave={this.leaveArea}\n imageData={this.props.config.activeImage ?? {}}\n areaMap={mappedArea}\n activeImageRefs={this._activeImageRefs}\n imageMapperResources={{\n altText: this.props.resources.altTextForSeeMoreButtonWithProductName,\n buttonText: this.props.resources.seeMoreButtonText\n }}\n />\n );\n };\n\n /**\n * EnterArea method - To handle mouse enter event.\n * @param area - Active point area.\n * @param index - Active point index.\n * @param event - Active point AreaEvent.\n */\n public enterArea = (area: IArea, index: number, event: AreaEvent): void => {\n this.setState({ area, overlayClass: 'msc-active-image-overlay' });\n if (this.props.onMouseEnter) {\n this.props.onMouseEnter(area, index, event);\n }\n if (event.type.toLocaleLowerCase() === 'click' && this._isDesktopViewPort) {\n window.open(area.productUrl, '_self');\n }\n };\n\n /**\n * LeaveArea method - To handle mouse leave event.\n */\n public leaveArea = (): void => {\n if (this._isDesktopViewPort) {\n this.resetState();\n }\n };\n\n /**\n * ResetState method - To reset the state for area and overlayclass.\n */\n public resetState = (): void => {\n this.setState({ area: null, overlayClass: '' });\n };\n\n /**\n * RenderProductComponent method - To render the product card with product information.\n * @returns - Returns React.ReactNode.\n */\n public renderProductComponent = (): React.ReactNode => {\n if (this.state.area?.productSearchResult) {\n const baseImageUrl: string = this.props.context.request.apiSettings.baseImageUrl;\n const imageUrl: string = this.state.area.primaryImageUrl ?? '';\n const primaryImageUrl: string = `${baseImageUrl}${imageUrl}`;\n const product: ProductSearchResult = this.state.area.productSearchResult;\n product.PrimaryImageUrl = primaryImageUrl;\n\n return (\n <ActiveProductComponent\n context={this.props.context}\n imageSettings={this.props.config.productImageSettings}\n id={product.ItemId ?? ''}\n typeName={this.props.typeName || ''}\n data={{ product }}\n />\n );\n }\n return React.Fragment;\n };\n\n /**\n * RenderProductCard method - To render product cards.\n * @returns - Returns React.ReactNode.\n */\n public renderProductCard = (): React.ReactNode => {\n const { area } = this.state;\n\n return (\n <>\n {area?.center && (\n <div className='msc-active-image-product-card' ref={this._productCardDivRef}>\n <div className='msc-active-image-product-card-wrapper' key={area.areaId}>\n {!this._isDesktopViewPort && <button onClick={this.resetState} className='close-button' />}\n {area.productSearchResult && this.renderProductComponent()}\n {!this._isDesktopViewPort && (\n <a href={area.productUrl} className='see-more-button'>\n {this.props.resources.seeMoreButtonText}\n </a>\n )}\n </div>\n </div>\n )}\n </>\n );\n };\n\n /**\n * RenderOverlay method - To render overlay for non desktop viewports.\n * @returns - Returns React.ReactNode.\n */\n public renderOverlay = (): React.ReactNode => {\n return <>{!this._isDesktopViewPort && <div className={this.state.overlayClass} />}</>;\n };\n\n /**\n * GetProductCardPositionX method - Provides product card x position to the left or right of active point based on available space.\n * For xs, sm and md viewports it provides x position for the center alignment.\n * @returns - Returns number.\n */\n public getProductCardPositionX = (): number => {\n const defaultImageSettings = this.getDefaultImageSettings();\n const productImageSettingsWidth = this.props.config.productImageSettings?.viewports\n ? this.props.config.productImageSettings.viewports.lg?.w\n : defaultImageSettings.viewports.lg?.w;\n const defaultPositionX: number = 0;\n const halfDivisor: number = 2;\n const productCardWidth: number = productImageSettingsWidth ? productImageSettingsWidth : this._defaultProductCardWidth;\n const { area, clientWidth, viewport } = this.state;\n const pointPositionX = area?.center?.[0] ?? clientWidth / halfDivisor;\n const leftAllignPosition = pointPositionX - productCardWidth - productCardWidth / halfDivisor;\n const rightAllignPosition = pointPositionX + productCardWidth / halfDivisor;\n let position: number = (clientWidth - productCardWidth) / halfDivisor;\n if (viewport !== 'xs' && viewport !== 'sm' && viewport !== 'md') {\n if (leftAllignPosition < defaultPositionX) {\n position = rightAllignPosition;\n } else {\n position = leftAllignPosition;\n }\n }\n return position;\n };\n\n /**\n * GetProductCardPositionY method - Provides product card y position in center with respect to active point.\n * For xs, sm and md viewports it provides y position for the center alignment.\n * @returns - Returns number.\n */\n public getProductCardPositionY = (): number => {\n const defaultImageSettings = this.getDefaultImageSettings();\n const productImageSettingsHeight = this.props.config.productImageSettings?.viewports\n ? this.props.config.productImageSettings.viewports.lg?.h\n : defaultImageSettings.viewports.lg?.h;\n const halfDivisor: number = 2;\n const { area, viewport } = this.state;\n const produtCardHight: number = productImageSettingsHeight ? productImageSettingsHeight : this._defaultProdutCardHight;\n const pointPositionY = (this.getActiveImageHeight() - produtCardHight) / halfDivisor;\n let position: number = pointPositionY;\n if (viewport !== 'xs' && viewport !== 'sm' && viewport !== 'md') {\n position = (area?.center?.[1] ?? this.getActiveImageHeight() / halfDivisor) - produtCardHight / halfDivisor;\n }\n return position;\n };\n\n /**\n * GetDefaultImageSettings method.\n * @returns MsDyn365.IImageSettings.\n */\n public getDefaultImageSettings = (): MsDyn365.IImageSettings => {\n const defaultImageSettings: MsDyn365.IImageSettings = {\n viewports: {\n xs: { q: 'w=275&h=275&m=6', w: 275, h: 275 },\n lg: { q: 'w=275&h=275&m=6', w: 275, h: 275 },\n xl: { q: 'w=275&h=275&m=6', w: 275, h: 275 }\n },\n lazyload: true\n };\n\n return defaultImageSettings;\n };\n\n /**\n * KeyDown method - To handle keydown event.\n * @param event - KeyboardEvent.\n */\n public keyDown = (event: KeyboardEvent): void => {\n if (event.key === ActiveImageConstants.enterKey) {\n const target: HTMLElement = event.target as HTMLElement;\n if (target.nodeName === 'AREA') {\n const area: HTMLAreaElement = target as HTMLAreaElement;\n if (area.href) {\n window.open(area.href, '_self');\n }\n }\n }\n if (event.key === ActiveImageConstants.escKey) {\n this.resetState();\n }\n };\n\n /**\n * GetActiveImageWidth method - To get active image width.\n * @returns Returns number.\n */\n public getActiveImageWidth = (): number => {\n const defaultWidth: number = 0;\n if (MsDyn365.msdyn365Commerce.isBrowser) {\n const activeImageReferenceValue = this._activeImageRefs;\n if (activeImageReferenceValue.current !== null) {\n return activeImageReferenceValue.current.clientWidth;\n }\n }\n return defaultWidth;\n };\n\n /**\n * GetActiveImageHeight method - To get active image height.\n * @returns Returns number.\n */\n public getActiveImageHeight = (): number => {\n const defaultHeight: number = 0;\n if (MsDyn365.msdyn365Commerce.isBrowser) {\n const activeImageReferenceValue = this._activeImageRefs;\n if (activeImageReferenceValue.current !== null) {\n return activeImageReferenceValue.current.clientHeight;\n }\n }\n return defaultHeight;\n };\n\n /**\n * HandleLinkTextChange method - To handle link text change event.\n * @param linkIndex - The link index.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleLinkTextChange(linkIndex: number, event: MsDyn365.ContentEditableEvent): void {\n if (this.props.config.links && this.props.config.links[Number(linkIndex)]) {\n this.props.config.links[Number(linkIndex)].linkText = event.target.value;\n }\n }\n\n /**\n * HandleTextChange method - To handle text change event.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleTextChange = (event: MsDyn365.ContentEditableEvent): void => {\n this.props.config.heading!.text = event.target.value;\n };\n\n /**\n * HandleParagraphChange method - To handle paragraph change event.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleParagraphChange = (event: MsDyn365.ContentEditableEvent): void => {\n this.props.config.paragraph = event.target.value;\n };\n\n /**\n * HandleAdditionalTextChange method - To handle additional text change event.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleAdditionalTextChange(event: MsDyn365.ContentEditableEvent): void {\n if (this.props.config.additionalContent) {\n this.props.config.additionalContent.heading = event.target.value;\n }\n }\n\n /**\n * HandleAdditionalLinkTextChange method - To handle additional link text change event.\n * @param linkIndex - The link index.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleAdditionalLinkTextChange(linkIndex: number, event: MsDyn365.ContentEditableEvent): void {\n const additionalContent = this.props.config.additionalContent ?? {};\n if (additionalContent.links) {\n additionalContent.links[Number(linkIndex)].linkText = event.target.value;\n }\n }\n\n /**\n * HandleAdditionalParagraphChange method - To handle additional paragraph change event.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleAdditionalParagraphChange(event: MsDyn365.ContentEditableEvent): void {\n if (this.props.config.additionalContent) {\n this.props.config.additionalContent.subtext = event.target.value;\n }\n }\n\n /**\n * RenderActiveImageDetailsLinks method - To render active image details links.\n * @returns - React node.\n */\n public renderActiveImageDetailsLinks = (): React.ReactNode[] | undefined => {\n const { links } = this.props.config;\n const payLoad = getPayloadObject('click', this._telemetryContent, '');\n\n return links?.map((linkData: IActiveImageLinksData, index: number) => {\n payLoad.contentAction.etext = linkData.linkText;\n const attributes = getTelemetryAttributes(this._telemetryContent, payLoad);\n const linkId = index;\n const editableLink: MsDyn365.ILinksData = {\n ariaLabel: linkData.ariaLabel,\n className: 'msc-active-image__details__cta__link',\n linkText: linkData.linkText,\n linkUrl: linkData.linkUrl.destinationUrl,\n openInNewTab: linkData.willOpenInNewTab,\n role: 'button',\n additionalProperties: attributes\n };\n\n return (\n <MsDyn365.Link\n key={linkId}\n link={editableLink}\n editProps={{\n /**\n * Handle additional paragraph change.\n * @param event - The keyboard event.\n */\n onTextChange: event => {\n this.handleLinkTextChange(index, event);\n },\n requestContext: this.props.context.request\n }}\n />\n );\n });\n };\n\n /**\n * RenderActiveImageDetailsHeading method - To render active image details heading.\n * @returns - React.ReactNode | undefined.\n */\n public renderActiveImageDetailsHeading = (): React.ReactNode | undefined => {\n const { heading } = this.props.config;\n\n return (\n heading && (\n <MsDyn365.Text\n className='msc-active-image__details__title'\n tag={heading.tag ?? 'h1'}\n text={heading.text}\n editProps={{ onEdit: this.handleTextChange, requestContext: this.props.context.request }}\n />\n )\n );\n };\n\n /**\n * RenderActiveImageDetailsParagraph method - To render active image details paragraph.\n * @returns - React.ReactNode | undefined.\n */\n public renderActiveImageDetailsParagraph = (): React.ReactNode | undefined => {\n const { paragraph } = this.props.config;\n\n return (\n paragraph && (\n <MsDyn365.RichTextComponent\n text={paragraph}\n className='msc-active-image__details__text'\n editProps={{ onEdit: this.handleParagraphChange, requestContext: this.props.context.request }}\n />\n )\n );\n };\n\n /**\n * GetActiveImageId - To get active image id from src.\n * @returns - String.\n */\n public getActiveImageId = (): string => {\n const { activeImage } = this.props.config;\n let activeImageId: string = '';\n if (activeImage?.src) {\n const activeImageSource = activeImage.src.split('/');\n const decrementOne: number = 1;\n const activeImageIdPart = activeImageSource[activeImageSource.length - decrementOne].split('?');\n activeImageId = activeImageIdPart[0] ?? '';\n }\n return activeImageId;\n };\n\n /**\n * Handle outside click method - To handle outside click of the active image product.\n * @param event - Mouse event.\n */\n private readonly _handleOutsideClick = (event: MouseEvent) => {\n if (this._productCardDivRef.current?.contains(event.target as Node)) {\n return;\n }\n this.resetState();\n };\n}\nexport default ActiveImage;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IActiveImageAdditionalContentViewProps } from '../active-image-utilities';\nimport { IActiveImageViewProps } from './active-image';\n\n/**\n * Render Additional Content.\n * @param additionalContent - Additional content view props.\n * @returns JSX Element.\n */\nconst renderAdditionalContent = (additionalContent: IActiveImageAdditionalContentViewProps) => {\n return (\n <Node {...additionalContent.additionalContentNode}>\n {additionalContent.heading}\n <Node {...additionalContent.additionalContentContainer}>\n {additionalContent.text}\n <Node {...additionalContent.additionalContentItemLinks}>{additionalContent.links}</Node>\n </Node>\n </Node>\n );\n};\n\n/**\n * Render View.\n * @param props - The view props.\n * @returns -The JSX Element.\n */\nexport const activeImageView: React.FC<IActiveImageViewProps> = props => {\n return (\n <Module {...props.activePointContainer}>\n <Node {...props.activePointDetailsContainer}>\n {props.imageMapper}\n <Node {...props.detailsContainer} className={props.detailsContainer ? props.detailsContainer.className : ''}>\n {props.title}\n {props.text}\n {props.additionalContent && renderAdditionalContent(props.additionalContent)}\n <Node {...props.detailsContainerCta} className={props.detailsContainerCta ? props.detailsContainerCta.className : ''}>\n {props.links}\n </Node>\n </Node>\n </Node>\n <Node\n className='msc-active-image-product-card-container'\n style={{ top: `${props.productCardtopPosition}px`, left: `${props.productCardleftPosition}px` }}\n >\n {props.overlay}\n {props.productCard}\n </Node>\n </Module>\n );\n};\n\nexport default activeImageView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IProductDimensionsWithAvailabilitiesFull } from '@msdyn365-commerce/commerce-entities';\nimport { ProductDimensionsMatrix } from '@msdyn365-commerce/components';\nimport { RichTextComponent } from '@msdyn365-commerce/core';\nimport { ICoreContext, getCatalogId } from '@msdyn365-commerce/core-internal';\nimport { ArrayExtensions, IDimensionsApp, validateCatalogId } from '@msdyn365-commerce-modules/retail-actions';\nimport { Alert, Button, Collapse, IModuleProps, isMobile, VariantType } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { FeatureState } from '@msdyn365-commerce/retail-proxy';\nimport { IBulkPurchaseData } from './bulk-purchase.data';\nimport { IBulkPurchaseProps } from './bulk-purchase.props.autogenerated';\n\n/**\n * Additional optional props for the bulk purchase.\n */\nexport interface IBulkPurchaseExtendedProps extends IBulkPurchaseProps<IBulkPurchaseData> {\n productDimensions?: IProductDimensionsWithAvailabilitiesFull[];\n}\n\n/**\n * View for the bulk purchase module.\n */\nexport interface IBulkPurchaseViewProps extends IBulkPurchaseProps<IBulkPurchaseData> {\n container: IModuleProps;\n content: React.ReactElement;\n}\n\n/**\n * BulkPurchase state message Interface.\n */\nexport interface IBulkPurchaseStateMessage {\n isOpen: boolean;\n messageGlyph: string;\n messageText: string;\n statusCssString: string;\n}\n\n/**\n * View for the bulk purchase module.\n */\nexport interface IBulkPurchaseState {\n isExpanded: boolean;\n stateMessage?: IBulkPurchaseStateMessage;\n}\n\n/**\n * Bulk-purchase module.\n */\nexport class BulkPurchase extends React.PureComponent<IBulkPurchaseExtendedProps, IBulkPurchaseState> {\n public static readonly className = 'ms-bulk-purchase';\n private readonly _errorCssClass: string = 'danger';\n private readonly _errorCssGlyphClass: string = 'fas fa-exclamation-triangle';\n private readonly collapseRef: React.RefObject<Collapse> = React.createRef<Collapse>();\n\n public constructor(props: IBulkPurchaseExtendedProps) {\n super(props);\n\n this.state = {\n isExpanded: false\n };\n }\n\n public render(): React.ReactElement | null {\n const hasDimensionsInProps = ArrayExtensions.hasElements(this.props.productDimensions);\n const hasDimensionsInData = ArrayExtensions.hasElements(this.props.data.productDimensions?.result);\n if (!hasDimensionsInProps && !hasDimensionsInData) {\n return null;\n }\n\n const viewProps: IBulkPurchaseViewProps = {\n ...this.props,\n container: {\n moduleProps: this.props,\n className: classnames(BulkPurchase.className, this.props.config.className)\n },\n content: this._renderCollapseContent(`${BulkPurchase.className}__content`)\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n private _renderCollapseContent(className: string): React.ReactElement {\n return (\n <div className={className}>\n {this._renderCollapseButton(`${className}__collapse-button`)}\n {this._renderCollapse(`${className}__collapse`)}\n </div>\n );\n }\n\n private _renderCollapseButton(className: string): React.ReactElement {\n return (\n <Button\n className={className}\n onClick={this._toggleCollapse}\n aria-expanded={this.state.isExpanded}\n title={this.props.resources.bulkPurchaseHeaderTitle}\n >\n {this.props.resources.bulkPurchaseHeaderTitle}\n </Button>\n );\n }\n\n /**\n *This function is being used to handel variant change dropdown.\n */\n private _dimensionDropDownChange = () => {\n this.collapseRef.current?.reEvaluateHeight();\n };\n\n private _renderCollapse(className: string): React.ReactElement {\n return (\n <Collapse className={className} isOpen={this.state.isExpanded} ref={this.collapseRef}>\n {this._renderMainContent(`${className}__main-content`)}\n </Collapse>\n );\n }\n\n private _renderMainContent(className: string): React.ReactElement {\n const isMobileDevice = isMobile({ variant: VariantType.Viewport, context: this.props.context.request }) === 'xs';\n\n const userMessageNode = this.state.stateMessage ? (\n <Alert color={this.state.stateMessage.statusCssString} isOpen={this.state.stateMessage.isOpen}>\n <span className={this.state.stateMessage.messageGlyph} />\n <span>{this.state.stateMessage.messageText}</span>\n </Alert>\n ) : (\n undefined\n );\n\n return (\n <div className={className}>\n {!isMobileDevice && (\n <div className={`${className}__description`}>\n <RichTextComponent text={this.props.resources.bulkPurchaseDescriptionText} />\n </div>\n )}\n {userMessageNode}\n {this._renderMatrix(`${className}__matrix-container`)}\n </div>\n );\n }\n\n private _renderMatrix(className: string): React.ReactElement {\n const hasDimensionsInProps = ArrayExtensions.hasElements(this.props.productDimensions);\n const channelMultipleCatalogsFeature = 'Dynamics.AX.Application.ChannelMultipleCatalogsFeature';\n const { featureState } = this.props.data;\n const isMultipleCatalogsFeatureEnabled =\n featureState?.result?.find((item: FeatureState) => item.Name === channelMultipleCatalogsFeature)?.IsEnabled || false;\n const catalogId = getCatalogId(this.props.context.request);\n validateCatalogId(catalogId);\n return (\n <ProductDimensionsMatrix\n className={className}\n context={this.props.context as ICoreContext<IDimensionsApp>}\n data={{\n dimensions: hasDimensionsInProps ? this.props.productDimensions! : this.props.data.productDimensions!.result!,\n orderTemplates: this.props.data.orderTemplates?.result,\n customerInformation: this.props.data.customerInformation?.result\n }}\n resources={this.props.resources}\n dimensionOnChange={this._dimensionDropDownChange}\n onErrorMessage={this._onErrorMessage}\n isMultipleCatalogFeatureEnabledInHq={isMultipleCatalogsFeatureEnabled}\n catalogId={catalogId}\n />\n );\n }\n\n private _onErrorMessage = (errorMessage: string) => {\n this.setState({\n stateMessage: {\n messageText: errorMessage,\n statusCssString: this._errorCssClass,\n messageGlyph: this._errorCssGlyphClass,\n isOpen: true\n }\n });\n };\n\n /**\n * Callback which toggles collapse mode.\n */\n private readonly _toggleCollapse = () => {\n this.setState(state => ({\n isExpanded: !state.isExpanded\n }));\n };\n}\n\nexport default BulkPurchase;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Module } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IBulkPurchaseViewProps } from './bulk-purchase';\n\n/**\n * Bulk purchase view.\n * @param props - Bulk purchase view props.\n * @returns React node with a module.\n */\nexport const BulkPurchaseViewComponent: React.FC<IBulkPurchaseViewProps> = props => {\n return <Module {...props.container}>{props.content}</Module>;\n};\n\nexport default BulkPurchaseViewComponent;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ICoreContext } from '@msdyn365-commerce/core';\nimport { ICartActionResult, ICartState } from '@msdyn365-commerce/global-state';\nimport {\n AsyncResult,\n CartLine,\n CartLineValidationResults,\n CartLineValidationResultsByLineId,\n CartsDataActions,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy';\n\nimport { ITelemetry } from '@msdyn365-commerce/telemetry-internal';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\n\n/**\n * Validate the cart.\n * @param isQuantityLimitsFeatureEnabled -- Is the quantity limits feature enabled.\n * @param cart -- The cart state to validate.\n * @param telemetry -- The telemetry.\n * @param propsContext -- The props context.\n * @param shouldRetry -- Should retry.\n * @returns A list of line data validation failures.\n */\nexport async function validateCartAsync(\n cart: AsyncResult<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 {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n IAny,\n ICommerceApiSettings,\n ICreateActionContext,\n IGeneric\n} from '@msdyn365-commerce/core';\nimport { getCartState } from '@msdyn365-commerce/global-state';\nimport { ProductDeliveryOptions, ProductsDataActions } from '@msdyn365-commerce/retail-proxy';\nimport {\n ArrayExtensions,\n ActiveCartProductsInput,\n QueryResultSettingsProxy,\n buildCacheKey,\n getActiveCartProductsAction\n} from '@msdyn365-commerce-modules/retail-actions';\n\n/**\n * Input class for pickup delivery options for items in cart.\n */\nexport class ProductPickUpOptionsForCartLineItems implements IActionInput {\n public readonly apiSettings: ICommerceApiSettings;\n\n public constructor(apiSettings: ICommerceApiSettings) {\n this.apiSettings = apiSettings;\n }\n\n /**\n * Get Cache Key.\n * @returns - Cache key string.\n */\n public getCacheKey = (): string => buildCacheKey('ActiveCartLineItemsPickUpOptions', this.apiSettings);\n\n /**\n * Get Cachetype Name.\n * @returns - Cache name string.\n */\n public getCacheObjectType = (): string => 'ActiveCartLineItemsPickUpOptions';\n\n /**\n * Get Cachetype.\n * @returns - CacheType enum.\n */\n public dataCacheType = (): CacheType => 'none';\n}\n\n/**\n * CreateInput method for the GetPickUpOptionCartLineItems method.\n * @param inputData - The input data passed to the createInput method.\n * @returns - Input for data action.\n */\nconst createInput = (inputData: ICreateActionContext<IGeneric<IAny>>) => {\n return new ProductPickUpOptionsForCartLineItems(inputData.requestContext.apiSettings);\n};\n\n/**\n * The action method for the GetPickUpOptionCartLineItems data action.\n * @param input - The action input.\n * @param context - The action context.\n * @returns - Order Template object.\n */\nexport async function getPickUpOptionsForCartLineItems(\n input: ProductPickUpOptionsForCartLineItems,\n context: IActionContext\n): Promise<ProductDeliveryOptions[]> {\n // If no input is provided fail out\n if (!input.apiSettings.channelId) {\n throw new Error('[getPickUpOptionsForCartLineItems]No valid Input was provided, failing');\n }\n const cartState = await getCartState(context);\n const cart = cartState.cart;\n const products = await getActiveCartProductsAction(new ActiveCartProductsInput(), context);\n const filterOption = 4;\n const response: ProductDeliveryOptions[] = [];\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- existing code.\n if (cart === undefined || !ArrayExtensions.hasElements(products)) {\n return Promise.resolve(response);\n }\n\n const pickupoptions = await ProductsDataActions.getDeliveryOptionsAsync(\n {\n callerContext: context,\n queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(context)\n },\n products.map(product => product.RecordId),\n {},\n filterOption\n );\n\n return pickupoptions;\n}\n\n/**\n * The GetPickupOptionCartLineItems Data Action\n * Returns pickup options.\n */\nexport const getPickUpOptionsForCartLineItemsDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/get-pickup-options-for-cartlines',\n action: getPickUpOptionsForCartLineItems as IAction<ProductDeliveryOptions[]>,\n input: createInput\n});\n\nexport default getPickUpOptionsForCartLineItemsDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n CartLine,\n ChannelDeliveryOptionConfiguration,\n DeliveryOption,\n OrgUnitLocation,\n ProductDeliveryOptions,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy';\nimport { IStoreSelectorStateManager } from '@msdyn365-commerce-modules/bopis-utilities';\nimport { INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface IPickUpInStoreViewProps {\n callbacks: {\n toggleBopis(isBopisSelected: boolean): void;\n };\n defaultComponent?: React.ReactNode;\n orgUnitName?: string;\n isBopisSelected: boolean;\n ContainerProps: INodeProps;\n deliveryOption?: string;\n}\n\nexport interface IPickUpInStoreProps {\n cartline: CartLine;\n product: SimpleProduct;\n shipitText: string;\n pickUpInStoreText: string;\n changeStoreText: string;\n cartState: ICartState | undefined;\n storeSelectorStateManager: IStoreSelectorStateManager | undefined;\n orgUnitLocations?: OrgUnitLocation[] | undefined;\n deliveryOptions?: ProductDeliveryOptions;\n pickupDeliveryModeCode?: string;\n storeSelectorModuleId?: string;\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n retailMulitplePickupFeatureState?: boolean;\n locationChangedHandler(): void;\n}\n\nexport const PickUpInStore = (props: IPickUpInStoreProps): IPickUpInStoreViewProps | undefined => {\n const _onLocationChangedCallback = async (\n orgUnitLocation: OrgUnitLocation,\n cartState: ICartState | undefined,\n cartline: CartLine,\n deliveryMode?: string\n ) => {\n if (!cartState) {\n return Promise.resolve();\n }\n return cartState\n .updateCartLinePickupLocation({ cartLineId: cartline.LineId!, location: orgUnitLocation, deliveryMode })\n .then(result => {\n if (result.status === 'SUCCESS') {\n props.locationChangedHandler();\n }\n })\n .catch(error => {});\n };\n\n const _toggleBOPIS = (isBopisSelected: boolean) => {\n const { storeSelectorStateManager, product, cartline, cartState, storeSelectorModuleId } = props;\n\n if (isBopisSelected) {\n if (!storeSelectorStateManager) {\n return;\n }\n storeSelectorStateManager\n .openDialog({\n id: storeSelectorModuleId,\n product,\n alreadySelectedLocation: {\n OrgUnitNumber: cartline.FulfillmentStoreId\n },\n deliveryOptions: props.deliveryOptions,\n onLocationSelected: async (orgUnitLocation, deliveryMode: string | undefined) => {\n return _onLocationChangedCallback(orgUnitLocation, cartState, cartline, deliveryMode);\n }\n })\n .catch(error => {});\n } else {\n if (!cartState) {\n return;\n }\n cartline.DeliveryMode = '';\n cartline.FulfillmentStoreId = '';\n cartline.ShippingAddress = {};\n cartState\n .clearCartLinePickupLocation({ cartLineId: cartline.LineId! })\n .then(result => {\n if (result.status === 'SUCCESS') {\n props.locationChangedHandler();\n }\n })\n .catch(error => {});\n }\n };\n\n const _getOrgUnitName = (fulfillmentStoreId: string | undefined, orgUnitLocations: OrgUnitLocation[] | undefined) => {\n if (!orgUnitLocations || !fulfillmentStoreId || orgUnitLocations.length === 0) {\n return '';\n }\n\n const foundLocation = orgUnitLocations.find(orgUnitLocation => {\n return orgUnitLocation.OrgUnitNumber === fulfillmentStoreId;\n });\n\n if (foundLocation) {\n return foundLocation.OrgUnitName;\n }\n return fulfillmentStoreId;\n };\n\n const _renderShippingMethod = (\n cartLine: CartLine,\n shipItText: string,\n pickupInStoretext: string,\n changeStoreText: string,\n orgUnitLocations: OrgUnitLocation[] | undefined\n ): JSX.Element => {\n const orgUnitName = _getOrgUnitName(cartLine.FulfillmentStoreId, orgUnitLocations);\n const bopisSelected = !!cartLine.FulfillmentStoreId;\n\n const toggleBOPIS = (isBopisSelected: boolean) => {\n return () => {\n _toggleBOPIS(isBopisSelected);\n };\n };\n\n return (\n <>\n <label className='msc-cart-line__bopis-shipping'>\n <input\n id={`ms-cart-bopis-ship-option-${cartLine.LineId}`}\n type='radio'\n name={`shippingType ${cartLine.LineId}`}\n onChange={toggleBOPIS(false)}\n value={shipItText}\n checked={!bopisSelected}\n aria-checked={!bopisSelected}\n key={`${cartLine.LineId}-shipit`}\n />\n {shipItText}\n </label>\n <label className='msc-cart-line__bopis-store-pickup'>\n <input\n id={`ms-cart-bopis-pickup-option-${cartLine.LineId}`}\n type='radio'\n name={`shippingType ${cartLine.LineId}`}\n onChange={toggleBOPIS(true)}\n value={pickupInStoretext}\n checked={bopisSelected}\n aria-checked={bopisSelected}\n key={`${cartLine.LineId}-pickup`}\n />\n {pickupInStoretext}\n </label>\n {cartLine.FulfillmentStoreId ? (\n <div className='msc-cart-line__bopis__fullfilment'>\n <span className='msc-cart-line__bopis__fullfilment-store'>{orgUnitName}</span>\n <button className='msc-cart-line__bopis-changestore btn' onClick={toggleBOPIS(true)}>\n {changeStoreText}\n </button>\n </div>\n ) : null}\n </>\n );\n };\n\n const _getDeliveryOption = (pickupStore: IPickUpInStoreProps, deliveryOptions: ProductDeliveryOptions) => {\n const delivery = deliveryOptions?.DeliveryOptions?.find(option => option.Code === pickupStore.pickupDeliveryModeCode);\n return delivery?.Description;\n };\n\n /**\n * Method to check if we have atleast one common delivery code between product and channel.\n * @param productdeliveryOptions - Product DeliveryOption List.\n * @param storePickUpOptionList - Channel DeliveryOption List.\n * @returns Boolean flag.\n */\n const matchDeliveryOptions = (\n productdeliveryOptions: DeliveryOption[] | undefined,\n storePickUpOptionList: string[] | undefined\n ): boolean => {\n const deliveryOption: string[] = [];\n productdeliveryOptions?.map(delivery => {\n const pickup = storePickUpOptionList?.find(deliveryCode => deliveryCode === delivery.Code);\n if (pickup) {\n deliveryOption.push(pickup);\n }\n return deliveryOption;\n });\n\n return ArrayExtensions.hasElements(deliveryOption);\n };\n\n // If no delivery options present on the product, or none of the delivery options\n // match the PickupDeliveryModeCode, that means the item cannot be used for BOPIS\n if (!props.deliveryOptions || !props.deliveryOptions.DeliveryOptions) {\n return undefined;\n }\n\n if (props.retailMulitplePickupFeatureState && props.channelDeliveryOptionConfig) {\n if (!matchDeliveryOptions(props.deliveryOptions.DeliveryOptions, props.channelDeliveryOptionConfig?.PickupDeliveryModeCodes)) {\n return undefined;\n }\n } else if (\n !props.pickupDeliveryModeCode ||\n !props.deliveryOptions.DeliveryOptions.find(option => option.Code === props.pickupDeliveryModeCode)\n ) {\n return undefined;\n }\n\n return {\n callbacks: {\n toggleBopis: _toggleBOPIS\n },\n defaultComponent: _renderShippingMethod(\n props.cartline,\n props.shipitText,\n props.pickUpInStoreText,\n props.changeStoreText,\n props.orgUnitLocations\n ),\n orgUnitName: _getOrgUnitName(props.cartline.FulfillmentStoreId, props.orgUnitLocations),\n isBopisSelected: !!props.cartline.FulfillmentStoreId,\n deliveryOption: _getDeliveryOption(props, props.deliveryOptions),\n ContainerProps: {\n className: 'msc-cart-line__bopis-container'\n }\n };\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n AddToOrderTemplateComponent,\n AddToWishlistComponent,\n CartLineItemComponent,\n IAddToOrderTemplateDialogResources,\n ICartlineResourceString,\n IDuplicateItemsWhenAddingToOrderTemplateDialogResources,\n IItemAddedToOrderTemplateDialogResources,\n IOrderTemplateNameDialogResources,\n IWishlistActionSuccessResult\n} from '@msdyn365-commerce/components';\nimport MsDyn365, {\n IAny,\n ICoreContext,\n IGeneric,\n IGridSettings,\n IImageSettings,\n ITelemetry,\n TelemetryEvent,\n isChannelTypeB2B\n} from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport {\n AsyncResult,\n CartLine,\n CartLineValidationResultsByLineId,\n ChannelDeliveryOptionConfiguration,\n CommerceList,\n Customer,\n OrgUnitLocation,\n ProductDeliveryOptions,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy';\nimport { ProductCatalog, ProductDimensionType, ReleasedProductType } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { IStoreSelectorStateManager } from '@msdyn365-commerce-modules/bopis-utilities';\nimport {\n ArrayExtensions,\n getInvoiceDetailsPageUrlSync,\n getProductUrlSync,\n IProductInventoryInformation,\n isCartLineItemPickUpType,\n ObjectExtensions,\n OrderTemplate,\n StringExtensions\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, getPayloadObject, getTelemetryAttributes, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { getProductByProductId, getProductByProductIdAndWarehouse } from '../../../Common/get-product';\nimport { IPickUpInStoreViewProps, PickUpInStore } from './cart-pick-up-in-store';\n\nexport interface ICartLineItemsProps {\n cartlines: CartLine[];\n cartlinesErrors: CartLineValidationResultsByLineId;\n cartState: ICartState | undefined;\n orgUnitLocations: OrgUnitLocation[] | undefined;\n resources: ICartlineResourceString;\n productAvailabilites: IProductInventoryInformation[] | undefined;\n products: SimpleProduct[] | undefined;\n productDeliveryOptions: ProductDeliveryOptions[] | undefined;\n pickupDeliveryModeCode?: string;\n catalogs?: ProductCatalog[];\n retailMulitplePickupFeatureState?: boolean;\n\n /* GridSettings for the product image in cartline */\n gridSettings: IGridSettings;\n\n /* ImageSettings for the product image in cartline */\n imageSettings: IImageSettings;\n id: string;\n typeName: string;\n context: ICoreContext<IGeneric<IAny>>;\n telemetry: ITelemetry;\n removeButtonText: string;\n addToWishlistButtonText: string;\n removeFromWishlistButtonText: string;\n shipItText: string;\n pickitUpText: string;\n changeStoreText: string;\n outOfStockText: string;\n outOfRangeOneText: string;\n outOfRangeFormatText: string;\n storeSelectorStateManager: IStoreSelectorStateManager | undefined;\n isStockCheckEnabled: boolean;\n wishlists: CommerceList[] | undefined;\n defaultWishlistName: string;\n maxCartlineQuantity: number;\n includeErrors?: boolean;\n showShippingChargesForLineItems?: boolean;\n telemetryContent?: ITelemetryContent;\n isQuantityLimitsFeatureEnabled: boolean;\n hasInvoiceLine?: boolean;\n storeSelectorModuleId?: string;\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n\n addToOrderTemplateDialogResources: IAddToOrderTemplateDialogResources;\n createOrderTemplateDialogResources: IOrderTemplateNameDialogResources;\n itemAddedToOrderTemplateDialogResources: IItemAddedToOrderTemplateDialogResources;\n duplicateItemsWhenAddingToOrderTemplateDialogResources: IDuplicateItemsWhenAddingToOrderTemplateDialogResources;\n\n addToOrderTemplateButtonText: string;\n addToOrderTemplateButtonTooltip: string;\n addToOrderTemplateMessage: string;\n addItemToOrderTemplateError: string;\n orderTemplates: OrderTemplate[] | undefined;\n customerInformation: Customer | undefined;\n shouldIgnoreWarehouse: boolean | undefined;\n productAvailability?: AsyncResult<IProductInventoryInformation[]>;\n productPickUpOptions?: ProductDeliveryOptions[] | undefined;\n isMultipleCatalogFeatureEnabledInHq: boolean;\n catalogId?: number;\n\n removeItemClickHandler(cartlineToRemove: CartLine): void;\n moveToWishlistSuccessHandler(result: IWishlistActionSuccessResult, cartlineId: CartLine): void;\n updateCartLinesQuantitySuccessHandler(cartline: CartLine, quantity: number, lineIndex?: number): boolean;\n locationChangedHandler(): void;\n}\n\nexport interface ICartlinesViewProps {\n cartline: React.ReactNode;\n pickUpInStore?: IPickUpInStoreViewProps;\n remove: React.ReactNode;\n addToWishlist: React.ReactNode | undefined;\n addToOrderTemplate: React.ReactNode | undefined;\n\n error?: string;\n cartlineId?: string;\n hasError?: boolean;\n data?: {\n product?: SimpleProduct;\n cartline: CartLine;\n };\n}\n\nconst _getCartItemAvailableQuantity = (\n isStockCheckEnabled: boolean,\n productAvailability: IProductInventoryInformation | undefined\n): number => {\n if (\n !isStockCheckEnabled ||\n !productAvailability ||\n !productAvailability.ProductAvailableQuantity ||\n !productAvailability.IsProductAvailable ||\n !productAvailability.ProductAvailableQuantity.AvailableQuantity\n ) {\n return 0;\n }\n\n return productAvailability.ProductAvailableQuantity.AvailableQuantity;\n};\n\nconst _getCartItemMaxQuantity = (\n maxQuantityByConfig: number,\n isStockCheckEnabled: boolean,\n availableQuantityInStock: number,\n isQuantityLimitsFeatureEnabled: boolean,\n maxByQuantityLimitsFeature: number\n) => {\n if (isQuantityLimitsFeatureEnabled) {\n let maxByQuantityLimitsFeatureResult = maxByQuantityLimitsFeature;\n\n // If max by feature in not defined when feature is on then we suggest that there no max by feature\n // and consider available qty if stock check enabled and max from config in site settings.\n if (!maxByQuantityLimitsFeature) {\n maxByQuantityLimitsFeatureResult = maxQuantityByConfig || 10;\n }\n\n return isStockCheckEnabled\n ? maxByQuantityLimitsFeatureResult < availableQuantityInStock\n ? maxByQuantityLimitsFeatureResult\n : availableQuantityInStock\n : maxByQuantityLimitsFeatureResult;\n }\n if (isStockCheckEnabled) {\n return availableQuantityInStock < maxQuantityByConfig ? availableQuantityInStock : maxQuantityByConfig;\n }\n return maxQuantityByConfig;\n};\n\nconst _getErrorMessage = (\n availableQuantityInStock: number,\n currentQuantity: number,\n props: ICartLineItemsProps,\n shouldSkipStockCheck: boolean,\n cartLine: CartLine,\n lineId: string | undefined,\n foundProductAvailability?: IProductInventoryInformation\n): string | undefined => {\n const finalErrorMessages: string[] = [];\n\n const isLoadingDeliveryOptions = props.productAvailability?.status === 'LOADING';\n if (isLoadingDeliveryOptions) {\n return undefined;\n }\n // check availability passed as prop for each cartline\n if (props.productAvailabilites && ArrayExtensions.hasElements(props.productAvailabilites)) {\n if (foundProductAvailability === undefined) {\n finalErrorMessages.push(props.outOfStockText);\n return finalErrorMessages.toString();\n }\n }\n if (props.includeErrors && props.isStockCheckEnabled && !shouldSkipStockCheck) {\n if (availableQuantityInStock <= 0) {\n finalErrorMessages.push(props.outOfStockText);\n } else if (availableQuantityInStock < currentQuantity) {\n if (availableQuantityInStock === 1) {\n finalErrorMessages.push(props.outOfRangeOneText);\n } else {\n finalErrorMessages.push(props.outOfRangeFormatText.replace('{numLeft}', availableQuantityInStock.toString()));\n }\n }\n }\n\n // Server-side validation\n const checkForErrors = props.cartlinesErrors.ValidationResultsPairs;\n const errorsFoundByLineId = checkForErrors?.filter(index => index.LineId === lineId);\n if (errorsFoundByLineId !== undefined) {\n for (const i of errorsFoundByLineId) {\n if (ArrayExtensions.hasElements(i.ValidationFailures)) {\n i.ValidationFailures.forEach(validation => {\n if (validation.ErrorContext !== undefined) {\n finalErrorMessages.push(validation.ErrorContext);\n }\n });\n }\n }\n }\n\n if (ArrayExtensions.hasElements(finalErrorMessages)) {\n return finalErrorMessages.join(' ');\n }\n\n return undefined;\n};\n\n/**\n * On Remove Click functionality.\n * @param removeItemClickHandler -Remove item click function.\n * @param cartline -CartLine.\n * @returns Remove change value.\n */\nconst onRemoveClickFunction = (removeItemClickHandler: (cartlineToRemove: CartLine) => void, cartline: CartLine) => () => {\n removeItemClickHandler(cartline);\n};\n\n// eslint-disable-next-line complexity -- Auto-suppressed.\nconst _assembleNode = (\n cartline: CartLine,\n product: SimpleProduct | undefined,\n props: ICartLineItemsProps,\n index: number,\n foundProductAvailability?: IProductInventoryInformation,\n productPickUpOptions?: ProductDeliveryOptions\n): ICartlinesViewProps => {\n const {\n imageSettings,\n gridSettings,\n id,\n typeName,\n context,\n resources,\n removeButtonText,\n removeItemClickHandler,\n moveToWishlistSuccessHandler,\n addToOrderTemplateButtonText,\n addToOrderTemplateButtonTooltip,\n addToOrderTemplateDialogResources,\n createOrderTemplateDialogResources,\n itemAddedToOrderTemplateDialogResources,\n duplicateItemsWhenAddingToOrderTemplateDialogResources,\n addToWishlistButtonText,\n removeFromWishlistButtonText,\n orderTemplates,\n customerInformation,\n wishlists,\n defaultWishlistName,\n storeSelectorModuleId,\n isMultipleCatalogFeatureEnabledInHq\n } = props;\n\n const isAuthenticated = context.request.user.isAuthenticated;\n const nameOfWishlist = wishlists && wishlists.length > 0 && wishlists[0].Name ? wishlists[0].Name : defaultWishlistName;\n const availableQuantityInStock = _getCartItemAvailableQuantity(props.isStockCheckEnabled, foundProductAvailability);\n\n const maxQuantity =\n product &&\n _getCartItemMaxQuantity(\n props.maxCartlineQuantity,\n props.isStockCheckEnabled,\n availableQuantityInStock,\n props.isQuantityLimitsFeatureEnabled,\n product?.Behavior?.MaximumQuantity || 0\n );\n\n // Skip stock check if the cart line is a service item or an invoice line\n const shouldSkipStockCheck = product?.ItemTypeValue === ReleasedProductType.Service || !!cartline.IsInvoiceLine;\n\n const errorMessage = ObjectExtensions.isNullOrUndefined(maxQuantity)\n ? undefined\n : _getErrorMessage(\n availableQuantityInStock,\n cartline.Quantity!,\n props,\n shouldSkipStockCheck,\n cartline,\n cartline.LineId,\n foundProductAvailability\n );\n\n const onRemoveClickHandler = onRemoveClickFunction(removeItemClickHandler, cartline);\n\n const payload = getPayloadObject(TelemetryEvent.RemoveFromCart, props.telemetryContent!, removeButtonText, '');\n const attributes = getTelemetryAttributes(props.telemetryContent!, payload);\n\n const inventoryLbl = foundProductAvailability?.StockLevelLabel;\n const inventoryCode = foundProductAvailability\n ? `ms-cart-line__inventory-code-${foundProductAvailability.StockLevelCode?.toLowerCase()}`\n : undefined;\n const productDimension = 4;\n const customPriceDimensionType = productDimension as ProductDimensionType.Style;\n const isCustomPriceSelected =\n product?.Dimensions?.find(dimension => dimension.DimensionTypeValue === customPriceDimensionType)?.DimensionValue?.Value ===\n 'Custom';\n\n let productUrl: string | undefined;\n if (product) {\n productUrl = getProductUrlSync(product, props.context.actionContext, undefined);\n\n if (MsDyn365.isBrowser && isChannelTypeB2B(props.context.actionContext.requestContext)) {\n const fullUrl = new URL(productUrl, window.location.href);\n fullUrl.searchParams.set('catalogid', `${cartline.CatalogId ?? 0}`);\n productUrl = fullUrl.href;\n }\n } else {\n productUrl = getInvoiceDetailsPageUrlSync(cartline.Description || '', props.context.actionContext);\n }\n\n return {\n data: {\n product,\n cartline\n },\n cartlineId: cartline.LineId,\n error: errorMessage,\n hasError:\n (!shouldSkipStockCheck && props.isStockCheckEnabled ? cartline.Quantity! > (maxQuantity ?? 0) : false) ||\n (!ObjectExtensions.isNullOrUndefined(errorMessage) && !StringExtensions.isNullOrEmpty(errorMessage)),\n cartline: (\n <CartLineItemComponent\n data={{\n cartLine: cartline,\n cartState: props.cartState,\n product,\n catalogs: props.catalogs\n }}\n currentQuantity={cartline.Quantity}\n maxQuantity={maxQuantity}\n isOutOfStock={!shouldSkipStockCheck && 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 lineIndex={index}\n isQuantityEditable={!ObjectExtensions.isNullOrUndefined(product)}\n quantityOnChange={props.updateCartLinesQuantitySuccessHandler}\n primaryImageUrl={product?.PrimaryImageUrl}\n errorMessage={errorMessage}\n inventoryInformationLabel={inventoryLbl}\n inventoryLabelClassName={inventoryCode}\n isCartStateReady={props.cartState?.status === 'READY'}\n showShippingChargesForLineItems={props.showShippingChargesForLineItems}\n telemetryContent={props.telemetryContent}\n channelDeliveryOptionConfig={props.channelDeliveryOptionConfig}\n priceCurrency={context.request.channel?.Currency}\n />\n ),\n pickUpInStore: product\n ? PickUpInStore({\n storeSelectorModuleId,\n cartState: props.cartState,\n cartline,\n product,\n shipitText: props.shipItText,\n pickUpInStoreText: props.pickitUpText,\n changeStoreText: props.changeStoreText,\n storeSelectorStateManager: props.storeSelectorStateManager,\n orgUnitLocations: props.orgUnitLocations,\n deliveryOptions: productPickUpOptions,\n pickupDeliveryModeCode:\n cartline.DeliveryMode !== (undefined || '') ? cartline.DeliveryMode : props.pickupDeliveryModeCode,\n retailMulitplePickupFeatureState: props.retailMulitplePickupFeatureState,\n channelDeliveryOptionConfig: props.channelDeliveryOptionConfig,\n locationChangedHandler: props.locationChangedHandler\n })\n : undefined,\n remove: (\n <Button className='msc-cart-line__remove-item' onClick={onRemoveClickHandler} title={removeButtonText} {...attributes}>\n {removeButtonText}\n </Button>\n ),\n addToWishlist:\n isAuthenticated && product && !isCustomPriceSelected ? (\n <AddToWishlistComponent\n className='msc-cart-line__add-to-wishlist'\n addToWishlistButtonText={addToWishlistButtonText}\n removeFromWishlistButtonText={removeFromWishlistButtonText}\n context={context}\n id={id}\n key={cartline.LineId}\n typeName={typeName}\n nameOfWishlist={nameOfWishlist}\n cartline={cartline}\n showButtonText\n showStatusMessage={false}\n showRemoveButton={false}\n showButtonTooltip={false}\n ariaRole='button'\n data={{\n wishlists,\n product\n }}\n onSuccess={moveToWishlistSuccessHandler}\n />\n ) : (\n undefined\n ),\n addToOrderTemplate:\n isAuthenticated && orderTemplates && product ? (\n <AddToOrderTemplateComponent\n className={classnames('msc-cart-line__add-to-order-template', isCustomPriceSelected ? 'disabled' : '')}\n addToOrderTemplateButtonText={addToOrderTemplateButtonText}\n addToOrderTemplateButtonTooltip={addToOrderTemplateButtonTooltip}\n addToOrderTemplateDialogResources={addToOrderTemplateDialogResources}\n createOrderTemplateDialogResources={createOrderTemplateDialogResources}\n itemAddedToOrderTemplateDialogResources={itemAddedToOrderTemplateDialogResources}\n duplicateItemsWhenAddingToOrderTemplateDialogResources={duplicateItemsWhenAddingToOrderTemplateDialogResources}\n data={{ product, quantity: cartline.Quantity || 1, orderTemplates, customerInformation }}\n context={context}\n showButtonText\n shouldShowButtonFailedTooltip={isCustomPriceSelected}\n disableButton={isCustomPriceSelected}\n id={id}\n typeName={typeName}\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- App config settings are of \"any\" value\n showButtonTooltip={!props.context.app.config.disableTooltip || false}\n imageSettings={props.imageSettings !== undefined ? props.imageSettings : undefined}\n isMultipleCatalogFeatureEnabledInHq={isMultipleCatalogFeatureEnabledInHq || false}\n catalogId={cartline.CatalogId}\n />\n ) : (\n undefined\n )\n };\n};\n\nexport const assembleCartlines = (\n cartlines: CartLine[],\n products: SimpleProduct[] | undefined,\n props: ICartLineItemsProps\n): ICartlinesViewProps[] | null => {\n const reactNodes: ICartlinesViewProps[] = [];\n\n cartlines.map((cartline, index) => {\n let product;\n if (props.isQuantityLimitsFeatureEnabled) {\n // When feature is enabled the same products could have different quantity limits in Behavior so we need\n // to check productId and WarehouseId for identification.\n product = getProductByProductIdAndWarehouse(cartline.ProductId, products, cartline.WarehouseId, props.cartState);\n } else {\n product = getProductByProductId(cartline.ProductId, products);\n }\n let foundProductAvailability;\n\n // check if cartlineitem is pickup item\n const isPickUpItem = isCartLineItemPickUpType(\n cartline,\n props.retailMulitplePickupFeatureState,\n props.channelDeliveryOptionConfig,\n props.pickupDeliveryModeCode\n );\n if (props.productAvailabilites && ArrayExtensions.hasElements(props.productAvailabilites)) {\n foundProductAvailability = props.productAvailabilites.find(productAvailability => {\n if (!props.shouldIgnoreWarehouse && isPickUpItem) {\n // check warehouse only if siteBuilder setting is not \"Based on aggregate for shipping and pickup warehouses\" and cartlineitem is pickupitem\n return (\n productAvailability.ProductAvailableQuantity?.ProductId === cartline.ProductId &&\n productAvailability.InventLocationId?.toUpperCase() === cartline.WarehouseId?.toUpperCase()\n );\n }\n return productAvailability.ProductAvailableQuantity.ProductId === cartline.ProductId;\n });\n }\n\n let productPickUpOptions;\n if (props.productPickUpOptions !== undefined && ArrayExtensions.hasElements(props.productPickUpOptions)) {\n productPickUpOptions = props.productPickUpOptions.find(deliveryOption => {\n return deliveryOption && deliveryOption.ProductId === cartline.ProductId;\n });\n }\n reactNodes.push(_assembleNode(cartline, product, props, index, foundProductAvailability, productPickUpOptions));\n });\n\n return reactNodes;\n};\n\n/**\n * CartLineItems component.\n * @param props\n */\nexport const CartLineItems = (props: ICartLineItemsProps) => {\n const { products, cartlines } = props;\n return assembleCartlines(cartlines, products, props);\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { CartLine, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport groupBy from 'lodash/groupBy';\n\nimport { assembleCartlines, ICartLineItemsProps, ICartlinesViewProps } from './cart-line-items';\n\nconst _assembleGroupCartlines = (\n cartlines: CartLine[],\n products: SimpleProduct[] | undefined,\n props: ICartLineItemsProps\n): ICartlinesViewProps[][] | null => {\n const reactNodes: ICartlinesViewProps[][] = [];\n if (!products || products.length === 0) {\n props.context.telemetry.error('Products content is empty, module wont render');\n return null;\n }\n\n const getGroupByStorePickup = (items: CartLine[]) => groupBy(items, item => item.FulfillmentStoreId);\n const getGroupByDelivery = (items: CartLine[]) => groupBy(items, item => item.DeliveryMode);\n const groupDelivery = getGroupByDelivery(cartlines);\n const cartLinesGroup: CartLine[] = [];\n\n // 1) Group by store and pick up mode\n Object.entries(groupDelivery).forEach(([deliveryType, groupByDeliveryType]) => {\n // @ts-expect-error\n groupDelivery[deliveryType] = getGroupByStorePickup(groupByDeliveryType);\n cartLinesGroup.push(getGroupByStorePickup(groupByDeliveryType));\n });\n\n // 2) Create cartlines group\n Object.keys(cartLinesGroup).forEach(key => {\n const cartLines = cartLinesGroup[key];\n Object.keys(cartLines).forEach(index => {\n const cartLine = cartLines[index];\n const carLineViewProps = assembleCartlines(cartLine, products, props);\n if (carLineViewProps !== null) {\n reactNodes.push(carLineViewProps);\n }\n });\n });\n\n return reactNodes;\n};\n\nconst _assembleGroupInvoiceCartlines = (\n cartLines: CartLine[],\n products: SimpleProduct[] | undefined,\n props: ICartLineItemsProps\n): ICartlinesViewProps[][] | null => {\n const reactNodes: ICartlinesViewProps[][] = [];\n if (cartLines && cartLines.length > 0) {\n // Create invoice cartLines group\n const carLineViewProps = assembleCartlines(cartLines, products, props);\n if (carLineViewProps !== null) {\n reactNodes.push(carLineViewProps);\n }\n }\n return reactNodes;\n};\n\n/**\n * CartLine Group component.\n * @param props\n */\nexport const CartLineGroupItems = (props: ICartLineItemsProps) => {\n const { products, cartlines, hasInvoiceLine } = props;\n return hasInvoiceLine\n ? _assembleGroupInvoiceCartlines(cartlines, products, props)\n : _assembleGroupCartlines(cartlines, products, props);\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { CartPromotionLine } from '@msdyn365-commerce/retail-proxy';\nimport { getPromotionOptionsForCartLineItems, PromotionOptionsForCartLineItems } from '@msdyn365-commerce-modules/retail-actions';\n\n/**\n * IPromotionData entity interface.\n */\nexport interface IPromotionData {\n promotionOptions?: CartPromotionLine[];\n}\n\n/**\n * Calls the Retail API and returns a promotion data.\n * @param ctx\n */\nexport async function getPromotionData(ctx: IActionContext): Promise<IPromotionData> {\n const promotionData: IPromotionData = {};\n\n await getPromotionOptionsForCartLineItems(new PromotionOptionsForCartLineItems(ctx.requestContext.apiSettings), ctx)\n .then(promotionOptions => {\n if (promotionOptions) {\n promotionData.promotionOptions = promotionOptions;\n }\n })\n .catch(error => {\n ctx.telemetry.exception(error);\n return {};\n });\n\n return promotionData;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n IAddToOrderTemplateDialogResources,\n IDuplicateItemsWhenAddingToOrderTemplateDialogResources,\n IItemAddedToOrderTemplateDialogResources,\n ILinesAddedToOrderTemplateDialogResources,\n IOrderTemplateNameDialogResources,\n IWishlistActionSuccessResult,\n PromoCodeComponent,\n SaveCartToOrderTemplateComponent\n} from '@msdyn365-commerce/components';\nimport MsDyn365, { getCatalogId, getUrlSync, IImageSettings, isChannelTypeB2B } from '@msdyn365-commerce/core';\nimport { ICartActionResult, ICartState } from '@msdyn365-commerce/global-state';\nimport { AsyncResult, CartLine, CartLineValidationResultsByLineId, LineValidationResult } from '@msdyn365-commerce/retail-proxy';\nimport { FeatureState, ProductDeliveryOptions, ReleasedProductType } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { cartLineQuantityUpdatedAsync, validateCartAsync } from '@msdyn365-commerce-modules/cart-utilities';\nimport { IInvoiceSummaryLines, InvoiceSummary } from '@msdyn365-commerce-modules/invoice-payment-summary';\nimport { IOrderSummaryLines, OrderSummary } from '@msdyn365-commerce-modules/order-summary-utilities';\nimport {\n ActiveCartProductsInput,\n ArrayExtensions,\n getActiveCartProductsAction,\n ICartLineInventoryValidationResult,\n ObjectExtensions,\n validateCartLinesInventory,\n ProductPickUpOptionsForCartLineItems,\n validateCatalogId\n} from '@msdyn365-commerce-modules/retail-actions';\nimport {\n Alert,\n Button,\n getPayloadObject,\n getTelemetryAttributes,\n getTelemetryObject,\n INodeProps,\n IPayLoad,\n ITelemetryContent,\n TelemetryConstant,\n Waiting,\n updateMaxQuantityForCartLineItem,\n urlCheck\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { reaction } from 'mobx';\nimport { observer } from 'mobx-react';\nimport React from 'react';\nimport { getPickUpOptionsForCartLineItems } from './actions/get-pickup-options-for-cartlines';\n\nimport { ICartData } from './cart.data';\nimport { ICartProps, ICartResources } from './cart.props.autogenerated';\nimport { CartLineGroupItems } from './components/cart-line-groups';\nimport { CartLineItems, ICartlinesViewProps } from './components/cart-line-items';\nimport { cartPromotions, ICartLineItemViewProps } from './components/cart-line-items-promotion';\nimport { getPromotionData, IPromotionData } from './utils/get-promotion-in-cart';\n\n/**\n * Cart view props interface.\n */\nexport interface ICartViewProps extends ICartProps<ICartData> {\n className: string;\n title?: React.ReactNode;\n CartlinesWrapper: INodeProps;\n cartlines?: ICartlinesViewProps[];\n cartLinesGroup?: ICartlinesViewProps[][];\n cart: ICartState | undefined;\n orderSummaryHeading: React.ReactNode;\n orderSummaryLineitems?: IOrderSummaryLines;\n invoiceSummaryLineitems?: IInvoiceSummaryLines;\n OrderSummaryWrapper: INodeProps;\n OrderSummaryItems: INodeProps;\n OrderSummaryErrors?: IOrderSummaryErrors;\n checkoutAsGuestButton: React.ReactNode;\n checkoutAsSignInUserButton: React.ReactNode;\n storeSelector?: React.ReactNode;\n expressCheckoutButton?: React.ReactNode[];\n ExpressCheckoutSectionWrapper: INodeProps;\n backToShoppingButton: React.ReactNode;\n waitingComponent: React.ReactNode;\n promotionOptions?: ICartLineItemViewProps;\n promoCode: React.ReactNode;\n cartLoadingStatus: string;\n cartDataResult: boolean;\n multiplePickUpEnabled?: boolean;\n createTemplateFromCartButton: React.ReactNode;\n telemetryContent?: ITelemetryContent;\n checkoutBlockedDueToUnavailableFunds?: React.ReactNode;\n removeItemClickHandler(cartlineToRemove: CartLine): void;\n moveToWishlistSuccessHandler(result: IWishlistActionSuccessResult, cartlineId: CartLine): void;\n}\n\n/**\n * Order summary errors interface.\n */\nexport interface IOrderSummaryErrors {\n Wrapper: INodeProps;\n header: React.ReactNode;\n errors: React.ReactNode[];\n}\n\n/**\n * Cart component state interface.\n */\ninterface ICartComponentState {\n showPromotionDialog: boolean;\n cartlinesErrors: CartLineValidationResultsByLineId;\n promotionData: IPromotionData;\n isCartValid: boolean;\n productPickUpOptions?: ProductDeliveryOptions[];\n}\n\n/**\n * Cart component.\n * @extends {React.PureComponent<ICartProps<ICartData>>}\n */\n@observer\nclass Cart extends React.Component<ICartProps<ICartData>> {\n public state: ICartComponentState;\n\n private readonly telemetryContent: ITelemetryContent;\n\n private readonly payLoad: IPayLoad;\n\n private isQuantityLimitsFeatureEnabled: boolean = false;\n\n private _isMounted: boolean = false;\n\n private readonly promotionPopupId: string = 'cart-promotion-popup';\n\n public constructor(props: ICartProps<ICartData>) {\n super(props);\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n this.payLoad = getPayloadObject('click', this.telemetryContent, '');\n this.promotionLinkClick = this.promotionLinkClick.bind(this);\n this.promotionCloseButtonclick = this.promotionCloseButtonclick.bind(this);\n\n this.state = {\n showPromotionDialog: false,\n promotionData: {},\n isCartValid: true,\n productPickUpOptions: undefined,\n cartlinesErrors: {}\n };\n }\n\n /**\n * Component did mount function.\n */\n public async componentDidMount(): Promise<void> {\n this._isMounted = true;\n const {\n config,\n context: { actionContext }\n } = this.props;\n\n this.isQuantityLimitsFeatureEnabled =\n (await this.getOrderQuantityLimitsFeatureFlag()) || (await this._isChannelLimitsFeatureEnabled());\n if (this.isQuantityLimitsFeatureEnabled) {\n await this.validateCart();\n }\n\n if (config.showAvailablePromotions) {\n if (this._isMounted && this.props.data.cart.result?.cart.CartLines) {\n this.setState({ promotionData: await getPromotionData(actionContext) });\n }\n\n reaction(\n () => this.props.data.cart.result?.cart.CartLines,\n async () => {\n if (this._isMounted) {\n this.setState({ promotionData: await getPromotionData(actionContext) });\n }\n }\n );\n }\n reaction(\n () => this.props.data.cart.result?.cart.CartLines,\n async () => {\n if (this._isMounted) {\n const input = new ProductPickUpOptionsForCartLineItems(actionContext.requestContext.apiSettings);\n this.setState({ productPickUpOptions: await getPickUpOptionsForCartLineItems(input, actionContext) });\n }\n }\n );\n }\n\n /**\n * Component will unmount function.\n */\n public componentWillUnmount(): void {\n this._isMounted = false;\n }\n\n /**\n * Should component update function.\n * @param nextProps - Next props.\n * @param nextState - Next state.\n * @returns True if component should update, false otherwise.\n */\n public shouldComponentUpdate(nextProps: ICartProps<ICartData>, nextState: ICartComponentState): boolean {\n if (this.state === nextState && this.props.data === nextProps.data) {\n return false;\n }\n return true;\n }\n\n /* eslint-disable complexity -- Disabling complexity for render method */\n public render(): JSX.Element | null {\n const {\n data: {\n cart: { result: cart },\n products: { result: products }\n },\n context: {\n request: {\n user: { isAuthenticated, signInUrl }\n }\n },\n resources\n } = this.props;\n\n const guestCheckoutUrl = getUrlSync('checkout', this.props.context.actionContext) || '';\n const backToShoppingUrl = getUrlSync('home', this.props.context.actionContext) || '';\n const checkoutURL = this.getCheckoutURL(isAuthenticated, guestCheckoutUrl, signInUrl || '');\n const isCartEmpty = cart && cart.cart.CartLines && cart.cart.CartLines.length === 0;\n const cartLines = this._getCartLines();\n const emailDeliveryModeCode = this.props.context.request.channel?.EmailDeliveryModeCode;\n const validInventoryAcrossCartLines = validateCartLinesInventory(\n cart?.cart.CartLines ?? [],\n this.props.data.productAvailabilites.result ?? [],\n this.props.context.actionContext,\n products ?? [],\n emailDeliveryModeCode\n );\n\n const hasError =\n !validInventoryAcrossCartLines?.isValid ||\n (!validInventoryAcrossCartLines && !this.state.isCartValid) ||\n (cartLines ? cartLines.some(cartline => cartline.hasError) : false);\n const RetailMultiplePickupFeatureState = this.props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature'\n );\n const multiplePickUpEnabled = RetailMultiplePickupFeatureState?.IsEnabled;\n const channelMultipleCatalogsFeature = 'Dynamics.AX.Application.ChannelMultipleCatalogsFeature';\n const { featureState } = this.props.data;\n const isMultipleCatalogsFeatureEnabled =\n featureState.result?.find((item: FeatureState) => item.Name === channelMultipleCatalogsFeature)?.IsEnabled || false;\n const currentCatalogId = getCatalogId(this.props.context.request);\n validateCatalogId(currentCatalogId);\n const cartLinesGroup = cart?.hasInvoiceLine || multiplePickUpEnabled ? this.getCartLinesGroup() : null;\n this.payLoad.contentAction.etext = TelemetryConstant.Checkout;\n const checkoutBySignInAttributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\n this.payLoad.contentAction.etext = TelemetryConstant.GuestCheckout;\n const checkoutByGuestAttributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\n this.payLoad.contentAction.etext = TelemetryConstant.BackToShopping;\n const backtoShoppingAttributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\n\n // If there's inventory issues across multiple cart lines then update the error and display as part of the order summary\n if (validInventoryAcrossCartLines && !validInventoryAcrossCartLines.isValid) {\n if (multiplePickUpEnabled && cartLinesGroup !== null) {\n for (const cartLineGroup of cartLinesGroup) {\n this._updateCartLineErrorForInvalidInventory(cartLineGroup, validInventoryAcrossCartLines);\n }\n }\n\n this._updateCartLineErrorForInvalidInventory(cartLines, validInventoryAcrossCartLines);\n }\n\n const viewProps = {\n ...this.props,\n className: classnames('ms-cart'),\n title: <h1 className='msc-cart__heading'>{resources.cartTitle}</h1>,\n cart: this.props.data.cart.result,\n CartlinesWrapper: { className: 'msc-cartline-wraper' },\n OrderSummaryWrapper: { className: cart?.hasInvoiceLine ? 'msc-invoice-summary-wrapper' : 'msc-order-summary-wrapper' },\n OrderSummaryItems: { className: cart?.hasInvoiceLine ? 'msc-invoice-summary__items' : 'msc-order-summary__items' },\n cartlines: cartLines,\n cartLinesGroup,\n promoCode: this._getPromoCode(),\n promotionOptions: this._getPromotions(),\n context: this.props.context,\n typeName: this.props.typeName,\n telemetry: this.props.telemetry,\n id: this.props.id,\n multiplePickUpEnabled,\n removePromoAriaLabelFormat: resources.removePromoAriaLabelFormat,\n orderSummaryHeading: ArrayExtensions.hasElements(cart?.cart.CartLines) ? (\n cart?.hasInvoiceLine ? (\n <h2 className='msc-invoice-summary__heading'>{resources.invoiceSummaryTitle}</h2>\n ) : (\n <h2 className='msc-order-summary__heading'>{resources.orderSummaryTitle}</h2>\n )\n ) : null,\n orderSummaryLineitems: this._getOrderSummaryLineItems(),\n invoiceSummaryLineitems: this._getInvoiceSummaryLineItems(),\n checkoutAsSignInUserButton: !isCartEmpty ? (\n <Button\n disabled={hasError}\n className='msc-cart__btn-checkout'\n href={checkoutURL}\n title={resources.checkoutButtonTitle}\n {...checkoutBySignInAttributes}\n >\n {resources.checkoutButtonTitle}\n </Button>\n ) : null,\n checkoutAsGuestButton:\n !isCartEmpty && !isAuthenticated && this.props.config.showGuestCheckoutButton ? (\n <Button\n disabled={hasError}\n className='msc-cart__btn-guestcheckout'\n href={guestCheckoutUrl}\n title={resources.guestCheckoutButtonTitle}\n {...checkoutByGuestAttributes}\n >\n {resources.guestCheckoutButtonTitle}\n </Button>\n ) : null,\n expressCheckoutButton: !isCartEmpty ? this.props.slots.paymentExpress : null,\n ExpressCheckoutSectionWrapper: { className: 'msc-express-payment-container-in-cart-page' },\n backToShoppingButton: (\n <Button\n className='msc-cart__btn-backtoshopping'\n {...backtoShoppingAttributes}\n href={backToShoppingUrl}\n title={resources.backToShoppingButtonTitle}\n >\n {resources.backToShoppingButtonTitle}\n </Button>\n ),\n createTemplateFromCartButton:\n this._displayAddCartToTemplate() && products ? (\n <SaveCartToOrderTemplateComponent\n addToOrderTemplateDialogResources={this._generateAddToOrderTemplateDialogResources(resources)}\n createOrderTemplateDialogResources={this._generateOrderTemplateNameDialogResources(resources)}\n linesAddedToOrderTemplateDialogResources={this._generateLinesAddedToOrderTemplateDialogResources(resources)}\n duplicateItemsWhenAddingToOrderTemplateDialogResources={this._generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(\n resources\n )}\n createOrderTemplateFromCartButton={resources.createOrderTemplateFromCartButton}\n createOrderTemplateFromCartButtonTooltip={resources.createOrderTemplateFromCartButtonTooltip}\n context={this.props.context}\n id={this.props.id}\n typeName={this.props.typeName}\n isMultipleCatalogFeatureEnabledInHq={isMultipleCatalogsFeatureEnabled || false}\n catalogId={currentCatalogId}\n data={{\n orderTemplates: this.props.data.orderTemplates.result!,\n cartLines: this.props.data.cart.result!.cart.CartLines!,\n customerInformation: this.props.data.customerInformation.result\n }}\n />\n ) : null,\n checkoutBlockedDueToUnavailableFunds: null,\n storeSelector:\n this.props.slots.storeSelector && this.props.slots.storeSelector.length > 0 ? this.props.slots.storeSelector[0] : null,\n removeItemClickHandler: this.removeItemFromCartHandler,\n moveToWishlistSuccessHandler: this.moveToWishlistSuccessHandler,\n waitingComponent: <Waiting className='msc-waiting-circular msc-waiting-lg' />,\n cartLoadingStatus: this.props.data.cart.status === 'FAILED' ? this.props.resources.cartLoadingErrorMessage : null,\n cartDataResult: this.props.data.cart.result && this.props.data.cart.result.isEmpty,\n OrderSummaryErrors: this._getOrderSummaryErrors(cartLines),\n telemetryContent: this.telemetryContent\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n /* eslint-enable complexity -- Disabling complexity for render method */\n\n /**\n * Promotion click event handler.\n * @param event - The mouse event.\n */\n private readonly promotionLinkClick = (event: React.MouseEvent<HTMLElement, MouseEvent>) => {\n this.setState({\n showPromotionDialog: !this.state.showPromotionDialog\n });\n };\n\n /**\n * Promotion close button click.\n */\n private readonly promotionCloseButtonclick = () => {\n this._hidePromotionDialog();\n };\n\n /**\n * Hide promotion dialog.\n */\n private _hidePromotionDialog(): void {\n this.setState({\n showPromotionDialog: false\n });\n }\n\n /**\n * Display add to cart template.\n * @returns True if should display, false otherwise.\n */\n private _displayAddCartToTemplate(): boolean {\n const cart = this.props.data.cart?.result;\n if (ObjectExtensions.isNullOrUndefined(cart) || cart.hasInvoiceLine) {\n return false;\n }\n\n if (\n isChannelTypeB2B(this.props.context.actionContext.requestContext) &&\n this.props.data.orderTemplates.result &&\n ArrayExtensions.hasElements(cart.cart?.CartLines) &&\n this.props.data.customerInformation.result\n ) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Get promotions.\n * @returns React node with the promotions.\n */\n private _getPromotions(): React.ReactNode {\n return (\n this.props.config.showAvailablePromotions &&\n cartPromotions({\n id: this.promotionPopupId,\n showPromotionPopup: this.state.showPromotionDialog,\n onSeeAllClick: this.promotionLinkClick,\n onCloseButtonClick: this.promotionCloseButtonclick,\n promotions: this.state.promotionData.promotionOptions,\n resources: {\n promotionStringHeading: this.props.resources.promotionStringHeading,\n promotionLinkText: this.props.resources.promotionLinkText,\n promotionPopupHeading: this.props.resources.promotionPopupHeading,\n promotionCloseButtonAriaLabel: this.props.resources.promotionCloseButtonAriaLabel\n }\n })\n );\n }\n\n /**\n * Add error message in cart line in case the quantity exceeds the current inventory.\n * @param cartLines - The cart lines.\n * @param cartLineInventoryValidationResult - The cart line inventory result.\n */\n private _updateCartLineErrorForInvalidInventory(\n cartLines: ICartlinesViewProps[] | null,\n cartLineInventoryValidationResult: ICartLineInventoryValidationResult\n ) {\n const { resources } = this.props;\n\n if (\n ArrayExtensions.hasElements(cartLines) &&\n !cartLineInventoryValidationResult.isValid &&\n ArrayExtensions.hasElements(cartLineInventoryValidationResult.productIdWithErrors)\n ) {\n for (const productIdWithError of cartLineInventoryValidationResult.productIdWithErrors) {\n const cartLine = cartLines?.find(element => element.data?.cartline.ProductId === productIdWithError);\n if (cartLine) {\n cartLine.error = resources.outOfStockErrorMessage;\n cartLine.hasError = true;\n }\n }\n }\n }\n\n /**\n * Get order summary errors.\n * @param cartLines - The cart lines.\n * @returns Order summary errors.\n */\n private _getOrderSummaryErrors(cartLines: ICartlinesViewProps[] | null): IOrderSummaryErrors | undefined {\n const allErrors =\n (cartLines &&\n cartLines\n .map(cartline => {\n // Check if the product is service or not by product type\n const isServiceItem = cartline.data?.product?.ItemTypeValue === ReleasedProductType.Service;\n\n if (!isServiceItem && cartline.error) {\n const fullError =\n cartline.data && cartline.data.product?.Name\n ? `${cartline.data.product.Name}: ${cartline.error}`\n : cartline.error;\n\n return (\n <div key={fullError} className='msc-alert__line'>\n {fullError}\n </div>\n );\n }\n\n return null;\n })\n .filter((line): line is JSX.Element => !!line)) ||\n [];\n\n return {\n Wrapper: {\n tag: Alert,\n className: 'msc-alert',\n isOpen: allErrors.length > 0,\n color: 'danger',\n assertive: true,\n 'aria-label': this.props.resources.outOfStockErrorMessageHeader\n },\n header: (\n <div className='msc-alert__header' aria-hidden='true'>\n <span className='msi-exclamation-triangle' />\n <span>{this.props.resources.outOfStockErrorMessageHeader}</span>\n </div>\n ),\n errors: allErrors\n };\n }\n\n /**\n * Gets invoice summary line items.\n * @returns Invoice summary lines.\n */\n private _getInvoiceSummaryLineItems(): IInvoiceSummaryLines | undefined {\n const {\n data: {\n cart: { result: cart }\n },\n telemetry,\n resources\n } = this.props;\n\n return cart?.hasInvoiceLine\n ? InvoiceSummary({\n orderTotalLabel: resources.totalAmountLabel,\n invoiceLabel: resources.invoiceLabel,\n cart: cart.cart,\n context: this.props.context,\n typeName: this.props.typeName,\n telemetry,\n id: this.props.id\n })\n : undefined;\n }\n\n /**\n * Gets order summary line items.\n * @returns Order summary lines.\n */\n private _getOrderSummaryLineItems(): IOrderSummaryLines | undefined {\n const {\n data: {\n cart: { result: cart },\n channelDeliveryOptionConfig\n },\n telemetry,\n resources\n } = this.props;\n\n const channelConfiguration = this.props.context && this.props.context.request && this.props.context.request.channel;\n const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\n const featureState = this.props?.data?.featureState;\n const retailMultiplePickUpOptionEnabled = featureState?.result?.find(item => item.Name === multiplePickupStoreSwitchName)\n ?.IsEnabled;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app configs are of generic type\n const isShowOrHideTaxEnabled = this.props.context.request.app.config?.isEnableShowOrHideSalesTaxECommerceEnabled === true;\n\n return channelConfiguration && ArrayExtensions.hasElements(cart?.cart.CartLines) && !cart?.hasInvoiceLine\n ? OrderSummary({\n cart: cart!.cart,\n subTotalLabel: resources.itemsWithCountLabel,\n shippingLabel: resources.estimatedShippingLabel,\n otherChargeLabel: resources.otherCharges,\n taxLabel: resources.estimatedTaxLabel,\n orderTotalLabel: resources.orderTotal,\n totalDiscountsLabel: resources.totalDiscountsLabel,\n context: this.props.context,\n typeName: this.props.typeName,\n id: this.props.id,\n toBeCalculatedText: resources.yetToBeCalculatedText,\n freeText: resources.priceFree,\n channelConfiguration,\n retailMultiplePickUpOptionEnabled,\n channelDeliveryOptionConfig: channelDeliveryOptionConfig?.result,\n telemetry,\n isTaxIncludedInPrice: cart!.cart.IsTaxIncludedInPrice,\n isShowTaxBreakup: isShowOrHideTaxEnabled\n })\n : undefined;\n }\n\n /**\n * Gets promo code.\n * @returns React node with the promo code.\n */\n private _getPromoCode(): React.ReactNode {\n const {\n data: {\n cart: { result: cart }\n },\n resources\n } = this.props;\n\n return (\n cart && (\n <PromoCodeComponent\n cart={cart}\n promoCodeHeadingText={resources.promoCodeHeadingText}\n promoPlaceholderText={resources.promoPlaceholderText}\n promoCodeApplyButtonText={resources.promoCodeApplyButtonText}\n appliedPromoCodeHeadingText={resources.appliedPromoCodeHeadingText}\n collapseTimeOut={350}\n removePromoAriaLabelFormat={resources.removePromoAriaLabelFormat}\n removePromoText={resources.removePromoText}\n invalidPromoCodeErrorText={resources.invalidPromoCodeErrorText}\n failedToAddPromoCodeErrorText={resources.failedToAddPromoCodeErrorText}\n failedToRemovePromoCodeErrorText={resources.failedToRemovePromoCodeErrorText}\n duplicatePromoCodeErrorText={resources.duplicatePromotionErrorText}\n context={this.props.context}\n id={this.props.id}\n typeName={this.props.typeName}\n data={{}}\n telemetryContent={this.telemetryContent}\n />\n )\n );\n }\n\n /**\n * Generate add to order template dialog resources.\n * @param resources - The resources.\n * @returns IAddToOrderTemplateDialogResources.\n */\n private _generateAddToOrderTemplateDialogResources(resources: ICartResources): IAddToOrderTemplateDialogResources {\n return {\n addToOrderTemplateHeader: resources.addToOrderTemplateHeader,\n\n noOrderTemplatesMessage: resources.noOrderTemplatesMessage,\n noOrderTemplatesDescription: resources.noOrderTemplatesDescription,\n\n createAnOrderTemplateButtonText: resources.createAnOrderTemplateButtonText,\n createNewOrderTemplateButtonText: resources.createNewOrderTemplateButtonText,\n cancelOrderTemplateCreationButtonText: resources.cancelOrderTemplateCreationButtonText,\n\n selectTemplatesText: resources.selectTemplatesText,\n addToTemplateButtonText: resources.addToTemplateButtonText,\n lineItemsText: resources.lineItemsText\n };\n }\n\n /**\n * Generate item added to order template dialog resources.\n * @param resources - The resources.\n * @returns IItemAddedToOrderTemplateDialogResources.\n */\n private _generateItemAddedToOrderTemplateDialogResources(resources: ICartResources): IItemAddedToOrderTemplateDialogResources {\n return {\n viewOrderTemplateButtonText: resources.viewOrderTemplateButtonText,\n continueShoppingButtonText: resources.continueShoppingButtonText,\n itemAddedToOrderTemplateHeaderItemOneText: resources.itemAddedToOrderTemplateHeaderItemOneText,\n itemAddedToOrderTemplateHeaderItemFormatText: resources.itemAddedToOrderTemplateHeaderItemFormatText,\n itemAddedToOrderTemplateHeaderMessageText: resources.itemAddedToOrderTemplateHeaderMessageText,\n freePriceText: resources.freePriceText,\n originalPriceText: resources.originalPriceText,\n currentPriceText: resources.currentPriceText\n };\n }\n\n /**\n * Generate lines added to order template dialog resources.\n * @param resources - The resources.\n * @returns ILinesAddedToOrderTemplateDialogResources.\n */\n private _generateLinesAddedToOrderTemplateDialogResources(resources: ICartResources): ILinesAddedToOrderTemplateDialogResources {\n return {\n viewOrderTemplateButtonText: resources.viewOrderTemplateButtonText,\n continueShoppingButtonText: resources.continueShoppingButtonText,\n linesAddedToOrderTemplateHeaderItemsOneText: resources.linesAddedToOrderTemplateHeaderItemsOneText,\n linesAddedToOrderTemplateHeaderItemsFormatText: resources.linesAddedToOrderTemplateHeaderItemsFormatText,\n linesAddedToOrderTemplateHeaderLinesOneText: resources.linesAddedToOrderTemplateHeaderLinesOneText,\n linesAddedToOrderTemplateHeaderLinesFormatText: resources.linesAddedToOrderTemplateHeaderLinesFormatText,\n linesAddedToOrderTemplateHeaderMessageText: resources.linesAddedToOrderTemplateHeaderMessageText,\n linesAddedToOrderTemplateCustomPriceAlertMessageText: resources.linesAddedToOrderTemplateCustomPriceAlertMessageText\n };\n }\n\n /**\n * Generate duplicate items when adding to order template dialog resources.\n * @param resources - The resources.\n * @returns IDuplicateItemsWhenAddingToOrderTemplateDialogResources.\n */\n private _generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(\n resources: ICartResources\n ): IDuplicateItemsWhenAddingToOrderTemplateDialogResources {\n return {\n duplicatedProductsHeader: resources.duplicatedProductsHeader,\n duplicatedProductsDescription: resources.duplicatedProductsDescription,\n updateQuantityButtonText: resources.updateQuantityButtonText,\n cancelDuplicateItemsButtonText: resources.cancelDuplicateItemsButtonText\n };\n }\n\n /**\n * Generate order template name dialog resources.\n * @param resources - The resources.\n * @returns IOrderTemplateNameDialogResources.\n */\n private _generateOrderTemplateNameDialogResources(resources: ICartResources): IOrderTemplateNameDialogResources {\n return {\n orderTemplateHeaderLabel: resources.createOrderTemplateHeader,\n orderTemplateTitleLabel: resources.orderTemplateTitle,\n orderTemplateNameAriaLabel: resources.orderTemplateNameAriaLabel,\n orderTemplateDescription: resources.createOrderTemplateDescription,\n\n defaultOrderTemplateName: resources.defaultOrderTemplateName,\n\n orderTemplateButtonLabel: resources.createOrderTemplateButtonText,\n orderTemplateCancelButtonLabel: resources.cancelNewOrderTemplateCreationButtonText\n };\n }\n\n /**\n * Gets the cart lines view props.\n * @returns ICartlinesViewProps [].\n */\n private _getCartLines(): ICartlinesViewProps[] | null {\n const {\n data: {\n cart: { result: cart },\n wishlists: { result: wishlists },\n orderTemplates: { result: orderTemplates },\n customerInformation: { result: customerInformation }\n },\n context: {\n request: { channel: { PickupDeliveryModeCode } = { PickupDeliveryModeCode: undefined } }\n },\n config,\n telemetry,\n resources,\n modules\n } = this.props;\n\n const imageSettings = this.getImageSettings(config.imageSettings);\n\n const RetailMultiplePickupFeatureState = this.props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature'\n );\n const multiplePickUpEnabled = RetailMultiplePickupFeatureState?.IsEnabled;\n\n const cartlinesErrors: CartLineValidationResultsByLineId = this.state.cartlinesErrors;\n let storeSelectorId: string = '';\n if (modules && Object.keys(modules).length > 0 && modules.storeSelector && modules.storeSelector.length > 0) {\n storeSelectorId = modules.storeSelector[0].id;\n }\n const channelMultipleCatalogsFeature = 'Dynamics.AX.Application.ChannelMultipleCatalogsFeature';\n const isMultipleCatalogsFeatureEnabled =\n this.props.data.featureState.result?.find((item: FeatureState) => item.Name === channelMultipleCatalogsFeature)?.IsEnabled ||\n false;\n return ArrayExtensions.hasElements(cart?.cart.CartLines)\n ? CartLineItems({\n cartlines: cart!.cart.CartLines,\n storeSelectorModuleId: storeSelectorId,\n cartlinesErrors,\n products: this.props.data.products.result,\n productAvailabilites: this.props.data.productAvailabilites.result,\n productDeliveryOptions: this.props.data.deliveryOptions.result,\n catalogs: this.props.data.catalogs?.result,\n imageSettings,\n isStockCheckEnabled: this.props.context.app.config.enableStockCheck || false,\n maxCartlineQuantity: updateMaxQuantityForCartLineItem(this.props.context.app.config.maxQuantityForCartLineItem),\n shouldIgnoreWarehouse: this.props.context.app.config.warehouseAggregation === 'multiple',\n gridSettings: this.props.context.request.gridSettings!,\n context: this.props.context,\n typeName: this.props.typeName,\n id: this.props.id,\n retailMulitplePickupFeatureState: multiplePickUpEnabled,\n resources: {\n sizeString: resources.productDimensionTypeSize,\n colorString: resources.productDimensionTypeColor,\n configString: resources.productDimensionTypeConfiguration,\n styleString: resources.productDimensionTypeStyle,\n amountString: resources.productDimensionTypeAmount,\n quantityDisplayString: resources.quantityDisplayText,\n inputQuantityAriaLabel: resources.inputQuantityAriaLabel,\n decrementButtonAriaLabel: resources.decrementButtonAriaLabel,\n incrementButtonAriaLabel: resources.incrementButtonAriaLabel,\n discountStringText: resources.discountStringText,\n originalPriceText: resources.originalPriceText,\n currentPriceText: resources.currentPriceText,\n shippingChargesText: resources.shippingCharges,\n salesAgreementPricePrompt: resources.salesAgreementPricePrompt,\n priceEditorResources: {\n ...resources\n }\n },\n telemetry,\n addToWishlistButtonText: resources.addToWishlistButtonText,\n removeFromWishlistButtonText: resources.removeFromWishlistButtonText,\n removeButtonText: resources.removeCartButtonText,\n shipItText: resources.shipInsteadDisplayText,\n pickitUpText: resources.pickItUpDisplayText,\n changeStoreText: resources.changeStoreDisplayText,\n storeSelectorStateManager: this.props.data.storeSelectorStateManager.result,\n outOfStockText: resources.outOfStockErrorMessage,\n outOfRangeOneText: resources.errorMessageOutOfRangeOneLeft,\n outOfRangeFormatText: resources.errorMessageOutOfRangeFormat,\n cartState: this.props.data.cart.result,\n orgUnitLocations: this.props.data.orgUnitLocations.result,\n removeItemClickHandler: this.removeItemFromCartHandler,\n moveToWishlistSuccessHandler: this.moveToWishlistSuccessHandler,\n updateCartLinesQuantitySuccessHandler: this.updateCartlineQuantity,\n locationChangedHandler: this.fulfillmentStoreIdUpdated,\n wishlists,\n defaultWishlistName: resources.defaultWishlistName,\n pickupDeliveryModeCode: PickupDeliveryModeCode,\n includeErrors: config.showOutOfStockErrors,\n showShippingChargesForLineItems: config.showShippingChargesForLineItems,\n telemetryContent: this.telemetryContent,\n isQuantityLimitsFeatureEnabled: this.isQuantityLimitsFeatureEnabled,\n\n addToOrderTemplateDialogResources: this._generateAddToOrderTemplateDialogResources(resources),\n createOrderTemplateDialogResources: this._generateOrderTemplateNameDialogResources(resources),\n itemAddedToOrderTemplateDialogResources: this._generateItemAddedToOrderTemplateDialogResources(resources),\n duplicateItemsWhenAddingToOrderTemplateDialogResources: this._generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(\n resources\n ),\n\n addToOrderTemplateButtonText: resources.addToOrderTemplateButtonText,\n addToOrderTemplateButtonTooltip: resources.addToOrderTemplateButtonTooltip,\n addToOrderTemplateMessage: resources.addToOrderTemplateMessage,\n addItemToOrderTemplateError: resources.addItemToOrderTemplateError,\n orderTemplates,\n customerInformation,\n productAvailability: this.props.data.productAvailabilites,\n isMultipleCatalogFeatureEnabledInHq: isMultipleCatalogsFeatureEnabled || false\n })\n : null;\n }\n\n /**\n * Gets the checkout URL.\n * @param isAuthenticated - Is authenticated flag.\n * @param guestCheckoutUrl - Guest checkout URL.\n * @param signInUrl -The sign in URL.\n * @returns The checkout URL.\n */\n private getCheckoutURL(isAuthenticated: boolean, guestCheckoutUrl: string, signInUrl: string): string {\n if (isAuthenticated) {\n return guestCheckoutUrl;\n }\n\n const isAbsoluteUrl = urlCheck(guestCheckoutUrl);\n let returnURL = guestCheckoutUrl;\n if (MsDyn365.isBrowser && !isAbsoluteUrl) {\n returnURL = `${window.location.origin}${guestCheckoutUrl}`;\n }\n\n return `${signInUrl}${!signInUrl.includes('?') ? '?' : '&'}ru=${returnURL}`;\n }\n\n /**\n * Gets the image settings.\n * @param imageSettings - Image settings.\n * @returns IImageSettings.\n */\n private readonly getImageSettings = (imageSettings: IImageSettings | undefined): IImageSettings => {\n return (\n imageSettings || {\n viewports: {\n xs: { q: 'w=80&h=94&m=6', w: 0, h: 0 },\n sm: { q: 'w=148&h=174&m=6', w: 0, h: 0 },\n lg: { q: 'w=148&h=174&m=6', w: 0, h: 0 }\n },\n lazyload: true\n }\n );\n };\n\n /**\n * Remove item from cart handler.\n * @param cartlineToRemove - The cart line to remove.\n */\n private readonly removeItemFromCartHandler = (cartlineToRemove: CartLine) => {\n if (this.props.data.cart.result) {\n const input = {\n cartLineIds: [cartlineToRemove.LineId!.toString()]\n };\n this.props.data.cart.result\n .removeCartLines(input)\n .then(() => {\n this.validateCart().catch(error => {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to validate Cart');\n });\n })\n .catch(error => {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to Remove Cart Line');\n });\n }\n };\n\n /**\n * Move to wish list handler.\n * @param result - The wish list action success result.\n * @param cartline - The cart line.\n */\n private readonly moveToWishlistSuccessHandler = (result: IWishlistActionSuccessResult, cartline?: CartLine) => {\n if (result.status === 'ADDED' && cartline) {\n this.removeItemFromCartHandler(cartline);\n }\n };\n\n /**\n * Updates the cart line quantity.\n * @param cartlineToUpdate - The cart line.\n * @param quantity - The quantity.\n * @param lineIndex - The line index.\n * @returns True if the cart line was updated, false otherwise.\n */\n private readonly updateCartlineQuantity = (cartlineToUpdate: CartLine, quantity: number, lineIndex?: number): boolean => {\n cartLineQuantityUpdatedAsync(\n this.isQuantityLimitsFeatureEnabled,\n this.props.data.cart.result,\n this.props.telemetry,\n this.props.data.products.result,\n cartlineToUpdate,\n quantity\n )\n .then((cartActionResult: ICartActionResult | undefined): boolean => {\n if (cartActionResult?.status === 'SUCCESS') {\n this.validateCart().catch(error => {\n this.props.telemetry.warning((error as Error).message);\n this.props.telemetry.debug('Unable to validate Cart');\n });\n this.setState({\n cartlinesErrors: {}\n });\n return true;\n }\n\n if (!ObjectExtensions.isNullOrUndefined(cartActionResult)) {\n // Show update line error message.\n const lineUpdateFailure: LineValidationResult = {\n LineId: ObjectExtensions.isNullOrUndefined(cartlineToUpdate.LineId) ? '0' : cartlineToUpdate.LineId,\n ValidationFailures: [\n {\n ErrorContext: ArrayExtensions.hasElements(cartActionResult.validationResults)\n ? cartActionResult.validationResults[0].ErrorContext\n : '',\n LocalizedMessage: cartActionResult.errorDetails?.LocalizedMessage\n }\n ]\n };\n\n this.setState({\n cartlinesErrors: { ValidationResultsPairs: [lineUpdateFailure] }\n });\n }\n\n return false;\n })\n .catch(() => {\n return false;\n });\n\n return false;\n };\n\n /**\n * Fulfillment store id is updated.\n */\n private readonly fulfillmentStoreIdUpdated = () => {\n if (this.isQuantityLimitsFeatureEnabled) {\n // Refresh products (in props.data) based on latest cart.\n getActiveCartProductsAction(new ActiveCartProductsInput(), this.props.context.actionContext)\n .then(async () => this.validateCart())\n .catch((error: Error) => {\n this.props.telemetry.warning(error.message);\n this.props.telemetry.debug('Unable to validate Cart');\n });\n }\n };\n\n /**\n * Validates cart.\n * @returns Void promise.\n */\n private async validateCart(): Promise<void> {\n if (!this.isQuantityLimitsFeatureEnabled) {\n this.setState({ cartlinesErrors: {}, isCartValid: true });\n return AsyncResult.resolve();\n }\n\n const {\n data: { cart },\n telemetry,\n context\n } = this.props;\n\n const validationResults: CartLineValidationResultsByLineId | undefined = await validateCartAsync(cart, telemetry, context, true);\n\n if (validationResults) {\n const isValid = !ArrayExtensions.hasElements(validationResults.ValidationResultsPairs);\n this.setState({\n cartlinesErrors: validationResults,\n isCartValid: isValid\n });\n } else {\n this.setState({ cartlinesErrors: {}, isCartValid: true });\n }\n\n return AsyncResult.resolve();\n }\n\n /**\n * Get order quantity limit feature flag.\n * @returns True if flag is enabled, false otherwise.\n */\n private async getOrderQuantityLimitsFeatureFlag(): Promise<boolean> {\n const featureStatuses = await this.props.data.featureState;\n\n try {\n const isQuantityLimitsFeatureEnabledInHq =\n featureStatuses.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature'\n )?.IsEnabled || false;\n if (!isQuantityLimitsFeatureEnabledInHq) {\n return false;\n }\n } catch (error) {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to get feature states');\n return false;\n }\n\n const useSiteBuilderSettings = featureStatuses?.find(\n featureState => featureState.Name === 'RevertToSiteBuilderOrderQuantityLimitsSettings'\n )?.IsEnabled;\n\n if (useSiteBuilderSettings) {\n const defaultOrderQuantityLimitsFeatureConfig = this.props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits;\n if (defaultOrderQuantityLimitsFeatureConfig === 'none') {\n return false;\n }\n\n if (defaultOrderQuantityLimitsFeatureConfig === 'all') {\n return true;\n }\n\n try {\n const customerInfo = await this.props.data.customerInformation;\n return (\n !!customerInfo &&\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b))\n );\n } catch (error) {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to get customer info');\n return false;\n }\n } else {\n const cartConfiguration = await this.props.data.cartConfiguration;\n return !(cartConfiguration?.IgnoreOrderSettings ?? false);\n }\n }\n\n private async _isChannelLimitsFeatureEnabled(): Promise<boolean> {\n const featureStatuses = await this.props.data.featureState;\n\n const isChannelLimitsFeatureEnabledInHq = featureStatuses?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.EcommerceQuantityLimitConfigurationsFeature'\n )?.IsEnabled;\n\n return isChannelLimitsFeatureEnabledInHq ?? false;\n }\n\n /**\n * Gets the cart lines group.\n * @returns ICartlinesViewProps [][].\n */\n private getCartLinesGroup(): ICartlinesViewProps[][] | null {\n const {\n data: {\n cart: { result: cart },\n wishlists: { result: wishlists },\n orderTemplates: { result: orderTemplates },\n customerInformation: { result: customerInformation }\n },\n context: {\n request: { channel: { PickupDeliveryModeCode } = { PickupDeliveryModeCode: undefined } }\n },\n config,\n telemetry,\n resources,\n modules\n } = this.props;\n\n const imageSettings = this.getImageSettings(config.imageSettings);\n const cartlinesErrors: CartLineValidationResultsByLineId = this.state.cartlinesErrors;\n let storeSelectorId: string = '';\n if (modules && Object.keys(modules).length > 0 && modules.storeSelector && modules.storeSelector.length > 0) {\n storeSelectorId = modules.storeSelector[0].id;\n }\n\n const RetailMultiplePickupFeatureState = this.props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature'\n );\n const multiplePickUpEnabled = RetailMultiplePickupFeatureState?.IsEnabled;\n const { featureState } = this.props.data;\n const channelMultipleCatalogsFeature = 'Dynamics.AX.Application.ChannelMultipleCatalogsFeature';\n const isMultipleCatalogsFeatureEnabled =\n featureState.result?.find((item: FeatureState) => item.Name === channelMultipleCatalogsFeature)?.IsEnabled || false;\n return this.props.data.products &&\n (cart?.hasInvoiceLine || this.props.data.products.result) &&\n cart &&\n cart.cart.CartLines &&\n cart.cart.CartLines.length > 0 &&\n this.props.data.channelDeliveryOptionConfig?.result\n ? CartLineGroupItems({\n cartlines: cart.cart.CartLines,\n storeSelectorModuleId: storeSelectorId,\n cartlinesErrors,\n products: this.props.data.products.result,\n productAvailabilites: this.props.data.productAvailabilites.result,\n productDeliveryOptions: this.props.data.deliveryOptions.result,\n catalogs: this.props.data.catalogs?.result,\n imageSettings,\n isStockCheckEnabled: this.props.context.app.config.enableStockCheck || false,\n hasInvoiceLine: cart?.hasInvoiceLine || false,\n maxCartlineQuantity: updateMaxQuantityForCartLineItem(this.props.context.app.config.maxQuantityForCartLineItem),\n gridSettings: this.props.context.request.gridSettings!,\n context: this.props.context,\n retailMulitplePickupFeatureState: multiplePickUpEnabled,\n typeName: this.props.typeName,\n id: this.props.id,\n resources: {\n sizeString: resources.productDimensionTypeSize,\n colorString: resources.productDimensionTypeColor,\n configString: resources.productDimensionTypeConfiguration,\n styleString: resources.productDimensionTypeStyle,\n amountString: resources.productDimensionTypeAmount,\n quantityDisplayString: resources.quantityDisplayText,\n inputQuantityAriaLabel: resources.inputQuantityAriaLabel,\n decrementButtonAriaLabel: resources.decrementButtonAriaLabel,\n incrementButtonAriaLabel: resources.incrementButtonAriaLabel,\n discountStringText: resources.discountStringText,\n originalPriceText: resources.originalPriceText,\n currentPriceText: resources.currentPriceText,\n shippingChargesText: resources.shippingCharges,\n salesAgreementPricePrompt: resources.salesAgreementPricePrompt,\n priceEditorResources: {\n ...resources\n }\n },\n telemetry,\n addToWishlistButtonText: resources.addToWishlistButtonText,\n removeFromWishlistButtonText: resources.removeFromWishlistButtonText,\n removeButtonText: resources.removeCartButtonText,\n shipItText: resources.shipInsteadDisplayText,\n pickitUpText: resources.pickItUpDisplayText,\n changeStoreText: resources.changeStoreDisplayText,\n storeSelectorStateManager: this.props.data.storeSelectorStateManager.result,\n outOfStockText: resources.outOfStockErrorMessage,\n outOfRangeOneText: resources.errorMessageOutOfRangeOneLeft,\n outOfRangeFormatText: resources.errorMessageOutOfRangeFormat,\n cartState: this.props.data.cart.result,\n orgUnitLocations: this.props.data.orgUnitLocations.result,\n removeItemClickHandler: this.removeItemFromCartHandler,\n moveToWishlistSuccessHandler: this.moveToWishlistSuccessHandler,\n updateCartLinesQuantitySuccessHandler: this.updateCartlineQuantity,\n locationChangedHandler: this.fulfillmentStoreIdUpdated,\n wishlists,\n defaultWishlistName: resources.defaultWishlistName,\n pickupDeliveryModeCode: PickupDeliveryModeCode,\n includeErrors: config.showOutOfStockErrors,\n showShippingChargesForLineItems: config.showShippingChargesForLineItems,\n telemetryContent: this.telemetryContent,\n isQuantityLimitsFeatureEnabled: this.isQuantityLimitsFeatureEnabled,\n\n addToOrderTemplateDialogResources: this._generateAddToOrderTemplateDialogResources(resources),\n createOrderTemplateDialogResources: this._generateOrderTemplateNameDialogResources(resources),\n itemAddedToOrderTemplateDialogResources: this._generateItemAddedToOrderTemplateDialogResources(resources),\n duplicateItemsWhenAddingToOrderTemplateDialogResources: this._generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(\n resources\n ),\n\n addToOrderTemplateButtonText: resources.addToOrderTemplateButtonText,\n addToOrderTemplateButtonTooltip: resources.addToOrderTemplateButtonTooltip,\n addToOrderTemplateMessage: resources.addToOrderTemplateMessage,\n addItemToOrderTemplateError: resources.addItemToOrderTemplateError,\n orderTemplates,\n customerInformation,\n channelDeliveryOptionConfig: this.props.data.channelDeliveryOptionConfig?.result,\n shouldIgnoreWarehouse: this.props.context.app.config.warehouseAggregation === 'multiple',\n productAvailability: this.props.data.productAvailabilites,\n productPickUpOptions: this.state.productPickUpOptions || this.props.data.cartLinesPickUpOptions?.result,\n isMultipleCatalogFeatureEnabledInHq: isMultipleCatalogsFeatureEnabled || false\n })\n : null;\n }\n}\n\nexport default Cart;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { CartPromotionLine } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { INodeProps, Modal, ModalBody, ModalFooter, ModalHeader } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nexport interface ICartLineItemPromotion {\n id: string;\n showPromotionPopup: boolean;\n promotions: CartPromotionLine[] | undefined;\n resources: ICartLineItemPromotionResourceString;\n onSeeAllClick(event: React.MouseEvent<HTMLElement>): void;\n onCloseButtonClick(): void;\n}\n\nexport interface ICartLineItemViewProps {\n promotionMessageWrapper: INodeProps;\n promotionMessage: React.ReactNode;\n promotionSeeAllLink: React.ReactElement;\n promotionDialog: React.ReactNode;\n}\n\nexport interface ICartLineItemPromotionResourceString {\n promotionLinkText: string;\n promotionStringHeading: string;\n promotionPopupHeading: string;\n promotionCloseButtonAriaLabel: string;\n}\n\nexport const cartPromotions = (props: ICartLineItemPromotion): ICartLineItemViewProps | undefined => {\n const {\n id,\n showPromotionPopup,\n promotions,\n resources: { promotionLinkText, promotionPopupHeading },\n onCloseButtonClick,\n onSeeAllClick\n } = props;\n\n if (!ArrayExtensions.hasElements(promotions)) {\n return;\n }\n\n const titleId = `${id}_title`;\n const className = 'msc-cart__promotion';\n return {\n promotionMessageWrapper: {\n className: 'msc-cart__promotion'\n },\n promotionMessage: (\n <>\n <span className='msi-promotion-icon' />\n <span> {props.resources.promotionStringHeading}</span>\n </>\n ),\n promotionSeeAllLink: (\n <a className='msc-cart__promotion_link' tabIndex={0} role='link' onClick={onSeeAllClick}>\n {` `}\n {promotionLinkText} {` `}\n </a>\n ),\n promotionDialog: (\n <Modal isOpen={showPromotionPopup} className={`${className}`} toggle={onCloseButtonClick}>\n <ModalHeader className={`${className}__dialog__header`} toggle={onCloseButtonClick}>\n <h5 id={titleId} className='msc-cart__promotion-popup_title'>\n {promotionPopupHeading}\n </h5>\n </ModalHeader>\n <ModalBody className={`${className}__dialog__body`}>\n <ul>\n {promotions.map(_promotion => {\n return (\n <li className='msc-cart__promotion-popup_name' key={_promotion.LineId}>\n {_promotion.Promotion?.OfferName} {` `}\n </li>\n );\n })}\n </ul>\n </ModalBody>\n <ModalFooter className={`${className}__dialog__footer`} />\n </Modal>\n )\n };\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport MsDyn365 from '@msdyn365-commerce/core';\nimport { IInvoiceSummaryLines } from '@msdyn365-commerce-modules/invoice-payment-summary';\nimport { IOrderSummaryLines } from '@msdyn365-commerce-modules/order-summary-utilities';\nimport { ArrayExtensions, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { INodeProps, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ICartViewProps, IOrderSummaryErrors } from './cart';\nimport { ICartlinesViewProps } from './components/cart-line-items';\nimport { ICartLineItemViewProps } from './components/cart-line-items-promotion';\n\nconst _renderCartlines = (\n cartLines: ICartlinesViewProps[] | undefined,\n cartEmptyText: string,\n CartlinesWrapper: INodeProps,\n storeSelector: React.ReactNode | undefined,\n backToShoppingButton: React.ReactNode,\n waitingComponent: React.ReactNode,\n cartLoadingStatus: string,\n cartDataResult: boolean\n): JSX.Element[] | JSX.Element => {\n if (cartLoadingStatus) {\n return <>{cartLoadingStatus}</>;\n }\n if (cartLines) {\n return cartLines.map(cartLine => {\n return (\n <div className='msc-cart-lines-item' key={`${cartLine.cartlineId ?? ''}-${MsDyn365.isBrowser.toString()}`}>\n {cartLine.cartline}\n {storeSelector && cartLine.pickUpInStore ? (\n <Node {...cartLine.pickUpInStore.ContainerProps}>{cartLine.pickUpInStore.defaultComponent}</Node>\n ) : null}\n {cartLine.addToOrderTemplate ? (\n <Node className='msc-cart-line__extra-actions'>\n {cartLine.remove}\n {cartLine.addToWishlist}\n {cartLine.addToOrderTemplate}\n </Node>\n ) : (\n <>\n {cartLine.remove}\n {cartLine.addToWishlist}\n </>\n )}\n </div>\n );\n });\n }\n return cartDataResult ? (\n <div className='msc-cart__empty-cart'>\n <p className='msc-cart-line'>{cartEmptyText}</p>\n {backToShoppingButton}\n </div>\n ) : (\n <>{waitingComponent}</>\n );\n};\n\n/**\n * Method will render error block.\n * @param errorData -The order summary errors interface.\n * @returns Jsx element.\n */\nconst _renderErrorBlock = (errorData: IOrderSummaryErrors | undefined): JSX.Element | null => {\n if (!errorData || !ArrayExtensions.hasElements(errorData.errors)) {\n return null;\n }\n return (\n <Node {...errorData.Wrapper}>\n {errorData.header}\n {errorData.errors}\n </Node>\n );\n};\n\n/**\n * Method will render invoice summary lines.\n * @param invoiceSummaryLines -The invoicesummary lines interface.\n * @param OrderSummaryItems -The order summary items props.\n * @param props -The cartview props.\n * @returns Jsx element.\n */\nconst _renderInvoiceSummarylines = (\n invoiceSummaryLines: IInvoiceSummaryLines | undefined,\n OrderSummaryItems: INodeProps,\n props: ICartViewProps\n): JSX.Element | null => {\n if (!invoiceSummaryLines) {\n props.context.telemetry.error('InvoiceSummary content is empty, module wont render');\n return null;\n }\n return (\n <Node {...OrderSummaryItems}>\n {invoiceSummaryLines.invoices}\n {invoiceSummaryLines.giftCard}\n {invoiceSummaryLines.loyalty}\n {invoiceSummaryLines.orderTotal}\n </Node>\n );\n};\n\n/**\n * Method will render order summary lines.\n * @param orderSummaryLines -The ordersummary lines interface.\n * @param OrderSummaryItems -The order summary items props.\n * @param props -The cartview props.\n * @returns Jsx element.\n */\nconst _renderOrderSummarylines = (\n orderSummaryLines: IOrderSummaryLines | undefined,\n OrderSummaryItems: INodeProps,\n props: ICartViewProps\n): JSX.Element | null => {\n if (!orderSummaryLines) {\n props.context.telemetry.error('OrderSummary content is empty, module wont render');\n return null;\n }\n return (\n <Node {...OrderSummaryItems}>\n {props.promoCode}\n {orderSummaryLines.subtotal}\n {orderSummaryLines.shipping}\n {orderSummaryLines.otherCharge}\n {orderSummaryLines.tax}\n {orderSummaryLines.totalDiscounts ? orderSummaryLines.totalDiscounts : null}\n {orderSummaryLines.orderTotal}\n </Node>\n );\n};\n\n/**\n * Method will render cart promotions.\n * @param promotions -The cartline item view props.\n * @returns Jsx element.\n */\nconst _renderPromotions = (promotions: ICartLineItemViewProps): JSX.Element | undefined => {\n return (\n <>\n <Node {...promotions.promotionMessageWrapper}>\n {promotions.promotionMessage}\n {promotions.promotionSeeAllLink}\n {promotions.promotionDialog}\n </Node>\n </>\n );\n};\n\n/**\n * Method will render cartlines group title.\n * @param cartLine -The cartline view props.\n * @param titleSeparate -The title separate.\n * @returns Jsx element.\n */\nconst renderCartLinesGroupTitle = (cartLine: ICartlinesViewProps, titleSeparate: string) => {\n const isBopisSelected: boolean | undefined = cartLine.pickUpInStore?.isBopisSelected;\n return (\n <>\n <Node className='msc-cart-lines-group-wraper__bopis-heading-title'>\n {isBopisSelected ? (\n <p className='msc-cart-lines-group-wraper__bopis-heading-title-st'>\n {cartLine.pickUpInStore?.deliveryOption}\n {titleSeparate}\n {cartLine.pickUpInStore?.orgUnitName}\n </p>\n ) : null}\n </Node>\n </>\n );\n};\n\n/**\n * Method will render cartlines groups header title.\n * @param pickUpText -The pickup text for group.\n * @param shippingText -The shipping text for group.\n * @param emailShippingText -The email shipping text for group.\n * @param titleSeparate -The title separator.\n * @param cartLine -The cartline view props.\n * @param emailDeliveryModeCode -The email delivery code from channel.\n * @returns Jsx element.\n */\nconst renderCartLinesGroupHeader = (\n pickUpText: string,\n shippingText: string,\n emailShippingText: string,\n titleSeparate: string,\n cartLine: ICartlinesViewProps,\n emailDeliveryModeCode?: string\n) => {\n const isBopisSelected: boolean | undefined = cartLine.pickUpInStore?.isBopisSelected;\n let groupTitle: string;\n\n groupTitle = isBopisSelected ? pickUpText : shippingText;\n if (!StringExtensions.isNullOrEmpty(emailDeliveryModeCode)) {\n groupTitle = cartLine.data && cartLine.data.cartline.DeliveryMode === emailDeliveryModeCode ? emailShippingText : groupTitle;\n }\n\n return (\n <>\n <div className='msc-cart-lines-group-wraper__bopis-heading'>\n <p className={`msc-cart-lines-group-wraper__bopis-heading-${groupTitle.toLowerCase()}-icon`} />\n <p className={`msc-cart-lines-group-wraper__bopis-heading-${groupTitle.toLowerCase()}`}>{groupTitle}</p>\n {renderCartLinesGroupTitle(cartLine, titleSeparate)}\n </div>\n </>\n );\n};\n\n/**\n * Method will render cartlines in groups.\n * @param props -The cartline.\n * @returns Jsx element.\n */\nconst renderCartLinesGroup = (props: ICartViewProps): JSX.Element | undefined => {\n if (props.cartLinesGroup && ArrayExtensions.hasElements(props.cartLinesGroup)) {\n return (\n <div className='msc-cart-lines-group'>\n {props.cartLinesGroup.map(cartlines => {\n return (\n <div key={cartlines[0].cartlineId} className='msc-cart-lines-group-wraper'>\n {renderCartLinesGroupHeader(\n props.resources.pickUpText,\n props.resources.shippingText,\n props.resources.emailshippingText,\n props.resources.titleSeparate,\n cartlines[0],\n props.context.actionContext.requestContext.channel?.EmailDeliveryModeCode\n )}\n {_renderCartlines(\n cartlines,\n props.resources.emptyCartText,\n props.CartlinesWrapper,\n props.storeSelector,\n props.backToShoppingButton,\n props.waitingComponent,\n props.cartLoadingStatus,\n props.cartDataResult\n )}\n </div>\n );\n })}\n </div>\n );\n }\n return props.cartDataResult ? (\n <div className='msc-cartline-wraper'>\n <div className='msc-cart__empty-cart'>\n <p className='msc-cart-line'>{props.resources.emptyCartText}</p>\n {props.backToShoppingButton}\n </div>\n </div>\n ) : (\n <>{props.waitingComponent}</>\n );\n};\n\nconst CartView: React.FC<ICartViewProps> = (props: ICartViewProps) => (\n <div className={props.className} id={props.id} {...props.renderModuleAttributes(props)}>\n {props.title}\n {!props.cart?.hasInvoiceLine && props.promotionOptions && _renderPromotions(props.promotionOptions)}\n {props.multiplePickUpEnabled ? (\n renderCartLinesGroup(props)\n ) : (\n <Node {...props.CartlinesWrapper}>\n {_renderCartlines(\n props.cartlines,\n props.resources.emptyCartText,\n props.CartlinesWrapper,\n props.storeSelector,\n props.backToShoppingButton,\n props.waitingComponent,\n props.cartLoadingStatus,\n props.cartDataResult\n )}\n </Node>\n )}\n {props.orderSummaryHeading && (\n <Node {...props.OrderSummaryWrapper}>\n {props.orderSummaryHeading}\n {props.cart?.hasInvoiceLine\n ? _renderInvoiceSummarylines(props.invoiceSummaryLineitems, props.OrderSummaryItems, props)\n : _renderOrderSummarylines(props.orderSummaryLineitems, props.OrderSummaryItems, props)}\n {_renderErrorBlock(props.OrderSummaryErrors)}\n {props.checkoutAsSignInUserButton}\n {props.checkoutAsGuestButton}\n {props.expressCheckoutButton && ArrayExtensions.hasElements(props.expressCheckoutButton) ? (\n <Node {...props.ExpressCheckoutSectionWrapper}>{props.expressCheckoutButton}</Node>\n ) : null}\n {props.backToShoppingButton}\n {props.createTemplateFromCartButton}\n </Node>\n )}\n {props.storeSelector}\n </div>\n);\n\nexport default CartView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { PriceComponent } from '@msdyn365-commerce/components';\nimport { IComponentProps } from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { Coupon } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport {\n Button,\n format,\n getPayloadObject,\n getTelemetryAttributes,\n IPayLoad,\n ITelemetryContent,\n TelemetryConstant\n} from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface IPromoCodeProps extends IComponentProps<{}> {\n cart: ICartState | undefined;\n promoCodeHeadingText: string;\n appliedPromoCodeHeadingText: string;\n removePromoAriaLabelFormat: string;\n promoPlaceholderText: string;\n promoCodeApplyButtonText: string;\n collapseTimeOut: number;\n removePromoText: string;\n invalidPromoCodeErrorText: string;\n failedToAddPromoCodeErrorText: string;\n duplicatePromoCodeErrorText: string;\n failedToRemovePromoCodeErrorText: string;\n\n /**\n * The telemetry content\n */\n telemetryContent?: ITelemetryContent;\n promoCodeApplyCallback?(): void;\n}\n\ninterface IPromoCodeState {\n isCollapseOpen: boolean;\n promoCodeInputValue: string;\n error: string;\n canApply: boolean;\n}\n\n/**\n *\n * The PromoCode component renders the promocode section.\n * @extends {React.PureComponent<IRefineSubmenuProps>}\n */\nclass PromoCode extends React.Component<IPromoCodeProps, IPromoCodeState> {\n private readonly payLoad: IPayLoad;\n\n constructor(props: IPromoCodeProps, state: IPromoCodeState) {\n super(props);\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, TelemetryConstant.ApplyPromoCode);\n this.state = {\n isCollapseOpen: false,\n promoCodeInputValue: '',\n error: '',\n canApply: false\n };\n }\n\n public shouldComponentUpdate(nextProps: IPromoCodeProps, nextState: IPromoCodeState): boolean {\n if (this.state === nextState && this.props.data === nextProps.data) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element {\n return (\n <div>\n <div className='msc-promo-code-heading'>{this.props.promoCodeHeadingText}</div>\n {this._renderForm(this.props.promoPlaceholderText, this.props.promoCodeApplyButtonText, this.props.cart)}\n <p className={this.state.error ? 'msc-alert-danger' : ''} aria-live='assertive'>\n {this.state.error}\n </p>\n {this._renderAppliedPromoCode(this.props)}\n </div>\n );\n }\n\n private readonly _onInputChangeHandler = (e: React.ChangeEvent<HTMLInputElement>) => {\n const error = e.target.value === '' ? '' : this.state.error;\n this.setState({\n promoCodeInputValue: e.target.value.trim(),\n error,\n canApply: !!e.target.value\n });\n };\n\n private readonly _applyPromotion = (cartState: ICartState | undefined) => {\n if (!cartState || !cartState.cart) {\n return;\n }\n const appliedPromo = this.state.promoCodeInputValue;\n\n cartState\n .addPromoCode({ promoCode: appliedPromo })\n .then(result => {\n if (result.status === 'SUCCESS') {\n // Show success text\n this.setState({ promoCodeInputValue: '', error: '', canApply: false });\n } else if (result.substatus === 'ALREADYADDED') {\n this.setState({ error: this.props.duplicatePromoCodeErrorText });\n } else {\n this.setState({ error: this.props.invalidPromoCodeErrorText });\n }\n })\n .catch(error => {\n this.setState({ error: this.props.failedToAddPromoCodeErrorText });\n });\n };\n\n /**\n * On Submit function.\n * @param cartState -Cartstate.\n * @returns Apply promotion.\n */\n private readonly _onSubmitHandler = (cartState: ICartState | undefined) => (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n this._applyPromotionHandler(cartState);\n };\n\n /**\n * On apply promotion function.\n * @param cartState -Cartstate.\n * @returns Apply promotion.\n */\n private readonly _applyPromotionHandler = (cartState: ICartState | undefined) => () => {\n this._applyPromotion(cartState);\n };\n\n private readonly _renderForm = (promoPlaceholderText: string, promoCodeApplyButtonText: string, cartState: ICartState | undefined) => {\n const attributes = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\n\n return (\n <form onSubmit={this._onSubmitHandler(cartState)} className='msc-promo-code__form-container'>\n <div className='msc-promo-code__group'>\n <input\n className='msc-promo-code__input-box'\n onChange={this._onInputChangeHandler}\n value={this.state.promoCodeInputValue}\n placeholder={promoPlaceholderText}\n />\n <Button\n title={promoCodeApplyButtonText}\n className='msc-promo-code__apply-btn btn'\n onClick={this._applyPromotionHandler(cartState)}\n disabled={!this.state.canApply}\n {...attributes}\n >\n {promoCodeApplyButtonText}\n </Button>\n </div>\n </form>\n );\n };\n\n private readonly _removePromotion = (cartState: ICartState | undefined, event: React.MouseEvent) => {\n if (!cartState) {\n return;\n }\n const code = event.currentTarget.getAttribute('data-value') || '';\n cartState\n .removePromoCodes({\n promoCodes: [code]\n })\n .then(result => {\n if (result.status === 'SUCCESS') {\n this.setState({ error: '' });\n }\n })\n .catch(() => {\n this.setState({ error: this.props.failedToRemovePromoCodeErrorText });\n });\n };\n\n private readonly _calculateDiscount = (code: string, cartState: ICartState | undefined) => {\n if (!cartState || !cartState.cart || !cartState.cart.CartLines || cartState.cart.CartLines.length === 0 || !code) {\n return;\n }\n let discountAmount = 0;\n for (const line of cartState.cart.CartLines) {\n if (line.DiscountLines) {\n for (const discountLine of line.DiscountLines) {\n if (discountLine.DiscountCode === code) {\n discountAmount += discountLine.DiscountCost!;\n }\n }\n }\n }\n return discountAmount * -1;\n };\n\n private readonly _renderAppliedPromoCode = (props: IPromoCodeProps) => {\n if (!props.cart || !props.cart.cart || !props.cart.cart.Coupons || props.cart.cart.Coupons.length === 0) {\n return;\n }\n\n const removePromotionHandler = (event: React.MouseEvent<HTMLElement>) => {\n this._removePromotion(props.cart, event);\n };\n\n const promoCodTotalDiscount = props.cart.cart.Coupons.reduce((count: number, coupon: Coupon) => {\n return count + (this._calculateDiscount(coupon.Code || '', props.cart) || 0);\n }, 0);\n\n return (\n <>\n <div className='msc-promo-code__discount'>\n <div className='msc-promo-code__discount-heading'>{this.props.appliedPromoCodeHeadingText}</div>\n <PriceComponent\n data={{\n price: {\n CustomerContextualPrice: promoCodTotalDiscount\n }\n }}\n context={props.context}\n id={props.id}\n typeName={props.typeName}\n className='msc-promo-code__discount-value'\n />\n </div>\n {props.cart.cart.Coupons.map((coupon: Coupon) => {\n const ariaLabel = props.removePromoAriaLabelFormat\n ? format(props.removePromoAriaLabelFormat, props.removePromoText, coupon.Code)\n : '';\n\n return (\n <div key={coupon.Code} className='msc-promo-code__line-container'>\n <div className='msc-promo-code__line-value'>\n {coupon.Code}{' '}\n <PriceComponent\n data={{\n price: {\n CustomerContextualPrice: this._calculateDiscount(coupon.Code || '', props.cart)\n }\n }}\n context={props.context}\n id={props.id}\n typeName={props.typeName}\n className='msc-promo-code__line-discount-value'\n />\n </div>\n <Button\n title={props.removePromoText}\n className='msc-promo-code__line__btn-remove'\n onClick={removePromotionHandler}\n data-value={coupon.Code}\n aria-label={ariaLabel}\n >\n {props.removePromoText}\n </Button>\n </div>\n );\n })}\n </>\n );\n };\n}\n\nexport default PromoCode;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { PriceComponent } from '@msdyn365-commerce/components';\nimport { ICoreContext, ITelemetry } from '@msdyn365-commerce/core';\nimport { ICheckoutState, IGiftCardExtend } from '@msdyn365-commerce/global-state';\nimport { Cart, CartLine } from '@msdyn365-commerce/retail-proxy';\nimport { format } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface IInvoiceSummaryProps {\n orderTotalLabel: string;\n invoiceLabel: string;\n loyaltyLabel?: string;\n giftcardLabel?: string;\n context: ICoreContext;\n telemetry: ITelemetry;\n cart: Cart;\n id: string;\n typeName: string;\n freeText?: string;\n toBeCalculatedText?: string;\n checkoutState?: ICheckoutState;\n}\n\nexport interface IInvoiceSummaryLines {\n orderTotal: React.ReactNode;\n invoices: React.ReactNode;\n giftCard?: React.ReactNode;\n loyalty?: React.ReactNode;\n}\n\ninterface IInvoiceSummaryLineProps {\n label: string;\n context: ICoreContext;\n telemetry: ITelemetry;\n price?: number;\n freeText?: string;\n toBeCalculatedText?: string;\n id: string;\n typeName: string;\n cssLabel: string;\n}\n\nconst InvoiceSummaryLine: React.FC<IInvoiceSummaryLineProps> = ({\n price,\n label,\n context,\n id,\n typeName,\n toBeCalculatedText,\n freeText,\n cssLabel\n}) => {\n return (\n <p className={`msc-invoice-summary__line-${cssLabel}`}>\n <span className=\"msc-invoice-summary__label\">{label}</span>\n {price || price === 0 ? (\n <PriceComponent\n data={{\n price: { CustomerContextualPrice: price }\n }}\n freePriceText={freeText}\n context={context}\n id={id}\n typeName={typeName}\n className=\"msc-invoice-summary__value\"\n />\n ) : (\n <span className=\"msc-invoice-summary__value\">{toBeCalculatedText}</span>\n )}\n </p>\n );\n};\n\nconst _buildPaymentSummarySection = (\n props: IInvoiceSummaryProps,\n price: number | undefined,\n label: string,\n cssLabel: string\n): React.ReactNode => {\n return (\n <InvoiceSummaryLine\n price={price}\n label={label}\n context={props.context}\n id={props.id}\n typeName={props.typeName}\n toBeCalculatedText={props.toBeCalculatedText}\n freeText={props.freeText}\n telemetry={props.telemetry}\n cssLabel={cssLabel}\n />\n );\n};\n\nconst _computedLoyaltyAmount = (checkoutState: ICheckoutState): number => {\n return (checkoutState && checkoutState.loyaltyAmount) || 0;\n};\n\nconst _computeGiftCardAmount = (checkoutState: ICheckoutState, cart: Cart): number => {\n const giftCardCounter = (count: number, giftCard: IGiftCardExtend) => {\n return count + (giftCard.Balance || 0);\n };\n const giftCardTotalValue = (checkoutState.giftCardExtends || []).reduce(giftCardCounter, 0);\n const amount = (cart.TotalAmount || 0) - _computedLoyaltyAmount(checkoutState);\n return Math.min(giftCardTotalValue, amount);\n};\n\nexport const InvoiceSummary = (props: IInvoiceSummaryProps) => {\n const { TotalAmount, CartLines } = props.cart;\n const invoiceLines = CartLines?.filter(cartLine => cartLine.IsInvoiceLine);\n const reactNodes: IInvoiceSummaryLines = {\n invoices: invoiceLines?.map((invoiceLine: CartLine) => {\n return _buildPaymentSummarySection(\n props,\n invoiceLine.InvoiceAmount,\n format(props.invoiceLabel, invoiceLine.InvoiceId),\n 'invoice'\n );\n }),\n orderTotal: _buildPaymentSummarySection(props, TotalAmount, props.orderTotalLabel, 'total')\n };\n\n if (props.checkoutState) {\n const giftCardAmount = _computeGiftCardAmount(props.checkoutState, props.cart);\n const loyaltyAmount = _computedLoyaltyAmount(props.checkoutState);\n const totalAmountAfterGiftCard = (TotalAmount || 0) - giftCardAmount - loyaltyAmount;\n\n if (loyaltyAmount > 0) {\n reactNodes.loyalty = _buildPaymentSummarySection(props, -loyaltyAmount, props.loyaltyLabel || 'Loyalty amount', 'loyalty');\n }\n\n if (giftCardAmount > 0) {\n reactNodes.giftCard = _buildPaymentSummarySection(\n props,\n -giftCardAmount,\n props.giftcardLabel || 'Gift card amount',\n 'gift-card'\n );\n }\n\n reactNodes.orderTotal = _buildPaymentSummarySection(\n { ...props, freeText: undefined },\n totalAmountAfterGiftCard,\n props.orderTotalLabel,\n 'total'\n );\n }\n\n return reactNodes;\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { PriceComponent } from '@msdyn365-commerce/components';\nimport { ICoreContext, ITelemetry } from '@msdyn365-commerce/core';\nimport { ICheckoutState, IGiftCardExtend } from '@msdyn365-commerce/global-state';\nimport { Cart, ChannelConfiguration, ChannelDeliveryOptionConfiguration } from '@msdyn365-commerce/retail-proxy';\nimport * as React from 'react';\n\nexport interface IOrderSummaryProps {\n subTotalLabel: string;\n shippingLabel: string;\n taxLabel: string;\n orderTotalLabel: string;\n loyaltyLabel?: string;\n giftcardLabel?: string;\n totalDiscountsLabel: string;\n context: ICoreContext;\n telemetry: ITelemetry;\n cart: Cart;\n channelConfiguration: ChannelConfiguration;\n id: string;\n typeName: string;\n otherChargeLabel?: string;\n freeText?: string;\n toBeCalculatedText?: string;\n checkoutState?: ICheckoutState;\n retailMultiplePickUpOptionEnabled?: boolean;\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n isTaxIncludedInPrice?: boolean;\n isShowTaxBreakup?: boolean;\n customerAccountLabel?: string;\n}\n\nexport interface IOrderSummaryLines {\n subtotal: React.ReactNode;\n shipping?: React.ReactNode;\n otherCharge?: React.ReactNode;\n tax: React.ReactNode;\n orderTotal: React.ReactNode;\n totalDiscounts?: React.ReactNode;\n giftCard?: React.ReactNode;\n loyalty?: React.ReactNode;\n customerAccount?: React.ReactNode;\n}\n\ninterface IOrderSummaryLineProps {\n label: string;\n context: ICoreContext;\n telemetry: ITelemetry;\n price?: number;\n freeText?: string;\n toBeCalculatedText?: string;\n id: string;\n typeName: string;\n cssLabel: string;\n priceCurrency?: string;\n}\n\ninterface IShippingOrderLine {\n cart: Cart;\n channelConfiguration: ChannelConfiguration;\n canShip?: boolean;\n hasDeliveryMethod?: boolean;\n hasShippingMethod?: boolean;\n freightFee?: number;\n}\n\nconst OrderSummaryLine: React.FC<IOrderSummaryLineProps> = ({\n price,\n label,\n context,\n id,\n typeName,\n toBeCalculatedText,\n freeText,\n cssLabel,\n priceCurrency\n}) => {\n return (\n <p className={`msc-order-summary__line-${cssLabel}`}>\n <span className=\"msc-order-summary__label\">{label}</span>\n {price || price === 0 ? (\n <PriceComponent\n data={{\n price: { CustomerContextualPrice: price }\n }}\n freePriceText={freeText}\n context={context}\n id={id}\n typeName={typeName}\n className=\"msc-order-summary__value\"\n currencyCode={priceCurrency}\n />\n ) : (\n <span className=\"msc-order-summary__value\">{toBeCalculatedText}</span>\n )}\n </p>\n );\n};\n\nconst _buildOrderSummarySection = (\n props: IOrderSummaryProps,\n price: number | undefined,\n cssLabel: string,\n label: string = ''\n): React.ReactNode => {\n return (\n <OrderSummaryLine\n price={price}\n label={label}\n context={props.context}\n id={props.id}\n typeName={props.typeName}\n toBeCalculatedText={props.toBeCalculatedText}\n freeText={props.freeText}\n telemetry={props.telemetry}\n cssLabel={cssLabel}\n priceCurrency={props.channelConfiguration.Currency}\n />\n );\n};\n\nconst _computedLoyaltyAmount = (checkoutState: ICheckoutState): number => {\n return (checkoutState && checkoutState.loyaltyAmount) || 0;\n};\n\nconst _computedCustomerAccountAmount = (checkoutState: ICheckoutState): number => {\n return (checkoutState && checkoutState.customerAccountAmount) || 0;\n};\n\nconst _computeGiftCardAmount = (checkoutState: ICheckoutState, cart: Cart): number => {\n const giftCardCounter = (count: number, giftCard: IGiftCardExtend) => {\n return count + (giftCard.Balance || 0);\n };\n const giftCardTotalValue = (checkoutState.giftCardExtends || []).reduce(giftCardCounter, 0);\n const amount = (cart.TotalAmount || 0) - _computedLoyaltyAmount(checkoutState);\n return Math.min(giftCardTotalValue, amount);\n};\n\nconst getDeliveryConfiguration = (\n cart: Cart,\n channelConfiguration: ChannelConfiguration,\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration,\n retailMultiplePickUpOptionEnabled?: boolean,\n isTaxIncludedInPrice?: boolean,\n isShowTaxBreakup?: boolean\n): IShippingOrderLine => {\n const pickupDeliveryModeCode = channelConfiguration && channelConfiguration.PickupDeliveryModeCode;\n const emailDeliveryModeCode = channelConfiguration && channelConfiguration.EmailDeliveryModeCode;\n const cartLines = cart.CartLines || [];\n const deliveryModes = cartLines.map(cartLine => cartLine.DeliveryMode);\n const taxOnShippingCharge = cart.TaxOnShippingCharge !== undefined ? cart.TaxOnShippingCharge : 0;\n const shippingChargeAmount = cart.ShippingChargeAmount !== undefined ? cart.ShippingChargeAmount : 0;\n\n // isTaxIncludedInPrice isShowTaxBreakup useProperties\n // False False/True shippingChargeAmount\n // True True shippingChargeAmount\n // True false shippingChargeAmount + taxOnShippingCharge\n // if either of isTaxIncludedInPrice or isShowTaxBreakup is undefined then we will execute old logic\n let freightFee: number | undefined = 0;\n if (isTaxIncludedInPrice === undefined || isShowTaxBreakup === undefined) {\n freightFee = cart.ShippingChargeAmount;\n } else {\n freightFee = isTaxIncludedInPrice && !isShowTaxBreakup ? shippingChargeAmount + taxOnShippingCharge : cart.ShippingChargeAmount;\n }\n const canShip = deliveryModes.some(\n deliveryMode =>\n !(\n deliveryMode !== '' &&\n (deliveryMode ===\n getDeliveryMode(deliveryMode, retailMultiplePickUpOptionEnabled, channelDeliveryOptionConfig, pickupDeliveryModeCode) ||\n deliveryMode === emailDeliveryModeCode)\n )\n );\n const hasDeliveryMethod = deliveryModes.some(deliveryMode => !!deliveryMode && deliveryMode !== emailDeliveryModeCode);\n const hasShippingMethod = deliveryModes.some(\n deliveryMode =>\n !!deliveryMode &&\n deliveryMode !==\n getDeliveryMode(deliveryMode, retailMultiplePickUpOptionEnabled, channelDeliveryOptionConfig, pickupDeliveryModeCode) &&\n deliveryMode !== emailDeliveryModeCode\n );\n return {\n canShip,\n hasDeliveryMethod,\n hasShippingMethod,\n freightFee\n } as IShippingOrderLine;\n};\n\nconst getDeliveryMode = (\n deliveryMode?: string,\n featureSate: boolean = false,\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration,\n pickupDeliveryMode?: string\n) => {\n if (!featureSate) {\n return pickupDeliveryMode;\n }\n return channelDeliveryOptionConfig?.PickupDeliveryModeCodes?.find(dM => dM === deliveryMode);\n};\n\n// eslint-disable-next-line complexity\nexport const OrderSummary = (props: IOrderSummaryProps) => {\n const {\n SubtotalAmount,\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Existing Property.\n SubtotalAmountWithoutTax,\n TaxAmount,\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Existing Property.\n TaxOnNonShippingCharges,\n DiscountAmount = 0,\n TotalAmount,\n OtherChargeAmount\n } = props.cart;\n\n const { canShip, hasDeliveryMethod, hasShippingMethod, freightFee } = getDeliveryConfiguration(\n props.cart,\n props.channelConfiguration,\n props.channelDeliveryOptionConfig,\n props.retailMultiplePickUpOptionEnabled,\n props.isTaxIncludedInPrice,\n props.isShowTaxBreakup\n );\n\n let reactNodes: IOrderSummaryLines;\n // if either of isTaxIncludedInPrice or isShowTaxBreakup is undefined then we will execute old logic\n if (props.isTaxIncludedInPrice === undefined || props.isShowTaxBreakup === undefined) {\n reactNodes = {\n subtotal: _buildOrderSummarySection(props, SubtotalAmount, 'sub-total', props.subTotalLabel),\n tax: _buildOrderSummarySection(props, hasDeliveryMethod ? TaxAmount : undefined, 'tax-amount', props.taxLabel),\n orderTotal: _buildOrderSummarySection(props, TotalAmount, 'total', props.orderTotalLabel),\n otherCharge:\n (OtherChargeAmount && _buildOrderSummarySection(props, OtherChargeAmount, 'other-charges', props.otherChargeLabel)) ||\n undefined\n };\n } else {\n const otherChargeAmount = OtherChargeAmount !== undefined ? OtherChargeAmount : 0;\n const taxOnNonShippingCharges = TaxOnNonShippingCharges !== undefined ? TaxOnNonShippingCharges : 0;\n const isTaxGreaterThanZero = TaxAmount !== undefined && TaxAmount > 0;\n // isTaxIncludedInPrice isShowTaxBreakup useProperties\n // False False/True otherChargeAmount\n // True True otherChargeAmount\n // True false otherChargeAmount+TaxOnNonShippingCharges\n\n const otherChargeAmountTotal =\n props.isTaxIncludedInPrice && !props.isShowTaxBreakup ? otherChargeAmount + taxOnNonShippingCharges : otherChargeAmount;\n\n const subtotalAmountActual = props.isTaxIncludedInPrice && props.isShowTaxBreakup ? SubtotalAmountWithoutTax : SubtotalAmount;\n\n reactNodes = {\n subtotal: _buildOrderSummarySection(props, subtotalAmountActual, 'sub-total', props.subTotalLabel),\n tax: props.isShowTaxBreakup\n ? _buildOrderSummarySection(\n props,\n hasDeliveryMethod || isTaxGreaterThanZero ? TaxAmount : undefined,\n 'tax-amount',\n props.taxLabel\n )\n : '',\n orderTotal: _buildOrderSummarySection(props, TotalAmount, 'total', props.orderTotalLabel),\n otherCharge:\n (OtherChargeAmount && _buildOrderSummarySection(props, otherChargeAmountTotal, 'other-charges', props.otherChargeLabel)) ||\n undefined\n };\n }\n if (canShip) {\n reactNodes.shipping = _buildOrderSummarySection(props, hasShippingMethod ? freightFee : undefined, 'shipping', props.shippingLabel);\n }\n if (props.checkoutState) {\n const giftCardAmount = _computeGiftCardAmount(props.checkoutState, props.cart);\n const loyaltyAmount = _computedLoyaltyAmount(props.checkoutState);\n const customerAccountAmount = _computedCustomerAccountAmount(props.checkoutState);\n const totalAmountAfterGiftCard = (TotalAmount || 0) - giftCardAmount - loyaltyAmount - customerAccountAmount;\n\n if (loyaltyAmount > 0) {\n reactNodes.loyalty = _buildOrderSummarySection(props, -loyaltyAmount, 'loyalty', props.loyaltyLabel || 'Loyalty amount');\n }\n\n if (giftCardAmount > 0) {\n reactNodes.giftCard = _buildOrderSummarySection(props, -giftCardAmount, 'gift-card', props.giftcardLabel || 'Gift card amount');\n }\n\n if (customerAccountAmount > 0) {\n reactNodes.customerAccount = _buildOrderSummarySection(\n props,\n -customerAccountAmount,\n 'customer-credit-amount',\n props.customerAccountLabel || 'Customer Credit amount'\n );\n }\n\n reactNodes.orderTotal = _buildOrderSummarySection(\n { ...props, freeText: undefined },\n totalAmountAfterGiftCard,\n 'total',\n props.orderTotalLabel\n );\n }\n\n if (DiscountAmount > 0) {\n reactNodes.totalDiscounts = _buildOrderSummarySection(props, -DiscountAmount, 'total-discounts', props.totalDiscountsLabel);\n }\n\n return reactNodes;\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\nimport { IPriceComponentResources, ProductComponent } from '@msdyn365-commerce/components';\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { getCatalogId, getUrlSync, ICoreContext } from '@msdyn365-commerce/core';\nimport { ProductPrice, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\nimport {\n ArrayExtensions,\n DimensionAvailabilitiesForProductSearchResultInput,\n DimensionTypes,\n DimensionSwatchDisplayTypes,\n getDimensionAvailabilitiesForProductSearchResultAction,\n getPriceForProductSearchResult,\n IDimensionsApp,\n ObjectExtensions,\n PriceForProductSearchResultInput,\n ProductPriceForSelectedProductsInput,\n validateCatalogId,\n getProductPriceForSelectedProducts\n} from '@msdyn365-commerce-modules/retail-actions';\nimport {\n Button,\n getTelemetryObject,\n IComponentNodeProps,\n IModuleProps,\n INodeProps,\n ISingleSlideCarouselProps,\n ITelemetryContent,\n NodeTag,\n SingleSlideCarousel\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { IProductCollectionData } from './product-collection.data';\nimport { IProductCollectionProps, layout } from './product-collection.props.autogenerated';\n\nexport interface IProductCollectionViewProps extends IProductCollectionProps<IProductCollectionData> {\n heading?: React.ReactNode;\n ProductCollectionContainer: IModuleProps;\n SingleSlideCarouselComponentProps: INodeProps;\n GridComponentProps: INodeProps;\n products: IProductComponentViewProps[];\n isCarousel: boolean;\n productPrices?: ProductPrice[];\n seeAllButton?: React.ReactNode;\n}\n\nexport interface IProductComponentViewProps {\n ProductContainer: INodeProps;\n productComponent: React.ReactNode;\n}\nexport interface IProductComponentState {\n products: ProductSearchResult[];\n productPrices: ProductPrice[];\n productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\n}\n\n/**\n * ProductCollection component.\n */\nclass ProductCollection extends React.PureComponent<IProductCollectionProps<IProductCollectionData>, IProductComponentState> {\n private readonly telemetryContent: ITelemetryContent;\n\n private readonly productPrices: ProductPrice[];\n\n constructor(props: IProductCollectionProps<IProductCollectionData>) {\n super(props);\n this.productPrices = [];\n this.state = {\n products: this.props.config.productCollection.products || [],\n productPrices: this.productPrices || []\n };\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n }\n\n public async componentDidMount(): Promise<void> {\n if (this.props.config.enableAffiliationBasedPricing && this.props.context.actionContext.requestContext.user.isAuthenticated) {\n await this._getActivePrice();\n }\n }\n\n public render(): JSX.Element | null {\n const { heading, className, shouldDisplaySeeAllButton } = this.props.config;\n const { resources } = this.props;\n const recommendation = this.props.config.productCollection.recommendationListId;\n const discountIds = this.props.config.productCollection.discountIds;\n\n // Initialize state in case if the products were not found during initial module render\n // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Initialize data if not there.\n this.initProductState(this.props.config.productCollection);\n\n const products = this.state.products;\n const productPrices = this.state.productPrices;\n\n const isCarousel = this.props.config.layout === layout.carousel;\n const headingLabel = heading ? heading.text : '';\n const headingComponent = heading && (\n <Msdyn365.Text\n className='ms-product-collection__heading'\n tag={heading.tag || 'h1'}\n text={headingLabel}\n editProps={{ onEdit: this.handleHeadingChange, requestContext: this.props.context.request }}\n />\n );\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- product check for safety.\n const updatedProducts = products?.map((item: ProductSearchResult, index: number) => {\n const getProductData = this._getProduct(\n item,\n index,\n productPrices ? productPrices.find(p => p.ProductId === item.RecordId) : undefined\n );\n return !ObjectExtensions.isNullOrUndefined(getProductData) ? getProductData : undefined;\n });\n\n const productCollectionViewProps = {\n ...this.props,\n heading: headingComponent,\n SingleSlideCarouselComponentProps: {\n tag: SingleSlideCarousel,\n className: '',\n flipperPrevLabel: `${headingLabel} ${resources.flipperPrevious}`,\n flipperNextLabel: `${headingLabel} ${resources.flipperNext}`,\n parentId: this.props.id,\n telemetryContent: this.telemetryContent\n } as IComponentNodeProps<ISingleSlideCarouselProps>,\n ProductCollectionContainer: {\n moduleProps: this.props,\n className: classnames('ms-product-collection', className)\n },\n GridComponentProps: {\n tag: 'ul' as NodeTag,\n className: 'ms-product-collection__items'\n },\n isCarousel,\n\n products:\n ArrayExtensions.hasElements(updatedProducts) &&\n updatedProducts.filter(item => {\n return item !== undefined;\n }),\n productPrices: this.productPrices,\n seeAllButton:\n (recommendation || discountIds) &&\n shouldDisplaySeeAllButton &&\n (ArrayExtensions.hasElements(updatedProducts) || this.props.config.productCollection.listType === 'promotional')\n ? this._getSeeAllButton(headingLabel, recommendation, discountIds)\n : undefined,\n resources: resources\n };\n return this.props.renderView(productCollectionViewProps) as React.ReactElement;\n }\n\n public handleHeadingChange = (event: Msdyn365.ContentEditableEvent) => (this.props.config.heading!.text = event.target.value);\n\n /**\n * Get products dimension availabilities.\n * @param products - Products.\n * @returns Promise.\n */\n private readonly _getProductsDimensionsAvailabilities = async (products: ProductSearchResult[]): Promise<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 const validProducts = ArrayExtensions.validValues(products);\n if (\n ArrayExtensions.hasElements(validProducts) &&\n ArrayExtensions.hasElements(dimensionsToDisplayOnProductCard) &&\n !dimensionsToDisplayOnProductCard.includes(DimensionTypes.none) &&\n ArrayExtensions.hasElements(dimensionsToDisplayAsSwatch) &&\n !dimensionsToDisplayAsSwatch.includes(DimensionTypes.none)\n ) {\n const productsDimensionAvailabilities = await getDimensionAvailabilitiesForProductSearchResultAction(\n new DimensionAvailabilitiesForProductSearchResultInput(\n validProducts,\n this.props.context as ICoreContext<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 /**\n * Helper method to initialize products state.\n * @param productCollection - List of products.\n */\n private readonly initProductState = async (productCollection: Msdyn365.IProductList) => {\n let products = this.state.products;\n let productPrices = this.state.productPrices;\n const productCollectionProducts = productCollection.products;\n if (!ArrayExtensions.hasElements(products) && ArrayExtensions.hasElements(productCollectionProducts)) {\n products = productCollectionProducts;\n this.setState({ products });\n } else if (\n ArrayExtensions.hasElements(products) &&\n ArrayExtensions.hasElements(productCollectionProducts) &&\n !ArrayExtensions.equals(products, productCollectionProducts)\n ) {\n products = productCollectionProducts;\n this.setState({ products });\n } else if (productCollectionProducts === undefined && ArrayExtensions.hasElements(this.state.products)) {\n products = [];\n this.setState({ products: products });\n }\n\n if (Msdyn365.msdyn365Commerce.isBrowser && !ArrayExtensions.hasElements(this.state.productsDimensionAvailabilities)) {\n await this._getProductsDimensionsAvailabilities(products);\n }\n\n if (this.props.config.productCollection.listType === 'promotional') {\n productPrices = await getProductPriceForSelectedProducts(\n new ProductPriceForSelectedProductsInput(products.filter(p => !p.IsMasterProduct).map(p => p.RecordId)),\n this.props.context.actionContext\n );\n\n this.setState({ productPrices: productPrices });\n }\n };\n\n private readonly _getProduct = (\n product: ProductSearchResult,\n index: number,\n productPrice?: ProductPrice\n ): IProductComponentViewProps | null => {\n if (!product || !product.Name) {\n this.props.telemetry.trace('[product-collection] Product or product name is null');\n return null;\n }\n const telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n const { imageSettings, allowBackNavigation } = this.props.config;\n const resources = this.props.resources;\n const breaCrumbType = this.props.context.app.config.breadcrumbType;\n const allowBack = allowBackNavigation && (breaCrumbType === 'back' || breaCrumbType === 'categoryAndBack');\n const quickviewSlot =\n this.props.slots && this.props.slots.quickview && this.props.slots.quickview.length > 0 ? this.props.slots.quickview[0] : null;\n const productComparisonButtonSlot = ArrayExtensions.hasElements(this.props.slots.productComparisonButton)\n ? this.props.slots.productComparisonButton[0]\n : null;\n\n const reviewCount = 1;\n const reviewTotalRatings = Number(product.TotalRatings);\n const reviewCountAriaLabelValue =\n reviewTotalRatings > reviewCount ? resources.ratingCountAriaLabel : resources.ratingCountAriaLabelSingleUser;\n const isPriceMinMaxEnabled = this.props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailSearchPriceRangeFeature'\n );\n const priceResources: IPriceComponentResources = {\n priceRangeSeparator: resources.priceRangeSeparator\n };\n return {\n ProductContainer: {\n tag: 'li' as NodeTag,\n className: 'ms-product-collection__item',\n role: 'listitem',\n key: index\n },\n productComponent: (\n <ProductComponent\n context={this.props.context}\n telemetryContent={telemetryContent}\n imageSettings={imageSettings}\n freePriceText={resources.priceFree}\n originalPriceText={resources.originalPriceText}\n currentPriceText={resources.currentPriceText}\n ratingAriaLabel={resources.ratingAriaLabel}\n ratingCountAriaLabel={reviewCountAriaLabelValue}\n allowBack={allowBack}\n id={this.props.id}\n typeName={this.props.typeName}\n data={{ product, productPrice }}\n quickViewButton={quickviewSlot}\n productComparisonButton={productComparisonButtonSlot}\n isPriceMinMaxEnabled={isPriceMinMaxEnabled?.IsEnabled}\n priceResources={priceResources}\n dimensionAvailabilities={this.state.productsDimensionAvailabilities?.find(\n dimensionAvailability =>\n ArrayExtensions.hasElements(dimensionAvailability) &&\n dimensionAvailability[0].masterProductId === (product.MasterProductId ?? product.RecordId)\n )}\n />\n )\n };\n };\n\n /**\n * Get the active price for products.\n */\n private readonly _getActivePrice = async (): Promise<void> => {\n const productsList = this.state.products;\n const products = await getPriceForProductSearchResult(\n new PriceForProductSearchResultInput(productsList),\n this.props.context.actionContext\n );\n if (Msdyn365.msdyn365Commerce.isBrowser) {\n await this._getProductsDimensionsAvailabilities(products);\n }\n\n this.setState({ products });\n };\n\n /**\n * Get the see all button.\n * @param headingLabel - Heading label.\n * @param recommendation - Recommendation.\n * @param discountIds - Discount Ids.\n * @returns IProductComponentSeeAllViewProps - Product component see all view props.\n */\n private readonly _getSeeAllButton = (headingLabel: string, recommendation?: string, discountIds?: string[]): React.ReactNode => {\n if (!Msdyn365.msdyn365Commerce.isBrowser) {\n return null;\n }\n\n if (!recommendation && !discountIds) {\n return null;\n }\n\n const catalogId = getCatalogId(this.props.context.request);\n validateCatalogId(catalogId);\n const searchPageLink = getUrlSync('search', this.props.context.actionContext);\n if (!searchPageLink) {\n return null;\n }\n\n const url = new URL(searchPageLink, window.location.href);\n\n if (discountIds) {\n // see all button for promotion page\n url.searchParams.set('discountIds', discountIds.toString());\n url.searchParams.set('title', headingLabel);\n url.searchParams.set('catalogid', `${catalogId}`);\n } else if (recommendation) {\n // See all button for recommendation\n url.searchParams.set('recommendation', recommendation);\n url.searchParams.set('title', headingLabel);\n url.searchParams.set('catalogid', `${catalogId}`);\n }\n\n return (\n <Button\n className='ms-product-collection__see-all-btn msc-cta__primary'\n title={this.props.resources.seeAllButtonText}\n href={url.href}\n >\n {this.props.resources.seeAllButtonText}\n </Button>\n );\n };\n}\n\nexport default ProductCollection;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { INodeProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IProductCollectionViewProps, IProductComponentViewProps } from './product-collection';\nimport { IProductCollectionResources } from './product-collection.props.autogenerated';\n\nconst ProductCollectionView: React.FC<IProductCollectionViewProps> = props => {\n const {\n heading,\n ProductCollectionContainer,\n products,\n SingleSlideCarouselComponentProps,\n GridComponentProps,\n isCarousel,\n seeAllButton,\n resources\n } = props;\n\n if (products) {\n return (\n <Module {...ProductCollectionContainer}>\n {heading}\n {seeAllButton}\n {isCarousel ? _renderCarousel(SingleSlideCarouselComponentProps, products) : _renderGrid(GridComponentProps, products)}\n </Module>\n );\n }\n\n // If no products are retrieved and the list type is promotional, still render the module to keep the entry of promotion page\n if (props.config.productCollection.listType === 'promotional') {\n return (\n <Module {...ProductCollectionContainer}>\n {heading}\n {seeAllButton}\n {_renderNoProduct(resources)}\n </Module>\n );\n }\n props.context.telemetry.error('Product collection content is empty, module wont render.');\n return null;\n};\n\nconst _renderCarousel = (carouselContainer: INodeProps, items: IProductComponentViewProps[]): JSX.Element => {\n return <Node {...carouselContainer}>{items && items.map(_renderProduct)}</Node>;\n};\n\nconst _renderGrid = (gridContainer: INodeProps, items: IProductComponentViewProps[]): JSX.Element => {\n return <Node {...gridContainer}>{items && items.map(_renderProduct)}</Node>;\n};\n\nconst _renderNoProduct = (resources: IProductCollectionResources): JSX.Element => {\n return (\n <Node className={''}>\n <p>{resources.noProductToRenderText}</p>\n </Node>\n );\n};\n\nconst _renderProduct = (product: IProductComponentViewProps): JSX.Element => {\n const { ProductContainer, productComponent } = product;\n\n return <Node {...ProductContainer}>{productComponent}</Node>;\n};\n\nexport default ProductCollectionView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Button, Collapse, ICollapseProps } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { IQuickOrderDrawerProps } from './quick-order-drawer-props';\n\nexport interface IQuickOrderDrawerState {\n isOpen: boolean;\n}\n\nexport type GlyphPlacement = 'start' | 'end';\n\n/**\n * Quick Order Drawer - This is a full width uncontrolled collapse where the button glyph changes\n * when the drawer is open and closed.\n */\n\nexport default class QuickOrderDrawer extends React.Component<IQuickOrderDrawerProps, IQuickOrderDrawerState> {\n public state: IQuickOrderDrawerState;\n\n private readonly drawerOpenGlyph: string;\n\n private readonly drawerCloseGlyph: string;\n\n private readonly drawerGlyphClass: string;\n\n private isManuallyToggled: boolean;\n\n constructor(props: IQuickOrderDrawerProps) {\n super(props);\n this._toggle = this._toggle.bind(this);\n this.isManuallyToggled = false;\n this.state = { isOpen: (props.collapseProps && props.collapseProps.isOpen) || false };\n this.drawerGlyphClass = classnames('drawer__glyph', this.props.toggleGlyphClassName ? this.props.toggleGlyphClassName : '');\n\n if (this.props.animateGlyph) {\n this.drawerOpenGlyph = classnames(\n this.drawerGlyphClass,\n this.props.openGlyph ? this.props.openGlyph : this.props.closeGlyph ? this.props.closeGlyph : ''\n );\n this.drawerCloseGlyph = this.drawerOpenGlyph;\n } else {\n this.drawerOpenGlyph = classnames(this.drawerGlyphClass, this.props.openGlyph ? this.props.openGlyph : '');\n this.drawerCloseGlyph = classnames(this.drawerGlyphClass, this.props.closeGlyph ? this.props.closeGlyph : '');\n }\n }\n\n public shouldComponentUpdate(nextProps: IQuickOrderDrawerProps, nextState: IQuickOrderDrawerState): boolean {\n if (this.state === nextState && this.props === nextProps) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element {\n const collapseProps = { ...this.props.collapseProps } as ICollapseProps;\n\n // If the drawer is manually toggled by pressing the button, then we use the internal state\n if (collapseProps.isOpen === undefined || this.isManuallyToggled) {\n collapseProps.isOpen = this.state.isOpen;\n } else {\n // eslint-disable-next-line react/no-direct-mutation-state\n this.state.isOpen = collapseProps.isOpen;\n }\n collapseProps.children = this.props.children;\n const drawerClass = classnames('drawer', this.props.className ? this.props.className : '');\n this.isManuallyToggled = false;\n return (\n <div className={drawerClass}>\n <Button\n {...this.props.toggleButtonProps}\n onClick={this._toggle}\n aria-expanded={collapseProps.isOpen}\n block\n disabled={this.props.disabled}\n className='drawer__button'\n color='secondary'\n >\n {this._generateDrawerButtonInnerMarkup(collapseProps.isOpen)}\n </Button>\n <Collapse {...collapseProps} />\n </div>\n );\n }\n\n private _generateDrawerButtonInnerMarkup(collapseState: boolean): JSX.Element {\n const drawerButtonTextClass = classnames(\n 'drawer__buttontext',\n this.props.toggleButtonClassName ? this.props.toggleButtonClassName : ''\n );\n return (\n <>\n <h2 className={classnames(drawerButtonTextClass, '__start ms-quick-order__heading')}>{this.props.moduleHeadingText}</h2>\n <span className={classnames(drawerButtonTextClass, '__start ms-quick-order__description')}>\n {this.props.moduleDescriptionText}\n </span>\n {this._generateGlyphMarkup('drawer__glyph__end', collapseState)}\n </>\n );\n }\n\n private _generateGlyphMarkup(location: string, collapseState: boolean): JSX.Element {\n let glyphClass = collapseState ? this.drawerOpenGlyph : this.drawerCloseGlyph;\n glyphClass = `${glyphClass} ${location}`;\n return <span className={glyphClass} />;\n }\n\n private _toggle(e: React.MouseEvent<HTMLElement> | React.KeyboardEvent<HTMLElement>): void {\n e.preventDefault();\n this.setState({ isOpen: !this.state.isOpen });\n this.isManuallyToggled = true;\n if (this.props.onToggle) {\n this.props.onToggle(this.state);\n }\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Alert, Button } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IQuickOrderState } from '../quick-order';\n\nexport interface IQuickOrderFormProps {\n disableAddtoCart: boolean | undefined;\n productTextInput: React.RefObject<HTMLInputElement>;\n quantityTextInput: React.RefObject<HTMLInputElement>;\n maxChars: number;\n maxQuantity?: number;\n ariaLabelQuantity: string;\n ariaLabelProduct: string;\n ariaLabelAddtoCart: string;\n addQuantityPlaceholderText: string;\n quickOrderState: IQuickOrderState;\n handleInputChange(query: string): void;\n handleQuantityChange(query: string): void;\n handleAddToCartClick(): Promise<void>;\n}\n\nexport interface IQuickOrderFormViewProps {\n product: React.ReactNode;\n quantity: React.ReactNode;\n addToCartBtn: React.ReactNode;\n userMessage?: React.ReactNode;\n}\n\n/**\n * On Input Change functionality.\n * @param handleInputChange -Input change function.\n * @returns Input change value.\n */\nconst onInputChangeFunction = (handleInputChange: (query: string) => void) => (event: React.ChangeEvent<HTMLInputElement>) => {\n handleInputChange(event.target.value || '');\n};\n\n/**\n * On Quantity Change functionality.\n * @param handleQuantityChange -Quantity change function.\n * @returns Quantity change value.\n */\nconst onQuantityChangeFunction = (handleQuantityChange: (query: string) => void) => (event: React.ChangeEvent<HTMLInputElement>) => {\n handleQuantityChange(event.target.value || '');\n};\n\nexport const QuickOrderFormComponent = (props: IQuickOrderFormProps): IQuickOrderFormViewProps => {\n const {\n productTextInput,\n quantityTextInput,\n quickOrderState,\n maxChars,\n maxQuantity,\n disableAddtoCart,\n ariaLabelQuantity,\n ariaLabelProduct,\n ariaLabelAddtoCart,\n addQuantityPlaceholderText,\n handleQuantityChange,\n handleInputChange,\n handleAddToCartClick\n } = props;\n\n const onInputChange = onInputChangeFunction(handleInputChange);\n\n const onQuantityInputChange = onQuantityChangeFunction(handleQuantityChange);\n\n const productNode = (\n <div className='ms-quick-order__content-form-main-product'>\n <h2 className='ms-quick-order__content-form-main-product-lable' aria-label={ariaLabelProduct}>\n {ariaLabelProduct}\n </h2>\n <input\n className='ms-quick-order__content-form-main-product-input'\n type='text'\n aria-label={ariaLabelProduct}\n ref={productTextInput}\n onChange={onInputChange}\n />\n </div>\n );\n\n const quantityNode = (\n <div className='ms-quick-order__content-form-main-quantity'>\n <h2 className='ms-quick-order__content-form-main-quantity-lable' aria-label={ariaLabelQuantity}>\n {ariaLabelQuantity}\n </h2>\n <input\n className='ms-quick-order__content-form-main-quantity-input'\n pattern='[0-9]*'\n ref={quantityTextInput}\n onChange={onQuantityInputChange}\n maxLength={maxChars}\n type='number'\n aria-live='polite'\n aria-label={ariaLabelQuantity}\n aria-valuemin={0}\n aria-valuemax={maxQuantity}\n aria-valuenow={quickOrderState.quantity}\n placeholder={addQuantityPlaceholderText}\n />\n </div>\n );\n\n const addtoCartNode = (\n <div className='ms-quick-order__content-form-main-addtocart'>\n <Button\n className='ms-quick-order__content-form-main-addtocart-button'\n disabled={disableAddtoCart}\n aria-label={ariaLabelAddtoCart}\n onClick={handleAddToCartClick}\n >\n {ariaLabelAddtoCart}\n </Button>\n </div>\n );\n\n const userMessageNode =\n quickOrderState && quickOrderState.stateMessage ? (\n <Alert color={quickOrderState.stateMessage.statusCssString} isOpen={quickOrderState.stateMessage.isOpen}>\n <span className={quickOrderState.stateMessage.messageGlyph} />\n <span>{quickOrderState.stateMessage.messageText}</span>\n </Alert>\n ) : (\n undefined\n );\n\n return {\n product: productNode,\n addToCartBtn: addtoCartNode,\n quantity: quantityNode,\n userMessage: userMessageNode\n };\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { CartLine, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { observable } from 'mobx';\n\n/**\n * Represents a product for quick order.\n */\nexport class QuickOrderProduct {\n @observable\n public isSelected: boolean;\n\n public readonly cartLine: CartLine;\n\n public readonly simpleProduct: SimpleProduct;\n\n public constructor(cartLine: CartLine, simpleProduct: SimpleProduct) {\n this.cartLine = cartLine;\n this.simpleProduct = simpleProduct;\n this.isSelected = false;\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IComponent, IComponentProps, ICoreContext } from '@msdyn365-commerce/core';\nimport classnames from 'classnames';\nimport React from 'react';\n\n/**\n * Interface for quick order table header resources.\n */\nexport interface IQuickOrderTableHeaderResources {\n quickOrderProductNumberText: string;\n quickOrderProductText: string;\n quickOrderUnitPriceText: string;\n quickOrderUnitOfMeasureText: string;\n quickOrderQuantityText: string;\n quickOrderTotalText: string;\n quickOrderActionsText: string;\n}\n\n/**\n * Interface for quick order table props.\n */\nexport interface IQuickOrderTableHeaderProps extends IComponentProps {\n context: ICoreContext;\n className: string;\n\n isMobile: boolean;\n resources: IQuickOrderTableHeaderResources;\n}\n\n/**\n * Interface for quick order table header component.\n */\nexport interface IQuickOrderTableHeaderComponent extends IComponent<IQuickOrderTableHeaderProps> {}\n\n/**\n * Get the quick order header cells for desktop.\n * @param props -- The quick order table header props.\n * @returns The list of cells for quick order header component in desktop version.\n */\nconst QuickOrderDesktopHeaderCellsComponent: React.FC<IQuickOrderTableHeaderProps> = (props: IQuickOrderTableHeaderProps) => {\n const { resources } = props;\n const columnWithNumberClassName = `${props.className}__row__column-with-number`;\n return (\n <>\n <th>\n <span className={classnames(`${props.className}__emptyColumn`)} />\n </th>\n <th>{resources.quickOrderProductNumberText}</th>\n <th>{resources.quickOrderProductText}</th>\n <th className={columnWithNumberClassName}>{resources.quickOrderUnitPriceText}</th>\n <th>{resources.quickOrderUnitOfMeasureText}</th>\n <th className={columnWithNumberClassName}>{resources.quickOrderQuantityText}</th>\n <th className={columnWithNumberClassName}>{resources.quickOrderTotalText}</th>\n <th>{resources.quickOrderActionsText}</th>\n </>\n );\n};\n\n/**\n * Get the quick order header cells for mobile.\n * @param props -- The quick order table header props.\n * @returns The quick order header component in desktop version.\n */\nconst QuickOrderMobileHeaderCellsComponent: React.FC<IQuickOrderTableHeaderProps> = (props: IQuickOrderTableHeaderProps) => {\n const { resources } = props;\n return (\n <>\n <th className={classnames(`${props.className}__emptyColumn`)} />\n <th>{resources.quickOrderProductNumberText}</th>\n <th />\n </>\n );\n};\n\n/**\n * Quick order table header component.\n * @param props - Configuration of the component.\n * @returns React node with the header.\n */\nexport const QuickOrderTableHeaderComponent: React.FC<IQuickOrderTableHeaderProps> = (props: IQuickOrderTableHeaderProps) => {\n const rowClassName = `${props.className}__row`;\n\n let headerCells: JSX.Element;\n if (props.isMobile) {\n headerCells = <QuickOrderMobileHeaderCellsComponent {...props} />;\n } else {\n headerCells = <QuickOrderDesktopHeaderCellsComponent {...props} />;\n }\n\n return (\n <thead className={props.className}>\n <tr className={rowClassName}>{headerCells}</tr>\n </thead>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IComponentProps, ICoreContext, IImageSettings, Image } from '@msdyn365-commerce/core';\nimport { CartLine, format, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { getFallbackImageUrl, getProductPageUrlSync, ObjectExtensions, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, IncrementalQuantity } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\n/**\n * Data required to render each quick order row.\n */\nexport interface IQuickOrderTableRowData {\n cartLine: CartLine;\n product: SimpleProduct;\n}\n\n/**\n * Resources for quick order table rows.\n */\nexport interface IQuickOrderTableRowResources {\n quickOrderQuantityMobileText: string;\n quickOrderProductDimensionsSeparator: string;\n quickOrderViewDetailsButtonText: string;\n quickOrderViewDetailsButtonAriaLabel: string;\n quickOrderRemoveItemButtonAriaLabel: string;\n quickOrderInputQuantityAriaLabel: string;\n quickOrderDecrementButtonAriaLabel: string;\n quickOrderIncrementButtonAriaLabel: string;\n}\n\n/**\n * Interface for quick order table props.\n */\nexport interface IQuickOrderTableRowProps extends IComponentProps<IQuickOrderTableRowData> {\n context: ICoreContext;\n className: string;\n\n imageSettings?: IImageSettings;\n isMobile: boolean;\n resources: IQuickOrderTableRowResources;\n}\n\n/**\n * The default image settings for quick order table row.\n */\nconst defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=80&h=80&m=6', w: 0, h: 0 },\n lg: { q: 'w=147&h=147&m=6', w: 0, h: 0 }\n },\n lazyload: true,\n cropFocalRegion: true\n};\n\n/**\n * Renders product image for quick order row.\n * @param props - Quick order table row props.\n * @returns React element.\n */\nconst QuickOrderTableRowProductImageComponent: React.FC<IQuickOrderTableRowProps> = (props: IQuickOrderTableRowProps) => {\n const fallbackImageUrl = getFallbackImageUrl(\n props.data.product.ItemId,\n props.context.actionContext.requestContext.apiSettings,\n props.context.request.app?.config?.OmniChannelMedia\n );\n\n const containerClassName = `${props.className}__product-image-container`;\n\n return (\n <div className={containerClassName}>\n <Image\n requestContext={props.context.actionContext.requestContext}\n className={`${containerClassName}__product-image`}\n altText={props.data.product.Name}\n src={props.data.product.PrimaryImageUrl ?? ''}\n fallBackSrc={fallbackImageUrl}\n gridSettings={props.context.request.gridSettings!}\n imageSettings={props.imageSettings ?? defaultImageSettings}\n loadFailureBehavior='empty'\n />\n </div>\n );\n};\n\n/**\n * Renders actions popup for the mobile view.\n * @param props - Configuration for popup.\n * @returns A react node with actions..\n */\nconst QuickOrderExtraActionsPopupComponent: React.FC<IQuickOrderTableRowProps> = (props: IQuickOrderTableRowProps): JSX.Element | null => {\n const product: SimpleProduct = props.data.product;\n\n let productUrl = '';\n if (!StringExtensions.isNullOrWhitespace(product.Name) && !ObjectExtensions.isNullOrUndefined(product.RecordId)) {\n productUrl = getProductPageUrlSync(product.Name!, product.RecordId, props.context.actionContext);\n }\n\n if (StringExtensions.isNullOrWhitespace(productUrl)) {\n return null;\n }\n\n const className = `${props.className}__extra-actions-cell`;\n\n return (\n <div className={className}>\n <Button className={`${className}__toggle`} />\n </div>\n );\n};\n\n/**\n * Renders quick order table rows for desktop view.\n * @param props - Configuration for the rows.\n * @returns A react node with a list of quick order rows for desktop view.\n */\nexport const QuickOrderDesktopTableRowCellComponent: React.FC<IQuickOrderTableRowProps> = (props: IQuickOrderTableRowProps) => {\n const product: SimpleProduct = props.data.product;\n const cartLine: CartLine = props.data.cartLine;\n const columnWithNumberClassName = `${props.className}__column-with-number`;\n\n let productUrl = '';\n if (!StringExtensions.isNullOrWhitespace(product.Name) && !ObjectExtensions.isNullOrUndefined(product.RecordId)) {\n productUrl = getProductPageUrlSync(product.Name!, product.RecordId, props.context.actionContext);\n }\n\n return (\n <>\n <td>\n <QuickOrderTableRowProductImageComponent {...props} />\n </td>\n <td>{product.ItemId}</td>\n <td>\n <div className={`${props.className}__product-info`}>\n <a className={`${props.className}__product-name`} href={productUrl}>\n {product.Name}\n </a>\n <span className={`${props.className}__product-dimensions`}>\n {product.Dimensions?.map(dimension => dimension.DimensionValue?.Value)\n .filter(dimensionValue => !StringExtensions.isNullOrWhitespace(dimensionValue))\n .join(props.resources.quickOrderProductDimensionsSeparator)}\n </span>\n </div>\n </td>\n <td className={columnWithNumberClassName}>{cartLine.Price}</td>\n <td>{cartLine.UnitOfMeasureSymbol}</td>\n <td className={`${props.className}__product-quantity`}>\n <IncrementalQuantity\n id={`msc-quick-order__quantity_${product.RecordId}-${cartLine.LineId ?? ''}`}\n max={10}\n currentCount={cartLine.Quantity}\n inputQuantityAriaLabel={props.resources.quickOrderInputQuantityAriaLabel}\n decrementButtonAriaLabel={props.resources.quickOrderDecrementButtonAriaLabel}\n incrementButtonAriaLabel={props.resources.quickOrderIncrementButtonAriaLabel}\n key={cartLine.LineId}\n isGiftCard={product.IsGiftCard}\n />\n </td>\n <td className={columnWithNumberClassName}>{cartLine.TotalAmount}</td>\n <td>\n <Button className={`${props.className}__product-remove`} aria-label={props.resources.quickOrderRemoveItemButtonAriaLabel} />\n </td>\n </>\n );\n};\n\n/**\n * Renders rows for mobile view.\n * @param props - Configuration for the rows.\n * @returns A react node with a list of quick order rows for mobile view.\n */\nexport const QuickOrderMobileTableRowCellComponent: React.FC<IQuickOrderTableRowProps> = (props: IQuickOrderTableRowProps) => {\n const product: SimpleProduct = props.data.product;\n const cartLine: CartLine = props.data.cartLine;\n\n return (\n <>\n <td>\n <QuickOrderTableRowProductImageComponent {...props} />\n </td>\n <td>\n <div className={`${props.className}__product-info`}>\n <span className={`${props.className}__product-name`}>{product.ItemId}</span>\n <span className={`${props.className}__product-quantity`}>\n {format(props.resources.quickOrderQuantityMobileText, cartLine.Quantity)}\n </span>\n </div>\n </td>\n <td>\n <QuickOrderExtraActionsPopupComponent {...props} />\n </td>\n </>\n );\n};\n\n/**\n * Quick order table row component.\n * @param props - Configuration of the component.\n * @returns React node for the row.\n */\nexport const QuickOrderTableRowComponent: React.FC<IQuickOrderTableRowProps> = (props: IQuickOrderTableRowProps) => {\n const rowClassName = `${props.className}__row`;\n\n let headerCells: JSX.Element;\n if (props.isMobile) {\n headerCells = <QuickOrderMobileTableRowCellComponent {...props} />;\n } else {\n headerCells = <QuickOrderDesktopTableRowCellComponent {...props} />;\n }\n\n return (\n <thead className={props.className}>\n <tr className={rowClassName}>{headerCells}</tr>\n </thead>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport MsDyn365, { IComponent, IComponentProps, ICoreContext } from '@msdyn365-commerce/core';\nimport React from 'react';\n\nimport { QuickOrderProduct } from '../quick-order-product';\nimport { IQuickOrderTableHeaderResources, QuickOrderTableHeaderComponent } from './components/quick-order-table-header-component';\nimport { IQuickOrderTableRowResources, QuickOrderTableRowComponent } from './components/quick-order-table-row-component';\n\n/**\n * Quick order table data interface.\n */\ninterface IQuickOrderTableData {\n quickOrderProducts: QuickOrderProduct[];\n}\n\n/**\n * Quick order table resources.\n */\nexport interface IQuickOrderTableResources extends IQuickOrderTableHeaderResources, IQuickOrderTableRowResources {}\n\n/**\n * Quick order table props.\n */\nexport interface IQuickOrderTableProps extends IComponentProps<IQuickOrderTableData> {\n context: ICoreContext;\n className: string;\n\n resources: IQuickOrderTableResources;\n isMobileView: boolean;\n}\n\n/**\n * Quick order table component.\n */\nexport interface IQuickOrderTableComponent extends IComponent<IQuickOrderTableProps> {}\n\n/**\n * The quick order table.\n * @param props -- The quick order table props.\n * @returns The quick order table element.\n */\nexport const QuickOrderTableComponent: React.FC<IQuickOrderTableProps> = (props: IQuickOrderTableProps) => {\n const [isMobile, setIsMobile] = React.useState(props.isMobileView);\n const quickOrderProducts = props.data.quickOrderProducts;\n\n /**\n * Update the view port.\n */\n const updateViewport = () => {\n setIsMobile(props.isMobileView);\n };\n if (MsDyn365.isBrowser) {\n window.addEventListener('resize', updateViewport);\n }\n\n const headerClassName = `${props.className}__header`;\n const rowClassName = `${props.className}__row`;\n\n return (\n <table className={props.className}>\n <QuickOrderTableHeaderComponent\n context={props.context}\n typeName={props.typeName}\n id={headerClassName}\n className={headerClassName}\n isMobile={isMobile}\n resources={props.resources}\n data={{}}\n />\n {quickOrderProducts.map((quickOrderProduct, index) => {\n return (\n <QuickOrderTableRowComponent\n context={props.context}\n typeName={props.typeName}\n id={`${rowClassName}-${index}`}\n key={quickOrderProduct.simpleProduct.ItemId}\n className={rowClassName}\n resources={props.resources}\n isMobile={isMobile}\n data={{\n cartLine: quickOrderProduct.cartLine,\n product: quickOrderProduct.simpleProduct\n }}\n />\n );\n })}\n </table>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ProductDimensionFull } from '@msdyn365-commerce/commerce-entities';\nimport {\n getProductConfigure,\n IErrorState,\n IProductDimensionCallbacks,\n IProductDimensionConfigureResources,\n IProductDimensionConfigureViewProps\n} from '@msdyn365-commerce/components';\nimport { CartLine, ProductDimension, ProductDimensionValue, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { getDeliveryOptionsAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\nimport {\n ArrayExtensions,\n FinitePromiseQueue,\n FinitePromiseQueueError,\n getDimensionsForSelectedVariant,\n GetDimensionsForSelectedVariantInput,\n getProductAvailabilitiesForSelectedVariant,\n getScanResult,\n GetScanResultInput,\n getSelectedVariant,\n IProductInventoryInformation,\n IPromiseQueue,\n ObjectExtensions,\n ProductAvailabilitiesForSelectedVariantInput,\n QueryResultSettingsProxy,\n SelectedVariantInput,\n StringExtensions\n} from '@msdyn365-commerce-modules/retail-actions';\nimport {\n getTelemetryObject,\n IModuleProps,\n INodeProps,\n ITelemetryContent,\n updateMaxQuantityForCartLineItem\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { debounce } from 'lodash';\nimport { computed, observable } from 'mobx';\nimport * as React from 'react';\n\nimport { QuickOrderDrawer, QuickOrderFormComponent, QuickOrderProduct } from './components';\nimport { QuickOrderTableComponent } from './components/quick-order-table/quick-order-table-component';\nimport { IQuickOrderData } from './quick-order.data';\nimport { IQuickOrderProps, IQuickOrderResources } from './quick-order.props.autogenerated';\n\n/**\n * Quick Order View Props Interface properties.\n */\nexport interface IQuickOrderViewProps extends IQuickOrderProps<IQuickOrderData> {\n isB2B?: boolean;\n productText: string;\n isQuickOrderFormExpanded: boolean;\n contentProps: INodeProps;\n drawer: INodeProps;\n quickOrderForm: INodeProps;\n quickOrderFormProductContent: INodeProps;\n quickOrderFormMsgContent: INodeProps;\n quickOrderProps: IModuleProps;\n quickOrderList?: React.ReactNode;\n form: React.ReactNode;\n configure?: IProductDimensionConfigureViewProps;\n isMobileView: boolean;\n}\n\n/**\n * Quick Order State Message Interface properties.\n */\nexport interface IQuickOrderStateMessage {\n isOpen: boolean;\n messageGlyph: string;\n messageText: string;\n statusCssString: string;\n}\n\n/**\n * GridSize Interface properties.\n */\nexport type GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\n/**\n * Quick Order Interface properties.\n */\nexport interface IQuickOrderState {\n isQuickOrderFormExpanded: boolean;\n isUpdatingDimension?: boolean;\n productAvailableQuantity: IProductInventoryInformation | undefined;\n productResponse: SimpleProduct | undefined;\n productDimensions: ProductDimensionFull[] | undefined;\n productText: string;\n quantity: number;\n stateMessage?: IQuickOrderStateMessage;\n productDimensionErrorState: IErrorState;\n isMobile: boolean;\n products: SimpleProduct[];\n}\n\n/**\n *\n * QuickOrder component.\n * @extends {React.PureComponent<IQuickOrderProps<IQuickOrderData>, IQuickOrderState>}\n */\nclass QuickOrder extends React.PureComponent<IQuickOrderProps<IQuickOrderData>, IQuickOrderState> {\n @observable\n private readonly viewport: GridSize;\n\n private readonly productTextInput: React.RefObject<HTMLInputElement>;\n\n private readonly quantityInput: React.RefObject<HTMLInputElement>;\n\n private readonly waitTime: number = 500;\n\n private readonly quickOrderFormClass: string;\n\n private readonly quickOrderFormProductContent: string;\n\n private readonly quickOrderFormMsgContent: string;\n\n private readonly telemetryContent: ITelemetryContent;\n\n private readonly dimensionUpdateQueue: IPromiseQueue<void> = new FinitePromiseQueue<void>(2);\n\n private dimensions: { [id: number]: string } = {};\n\n private initializedDimensions: Set<string> = new Set();\n\n private readonly cssClassNameConfigure: string = 'ms-quick-order__content-form-main';\n\n // @ts-expect-error -- Existing code.\n private cancellableDebounce: debounce;\n\n private readonly quickOrderCallbacks: IProductDimensionCallbacks = {\n initializeDimension: (initializedDimension: string): void => {\n if (initializedDimension) {\n this.initializedDimensions.add(initializedDimension);\n }\n },\n /**\n * Get Dropdown name.\n * @param selectedDimensionId - Dimension type.\n * @param selectedDimensionValueId - Resources.\n * @returns Dropdown name.\n */\n /* eslint-disable @typescript-eslint/no-explicit-any */\n dimensionSelectedAsync: async (selectedDimensionId: number, selectedDimensionValueId: string): Promise<void> => {\n this.dimensions[selectedDimensionId] = selectedDimensionValueId;\n // Only trigger _updateDimensions when all dimensions are initialized\n if (this.initializedDimensions.size === this.state.productDimensions?.length) {\n return this.dimensionUpdateQueue\n .enqueue(async () => {\n return this._updateDimensions();\n })\n .catch((error: any) => {\n // Ignore discarded processes.\n if (error !== FinitePromiseQueueError.ProcessWasDiscardedFromTheQueue) {\n throw error;\n }\n });\n }\n },\n\n /**\n * Get Dropdown name.\n * @param dimensionType - Dimension type.\n * @param resources - Resources.\n * @returns Dropdown name.\n */\n getDropdownName: (dimensionType: number, resources: IProductDimensionConfigureResources): string => {\n return this._getDropdownName(dimensionType, resources);\n },\n\n /**\n * Method to call on dimension change.\n * @param isUpdatingDimension - Flag to update dimension.\n */\n changeUpdatingDimension: (isUpdatingDimension: boolean): void => {\n this.setState({ isUpdatingDimension });\n }\n };\n\n public constructor(props: IQuickOrderProps<IQuickOrderData>) {\n super(props);\n this.productTextInput = React.createRef();\n this.quantityInput = React.createRef<HTMLInputElement>();\n this.viewport = props.context.request.device.Type === 'Mobile' ? 'xs' : 'lg';\n\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n this.state = {\n productText: '',\n isQuickOrderFormExpanded: false,\n productAvailableQuantity: undefined,\n quantity: 1,\n productResponse: undefined,\n productDimensions: undefined,\n productDimensionErrorState: {\n configureErrors: {}\n },\n isMobile: this.isMobile,\n products: []\n };\n this._handleInputChange = this._handleInputChange.bind(this);\n this._handleQuantityChange = this._handleQuantityChange.bind(this);\n this.quickOrderFormClass = 'ms-quick-order__content-form';\n this.quickOrderFormProductContent = 'ms-quick-order__content-form-main';\n this.quickOrderFormMsgContent = 'ms-quick-order__content-form-msg';\n }\n\n @computed get isMobile(): boolean {\n return this.viewport === 'xs' || this.viewport === 'sm';\n }\n\n public render(): JSX.Element | null {\n const { data } = this.props;\n if (!data.customerInformation.result) {\n return null;\n }\n\n const { className = '', maxQuantity } = this.props.config;\n const customerInfo = this.props.data.customerInformation.result;\n const {\n quickOrderModuleHeading,\n quickOrderModuleDescription,\n quickOrderAddtobag,\n quickOrderProductQuantityInputLabel,\n quickOrderProductInputLabel,\n quickOrderProductDimensionTypeColor,\n quickOrderProductDimensionTypeConfiguration,\n quickOrderSelectDimensionFormatString,\n quickOrderProductDimensionTypeSize,\n quickOrderProductDimensionTypeStyle,\n quickOrderProductDimensionTypeAmount,\n quickAddQuantityPlaceholderText\n } = this.props.resources;\n\n const productConfigureResources: IProductDimensionConfigureResources = {\n selectDimensionFormatString: quickOrderSelectDimensionFormatString,\n productDimensionTypeColor: quickOrderProductDimensionTypeColor,\n productDimensionTypeConfiguration: quickOrderProductDimensionTypeConfiguration,\n productDimensionTypeSize: quickOrderProductDimensionTypeSize,\n productDimensionTypeStyle: quickOrderProductDimensionTypeStyle,\n productDimensionTypeAmount: quickOrderProductDimensionTypeAmount\n };\n\n const { isQuickOrderFormExpanded, productText, productDimensionErrorState, productResponse, productDimensions } = this.state;\n\n const moduleClassName: string = 'ms-quick-order';\n\n const viewProps: IQuickOrderViewProps = {\n ...(this.props as IQuickOrderProps<IQuickOrderData>),\n\n quickOrderProps: { className: classnames('ms-quick-order', className), moduleProps: this.props },\n contentProps: { className: 'ms-quick-order__content' },\n isB2B: customerInfo?.IsB2b,\n drawer: {\n tag: QuickOrderDrawer,\n className: `${moduleClassName}__drawer`,\n collapseProps: { isOpen: this.state.isQuickOrderFormExpanded },\n moduleHeadingText: quickOrderModuleHeading,\n moduleDescriptionText: quickOrderModuleDescription,\n requestContext: this.props.context.request,\n telemetryContent: this.telemetryContent\n },\n quickOrderForm: {\n className: `${this.quickOrderFormClass} ${isQuickOrderFormExpanded ? 'qo-show' : 'qo-hide'}`\n },\n quickOrderFormProductContent: {\n className: this.quickOrderFormProductContent\n },\n quickOrderFormMsgContent: {\n className: this.quickOrderFormMsgContent\n },\n productText,\n quickOrderList: ArrayExtensions.hasElements(this.state.products) ? this._renderQuickOrderTable('ms-quick-order') : undefined,\n form: QuickOrderFormComponent({\n productTextInput: this.productTextInput,\n quantityTextInput: this.quantityInput,\n disableAddtoCart: !productResponse,\n ariaLabelAddtoCart: quickOrderAddtobag,\n ariaLabelProduct: quickOrderProductInputLabel,\n ariaLabelQuantity: quickOrderProductQuantityInputLabel,\n addQuantityPlaceholderText: quickAddQuantityPlaceholderText,\n maxChars: 50,\n maxQuantity,\n quickOrderState: this.state,\n handleInputChange: this._handleInputChange,\n handleAddToCartClick: this._addItemToCart,\n handleQuantityChange: this._handleQuantityChange\n }),\n configure:\n productResponse && productDimensions\n ? getProductConfigure(\n this.cssClassNameConfigure,\n this.props.context,\n this.props.friendlyName,\n this.props.telemetry,\n quickOrderSelectDimensionFormatString,\n productConfigureResources,\n this.quickOrderCallbacks,\n productResponse,\n productDimensions,\n productDimensionErrorState\n )\n : undefined,\n isQuickOrderFormExpanded: this.state.isQuickOrderFormExpanded,\n isMobileView: this.state.isMobile\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n /**\n * Initial the products on quick order.\n * @returns List of quick order products or undefined.\n */\n private _initQuickOrderProducts(): QuickOrderProduct[] {\n const {\n data: {\n cart: { result: cart }\n }\n } = this.props;\n\n const products: SimpleProduct[] = this.state.products;\n\n const quickOrderProducts = cart?.cart.CartLines?.map((cartLine: CartLine) => {\n const quickOrderProduct = products.find(product => product.RecordId === cartLine.ProductId);\n if (ObjectExtensions.isNullOrUndefined(quickOrderProduct)) {\n return undefined;\n }\n\n return new QuickOrderProduct(cartLine, quickOrderProduct);\n });\n\n return ArrayExtensions.validValues(quickOrderProducts);\n }\n\n /**\n * Render Quick Order Table.\n * @param className - Class name.\n * @returns JSX element.\n */\n private _renderQuickOrderTable(className: string): JSX.Element {\n const tableClassName = `${className}__table-list`;\n\n return (\n <QuickOrderTableComponent\n id={tableClassName}\n typeName={this.props.typeName}\n key={tableClassName}\n className={tableClassName}\n data={{ quickOrderProducts: this._initQuickOrderProducts() }}\n context={this.props.context}\n resources={this.props.resources}\n isMobileView={this.state.isMobile}\n />\n );\n }\n\n /**\n * Method to handle input change.\n * @param query - Class name.\n */\n private readonly _handleInputChange = (query: string): void => {\n if (!query || query.length > 4) {\n this.setState({ productText: query, quantity: 0, productResponse: undefined, productDimensions: [] });\n this.setState({\n stateMessage: {\n messageText: '',\n statusCssString: '',\n messageGlyph: '',\n isOpen: false\n }\n });\n const inputQuantityText = this.quantityInput.current instanceof HTMLInputElement && this.quantityInput.current;\n if (inputQuantityText) {\n inputQuantityText.value = '0';\n }\n } else {\n return;\n }\n\n if (this.cancellableDebounce) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call -- existing code.\n this.cancellableDebounce.cancel();\n }\n\n const { telemetry, context } = this.props;\n const maxChar = 50;\n if (context) {\n if (!StringExtensions.isNullOrWhitespace(query)) {\n if (query.length > maxChar) {\n return;\n }\n\n this.cancellableDebounce = debounce(() => {\n getScanResult(\n new GetScanResultInput(\n context.actionContext.requestContext.apiSettings,\n query,\n context.actionContext.requestContext.apiSettings.channelId\n ),\n this.props.context.actionContext\n )\n .then(results => {\n this.setState({\n productResponse: results?.Product,\n productDimensions: results?.ProductDimensionFull,\n isQuickOrderFormExpanded: true\n });\n })\n .catch(error => {\n this.setState({ productText: '' });\n telemetry.exception(error);\n telemetry.debug('Unable to get scan results');\n });\n }, this.waitTime);\n\n setTimeout(() => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call -- Existing code.\n this.cancellableDebounce();\n }, 0);\n this.setState({ productText: query, isQuickOrderFormExpanded: true });\n } else {\n this.setState({ productText: '', productResponse: undefined, isQuickOrderFormExpanded: true });\n }\n }\n };\n\n /**\n * Method to add product in cart.\n */\n // eslint-disable-next-line complexity\n private readonly _addItemToCart = async (): Promise<void> => {\n const { context, data, resources, telemetry } = this.props;\n const { cart } = data;\n const { quickOrderAddedToCartSuccessMessage, quickOrderAddedToCartFailureMessage } = resources;\n const { productResponse, quantity } = this.state;\n this.setState({\n stateMessage: {\n messageText: '',\n statusCssString: '',\n messageGlyph: '',\n isOpen: false\n }\n });\n\n const isValidCart = productResponse && (await this._validateCart(productResponse, quantity));\n if (isValidCart && cart.result && productResponse !== undefined) {\n // Get product delivery mode info\n const deliveryOptions = await getDeliveryOptionsAsync(\n {\n callerContext: this.props.context.actionContext,\n queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(this.props.context.actionContext)\n },\n [productResponse.RecordId]\n );\n const emailDeliveryModeCode = this.props.context.actionContext.requestContext.channel?.EmailDeliveryModeCode;\n const defaultDeliveryOption =\n ArrayExtensions.hasElements(deliveryOptions) && ArrayExtensions.hasElements(deliveryOptions[0].DeliveryOptions)\n ? deliveryOptions[0].DeliveryOptions[0].Code\n : undefined;\n\n if (this.state.productAvailableQuantity === undefined) {\n await this._updateAvailability();\n }\n const shouldValidateQuantityLimits: boolean = this._shouldValidateQuantityLimits();\n const { productAvailableQuantity } = this.state;\n const addProductToCartInput = {\n product: productResponse,\n count: quantity,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- Existing code.\n enableStockCheck: context.app.config.enableStockCheck,\n availableQuantity: productAvailableQuantity ? productAvailableQuantity.ProductAvailableQuantity.AvailableQuantity : 0,\n additionalProperties: { orderQuantityLimitsFeatureIsEnabled: shouldValidateQuantityLimits },\n isAddEmailDeliveryItemToCart: defaultDeliveryOption !== undefined && defaultDeliveryOption === emailDeliveryModeCode,\n deliveryMode: defaultDeliveryOption\n };\n\n cart.result\n .addProductToCart(addProductToCartInput)\n .then(async result => {\n if (result.status === 'SUCCESS') {\n this.props.telemetry.debug('[quick-order] Cart Updated');\n const inputProductText = this.productTextInput.current instanceof HTMLInputElement && this.productTextInput.current;\n const inputQuantityText = this.quantityInput.current instanceof HTMLInputElement && this.quantityInput.current;\n if (inputProductText) {\n inputProductText.value = '';\n }\n if (inputQuantityText) {\n inputQuantityText.value = '0';\n }\n // clean dimensions once product is added to cart\n this.dimensions = [];\n this.setState({\n productText: '',\n quantity: 0,\n productResponse: undefined,\n productDimensions: [],\n stateMessage: {\n messageText: quickOrderAddedToCartSuccessMessage,\n statusCssString: 'success',\n messageGlyph: 'fas fa-check',\n isOpen: true\n }\n });\n } else if (result.substatus === 'MAXQUANTITY') {\n this.props.telemetry.debug('[quick-order] Unable to Update Cart Line from the quick order', quantity);\n const maxQtyLimitReachedMessage = this._getMaxQtyMessage(productAvailableQuantity, quantity);\n\n this.setState({\n stateMessage: {\n messageText: maxQtyLimitReachedMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n }\n });\n } else if (result.substatus === 'QUANTITYLIMITS' && shouldValidateQuantityLimits) {\n const maxQtyLimitReachedMessage = result.errorDetails?.LocalizedMessage!;\n this.props.telemetry.debug(\n '[quick-order] Unable to Update Cart Line from the quick order',\n maxQtyLimitReachedMessage\n );\n\n this.setState({\n stateMessage: {\n messageText: maxQtyLimitReachedMessage || quickOrderAddedToCartFailureMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n }\n });\n } else {\n this.props.telemetry.debug('[quick-order] Unable to Update Cart Line from the quick order');\n\n this.setState({\n stateMessage: {\n messageText: quickOrderAddedToCartFailureMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n }\n });\n }\n })\n .catch(error => {\n telemetry.warning(error);\n telemetry.debug('[quick-order] Error trying to Update Cart Line from the quick order');\n\n this.setState({\n stateMessage: {\n messageText: quickOrderAddedToCartFailureMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n }\n });\n });\n }\n };\n\n private readonly _shouldValidateQuantityLimits = (): boolean => {\n const featureStatuses = this.props.data.featureState.result;\n const isECommerceQuantityLimitsFeatureEnabledInHq =\n featureStatuses?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.EcommerceQuantityLimitConfigurationsFeature'\n )?.IsEnabled || false;\n\n if (isECommerceQuantityLimitsFeatureEnabledInHq) {\n return true;\n }\n\n const isOrderQuantityLimitsFeatureEnabledInHq =\n featureStatuses?.find(featureState => featureState.Name === 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature')\n ?.IsEnabled || false;\n\n if (!isOrderQuantityLimitsFeatureEnabledInHq) {\n return false;\n }\n\n const useSiteBuilderSettings = featureStatuses?.find(\n featureState => featureState.Name === 'RevertToSiteBuilderOrderQuantityLimitsSettings'\n )?.IsEnabled;\n\n if (useSiteBuilderSettings) {\n const defaultOrderQuantityLimitsFeatureConfig = this.props.context.request.app.platform?.enableDefaultOrderQuantityLimits;\n const customerInfo = this.props.data.customerInformation.result;\n\n const isOrderQuantityLimitsFeatureEnabledInSiteSettings =\n defaultOrderQuantityLimitsFeatureConfig === 'all' ||\n (customerInfo &&\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b)));\n\n return isOrderQuantityLimitsFeatureEnabledInSiteSettings ?? false;\n } else {\n const cartConfiguration = this.props.data.cartConfiguration?.result;\n return !(cartConfiguration?.IgnoreOrderSettings ?? false);\n }\n };\n\n private _getMaxQtyMessage(productInventoryInfo: IProductInventoryInformation | undefined, currentQuantity: number): string {\n const { context, data } = this.props;\n const { cart } = data;\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- existing code.\n const maxQuantityForLineItem = updateMaxQuantityForCartLineItem(context.app.config.maxQuantityForCartLineItem);\n\n const addedQuantity =\n cart.result?.cart.CartLines?.find(\n item => item.ItemId?.toString() === this.state.productText && item.ProductId === this.state.productResponse?.RecordId\n )?.Quantity || 0;\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- existing code.\n if (\n !productInventoryInfo ||\n !productInventoryInfo.ProductAvailableQuantity.AvailableQuantity ||\n !context.app.config.enableStockCheck\n ) {\n return this._getConcatenatedMaxQtyMessage(addedQuantity.toString(), maxQuantityForLineItem.toString());\n }\n\n const minInventory = Math.min(maxQuantityForLineItem, productInventoryInfo.ProductAvailableQuantity.AvailableQuantity);\n\n return this._getConcatenatedMaxQtyMessage(addedQuantity.toString(), minInventory.toString());\n }\n\n /**\n * Method to return concatenated added quantity Message.\n * @param currentQuantity - Current or added Quantity.\n * @param maxQuantity - Max Quantity.\n * @returns - ConcatenatedMaxQtyMessage.\n */\n private readonly _getConcatenatedMaxQtyMessage = (currentQuantity: string, maxQuantity: string): string => {\n const { quickOrderMaxQuantityLimitText, quickOrderAlreadyItemQuantityText } = this.props.resources;\n\n if (currentQuantity !== '0') {\n return (\n quickOrderAlreadyItemQuantityText.replace('{curQuantity}', currentQuantity) +\n quickOrderMaxQuantityLimitText.replace('{maxQuantity}', maxQuantity)\n );\n }\n\n return quickOrderMaxQuantityLimitText.replace('{maxQuantity}', maxQuantity);\n };\n\n /**\n * Method to handle quantity change.\n * @param value - Quantity.\n */\n private readonly _handleQuantityChange = (value: string): void => {\n let currentValue = Number.parseInt(value, 10);\n const inputElement = this.quantityInput.current instanceof HTMLInputElement && this.quantityInput.current;\n\n if (isNaN(currentValue)) {\n currentValue = 0;\n }\n\n this.setState({ quantity: currentValue }, () => {\n debounce(() => {\n if (!isNaN(this.state.quantity) && this.state.quantity >= 0 && inputElement) {\n inputElement.setAttribute('aria-valuenow', currentValue.toString());\n inputElement.setAttribute('value', currentValue.toString());\n }\n }, 200)();\n });\n };\n\n private readonly _updateDimensionValue = (\n productDimensionFull: ProductDimensionFull,\n newValueId: string | undefined\n ): ProductDimensionValue | undefined => {\n if (newValueId && productDimensionFull.DimensionValues) {\n return productDimensionFull.DimensionValues.find(dimension => dimension.RecordId === +newValueId);\n }\n\n return undefined;\n };\n\n private readonly _getDropdownName = (dimensionType: number, resources: IProductDimensionConfigureResources): string => {\n const isGiftCard = this.state.productResponse?.IsGiftCard;\n\n switch (dimensionType) {\n case 1: // ProductDimensionType.Color\n return resources.productDimensionTypeColor;\n case 2: // ProductDimensionType.Configuration\n return resources.productDimensionTypeConfiguration;\n case 3: // ProductDimensionType.Size\n return resources.productDimensionTypeSize;\n case 4: // ProductDimensionType.Style\n return isGiftCard ? resources.productDimensionTypeAmount : resources.productDimensionTypeStyle;\n default:\n return '';\n }\n };\n\n /**\n * Method to update product dimension.\n */\n private readonly _updateDimensions = async (): Promise<void> => {\n const {\n context: {\n actionContext,\n request: {\n apiSettings: { channelId }\n }\n }\n } = this.props;\n const { productDimensions, productResponse } = this.state;\n if (!productResponse || !productDimensions) {\n return;\n }\n\n const dimensionsToUpdate: { [id: number]: string } = { ...this.dimensions };\n this.setState({ isUpdatingDimension: true });\n\n // Step 1: Update state to indicate which dimensions are selected\n if (this.state.productDimensionErrorState.otherError) {\n const clearOtherErrorState = { ...this.state.productDimensionErrorState };\n clearOtherErrorState.otherError = undefined;\n this.setState({ productDimensionErrorState: clearOtherErrorState });\n }\n\n // Step 2: Clear any errors indicating the dimension wasn't selected\n for (const key of Object.keys(dimensionsToUpdate)) {\n if (this.state.productDimensionErrorState.configureErrors[key]) {\n const errorState = { ...this.state.productDimensionErrorState };\n errorState.configureErrors[key] = undefined;\n\n this.setState({ productDimensionErrorState: errorState });\n }\n }\n\n // Step 3, Build the actually selected dimensions, prioritizing the information in state\n // over the information in data\n const mappedDimensions = productDimensions\n .map(dimension => {\n return {\n DimensionTypeValue: dimension.DimensionTypeValue,\n DimensionValue:\n this._updateDimensionValue(dimension, dimensionsToUpdate[dimension.DimensionTypeValue]) || dimension.DimensionValue,\n ExtensionProperties: dimension.ExtensionProperties\n };\n })\n .filter(dimension => {\n return dimension.DimensionValue;\n });\n\n // Step 4. Use these dimensions hydrate the product. Wrap this in a promise\n // so that places like add to cart can await it\n const selectedProduct = new Promise<SimpleProduct | null>(async (resolve, reject) => {\n const newProduct = await getSelectedVariant(\n new SelectedVariantInput(\n productResponse.MasterProductId ? productResponse.MasterProductId : productResponse.RecordId,\n channelId,\n mappedDimensions,\n undefined,\n this.props.context.request\n ),\n actionContext\n );\n if (newProduct) {\n await getDimensionsForSelectedVariant(\n new GetDimensionsForSelectedVariantInput(\n newProduct.MasterProductId ? newProduct.MasterProductId : newProduct.RecordId,\n channelId,\n mappedDimensions,\n this.props.context.request\n ),\n actionContext\n );\n }\n\n resolve(newProduct);\n });\n\n const variantProduct = await selectedProduct;\n this.setState({ productResponse: variantProduct !== null ? variantProduct : undefined });\n if (variantProduct) {\n // Step 5. Use these dimensions hydrate the inventory. Wrap this in a promise\n // so that places like add to cart can await it\n const newAvailableQuantity = await getProductAvailabilitiesForSelectedVariant(\n new ProductAvailabilitiesForSelectedVariantInput(variantProduct.RecordId, channelId),\n actionContext\n );\n\n if (newAvailableQuantity && newAvailableQuantity.length > 0) {\n this.setState({ productAvailableQuantity: newAvailableQuantity[0] });\n } else {\n this.setState({ productAvailableQuantity: undefined });\n }\n }\n };\n\n /**\n * Method to update product availability.\n */\n private readonly _updateAvailability = async (): Promise<void> => {\n const {\n context: {\n actionContext,\n request: {\n apiSettings: { channelId }\n }\n }\n } = this.props;\n const { productResponse } = this.state;\n if (!productResponse) {\n return;\n }\n\n let productAvailable: IProductInventoryInformation | undefined;\n await getProductAvailabilitiesForSelectedVariant(\n new ProductAvailabilitiesForSelectedVariantInput(productResponse.RecordId, channelId),\n actionContext\n ).then(result => {\n if (ArrayExtensions.hasElements(result)) {\n productAvailable = result.find(quantity => quantity.ProductAvailableQuantity.ProductId === productResponse.RecordId);\n } else {\n this.setState({ productAvailableQuantity: undefined });\n }\n this.setState({ productAvailableQuantity: productAvailable });\n });\n };\n\n /**\n * Method to get dimension error string.\n * @param dimensionTypeValue - Dimension value.\n * @param resources - Localized error message.\n * @param isGiftCard - Flag to check giftcard.\n * @returns Dimension error string.\n */\n private readonly _getDimensionErrorString = (\n dimensionTypeValue: number,\n resources: IQuickOrderResources,\n isGiftCard?: boolean\n ): string => {\n switch (dimensionTypeValue) {\n case 1: // ProductDimensionType.Color\n return resources.quickOrderproductDimensionTypeColorErrorMessage;\n case 2: // ProductDimensionType.Configuration\n return resources.quickOrderproductDimensionTypeConfigurationErrorMessage;\n case 3: // ProductDimensionType.Size\n return resources.quickOrderproductDimensionTypeSizeErrorMessage;\n case 4: // ProductDimensionType.Style\n return isGiftCard\n ? resources.quickOrderproductDimensionTypeAmountErrorMessage\n : resources.quickOrderproductDimensionTypeStyleErrorMessage;\n default:\n return '';\n }\n };\n\n private readonly _updateProductAvailability = async (): Promise<void> => {\n if (this.state.productAvailableQuantity === undefined) {\n await this._updateAvailability();\n }\n };\n\n /**\n * Method to validate the cart.\n * @param productResponse - Simple product object.\n * @param quantity - Quantity.\n * @returns Flag after validating cart.\n */\n private readonly _validateCart = async (productResponse: SimpleProduct, quantity: number): Promise<boolean> => {\n const missingDimensions = productResponse.Dimensions?.filter((dimension: ProductDimension) => !dimension.DimensionValue?.Value);\n if (missingDimensions && missingDimensions.length > 0) {\n const userMessage = this._getConfigureErrors(missingDimensions, false);\n if (this.state.productDimensionErrorState.configureErrors) {\n const errorState = { ...this.state.productDimensionErrorState };\n errorState.configureErrors = userMessage;\n\n this.setState({ productDimensionErrorState: errorState });\n return false;\n }\n }\n\n if (quantity <= 0) {\n const resources = this.props.resources;\n this.setState({\n stateMessage: {\n messageText: resources.quickOrderWrongQuantityErrorMsg,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n }\n });\n return false;\n }\n\n // If stock check false no need to check the availability.\n const { context } = this.props;\n if (!context.app.config.enableStockCheck) {\n return true;\n }\n\n await this._updateProductAvailability();\n const { productAvailableQuantity } = this.state;\n const availableQuantity = productAvailableQuantity ? productAvailableQuantity.ProductAvailableQuantity.AvailableQuantity : 0;\n if (availableQuantity === undefined || availableQuantity <= 0) {\n this.setState({\n stateMessage: {\n messageText: this.props.resources.quickOrderOutofStockErrorMsg,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n }\n });\n return false;\n }\n return true;\n };\n\n /**\n * Method to get configuration error string.\n * @param result - List of Dimension values.\n * @param isGiftCard - Flag to check giftcard.\n * @returns Error object.\n */\n private _getConfigureErrors(\n result: ProductDimension[] | undefined,\n isGiftCard?: boolean\n ): { [configureId: string]: string | undefined } {\n if (!result) {\n return {};\n }\n const dimensions: { [configureId: string]: string | undefined } = {};\n const resources = this.props.resources;\n for (const dimension of result) {\n dimensions[dimension.DimensionTypeValue] = this._getDimensionErrorString(dimension.DimensionTypeValue, resources, isGiftCard);\n }\n return dimensions;\n }\n}\n\nexport default QuickOrder;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IProductDimensionConfigureDropdownViewProps, IProductDimensionConfigureViewProps } from '@msdyn365-commerce/components';\nimport { INodeProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IQuickOrderFormViewProps, IQuickOrderViewProps } from './index';\n\n/**\n * Render product dimension/configure container.\n * @param configure -- Product dimension configuration.\n * @returns Container to have dimension dropdown.\n */\nconst renderConfigure = (configure?: IProductDimensionConfigureViewProps): JSX.Element | null => {\n if (configure !== undefined) {\n const { containerProps, dropdowns } = configure;\n\n return <Node {...containerProps}>{dropdowns.map(renderConfigureDropdown)}</Node>;\n }\n return null;\n};\n\n/**\n * Render product dimension/configure dropdown.\n * @param dropdown -- Product dimension drop down.\n * @returns Dropdown.\n */\nconst renderConfigureDropdown = (dropdown: IProductDimensionConfigureDropdownViewProps): JSX.Element => {\n const { containerProps, labelContainerProps, heading, errors, select } = dropdown;\n\n return (\n <Node {...containerProps}>\n <Node {...labelContainerProps}>{heading}</Node>\n {errors}\n {select}\n </Node>\n );\n};\n\nconst renderForm = (\n form: IQuickOrderFormViewProps,\n isMobileView: boolean,\n quickOrderForm: INodeProps,\n quickOrderProductContent: INodeProps,\n quickOrderMsgContent: INodeProps,\n configure?: IProductDimensionConfigureViewProps\n) => {\n return isMobileView ? (\n <Node {...quickOrderForm}>\n <Node {...quickOrderProductContent}>\n {form.product}\n {renderConfigure(configure)}\n {form.quantity}\n <Node {...quickOrderMsgContent}>{form.userMessage}</Node>\n {form.addToCartBtn}\n </Node>\n </Node>\n ) : (\n <Node {...quickOrderForm}>\n <Node {...quickOrderMsgContent}>{form.userMessage}</Node>\n <Node {...quickOrderProductContent}>\n {form.product}\n {renderConfigure(configure)}\n {form.quantity}\n {form.addToCartBtn}\n </Node>\n </Node>\n );\n};\n\nconst quickOrderView: React.FC<IQuickOrderViewProps> = props => {\n const {\n quickOrderProps,\n contentProps,\n form,\n quickOrderForm,\n drawer,\n configure,\n quickOrderFormProductContent,\n quickOrderFormMsgContent,\n quickOrderList,\n isMobileView\n } = props;\n\n return (\n <Module {...quickOrderProps}>\n <Node {...drawer}>\n <Node {...contentProps}>\n {renderForm(\n form as IQuickOrderFormViewProps,\n isMobileView,\n quickOrderForm,\n quickOrderFormProductContent,\n quickOrderFormMsgContent,\n configure\n )}\n </Node>\n </Node>\n\n {quickOrderList}\n </Module>\n );\n};\nexport default quickOrderView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { createObservableDataAction, IAction, IActionContext, sendRequest } from '@msdyn365-commerce/core';\n\nimport { SubmitUserReviewInput } from './inputs/submit-user-review-input';\n\n/**\n * This data action allows submitting review to the reviews service.\n * @param input This user review submission text.\n * @param ctx The data action context.\n */\nasync function submitReview(input: SubmitUserReviewInput, ctx: IActionContext): Promise<string> {\n if (!inputIsValid(input)) {\n ctx.trace(`[SubmitUserReview] Failed to submit reviews for product due to bad input ${input}`);\n return '';\n }\n\n const requestUrl =\n `${input.serviceEndpoint}/v2.0/reviews/product/${input.productId}/user?` +\n `tenantId=${input.tenantId}&` +\n `channelId=${input.channelId}&` +\n `locale=${input.locale}`;\n\n return sendRequest<string>(requestUrl, 'post', input.userReviewData, { headers: { Authorization: `id_token ${input.authorization}` } })\n .then(response => {\n if (response.status !== 200 && response.status !== 201) {\n ctx.trace('[SubmitUserReview] Failed to submit reviews for product');\n ctx.trace(response.data);\n return '';\n }\n return response.data;\n })\n .catch(error => {\n ctx.trace('[SubmitUserReview] Failed to submit reviews for product');\n ctx.telemetry.exception(error);\n ctx.telemetry.debug('[SubmitUserReview] Failed to submit reviews for product');\n ctx.trace(error);\n return '';\n });\n}\n\nfunction inputIsValid(input: SubmitUserReviewInput): boolean {\n return input && !!input.productId && !!input.tenantId;\n}\n\nexport const submitReviewDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/ratings-reviews/submit-user-review',\n action: <IAction<string>>submitReview\n});\n\nexport default submitReviewDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { CacheType, IActionInput } from '@msdyn365-commerce/core';\n\nimport { IUserReviewData } from './submit-user-review-input-data';\n\n/**\n * SubmitUserReview Input Action.\n */\nexport class SubmitUserReviewInput implements IActionInput {\n /**\n * The Id representing the product to get the ratings for.\n */\n public productId?: string;\n\n /**\n * The ID representing the tenant.\n */\n public tenantId: string;\n\n /**\n * The calling organization's channel id.\n */\n public channelId: string;\n\n /**\n * The locale for which to get the ratings from.\n */\n public locale: string;\n\n /**\n * The user's review data.\n */\n public userReviewData: IUserReviewData;\n\n /**\n * The user's authorization token.\n */\n public authorization: string;\n\n /**\n * The ratings and reviews service endpoint.\n */\n public serviceEndpoint: string;\n\n constructor(\n productId: string | undefined,\n tenantId: string,\n channelId: string,\n locale: string,\n userReviewData: IUserReviewData,\n authorization: string,\n serviceEndpoint: string\n ) {\n this.productId = productId;\n this.tenantId = tenantId;\n this.channelId = channelId;\n this.locale = locale;\n this.userReviewData = userReviewData;\n this.authorization = authorization;\n this.serviceEndpoint = serviceEndpoint;\n }\n\n public getCacheKey = () => 'SubmitUserReview';\n\n public getCacheObjectType = () => 'SubmitUserReview';\n\n public dataCacheType = (): CacheType => 'none';\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Review } from '@msdyn365-commerce/commerce-entities';\nimport { RatingComponent } from '@msdyn365-commerce/components';\nimport { getUrlSync, IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { getRnrAuthEndpointId, getRnrPartnerId } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n Alert,\n Button,\n getPayloadObject,\n getTelemetryAttributes,\n INodeProps,\n ITelemetryContent,\n Modal,\n ModalBody,\n ModalFooter,\n ModalHeader,\n TelemetryConstant\n} from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nimport classNames from 'classnames';\nimport { GetUserReviewInput } from '../actions/inputs/get-user-review-input';\nimport { SubmitUserReviewInput } from '../actions/inputs/submit-user-review-input';\nimport submitUserReview from '../actions/submit-user-review';\n\nexport interface IReviewModalProps {\n userReview?: Review;\n product?: SimpleProduct;\n renderContextId: string;\n resources: IReviewModalResources;\n context: ICoreContext<IGeneric<IAny>>;\n parentId: string;\n parentType: string;\n isOpen: boolean;\n rating: number;\n reviewTitle: string;\n reviewText: string;\n returnRef: React.RefObject<HTMLButtonElement> | undefined;\n hasError: boolean;\n telemetryContent?: ITelemetryContent;\n onModalToggle(): void;\n onTitleChange(event: React.ChangeEvent<HTMLInputElement>): void;\n onTextChange(event: React.ChangeEvent<HTMLTextAreaElement>): void;\n onRatingChange(value: number): void;\n onReviewComplete?(isSuccess: boolean): void;\n modalCSS?: string;\n}\n\nexport interface IReviewModalResources {\n selectRatingAriaLabel: string;\n selectRatingLabel: string;\n reviewTitleLabel: string;\n reviewTextLabel: string;\n privacyPolicyTitle: string;\n privacyPolicyTextFormat: string;\n writeReviewModalTitle: string;\n editReviewModalTitle: string;\n submitReviewButtonText: string;\n discardReviewButtonText: string;\n errorMessageText: string;\n reviewTitleAriaLabel?: string;\n reviewAriaLabel?: string;\n}\n\nexport interface IReviewModalViewProps {\n modal: INodeProps;\n modalHeader: React.ReactElement;\n modalFooter: INodeProps;\n modalBody: INodeProps;\n cancelButton: React.ReactElement;\n submitButton: React.ReactElement;\n rating: React.ReactElement;\n ratingLabel: React.ReactElement;\n titleInput: React.ReactElement;\n titleLabel: React.ReactElement;\n textInput: React.ReactElement;\n textLabel: React.ReactElement;\n privacyPolicyUrl: React.ReactElement;\n form: INodeProps;\n inputRow: INodeProps;\n error: React.ReactElement;\n}\n\n/**\n * On Click Submit.\n * @param props -Review Modal props.\n * @returns On submit.\n */\nconst onClickSubmit = (props: IReviewModalProps) => () => {\n onSubmit(props);\n};\n\n/**\n * CartLineItems component.\n */\n\nexport const ReviewModal = (props: IReviewModalProps): IReviewModalViewProps => {\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.SubmitReview);\n const submitButtonAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n payLoad.contentAction.etext = TelemetryConstant.Cancel;\n const cancelButtonAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n return {\n modal: {\n tag: Modal,\n className: props.modalCSS ? classNames(props.modalCSS, 'msc-modal-input-required') : 'ms-review-modal msc-modal-input-required',\n toggle: props.onModalToggle,\n applicationNode: 'renderPage',\n isOpen: props.isOpen,\n returnFocusRef: props.returnRef\n },\n modalHeader: modalHeaderNode(props),\n modalFooter: { tag: ModalFooter, className: 'ms-review-modal-footer' },\n modalBody: { tag: ModalBody, className: 'ms-review-modal-body' },\n cancelButton: (\n <Button className='ms-review-modal-cancel' onClick={props.onModalToggle} {...submitButtonAttribute}>\n {props.resources.discardReviewButtonText}\n </Button>\n ),\n submitButton: (\n <Button\n className='ms-review-modal-submit'\n onClick={onClickSubmit(props)}\n {...cancelButtonAttribute}\n disabled={submitDisabled(props)}\n >\n {props.resources.submitReviewButtonText}\n </Button>\n ),\n rating: ratingsInput(props),\n ratingLabel: ratingsLabel(props),\n titleInput: titleInput(props),\n titleLabel: titleLabel(props),\n textInput: textInput(props),\n textLabel: textLabel(props),\n privacyPolicyUrl: privacyPolicyLink(props),\n form: { tag: 'form', className: 'ms-review-modal-form', autoComplete: 'off' },\n inputRow: { tag: 'div', className: 'ms-review-modal-row', autoComplete: 'off' },\n error: (\n <Alert className='ms-review-modal-error' isOpen={props.hasError} color='danger'>\n {props.resources.errorMessageText}\n </Alert>\n )\n };\n};\n\nconst modalHeaderNode = (props: IReviewModalProps) => {\n return (\n <ModalHeader toggle={props.onModalToggle} className='ms-review-modal-header'>\n {props.userReview && props.userReview.reviewId ? props.resources.editReviewModalTitle : props.resources.writeReviewModalTitle}\n </ModalHeader>\n );\n};\n\nconst submitDisabled = (props: IReviewModalProps) => {\n return !props.rating || !stripWhiteSpacesFromString(props.reviewText) || !stripWhiteSpacesFromString(props.reviewTitle);\n};\n\nconst ratingsInput = (props: IReviewModalProps) => {\n return (\n <RatingComponent\n readOnly={false}\n avgRating={0}\n ariaLabel={props.resources.selectRatingAriaLabel}\n initialRating={props.rating}\n context={props.context}\n id={props.parentId}\n typeName={props.parentType}\n data={{}}\n key='ratings'\n onChange={props.onRatingChange}\n />\n );\n};\n\nconst ratingsLabel = (props: IReviewModalProps) => {\n return (\n <label className='ms-review-modal-rating-label' key='ratingsLabel'>\n {props.resources.selectRatingLabel}*\n </label>\n );\n};\n\nconst titleInput = (props: IReviewModalProps) => {\n const maxLength = props.context.app.config.reviewTitleMaxLength;\n\n return (\n <input\n maxLength={maxLength}\n id={`reviewTitle-${props.renderContextId}`}\n onChange={props.onTitleChange}\n value={props.reviewTitle}\n aria-required='true'\n className='ms-review-modal-title'\n aria-label={props.resources.reviewTitleAriaLabel}\n />\n );\n};\n\nconst titleLabel = (props: IReviewModalProps) => {\n return (\n <label className='ms-review-modal-title-label' htmlFor={`reviewTitle-${props.renderContextId}`}>\n {props.resources.reviewTitleLabel}\n </label>\n );\n};\n\nconst reviewTextWidth: number = 50;\n\nconst textInput = (props: IReviewModalProps) => {\n const maxLength = props.context.app.config.reviewTextMaxLength;\n return (\n <textarea\n maxLength={maxLength}\n className='ms-review-modal-text'\n id={`reviewTextArea-${props.renderContextId}`}\n onChange={props.onTextChange}\n rows={maxLength / reviewTextWidth}\n value={props.reviewText}\n aria-required='true'\n aria-label={props.resources.reviewAriaLabel}\n />\n );\n};\n\nconst textLabel = (props: IReviewModalProps) => {\n return (\n <label htmlFor={`reviewTextArea-${props.renderContextId}`} className='ms-review-modal-text-label'>\n {props.resources.reviewTextLabel}\n </label>\n );\n};\n\nconst privacyPolicyLink = (props: IReviewModalProps) => {\n const policyTextBlocks = props.resources.privacyPolicyTextFormat.split('{0}');\n const isSeparatorAtStart = props.resources.privacyPolicyTextFormat.startsWith('{0}');\n const isSeparatorAtEnd = props.resources.privacyPolicyTextFormat.endsWith('{0}');\n const privacyPolicyUrl = getUrlSync('rnrPrivacyPolicy', props.context.actionContext);\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.PrivacyPolicy);\n const privacyPolicyAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n\n return (\n <p className='ms-review-modal-policy'>\n {isSeparatorAtStart ? '' : policyTextBlocks[0]}\n <a href={privacyPolicyUrl} rel='noreferrer' target='_blank' className='msc-link' {...privacyPolicyAttribute}>\n {props.resources.privacyPolicyTitle}\n </a>\n {isSeparatorAtEnd ? '' : isSeparatorAtStart ? policyTextBlocks[0] : policyTextBlocks[1]}\n </p>\n );\n};\n\nconst onSubmit = (props: IReviewModalProps): void => {\n if (props.product) {\n submitReview(\n props.product,\n props.reviewTitle,\n props.reviewText,\n props.rating,\n props.context,\n props.userReview,\n props.onReviewComplete\n );\n }\n};\n\n/**\n * This method strips content of extra white spaces.\n * @param text The text to be stripped of extra white spaces.\n */\nconst stripWhiteSpacesFromString = (text: string): string => {\n return text\n .replace(new RegExp('\\\\r?\\\\n|\\\\r+', 'g'), ' ')\n .replace(new RegExp('\\\\s+', 'g'), ' ')\n .trim();\n};\n\nexport const submitReview = (\n product: SimpleProduct,\n title: string,\n text: string,\n rating: number,\n context: ICoreContext,\n userReview?: Review,\n onReviewSubmission?: (isSuccessful: boolean) => void\n) => {\n const { request } = context;\n const { user } = request;\n if (user && request) {\n const input = new SubmitUserReviewInput(\n product.RecordId.toString(),\n getRnrPartnerId(context.actionContext),\n request.apiSettings.channelId.toString(),\n request.locale,\n {\n productName: product && product.Name,\n rating,\n reviewText: stripWhiteSpacesFromString(text),\n title: stripWhiteSpacesFromString(title),\n userEmail: user.emailAddress,\n userName: user.name\n },\n request.user.token,\n getRnrAuthEndpointId(context.actionContext)\n );\n\n submitUserReview(input, context.actionContext)\n .then(reviewId => {\n const review = reviewId\n ? {\n rating,\n title: stripWhiteSpacesFromString(title),\n reviewText: stripWhiteSpacesFromString(text),\n submittedDateTime: new Date(),\n helpfulPositive: userReview ? userReview.helpfulPositive : 0,\n helpfulNegative: userReview ? userReview.helpfulNegative : 0,\n reviewId,\n userName: request.user.firstName || request.user.name\n }\n : userReview;\n\n const getReviewInput = new GetUserReviewInput(input.productId!, input.tenantId, input.authorization, input.serviceEndpoint);\n context.actionContext.update(getReviewInput, review);\n\n if (onReviewSubmission) {\n onReviewSubmission(!!reviewId);\n }\n })\n .catch(() => {\n const productId = product.RecordId;\n context.telemetry.error(`Failed to submit review for product with recordId: ${productId}`);\n context.telemetry.debug(`Failed to submit review for product with recordId: ${productId}`);\n if (onReviewSubmission) {\n onReviewSubmission(false);\n }\n });\n }\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { OrderBy } from '../actions/inputs/get-product-reviews-input';\n\nexport interface IRnrKeyValuePair {\n key: string;\n value: string;\n}\n\nexport interface IRnrOrderByKeyValuePair {\n key: OrderBy;\n value: string;\n}\n\nexport function setFocusOnElement(id: string): void {\n const element = document.getElementById(id);\n if (element) {\n element.focus();\n }\n}\n\nexport const TOGGLE_REVIEW_MODAL_BUTTON_ID: string = 'reviewproductid';\nexport const TOGGLE_EDIT_MODAL_BUTTON_ID: string = 'ms-write-review__edit';\nexport const TOGGLE_EDIT_MODAL_BUTTON_CARD_ID: string = 'ms-reviews-list__edit';\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { RatingsSummary } from '@msdyn365-commerce/commerce-entities';\nimport { format, INodeProps, Progress } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nexport interface IHistogramItemsProps {\n ratingsSummary: RatingsSummary;\n resources: IHistogramItemsResources;\n locale: string;\n onClick(stars: number): void;\n}\n\nexport interface IHistogramItemsResources {\n barItemAriaLabel: string;\n}\n\nexport interface IHistogramItemViewProps {\n starLabel: React.ReactElement;\n bar: React.ReactElement;\n percentage: React.ReactElement;\n buttonProps: INodeProps;\n}\n\n/**\n * CartLineItems component.\n */\n\nexport const HistogramItems = (props: IHistogramItemsProps): IHistogramItemViewProps[] => {\n const { ratingsSummary } = props;\n const totalRatingsCount: number = ratingsSummary.totalRatingsCount || 0;\n if (totalRatingsCount === 0) {\n return [];\n }\n return [\n renderItem(props, 5, ratingsSummary.star5Count, totalRatingsCount),\n renderItem(props, 4, ratingsSummary.star4Count, totalRatingsCount),\n renderItem(props, 3, ratingsSummary.star3Count, totalRatingsCount),\n renderItem(props, 2, ratingsSummary.star2Count, totalRatingsCount),\n renderItem(props, 1, ratingsSummary.star1Count, totalRatingsCount)\n ];\n};\n\nconst renderItem = (props: IHistogramItemsProps, stars: number, count?: number, totalCount?: number): IHistogramItemViewProps => {\n count = count || 0;\n totalCount = totalCount || 0;\n const percentage = totalCount === 0 ? 0 : count / totalCount;\n const formattedPercent = new Intl.NumberFormat(props.locale, { style: 'percent' }).format(percentage);\n const ariaLabel = format(props.resources.barItemAriaLabel, stars, formattedPercent);\n\n return {\n starLabel: (\n <span aria-hidden='true' className='ms-ratings-histogram__star'>\n {stars}\n </span>\n ),\n percentage: (\n <span aria-hidden='true' className='ms-ratings-histogram__percentage'>\n {formattedPercent}\n </span>\n ),\n bar: <Progress value={percentage * 100} max={100} ariaLabel={ariaLabel} className='ms-ratings-histogram__bar' />,\n buttonProps: {\n tag: 'button',\n className: 'ms-ratings-histogram__item',\n onClick: () => {\n props.onClick(stars);\n }\n }\n };\n};\n\nexport const AverageRatingNumber: React.FC<{ summary: RatingsSummary }> = (props: { summary: RatingsSummary }) => {\n return (\n <p className='ms-ratings-histogram__average'>\n {props.summary.averageRating}\n {` `}/ 5\n </p>\n );\n};\n\nexport const TotalReviews: React.FC<{ summary: RatingsSummary }> = (props: { summary: RatingsSummary }) => {\n return <p className='ms-ratings-histogram__total'>{props.summary.totalRatingsCount}</p>;\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { RatingComponent } from '@msdyn365-commerce/components';\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { format, IModuleProps, INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport classname from 'classnames';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { createRatingsReviewsStateInput } from '../../actions/ratings-reviews-state-data-action';\nimport { AverageRatingNumber, HistogramItems, IHistogramItemViewProps, TotalReviews } from './component/components';\nimport { IRatingsHistogramData } from './ratings-histogram.data';\nimport { IRatingsHistogramProps } from './ratings-histogram.props.autogenerated';\n\nexport interface IRatingsHistogramViewProps extends IRatingsHistogramProps<IRatingsHistogramData> {\n className: string;\n histogramItems: IHistogramItemViewProps[];\n moduleProps: IModuleProps;\n heading: React.ReactNode;\n averageRating: React.ReactNode;\n averageNumber: React.ReactNode;\n totalReviews: React.ReactNode;\n histogramProps: INodeProps;\n ratingsSummaryProps: INodeProps;\n callbacks: IRatingsHistogramCallbacks;\n}\n\nexport interface IRatingsHistogramCallbacks {\n selectFilterBy(stars: number): void;\n}\n\n/**\n * RatingsHistogram component.\n * @extends {React.Component<IRatingsHistogramProps<IRatingsHistogramData>>}\n */\n@observer\nclass RatingsHistogram extends React.PureComponent<IRatingsHistogramProps<IRatingsHistogramData>> {\n constructor(props: IRatingsHistogramProps<IRatingsHistogramData>) {\n super(props);\n this.selectFilterBy = this.selectFilterBy.bind(this);\n }\n\n public render(): JSX.Element | null {\n const { resources } = this.props;\n const { className, heading } = this.props.config;\n const {\n ratingsSummary: { result: ratingsSummary }\n } = this.props.data;\n const ratingCount = ratingsSummary && ratingsSummary.totalRatingsCount ? `${ratingsSummary.totalRatingsCount}` : '0';\n\n const completeClass = classname('ms-ratings-histogram', className);\n const viewProps: IRatingsHistogramViewProps = {\n ...this.props,\n className: completeClass,\n callbacks: {\n selectFilterBy: this.selectFilterBy\n },\n moduleProps: {\n moduleProps: this.props,\n className: completeClass\n },\n histogramItems: ratingsSummary\n ? HistogramItems({\n ratingsSummary,\n resources: { ...resources },\n locale: this.props.context.request.locale,\n onClick: this.selectFilterBy\n })\n : [],\n averageRating: ratingsSummary && (\n <RatingComponent\n avgRating={ratingsSummary.averageRating!}\n ratingCount={ratingCount}\n ariaLabel={format(this.props.resources.averageRatingAriaLabel, ratingsSummary.averageRating, '5')}\n readOnly\n context={this.props.context}\n hideCount\n id={this.props.id}\n typeName={this.props.typeName}\n data={{}}\n />\n ),\n averageNumber: ratingsSummary && <AverageRatingNumber summary={ratingsSummary} />,\n totalReviews: ratingsSummary && <TotalReviews summary={ratingsSummary} />,\n ratingsSummaryProps: { className: 'ms-ratings-histogram__summary' },\n heading: heading && (\n <Msdyn365.Text\n className='ms-ratings-histogram__heading'\n tag={heading.tag || 'h2'}\n text={heading.text}\n editProps={{ onEdit: this.handleHeadingChange, requestContext: this.props.context.request }}\n />\n ),\n histogramProps: { className: 'ms-ratings-histogram__histogram' }\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n public handleHeadingChange = (event: Msdyn365.ContentEditableEvent) => (this.props.config.heading!.text = event.target.value);\n\n public selectFilterBy(stars: number): void {\n const filterKey = `${stars}`;\n this.props.context.actionContext.update(createRatingsReviewsStateInput({ filterKey }), { filterKey });\n }\n}\n\nexport default RatingsHistogram;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IHistogramItemViewProps } from './component/components';\nimport { IRatingsHistogramViewProps } from './ratings-histogram';\n\nconst RatingsHistogramView: React.FC<IRatingsHistogramViewProps> = props => {\n const { heading, histogramItems, histogramProps, moduleProps } = props;\n\n return (\n <Module {...moduleProps}>\n {heading}\n <Node {...histogramProps}>\n {histogramItems.map(item => {\n return histogramItem(item);\n })}\n </Node>\n </Module>\n );\n};\n\nconst histogramItem = (props: IHistogramItemViewProps) => {\n return (\n <Node {...props.buttonProps}>\n {props.starLabel}\n {props.bar}\n {props.percentage}\n </Node>\n );\n};\n\nexport default RatingsHistogramView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { createObservableDataAction, IAction, IActionContext, sendRequest } from '@msdyn365-commerce/core';\n\nimport { ReportReviewConcernInput } from './inputs/report-review-concern-input';\n\nasync function reportReviewConcern(input: ReportReviewConcernInput, ctx: IActionContext): Promise<boolean> {\n if (!inputIsValid(input)) {\n throw new Error(\n `[SubmitHelpfulnessVote] Invalid input. ReviewId=${input.reviewId},tenantId=${input.tenantId},locale= ${input.locale},`\n );\n }\n\n const requestUrl =\n `${input.serviceEndpoint}/v2.0/concerns/review/${input.reviewId}` + `?tenantId=${input.tenantId}` + `&locale=${input.locale}`;\n\n const requestBody = {\n concernCategory: input.concernCategory\n };\n\n const requestHeader = {\n headers: {\n Authorization: `id_token ${input.authToken}`\n }\n };\n\n return sendRequest<boolean>(requestUrl, 'post', requestBody, requestHeader)\n .then(response => {\n return response.status === 200 || response.status === 201;\n })\n .catch(error => {\n ctx.trace('[ReportReviewConcernInput] Failed to report a concern');\n ctx.telemetry.exception(error);\n ctx.telemetry.debug('[ReportReviewConcernInput] Failed to report a concern');\n return false;\n });\n}\n\nfunction inputIsValid(input: ReportReviewConcernInput): boolean {\n return input && input.reviewId.length > 0 && input.tenantId.length > 0 && input.locale.length > 0 && input.authToken.length > 0;\n}\n\nexport const reportReviewConcernDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/ratings-reviews/report-review-concern',\n action: <IAction<boolean>>reportReviewConcern\n});\n\nexport default reportReviewConcernDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { createObservableDataAction, IAction, IActionContext, sendRequest } from '@msdyn365-commerce/core';\n\nimport { SubmitHelpfulnessVoteInput } from './inputs/submit-helpfulness-vote-input';\n\nasync function submitHelpfulnessVote(input: SubmitHelpfulnessVoteInput, ctx: IActionContext): Promise<boolean> {\n if (!inputIsValid(input)) {\n throw new Error(\n `[SubmitHelpfulnessVote] Invalid input. ReviewId=${input.reviewId},tenantId=${input.tenantId}, locale= ${input.locale},`\n );\n }\n\n const requestUrl =\n `${input.serviceEndpoint}/v2.0/votes/review/${input.reviewId}` + `?tenantId=${input.tenantId}` + `&locale=${input.locale}`;\n\n const requestBody = {\n isHelpful: !!input.isHelpful\n };\n\n const requestHeader = {\n headers: {\n Authorization: `id_token ${input.authToken}`\n }\n };\n\n return sendRequest<boolean>(requestUrl, 'post', requestBody, requestHeader)\n .then(response => {\n return response.status === 200 || response.status === 201;\n })\n .catch(error => {\n ctx.trace('[SubmitHelpfulnessVote] Failed to vote on a review');\n ctx.telemetry.exception(error);\n ctx.telemetry.debug('[SubmitHelpfulnessVote] Failed to vote on a review');\n return false;\n });\n}\n\nfunction inputIsValid(input: SubmitHelpfulnessVoteInput): boolean {\n return input && input.reviewId.length > 0 && input.tenantId.length > 0 && input.locale.length > 0 && input.authToken.length > 0;\n}\n\nexport const submitHelpfulnessVoteDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/ratings-reviews/submit-helpfulness-vote',\n action: <IAction<boolean>>submitHelpfulnessVote\n});\n\nexport default submitHelpfulnessVoteDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { CacheType, IActionInput } from '@msdyn365-commerce/core';\n\nexport enum ReviewConcernCategory {\n OffensiveContent = '1',\n ReviewResponse = '7',\n SpamAdvertising = '8',\n Profanity = '9'\n}\n\n/**\n * ReportReviewConcern Input Action.\n */\nexport class ReportReviewConcernInput implements IActionInput {\n public reviewId: string;\n\n public tenantId: string;\n\n public locale: string;\n\n public serviceEndpoint: string;\n\n public concernCategory: string;\n\n public authToken: string;\n\n constructor(reviewId: string, tenantId: string, locale: string, concernCategory: string, authToken: string, serviceEndpoint: string) {\n this.reviewId = reviewId;\n this.tenantId = tenantId;\n this.locale = locale;\n this.concernCategory = concernCategory;\n this.authToken = authToken;\n this.serviceEndpoint = serviceEndpoint;\n }\n\n public getCacheKey = () => 'ReportReviewConcern';\n\n public getCacheObjectType = () => 'ReportReviewConcern';\n\n public dataCacheType = (): CacheType => 'none';\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n format,\n getPayloadObject,\n getTelemetryAttributes,\n ILabeledDropdownOption,\n ITelemetryContent,\n TelemetryConstant\n} from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface IReviewCountResources {\n pageReviewCountText: string;\n}\n\nexport interface IReviewCountProps {\n resources: IReviewCountResources;\n currentPage: number;\n reviewsCount: number;\n reviewsShownOnEachPage: number;\n}\n\nexport const ReviewCount: React.FC<IReviewCountProps> = (props: IReviewCountProps) => {\n const { currentPage, resources, reviewsCount, reviewsShownOnEachPage } = props;\n\n return (\n <span aria-live='polite' className='sr-only'>\n {format(\n resources.pageReviewCountText,\n _getReviewStartNumber(currentPage, reviewsShownOnEachPage),\n _getReviewEndNumber(currentPage, reviewsCount, reviewsShownOnEachPage),\n reviewsCount\n )}\n </span>\n );\n};\n\nexport interface IPageControlResources {\n previousButtonText: string;\n nextButtonText: string;\n pageReviewAriaLabel: string;\n}\n\nexport interface IPageControlsProps {\n resources: IPageControlResources;\n currentPage: number;\n reviewsCount: number;\n reviewsShownOnEachPage: number;\n selectedSortByOption: ILabeledDropdownOption;\n selectedFilterByOption: ILabeledDropdownOption;\n telemetryContent?: ITelemetryContent;\n updateReviews(\n skipItems: number,\n selectedSortByOption: ILabeledDropdownOption,\n selectedFilterByOption: ILabeledDropdownOption,\n currentPage: number,\n isFilterApplied: boolean\n ): Promise<void>;\n}\n\nexport const PageControls: React.FC<IPageControlsProps> = (props: IPageControlsProps) => {\n const { currentPage, resources, reviewsCount, reviewsShownOnEachPage } = props;\n const previousPageClick = React.useCallback(() => {\n return _getPreviousPageData(props);\n }, [props]);\n const nextPageClick = React.useCallback(() => {\n return _getNextPageData(props);\n }, [props]);\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.Next);\n const nextAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n payLoad.contentAction.etext = TelemetryConstant.Previous;\n const previousAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n\n return (\n <div className='ms-reviews-list__page-controls'>\n {_hasPreviousPage(currentPage) && (\n <button\n onClick={previousPageClick}\n className='ms-reviews-list__previous'\n aria-label={_paginationAriaLabel(\n resources.pageReviewAriaLabel,\n currentPage,\n reviewsCount,\n reviewsShownOnEachPage,\n false\n )}\n {...previousAttribute}\n >\n {resources.previousButtonText}\n </button>\n )}\n {_hasNextPage(currentPage, reviewsCount, reviewsShownOnEachPage) && (\n <button\n onClick={nextPageClick}\n className='ms-reviews-list__next'\n aria-label={_paginationAriaLabel(\n resources.pageReviewAriaLabel,\n currentPage,\n reviewsCount,\n reviewsShownOnEachPage,\n true\n )}\n {...nextAttribute}\n >\n {resources.nextButtonText}\n </button>\n )}\n </div>\n );\n};\n\nconst _hasPreviousPage = (currentPage: number): boolean => {\n return currentPage > 1;\n};\n\nconst _hasNextPage = (currentPage: number, reviewsCount: number, reviewsShownOnEachPage: number): boolean => {\n return _getPagesCount(reviewsCount, reviewsShownOnEachPage) > currentPage;\n};\n\nconst _getReviewsShown = (reviewsShownOnEachPage: number) => {\n return Math.min(25, reviewsShownOnEachPage);\n};\n\nconst _getPagesCount = (reviewsCount: number, reviewsShownOnEachPage: number): number => {\n return Math.ceil(reviewsCount / _getReviewsShown(reviewsShownOnEachPage));\n};\n\nconst _paginationAriaLabel = (\n pageReviewAriaLabel: string,\n currentPage: number,\n reviewsCount: number,\n reviewsShownOnEachPage: number,\n isNextPage: boolean,\n page?: number\n): string => {\n const pageModifier = isNextPage ? 1 : -1;\n return format(\n pageReviewAriaLabel,\n _getReviewStartNumber(currentPage, reviewsShownOnEachPage, currentPage + pageModifier),\n _getReviewEndNumber(currentPage, reviewsCount, reviewsShownOnEachPage, currentPage + pageModifier),\n reviewsCount\n );\n};\n\nconst _getReviewStartNumber = (currentPage: number, reviewsShownOnEachPage: number, page?: number): number => {\n return ((page || currentPage) - 1) * _getReviewsShown(reviewsShownOnEachPage) + 1;\n};\n\nconst _getReviewEndNumber = (currentPage: number, reviewsCount: number, reviewsShownOnEachPage: number, page?: number): number => {\n const pageUsed = page || currentPage;\n const pageReviewCount = pageUsed * _getReviewsShown(reviewsShownOnEachPage);\n return pageReviewCount < reviewsCount ? pageReviewCount : reviewsCount;\n};\n\nconst _getPreviousPageData = async (props: IPageControlsProps) => {\n await props.updateReviews(\n _getReviewStartNumber(props.currentPage, props.reviewsShownOnEachPage) - 1 - _getReviewsShown(props.reviewsShownOnEachPage),\n props.selectedSortByOption,\n props.selectedFilterByOption,\n props.currentPage - 1,\n false\n );\n};\n\nconst _getNextPageData = async (props: IPageControlsProps) => {\n await props.updateReviews(\n _getReviewEndNumber(props.currentPage, props.reviewsCount, props.reviewsShownOnEachPage),\n props.selectedSortByOption,\n props.selectedFilterByOption,\n props.currentPage + 1,\n false\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\nimport {\n Alert,\n getPayloadObject,\n getTelemetryAttributes,\n INodeProps,\n ITelemetryContent,\n Modal,\n ModalBody,\n ModalFooter,\n ModalHeader,\n TelemetryConstant\n} from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nimport { ReviewConcernCategory } from '../../../actions/inputs/report-review-concern-input';\nimport { IRnrKeyValuePair } from '../../../common/rnrInterface';\n\nexport interface IReportReviewModalProps {\n resources: IReportReviewModalResources;\n context: ICoreContext<IGeneric<IAny>>;\n isOpen: boolean;\n returnRef: React.RefObject<HTMLButtonElement> | undefined;\n reportedKey: string;\n hasError: boolean;\n telemetryContent?: ITelemetryContent;\n onModalToggle(): void;\n onRadioChange(event: React.ChangeEvent<HTMLInputElement>): void;\n reportReview(): void;\n}\n\nexport interface IReportReviewModalResources {\n reportConcernText: string;\n feedbackThankYouText: string;\n reportModalMessage: string;\n reportSubmittedMessage: string;\n reportSpamText: string;\n offensiveContentText: string;\n profanityContentText: string;\n okReportReviewText: string;\n cancelReportReviewText: string;\n reportReviewButtonText: string;\n errorMessageText: string;\n}\n\nexport interface IReportReviewModalViewProps {\n modal: INodeProps;\n modalHeader: INodeProps;\n modalFooter: INodeProps;\n modalBody: INodeProps;\n header: React.ReactElement;\n headerSubmitted: React.ReactElement;\n cancelButton: React.ReactElement;\n submitButton: React.ReactElement;\n succesfulButton: React.ReactElement;\n reportMessage: React.ReactElement;\n reportSubmittedMessage: React.ReactElement;\n radioButtons: React.ReactElement;\n error: React.ReactElement;\n}\n\nlet reportConcernDropdownOptions: IRnrKeyValuePair[];\n\n/**\n * CartLineItems component.\n */\n\nexport const ReportReviewModal = (props: IReportReviewModalProps): IReportReviewModalViewProps => {\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.SubmitReview);\n const submitReviewAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n payLoad.contentAction.etext = TelemetryConstant.SuccessButton;\n const successAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n payLoad.contentAction.etext = TelemetryConstant.Cancel;\n const cancelAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n\n reportConcernDropdownOptions = [\n { key: ReviewConcernCategory.SpamAdvertising, value: props.resources.reportSpamText },\n { key: ReviewConcernCategory.OffensiveContent, value: props.resources.offensiveContentText },\n { key: ReviewConcernCategory.Profanity, value: props.resources.profanityContentText }\n ];\n\n return {\n modal: {\n tag: Modal,\n className: 'ms-report-review-modal msc-modal-input-required',\n toggle: props.onModalToggle,\n applicationNode: 'renderPage',\n isOpen: props.isOpen,\n returnFocusRef: props.returnRef\n },\n modalHeader: { tag: ModalHeader, toggle: props.onModalToggle, className: 'ms-report-review-modal-header' },\n modalFooter: { tag: ModalFooter, className: 'ms-report-review-modal-footer' },\n modalBody: { tag: ModalBody, className: 'ms-report-review-modal-body' },\n header: <p className='ms-reviews-list__report-header'>{props.resources.reportConcernText}</p>,\n headerSubmitted: <p className='ms-reviews-list__report-header'>{props.resources.feedbackThankYouText}</p>,\n cancelButton: (\n <button className='msc-btn ms-reviews-list__cancel' onClick={props.onModalToggle} {...cancelAttribute}>\n {props.resources.cancelReportReviewText}\n </button>\n ),\n submitButton: (\n <button className='msc-btn ms-reviews-list__submit' onClick={props.reportReview} {...submitReviewAttribute}>\n {' '}\n {props.resources.reportReviewButtonText || 'Report'}\n </button>\n ),\n succesfulButton: (\n <button className='msc-btn ms-reviews-list__success' onClick={props.onModalToggle} {...successAttribute}>\n {props.resources.okReportReviewText}\n </button>\n ),\n reportMessage: <p className='ms-reviews-list__report-message'>{props.resources.reportModalMessage}</p>,\n reportSubmittedMessage: <p className='ms-reviews-list__report-message'>{props.resources.reportSubmittedMessage}</p>,\n radioButtons: radioPairs(props),\n error: (\n <Alert className='ms-reviews-list__report-error' isOpen={props.hasError} color='danger'>\n {props.resources.errorMessageText}\n </Alert>\n )\n };\n};\n\nconst radioPairs = (props: IReportReviewModalProps) => {\n const pairs = [];\n for (const option of reportConcernDropdownOptions) {\n const inputId = `report-review-${option.key}`;\n const checked = option.key === props.reportedKey;\n pairs.push(\n <div className='ms-report-review-modal-pair' key={option.key}>\n <input\n className='msc-radio-input'\n type='radio'\n name='report-error'\n id={inputId}\n data-key={option.key}\n value={option.value}\n checked={checked}\n aria-checked={checked}\n onChange={props.onRadioChange}\n />\n <label className='msc-radio-label' htmlFor={inputId}>\n {option.value}\n </label>\n </div>\n );\n }\n\n return <fieldset>{pairs}</fieldset>;\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Review } from '@msdyn365-commerce/commerce-entities';\nimport { RatingComponent } from '@msdyn365-commerce/components';\nimport { IAny, ICoreContext, IGeneric, isOboRequest } from '@msdyn365-commerce/core';\nimport { Button, format, INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nimport { TOGGLE_EDIT_MODAL_BUTTON_CARD_ID } from '../../../common/rnrInterface';\n\nexport interface IReviewCardResources {\n wasReviewHelpfulText: string;\n yesButtonText: string;\n noButtonText: string;\n editReviewCardText: string;\n reportedText: string;\n reportConcernText: string;\n reviewRatingNarratorText: string;\n}\n\nexport interface IReviewCardProps {\n review: Review;\n resources: IReviewCardResources;\n context: ICoreContext<IGeneric<IAny>>;\n isUserReview?: boolean;\n parentId: string;\n parentType: string;\n reportedReviews: string[];\n returnRef: React.RefObject<HTMLButtonElement> | undefined;\n reportedReviewId: string;\n votedReviews: { reviewId: string; approved: boolean }[];\n toggleWriteReviewModal?(): void;\n toggleReportReviewModal(reviewId: string): void;\n updateReviewHelpfulness(reviewId: string, isHelpful: boolean): void;\n}\n\nexport interface IReviewCardViewProps {\n cardProps: INodeProps;\n name: React.ReactElement;\n rating: React.ReactElement;\n date: React.ReactElement;\n reviewTitle: React.ReactElement;\n reviewText: React.ReactElement;\n ratingHelpfulLabel?: React.ReactElement;\n like?: React.ReactElement;\n dislike?: React.ReactElement;\n edit: React.ReactNode;\n report: React.ReactNode;\n responseName: React.ReactNode;\n responseDate: React.ReactNode;\n responseText: React.ReactNode;\n cardBodyProps: INodeProps;\n responseProps: INodeProps;\n reviewProps: INodeProps;\n controlsProps: INodeProps;\n headerProps: INodeProps;\n}\n\n/**\n * Review card component.\n */\n\nexport const ReviewCard = (props: IReviewCardProps): IReviewCardViewProps => {\n const className = props.isUserReview ? 'ms-reviews-list__card ms-reviews-list__user-review' : 'ms-reviews-list__card';\n return {\n cardProps: { className, key: props.review.reviewId },\n name: <p className='ms-reviews-list__name'>{props.review.userName}</p>,\n rating: rating(props),\n date: <p className='ms-reviews-list__date'>{renderDate(props, props.review.submittedDateTime)}</p>,\n reviewTitle: <h4 className='ms-reviews-list__title'>{props.review.title}</h4>,\n reviewText: <p className='ms-reviews-list__text'>{props.review.reviewText}</p>,\n ratingHelpfulLabel: props.isUserReview ? (\n undefined\n ) : (\n <p className='ms-reviews-list__helpful'>{props.resources.wasReviewHelpfulText}</p>\n ),\n like: props.isUserReview ? undefined : voteHelpfulButton(props, true),\n dislike: props.isUserReview ? undefined : voteHelpfulButton(props, false),\n edit: editButton(props),\n report: reportToggle(props),\n responseName: props.review.userResponse ? (\n <p className='ms-reviews-list__response-name'>{props.review.userResponse.responderName}</p>\n ) : (\n undefined\n ),\n responseText: props.review.userResponse ? (\n <p className='ms-reviews-list__response-text'>{props.review.userResponse.responseText}</p>\n ) : (\n undefined\n ),\n responseDate: props.review.userResponse ? (\n <p className='ms-reviews-list__response-date'>{renderDate(props, props.review.userResponse.submittedDateTime)}</p>\n ) : (\n undefined\n ),\n cardBodyProps: { className: 'ms-reviews-list__card-body' },\n responseProps: { className: 'ms-reviews-list__response' },\n reviewProps: { className: 'ms-reviews-list__review' },\n controlsProps: { className: 'ms-reviews-list__card-controls' },\n headerProps: { className: 'ms-reviews-list__card-header' }\n };\n};\n\nconst rating = (props: IReviewCardProps) => {\n return (\n <RatingComponent\n readOnly\n avgRating={props.review.rating}\n ariaLabel={format(props.resources.reviewRatingNarratorText || '', props.review.rating, '5')}\n context={props.context}\n className='ms-reviews-list__rating'\n id={props.parentId}\n typeName={props.parentType}\n data={{}}\n />\n );\n};\n\nconst isVotedFor = (props: IReviewCardProps, isHelpful: boolean): boolean => {\n for (let i = 0; i < props.votedReviews.length; i++) {\n if (props.votedReviews[i].reviewId === props.review.reviewId) {\n return props.votedReviews[i].approved === isHelpful;\n }\n }\n\n return false;\n};\n\nconst voteHelpfulButton = (props: IReviewCardProps, isHelpful: boolean) => {\n const isVoted = isVotedFor(props, isHelpful);\n const isDisabled = props.isUserReview || isVoted || isOboRequest(props.context.request) ? 'disabled' : '';\n let className = isHelpful ? 'ms-reviews-list__like' : 'ms-reviews-list__dislike';\n className = `${className} ${isDisabled}`;\n const label = isHelpful ? props.resources.yesButtonText : props.resources.noButtonText;\n let voteCount = (isHelpful ? props.review.helpfulPositive : props.review.helpfulNegative) || 0;\n voteCount = isVoted ? voteCount + 1 : voteCount;\n const title = `(${voteCount})`;\n const user = props.context.request.user;\n const onClickMethod = () => {\n props.updateReviewHelpfulness(props.review.reviewId!, isHelpful);\n };\n const onClick = isDisabled ? undefined : onClickMethod;\n\n if (user.isAuthenticated) {\n return (\n <Button aria-label={label} className={className} title={title} onClick={onClick}>\n {title}\n </Button>\n );\n }\n return (\n <Button href={user.signInUrl} aria-label={label} className={className} title={title} tag='a'>\n {title}\n </Button>\n );\n};\n\nconst editButton = (props: IReviewCardProps) => {\n if (props.isUserReview && !isOboRequest(props.context.request)) {\n return (\n <Button id={TOGGLE_EDIT_MODAL_BUTTON_CARD_ID} className='ms-reviews-list__edit' onClick={props.toggleWriteReviewModal}>\n {props.resources.editReviewCardText}\n </Button>\n );\n }\n\n return undefined;\n};\n\nconst renderDate = (props: IReviewCardProps, date?: Date): string | Date => {\n if (!date) {\n return '';\n }\n\n try {\n return new Intl.DateTimeFormat(props.context.request.locale, { month: 'long', day: 'numeric', year: 'numeric' }).format(\n new Date(date)\n );\n } catch {\n return date;\n }\n};\n\n/**\n * On Click Handler.\n * @param props -Review card props.\n * @returns Report review modal.\n */\nconst onClick = (props: IReviewCardProps) => () => {\n props.toggleReportReviewModal(props.review.reviewId!);\n};\n\nconst reportToggle = (props: IReviewCardProps) => {\n const user = props.context.request.user;\n if (props.isUserReview || isOboRequest(props.context.request)) {\n return undefined;\n } else if (!user.isAuthenticated) {\n return (\n <Button href={user.signInUrl} className='ms-reviews-list__report' tag='a'>\n {' '}\n {props.resources.reportConcernText}\n </Button>\n );\n }\n\n if (props.reportedReviews.includes(props.review.reviewId!)) {\n return <p className='ms-reviews-list__reported'>{props.resources.reportedText}</p>;\n }\n\n const ref = props.review.reviewId === props.reportedReviewId ? props.returnRef : undefined;\n\n return (\n <Button className='ms-reviews-list__report' onClick={onClick(props)} innerRef={ref}>\n {props.resources.reportConcernText}\n </Button>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { CacheType, IActionInput } from '@msdyn365-commerce/core';\n\n/**\n * SubmitHelpfulnessVote Input Action.\n */\nexport class SubmitHelpfulnessVoteInput implements IActionInput {\n public reviewId: string;\n\n public tenantId: string;\n\n public locale: string;\n\n public serviceEndpoint: string;\n\n public isHelpful: boolean;\n\n public authToken: string;\n\n constructor(reviewId: string, tenantId: string, locale: string, isHelpful: boolean, authToken: string, serviceEndpoint: string) {\n this.reviewId = reviewId;\n this.tenantId = tenantId;\n this.locale = locale;\n this.isHelpful = isHelpful;\n this.authToken = authToken;\n this.serviceEndpoint = serviceEndpoint;\n }\n\n public getCacheKey = () => 'SubmitHelpfulnessVote';\n\n public getCacheObjectType = () => 'SubmitHelpfulnessVote';\n\n public dataCacheType = (): CacheType => 'none';\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Review } from '@msdyn365-commerce/commerce-entities';\nimport { RatingComponent } from '@msdyn365-commerce/components';\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport {\n getRnrAuthEndpointId,\n getRnrEndpointId,\n getRnrPartnerId,\n getSelectedProductIdFromActionInput\n} from '@msdyn365-commerce-modules/retail-actions';\nimport {\n format,\n getTelemetryObject,\n ILabeledDropdownOnChangeNotification,\n ILabeledDropdownOption,\n IModuleProps,\n INodeProps,\n ITelemetryContent,\n LabeledDropdown\n} from '@msdyn365-commerce-modules/utilities';\nimport classname from 'classnames';\nimport { reaction } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { reportReviewConcern, submitHelpfulnessVote } from '../..';\nimport { getReviewsForGivenProduct } from '../../actions/get-product-reviews';\nimport { GetProductReviewsInput } from '../../actions/inputs/get-product-reviews-input';\nimport { ReportReviewConcernInput, ReviewConcernCategory } from '../../actions/inputs/report-review-concern-input';\nimport { SubmitHelpfulnessVoteInput } from '../../actions/inputs/submit-helpfulness-vote-input';\nimport { IReviewModalViewProps, ReviewModal, submitReview } from '../../common/review-modal';\nimport { IRnrKeyValuePair, IRnrOrderByKeyValuePair } from '../../common/rnrInterface';\nimport { PageControls, ReviewCount } from './components/components';\nimport { IReportReviewModalViewProps, ReportReviewModal } from './components/report-review-modal';\nimport { IReviewCardViewProps, ReviewCard } from './components/review-card';\nimport { IReviewsListData } from './reviews-list.data';\nimport { IReviewsListProps } from './reviews-list.props.autogenerated';\n\nexport interface IReviewsListState {\n skipItems: number;\n listOfReviews: Review[];\n currentPage: number;\n reviewsCount: number;\n showSpinner: boolean;\n isFilterApplied: boolean;\n selectedSortByOption: ILabeledDropdownOption;\n selectedFilterByOption: ILabeledDropdownOption;\n userReviewRating: number;\n userReviewTitle: string;\n userReviewText: string;\n isReviewModalOpen: boolean;\n hasReviewError: boolean;\n isReportModalOpen: boolean;\n hasReportError: boolean;\n reportingReviewId: string;\n reportedKey: string;\n reported: boolean;\n reportedReviews: string[];\n votedReviews: { reviewId: string; approved: boolean }[];\n}\n\nexport interface IReviewsListCallbacks {\n toggleModal(): void;\n updateReviewTitle(title: string): void;\n updateReviewText(text: string): void;\n updateRating(rating: number): void;\n onReviewSubmitted(isSuccessful: boolean): void;\n submitReview(\n product: SimpleProduct,\n title: string,\n text: string,\n rating: number,\n context: Msdyn365.ICoreContext,\n userReview?: Review,\n onReviewSubmission?: (isSuccessful: boolean) => void\n ): void;\n updateReviewHelpfulnessVote(reviewId: string, isHelpful: boolean): void;\n toggleReportModal(reviewId: string): void;\n reportReview(reviewId: string, reportedKey: string): void;\n updateSortByDropdown(notification: ILabeledDropdownOnChangeNotification): void;\n updateFilterByDropdown(notification: ILabeledDropdownOnChangeNotification): void;\n updateReviews(\n skipItems: number,\n selectedSortByOption: ILabeledDropdownOption,\n selectedFilterByOption: ILabeledDropdownOption,\n currentPage: number,\n isFilterApplied: boolean\n ): void;\n}\n\nexport interface IReviewsListViewProps extends IReviewsListProps<IReviewsListData> {\n state: IReviewsListState;\n className: string;\n callbacks: IReviewsListCallbacks;\n moduleProps: IModuleProps;\n reviewModal: IReviewModalViewProps;\n reportReviewModal: IReportReviewModalViewProps;\n sortByDropdown: React.ReactNode;\n filterByDropdown: React.ReactNode;\n averageRating: React.ReactNode;\n reviewCount: React.ReactElement;\n refineReviewsProps: INodeProps;\n reviewsListProps: INodeProps;\n reviewCards: IReviewCardViewProps[];\n userReview?: IReviewCardViewProps;\n pageControls: React.ReactNode;\n noReviewsMessage: React.ReactElement;\n noReviewsWithFilterMessage: React.ReactElement;\n heading: React.ReactNode;\n sortByOptions: IRnrOrderByKeyValuePair[];\n filterByOptions: IRnrOrderByKeyValuePair[];\n}\n\n/**\n *\n * ReviewsList component.\n * @extends {React.Component<IReviewsListProps<IReviewsListData>, IReviewsListState>}\n */\n@observer\nclass ReviewsList extends React.Component<IReviewsListProps<IReviewsListData>, IReviewsListState> {\n public sortByDropdownOptions: IRnrOrderByKeyValuePair[] = [\n { key: 'MostHelpful', value: this.props.resources.mostHelpfulSortOptionText },\n { key: 'MostRecent', value: this.props.resources.mostRecentSortOptionText },\n { key: 'HighestRating', value: this.props.resources.highestRatedSortOptionText },\n { key: 'LowestRating', value: this.props.resources.lowestRatedSortOptionText }\n ];\n\n public filterByDropdownOptions: IRnrKeyValuePair[] = [\n { key: '1;2;3;4;5', value: this.props.resources.allRatinsFilterByOptionText },\n { key: '5', value: this.props.resources.fiveStarFilterByOptionText },\n { key: '4', value: this.props.resources.fourStarFilterByOptionText },\n { key: '3', value: this.props.resources.threeStarFilterByOptionText },\n { key: '2', value: this.props.resources.twoStarFilterByOptionText },\n { key: '1', value: this.props.resources.oneStarFilterByOptionText }\n ];\n\n private readonly _userReviewModalToggle: React.RefObject<HTMLButtonElement>;\n\n private readonly _userReportModalToggle: React.RefObject<HTMLButtonElement>;\n\n private readonly telemetryContent?: ITelemetryContent;\n private readonly reviewsListCallbacks: IReviewsListCallbacks = {\n updateReviewTitle: (title: string): void => {\n this.setState({ userReviewTitle: title });\n },\n updateReviewText: (text: string): void => {\n this.setState({ userReviewText: text });\n },\n updateRating: (rating: number): void => {\n this.setState({ userReviewRating: rating });\n },\n onReviewSubmitted: (isSuccessful: boolean): void => {\n if (isSuccessful) {\n this.setState({ isReviewModalOpen: false, hasReviewError: false });\n } else {\n this.setState({ hasReviewError: true });\n }\n },\n submitReview,\n // @ts-expect-error\n toggleModal: this._toggleReviewModal,\n // @ts-expect-error\n updateReviewHelpfulnessVote: this.updateReviewHelpfulnessVote,\n toggleReportModal: (reviewId: string): void => {\n this.state.isReportModalOpen ? this._onReportModalOpen(reviewId) : this._onReportModalClose();\n },\n // @ts-expect-error\n reportReview: this._reportReviewCallback,\n // @ts-expect-error\n updateFilterByDropdown: this.updateFilterByDropdown,\n // @ts-expect-error\n updateSortByDropdown: this.updateSortByDropdown,\n // @ts-expect-error\n updateReviews: this.updateReviews\n };\n constructor(props: IReviewsListProps<IReviewsListData>) {\n super(props);\n const {\n userReview: { result: userReview }\n } = this.props.data;\n\n this.state = {\n skipItems: 0,\n reviewsCount: 0,\n listOfReviews: [],\n currentPage: 1,\n showSpinner: false,\n isFilterApplied: false,\n selectedSortByOption: this.sortByDropdownOptions[0],\n selectedFilterByOption: this.filterByDropdownOptions[0],\n userReviewRating: userReview ? userReview.rating : 0,\n userReviewText: userReview ? userReview.reviewText : '',\n userReviewTitle: userReview ? userReview.title : '',\n isReviewModalOpen: false,\n hasReviewError: false,\n isReportModalOpen: false,\n hasReportError: false,\n reported: false,\n reportedKey: ReviewConcernCategory.SpamAdvertising,\n reportingReviewId: '',\n reportedReviews: [],\n votedReviews: []\n };\n\n this._userReviewModalToggle = React.createRef<HTMLButtonElement>();\n this._userReportModalToggle = React.createRef<HTMLButtonElement>();\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n }\n\n public shouldComponentUpdate(nextProps: IReviewsListProps<IReviewsListData>, nextState: IReviewsListState): boolean {\n if (this.state === nextState && this.props.data === nextProps.data) {\n return false;\n }\n return true;\n }\n public componentDidMount = async () => {\n this.props.data.reviewsList.then(reviewsList => {\n if (\n reviewsList &&\n reviewsList.pagingInfo &&\n reviewsList.pagingInfo.totalItems &&\n reviewsList.items &&\n reviewsList.items.length > 0\n ) {\n this.setState({\n listOfReviews: reviewsList.items,\n reviewsCount: reviewsList.pagingInfo.totalItems\n });\n }\n });\n await this.updateReviews(0, this.state.selectedSortByOption, this.state.selectedFilterByOption, 1, this.state.isFilterApplied);\n\n reaction(\n () => this.props.data.ratingsReviewsState.result && this.props.data.ratingsReviewsState.result.filterKey,\n async (filterKey: string | undefined) => {\n const filterKeyValue = Number(filterKey);\n const dropdownItemsCount = this.filterByDropdownOptions.length;\n if (filterKey && !isNaN(filterKeyValue) && filterKeyValue < dropdownItemsCount) {\n const filterByOption = this.filterByDropdownOptions.find((option: IRnrKeyValuePair) => option.key === filterKey);\n if (!filterByOption) {\n this.props.telemetry.warning(`[reviews-list] cannot find filter with key ${filterKey}`);\n } else {\n await this.updateReviews(0, this.state.selectedSortByOption, filterByOption, 1, true);\n const selectedIndex = dropdownItemsCount - filterKeyValue;\n this.setState({\n selectedFilterByOption: this.filterByDropdownOptions[selectedIndex]\n });\n }\n }\n }\n );\n };\n public render(): JSX.Element | null {\n const { className, heading, reviewsShownOnEachPage } = this.props.config;\n const { currentPage, reviewsCount, selectedFilterByOption, selectedSortByOption } = this.state;\n const {\n ratingsSummary: { result: ratingsSummary }\n } = this.props.data;\n const resources = this.props.resources;\n const completeClass = classname('ms-reviews-list', className);\n const viewProps: IReviewsListViewProps = {\n ...this.props,\n state: this.state,\n className: completeClass,\n moduleProps: {\n moduleProps: this.props,\n className: completeClass\n },\n callbacks: this.reviewsListCallbacks,\n reviewModal: this._userReviewModal(),\n reportReviewModal: this._reportReviewModal(),\n filterByDropdown: (\n <LabeledDropdown\n labelText={resources.filterByDropdownText}\n dropdownId='reviewsListFilterBy'\n dropdownOptions={this.filterByDropdownOptions}\n selectedOption={selectedFilterByOption}\n onSelectOption={this.updateFilterByDropdown}\n controlledByParent\n />\n ),\n sortByDropdown: (\n <LabeledDropdown\n labelText={resources.sortByDropdownText}\n dropdownId='reviewsListSortBy'\n dropdownOptions={this.sortByDropdownOptions}\n selectedOption={selectedSortByOption}\n onSelectOption={this.updateSortByDropdown}\n />\n ),\n averageRating: ratingsSummary && (\n <RatingComponent\n avgRating={ratingsSummary.averageRating || 0}\n readOnly\n ariaLabel={format(resources.averageRatingAriaLabel, ratingsSummary.averageRating, '5')}\n ratingCount={`${ratingsSummary.reviewsCount}`}\n data={{}}\n context={this.props.context}\n id={this.props.id}\n typeName={this.props.typeName}\n />\n ),\n reviewCount: (\n <ReviewCount\n resources={{ ...this.props.resources }}\n currentPage={currentPage}\n reviewsCount={reviewsCount}\n reviewsShownOnEachPage={reviewsShownOnEachPage}\n />\n ),\n refineReviewsProps: { className: 'ms-reviews-list__refiners' },\n reviewsListProps: { className: 'ms-reviews-list__reviews' },\n reviewCards: this._reviewCards(this.state.listOfReviews),\n userReview: this._userReview(),\n pageControls: (\n <PageControls\n resources={{ ...this.props.resources }}\n currentPage={currentPage}\n reviewsShownOnEachPage={reviewsShownOnEachPage}\n selectedSortByOption={selectedSortByOption}\n selectedFilterByOption={selectedFilterByOption}\n updateReviews={this.updateReviews}\n reviewsCount={reviewsCount}\n telemetryContent={this.telemetryContent}\n />\n ),\n noReviewsMessage: (\n <span className='ms-reviews-list__empty-message' aria-live='polite'>\n {resources.noReviewsMessage}\n </span>\n ),\n noReviewsWithFilterMessage: (\n <span className='ms-reviews-list__filter-message' aria-live='polite'>\n {resources.noReviewsWithSelectedFilterMessage}\n </span>\n ),\n heading: heading && heading.text && (\n <Msdyn365.Text\n className='ms-reviews-list__heading'\n tag={heading.tag || 'h2'}\n text={heading.text}\n editProps={{ onEdit: this.handleHeadingChange, requestContext: this.props.context.request }}\n />\n ),\n sortByOptions: this.sortByDropdownOptions,\n filterByOptions: this.filterByDropdownOptions\n } as IReviewsListViewProps;\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n public handleHeadingChange = (event: Msdyn365.ContentEditableEvent) => (this.props.config.heading!.text = event.target.value);\n private readonly _userReview = () => {\n const userReview = this.props.data.userReview.result;\n\n return userReview && this._reviewCard(userReview, true);\n };\n\n private readonly _reviewCards = (reviewList: Review[]) => {\n const userReview = this.props.data.userReview.result;\n const reviewElements: IReviewCardViewProps[] = [];\n\n for (const review of reviewList) {\n if (!review.isTakenDown && review.isPublished && userReview ? review.reviewId !== userReview.reviewId : true) {\n reviewElements.push(this._reviewCard(review, false));\n }\n }\n return reviewElements;\n };\n\n private readonly _reviewCard = (review: Review, userReview: boolean): IReviewCardViewProps => {\n return ReviewCard({\n review,\n resources: { ...this.props.resources },\n context: this.props.context,\n isUserReview: userReview,\n parentId: this.props.id,\n parentType: this.props.typeName,\n reportedReviews: this.state.reportedReviews,\n returnRef: this._userReportModalToggle,\n reportedReviewId: this.state.reportingReviewId,\n toggleWriteReviewModal: this._toggleReviewModal,\n toggleReportReviewModal: this._onReportModalOpen,\n updateReviewHelpfulness: this.updateReviewHelpfulnessVote,\n votedReviews: this.state.votedReviews\n });\n };\n\n private readonly _userReviewModal = (): IReviewModalViewProps => {\n return ReviewModal({\n userReview: this.props.data.userReview.result,\n product: this.props.data.product.result,\n resources: { ...this.props.resources },\n context: this.props.context,\n parentId: this.props.id,\n parentType: this.props.typeName,\n isOpen: this.state.isReviewModalOpen,\n rating: this.state.userReviewRating,\n reviewTitle: this.state.userReviewTitle,\n reviewText: this.state.userReviewText,\n onModalToggle: this._toggleReviewModal,\n onTitleChange: this._onTitleChange,\n onTextChange: this._onTextChange,\n onRatingChange: this._onRatingChange,\n onReviewComplete: this._onReviewComplete,\n renderContextId: 'writeReview-list',\n returnRef: this._userReviewModalToggle,\n hasError: this.state.hasReviewError,\n modalCSS: 'ms-reviews-list'\n });\n };\n\n private readonly _onTitleChange = (event: React.ChangeEvent<HTMLInputElement>): void => {\n this.reviewsListCallbacks.updateReviewTitle(event.target.value);\n };\n\n private readonly _onTextChange = (event: React.ChangeEvent<HTMLTextAreaElement>): void => {\n this.reviewsListCallbacks.updateReviewText(event.target.value);\n };\n\n private readonly _onRatingChange = (value: number): void => {\n this.reviewsListCallbacks.updateRating(value);\n };\n\n private readonly _toggleReviewModal = (): void => {\n const userReview = this.props.data.userReview.result;\n if (this.state.isReviewModalOpen) {\n this.setState({ isReviewModalOpen: false, hasReviewError: false });\n } else {\n this.setState({\n isReviewModalOpen: true,\n userReviewText: userReview!.reviewText,\n userReviewTitle: userReview!.title,\n userReviewRating: userReview!.rating\n });\n }\n };\n\n private readonly _onReviewComplete = (isSuccess: boolean): void => {\n if (isSuccess) {\n this.setState({ isReviewModalOpen: false, hasReviewError: false });\n } else {\n this.setState({ hasReviewError: true });\n }\n };\n\n private readonly _reportReviewModal = () => {\n return ReportReviewModal({\n resources: { ...this.props.resources },\n context: this.props.context,\n isOpen: this.state.isReportModalOpen,\n returnRef: this._userReportModalToggle,\n reportedKey: this.state.reportedKey,\n onModalToggle: this._onReportModalClose,\n onRadioChange: this._onRadioChange,\n reportReview: this._reportReview,\n hasError: this.state.hasReportError,\n telemetryContent: this.telemetryContent\n });\n };\n\n private readonly _onReportModalOpen = (reviewId: string) => {\n this.setState({\n isReportModalOpen: true,\n reportingReviewId: reviewId,\n reported: false,\n reportedKey: ReviewConcernCategory.SpamAdvertising\n });\n };\n\n private readonly _onReportModalClose = () => {\n this.setState({ isReportModalOpen: false, hasReportError: false });\n };\n\n private readonly _onRadioChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n this.setState({ reportedKey: event.currentTarget.getAttribute('data-key') || '' });\n };\n\n private readonly _reportReviewCallback = (reviewId: string, reportedKey: string) => {\n reportReviewConcern(\n new ReportReviewConcernInput(\n reviewId,\n getRnrPartnerId(this.props.context.actionContext),\n this.props.context.request.locale,\n reportedKey,\n this.getUserToken(this.props.context.request),\n getRnrAuthEndpointId(this.props.context.actionContext)\n ),\n this.props.context.actionContext\n )\n .then((_value: boolean) => {\n const reportedReview = this.state.reportedReviews;\n reportedReview.push(reviewId);\n this.setState({ reported: true, reportedReviews: reportedReview, hasReportError: false });\n })\n .catch((error: boolean) => {\n this.setState({ hasReportError: true });\n });\n };\n\n private readonly _reportReview = () => {\n this._reportReviewCallback(this.state.reportingReviewId, this.state.reportedKey);\n };\n\n private readonly updateSortByDropdown = async (notification: ILabeledDropdownOnChangeNotification) => {\n await this.updateReviews(0, notification.selectedOption, this.state.selectedFilterByOption, 1, this.state.isFilterApplied);\n };\n\n private readonly updateFilterByDropdown = async (notification: ILabeledDropdownOnChangeNotification) => {\n await this.updateReviews(0, this.state.selectedSortByOption, notification.selectedOption, 1, true);\n };\n\n private readonly updateReviews = async (\n skipItems: number | 0,\n selectedSortByOption: ILabeledDropdownOption,\n selectedFilterByOption: ILabeledDropdownOption,\n currentPage: number,\n isFilterApplied: boolean\n ) => {\n const productId = getSelectedProductIdFromActionInput(this.props.context.actionContext);\n if (productId === undefined) {\n return;\n }\n const result = await getReviewsForGivenProduct(\n // Task #211227597 Remove this hardcoded values.\n new GetProductReviewsInput(\n productId,\n getRnrPartnerId(this.props.context.actionContext),\n this.props.context.request.locale,\n getRnrEndpointId(this.props.context.actionContext),\n selectedSortByOption.key,\n selectedFilterByOption.key,\n skipItems < 0 ? 0 : skipItems,\n this.props.config.reviewsShownOnEachPage\n ),\n this.props.context.actionContext\n );\n if (result && result.items && result.pagingInfo && result.pagingInfo.totalItems !== undefined) {\n this.setState({\n currentPage,\n listOfReviews: result.items,\n selectedSortByOption,\n selectedFilterByOption,\n reviewsCount: result.pagingInfo.totalItems,\n isFilterApplied\n });\n }\n };\n\n private readonly _updateVoteUi = (reviewId: string, isHelpful: boolean): void => {\n let alreadyExists = false;\n let list = this.state.votedReviews.map(review => {\n if (review.reviewId === reviewId) {\n review.approved = isHelpful;\n alreadyExists = true;\n }\n return review;\n });\n\n if (!alreadyExists) {\n list = list.concat({ reviewId, approved: isHelpful });\n }\n\n this.setState({ votedReviews: list });\n };\n\n private readonly updateReviewHelpfulnessVote = (reviewId: string, isHelpful: boolean): void => {\n submitHelpfulnessVote(\n new SubmitHelpfulnessVoteInput(\n reviewId,\n getRnrPartnerId(this.props.context.actionContext),\n this.props.context.request.locale,\n isHelpful,\n this.getUserToken(this.props.context.request),\n getRnrAuthEndpointId(this.props.context.actionContext)\n ),\n this.props.context.actionContext\n )\n .then(() => {\n this._updateVoteUi(reviewId, isHelpful);\n })\n .catch((error: Error) => {\n throw new Error('[submitHelpfulnessVote]Error executing action');\n });\n };\n\n private readonly getUserToken = (context: Msdyn365.IRequestContext): string => {\n return context && context.user && context.user.token;\n };\n}\n\nexport default ReviewsList;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IModuleProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IReviewModalViewProps } from '../../common/review-modal';\nimport { IReportReviewModalViewProps } from './components/report-review-modal';\nimport { IReviewCardViewProps } from './components/review-card';\nimport { IReviewsListState, IReviewsListViewProps } from './reviews-list';\n\nconst ReviewsListview: React.FC<IReviewsListViewProps> = props => {\n const {\n averageRating,\n filterByDropdown,\n heading,\n moduleProps,\n noReviewsMessage,\n noReviewsWithFilterMessage,\n pageControls,\n refineReviewsProps,\n reportReviewModal,\n reviewsListProps,\n reviewCards,\n reviewCount,\n reviewModal,\n sortByDropdown,\n state,\n userReview\n } = props;\n\n if (!userReview && reviewCards.length === 0 && !state.isFilterApplied) {\n return <Module {...moduleProps}>{noReviewsMessage}</Module>;\n }\n\n return (\n <Module {...moduleProps}>\n {heading}\n {averageRating}\n {reviewCount}\n <Node {...refineReviewsProps}>\n {sortByDropdown}\n {filterByDropdown}\n </Node>\n <Node {...reviewsListProps}>\n {userReview && buildReviewCard(userReview)}\n {reviewCards.map(review => {\n return buildReviewCard(review);\n })}\n </Node>\n {reviewCards.length === 0 && state.isFilterApplied && noReviewsWithFilterMessage}\n {pageControls}\n {createReviewModal(reviewModal, moduleProps)}\n {createReportModal(reportReviewModal, state)}\n </Module>\n );\n};\n\nconst buildReviewCard = (props: IReviewCardViewProps) => {\n return (\n <Node {...props.cardProps}>\n <Node {...props.headerProps}>\n {props.rating}\n {props.name}\n </Node>\n <Node {...props.cardBodyProps}>\n <Node {...props.reviewProps}>\n {props.reviewTitle}\n {props.date}\n {props.reviewText}\n </Node>\n <Node {...props.responseProps}>\n {props.responseName}\n {props.responseDate}\n {props.responseText}\n </Node>\n <Node {...props.controlsProps}>\n {props.ratingHelpfulLabel}\n {props.like}\n {props.dislike}\n {props.edit}\n {props.report}\n </Node>\n </Node>\n </Node>\n );\n};\n\nconst createReviewModal = (props: IReviewModalViewProps, moduleProps: IModuleProps): JSX.Element => {\n return (\n <Module {...props.modal} {...moduleProps}>\n {props.modalHeader}\n <Node {...props.modalBody}>\n <Node {...props.form}>\n <Node {...props.inputRow}>\n {props.rating}\n {props.ratingLabel}\n </Node>\n <Node {...props.inputRow}>\n {props.titleLabel}\n {props.titleInput}\n </Node>\n <Node {...props.inputRow}>\n {props.textLabel}\n {props.textInput}\n </Node>\n {props.privacyPolicyUrl}\n {props.error}\n </Node>\n </Node>\n <Node {...props.modalFooter}>\n {props.submitButton}\n {props.cancelButton}\n </Node>\n </Module>\n );\n};\n\nconst createReportModal = (props: IReportReviewModalViewProps, state: IReviewsListState): JSX.Element => {\n return (\n <Node {...props.modal}>\n <Node {...props.modalHeader}>{state.reported ? props.headerSubmitted : props.header}</Node>\n <Node {...props.modalBody}>\n {state.reported ? props.reportSubmittedMessage : [props.reportMessage, props.radioButtons, props.error]}\n </Node>\n <Node {...props.modalFooter}>{state.reported ? props.succesfulButton : [props.submitButton, props.cancelButton]}</Node>\n </Node>\n );\n};\n\nexport default ReviewsListview;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nexport const SignInMessage: React.FC<{ text: string }> = (props: { text: string }) => {\n return <p className='ms-write-review__sign-in'>{props.text}</p>;\n};\n\nexport const SignInButton: React.FC<{ text: string; href: string; ariaLabel: string; telemetryContent?: ITelemetryContent }> = (props: {\n text: string;\n href: string;\n ariaLabel: string;\n telemetryContent?: ITelemetryContent;\n}) => {\n const { text, href, ariaLabel, telemetryContent } = props;\n const payLoad = getPayloadObject('click', telemetryContent!, TelemetryConstant.SignIn);\n const attributes = getTelemetryAttributes(telemetryContent!, payLoad);\n return (\n <a href={href} className='ms-write-review__sign-in-btn msc-btn' aria-label={ariaLabel} {...attributes}>\n {text}\n </a>\n );\n};\n\ninterface IModalToggleProps {\n innerRef: React.RefObject<HTMLButtonElement> | undefined;\n id: string;\n text: string;\n ariaLabel: string;\n telemetryContent?: ITelemetryContent;\n onClick(): void;\n}\n\nexport const ModalToggle: React.FC<IModalToggleProps> = (props: IModalToggleProps) => {\n const { text, onClick, ariaLabel, innerRef, telemetryContent, id } = props;\n const payLoad = getPayloadObject('click', telemetryContent!, TelemetryConstant.WriteReview);\n const attributes = getTelemetryAttributes(telemetryContent!, payLoad);\n return (\n <button id={id} className='ms-write-review__toggle msc-btn' aria-label={ariaLabel} onClick={onClick} ref={innerRef} {...attributes}>\n {text}\n </button>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Review } from '@msdyn365-commerce/commerce-entities';\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { getTelemetryObject, IModuleProps, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport React from 'react';\n\nimport { IReviewModalViewProps, ReviewModal, submitReview } from '../../common/review-modal';\nimport { TOGGLE_REVIEW_MODAL_BUTTON_ID } from '../../common/rnrInterface';\nimport { ModalToggle, SignInButton, SignInMessage } from './components/components';\nimport { IWriteReviewData } from './write-review.data';\nimport { IWriteReviewProps } from './write-review.props.autogenerated';\n\nexport interface IWriteReviewCallbacks {\n toggleModal(): void;\n updateReviewTitle(title: string): void;\n updateReviewText(text: string): void;\n updateRating(rating: number): void;\n onReviewSubmitted(isSuccessful: boolean): void;\n submitReview(\n product: SimpleProduct,\n title: string,\n text: string,\n rating: number,\n context: Msdyn365.ICoreContext,\n userReview?: Review,\n onReviewSubmission?: (isSuccessful: boolean) => void\n ): void;\n}\n\nexport interface IWriteReviewState {\n rating: number;\n reviewTitle: string;\n reviewText: string;\n isReviewModalOpen: boolean;\n hasReviewError: boolean;\n}\n\nexport interface IWriteReviewViewProps extends IWriteReviewProps<IWriteReviewData> {\n state: IWriteReviewState;\n className: string;\n callbacks: IWriteReviewCallbacks;\n signInMessage: React.ReactNode;\n signInButton: React.ReactNode;\n modalToggle: React.ReactNode;\n reviewModal: IReviewModalViewProps;\n moduleProps: IModuleProps;\n heading: React.ReactNode;\n}\n\n/**\n * This module is enables user's to leave ratings and reviews on a specific product\n * WriteReview module.\n * @extends {React.PureComponent<IWriteReviewProps<IWriteReviewData>>}\n */\nclass WriteReview extends React.PureComponent<IWriteReviewProps<IWriteReviewData>, IWriteReviewState> {\n private readonly _modalToggleRef: React.RefObject<HTMLButtonElement> | undefined;\n\n private readonly telemetryContent: ITelemetryContent;\n private readonly writeReviewCallbacks: IWriteReviewCallbacks = {\n // @ts-expect-error\n toggleModal: this._toggleReviewModal,\n updateReviewTitle: (title: string): void => {\n this.setState({ reviewTitle: title });\n },\n updateReviewText: (text: string): void => {\n this.setState({ reviewText: text });\n },\n updateRating: (rating: number): void => {\n this.setState({ rating });\n },\n onReviewSubmitted: (isSuccessful: boolean): void => {\n if (isSuccessful) {\n this.setState({ isReviewModalOpen: false, hasReviewError: false });\n } else {\n this.setState({ hasReviewError: true });\n }\n },\n submitReview\n };\n public constructor(props: IWriteReviewProps<IWriteReviewData>) {\n super(props);\n const {\n userReview: { result: userReview }\n } = this.props.data;\n this._toggleReviewModal = this._toggleReviewModal.bind(this);\n this._modalToggleRef = React.createRef<HTMLButtonElement>();\n const rating = userReview ? userReview.rating : 0;\n const reviewTitle = userReview ? userReview.title : '';\n const reviewText = userReview ? userReview.reviewText : '';\n\n this.state = {\n isReviewModalOpen: false,\n rating,\n reviewTitle,\n reviewText,\n hasReviewError: false\n };\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n }\n\n public render(): JSX.Element {\n const { resources } = this.props;\n const { className, heading } = this.props.config;\n const {\n product: { result: product },\n userReview: { result: userReview }\n } = this.props.data;\n\n const userInfo = this.props.context && this.props.context.request && this.props.context.request.user;\n const completeClass = classnames('ms-write-review', 'msc-modal-input-required', className);\n const viewProps = {\n ...this.props,\n state: this.state,\n className: completeClass,\n moduleProps: {\n moduleProps: this.props,\n className: completeClass,\n id: null\n },\n callbacks: this.writeReviewCallbacks,\n signInMessage: <SignInMessage text={resources.signInMessage} />,\n signInButton: (\n <SignInButton\n text={resources.signInLabel}\n ariaLabel={resources.signInAriaLabel}\n href={userInfo.signInUrl!}\n telemetryContent={this.telemetryContent}\n />\n ),\n modalToggle: !Msdyn365.isOboRequest(this.props.context.request) && product && (\n <ModalToggle\n text={userReview ? resources.editReviewButtonText : resources.reviewButtonLabel}\n ariaLabel={resources.reviewButtonLabel}\n innerRef={this._modalToggleRef}\n onClick={this._toggleReviewModal}\n id={TOGGLE_REVIEW_MODAL_BUTTON_ID}\n telemetryContent={this.telemetryContent}\n />\n ),\n reviewModal: this._buildUserReviewModal(),\n heading: heading && heading.text && (\n <Msdyn365.Text\n className='ms-write-review__heading'\n tag={heading.tag || 'h2'}\n text={heading.text}\n editProps={{ onEdit: this.handleHeadingChange, requestContext: this.props.context.request }}\n />\n )\n } as IWriteReviewViewProps;\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n public handleHeadingChange = (event: Msdyn365.ContentEditableEvent) => (this.props.config.heading!.text = event.target.value);\n private readonly _onTitleChange = (event: React.ChangeEvent<HTMLInputElement>): void => {\n this.writeReviewCallbacks.updateReviewTitle(event.target.value);\n };\n\n private readonly _onTextChange = (event: React.ChangeEvent<HTMLTextAreaElement>): void => {\n this.writeReviewCallbacks.updateReviewText(event.target.value);\n };\n\n private readonly _onRatingChange = (value: number): void => {\n this.writeReviewCallbacks.updateRating(value);\n };\n\n private readonly _toggleReviewModal = (): void => {\n const userReview = this.props.data.userReview.result;\n if (this.state.isReviewModalOpen) {\n this.setState({ isReviewModalOpen: false, hasReviewError: false });\n } else if (userReview) {\n this.setState({\n isReviewModalOpen: true,\n reviewText: userReview.reviewText,\n reviewTitle: userReview.title,\n rating: userReview.rating\n });\n } else {\n this.setState({\n isReviewModalOpen: true,\n reviewText: '',\n reviewTitle: '',\n rating: 0\n });\n }\n };\n\n /**\n * This method builds the user review modal.\n * @param config The module config.\n */\n private _buildUserReviewModal(): IReviewModalViewProps {\n return ReviewModal({\n userReview: this.props.data.userReview.result,\n product: this.props.data.product.result,\n resources: { ...this.props.resources },\n context: this.props.context,\n parentId: this.props.id,\n parentType: this.props.typeName,\n isOpen: this.state.isReviewModalOpen,\n rating: this.state.rating,\n reviewTitle: this.state.reviewTitle,\n reviewText: this.state.reviewText,\n onModalToggle: this._toggleReviewModal,\n onTitleChange: this._onTitleChange,\n onTextChange: this._onTextChange,\n onRatingChange: this._onRatingChange,\n onReviewComplete: this.writeReviewCallbacks.onReviewSubmitted,\n renderContextId: 'writeReview',\n returnRef: this._modalToggleRef,\n hasError: this.state.hasReviewError,\n telemetryContent: this.telemetryContent\n });\n }\n}\n\nexport default WriteReview;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IModuleProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IReviewModalViewProps } from '../../common/review-modal';\nimport { IWriteReviewViewProps } from './write-review';\n\nconst WriteReviewView: React.FC<IWriteReviewViewProps> = props => {\n const { heading, signInMessage, signInButton, modalToggle, reviewModal, moduleProps } = props;\n const isAuthenticated = props.context.request.user.isAuthenticated;\n return (\n <Module {...moduleProps}>\n {heading}\n {!isAuthenticated ? (\n <>\n {signInMessage}\n {signInButton}\n </>\n ) : (\n <>\n {modalToggle}\n {createReviewModal(reviewModal, moduleProps)}\n </>\n )}\n </Module>\n );\n};\n\nconst createReviewModal = (props: IReviewModalViewProps, moduleProps: IModuleProps): JSX.Element => {\n return (\n <Module {...props.modal} {...moduleProps}>\n {props.modalHeader}\n <Node {...props.modalBody}>\n <Node {...props.form}>\n <Node {...props.inputRow}>\n {props.rating}\n {props.ratingLabel}\n </Node>\n <Node {...props.inputRow}>\n {props.titleLabel}\n {props.titleInput}\n </Node>\n <Node {...props.inputRow}>\n {props.textLabel}\n {props.textInput}\n </Node>\n {props.privacyPolicyUrl}\n {props.error}\n </Node>\n </Node>\n <Node {...props.modalFooter}>\n {props.submitButton}\n {props.cancelButton}\n </Node>\n </Module>\n );\n};\n\nexport default WriteReviewView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { observable } from 'mobx';\n\n/**\n * State information related to what is needed to succesfully perform a autosuggest.\n */\nexport class SearchState {\n @observable public searchText?: string;\n\n @observable public defaultBasicSearchUrl?: string;\n\n @observable public searchQueryStringParameter?: string;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Autosuggestions } from '@msdyn365-commerce/commerce-entities';\nimport {\n CacheType,\n createObservableDataAction,\n getCatalogId,\n IAction,\n IActionContext,\n IActionInput,\n ICreateActionContext\n} from '@msdyn365-commerce/core';\nimport {\n AttributeDataType,\n ChannelInventoryConfiguration,\n ProductRefinerSource,\n ProductRefinerValue,\n ProductSearchCriteria,\n SearchSuggestion,\n SearchSuggestionCriteria\n} from '@msdyn365-commerce/retail-proxy';\nimport {\n getInventoryConfigurationAsync,\n getSearchSuggestionsAsync\n} from '@msdyn365-commerce/retail-proxy/dist/DataActions/StoreOperationsDataActions.g';\nimport { generateImageUrl } from '@msdyn365-commerce-modules/retail-actions';\n\nexport enum SuggestionType {\n Category = 'ScopedCategory',\n Keyword = 'Keyword',\n Product = 'Product',\n None = 'None'\n}\n\n/**\n * This setting defines inventory filtering options.\n */\nexport enum ProductListInventoryFilteringOptions {\n /**\n * Filter out all products out of stock.\n */\n HideOOS = 'hideOOS',\n\n /**\n * Sort products by availability, OOS goes last.\n */\n SortOOS = 'sortOOS',\n\n /**\n * No filtering selected.\n */\n Default = 'default'\n}\n\n/**\n * Input class for auto suggest search input.\n */\nexport class AutoSuggestInput implements IActionInput {\n public searchQuery?: string;\n\n public topResultsCount?: number;\n\n public suggestionType?: string;\n\n public hitPrefix?: string;\n\n public hitSuffix?: string;\n\n public constructor(searchText?: string, top?: number, suggestionType?: string, hitPrefix?: string, hitSuffix?: string) {\n this.searchQuery = searchText;\n this.topResultsCount = top;\n this.suggestionType = suggestionType;\n this.hitPrefix = hitPrefix;\n this.hitSuffix = hitSuffix;\n }\n\n public getCacheKey = () => 'AutoSuggestSearchSuggestions';\n\n public getCacheObjectType = () => 'AutoSuggestSearchSuggestions';\n\n public dataCacheType = (): CacheType => 'none';\n}\n\nconst createInput = (inputData: ICreateActionContext) => {\n return new AutoSuggestInput();\n};\n\n/**\n * Calls the Retail API and returns a auto-suggest suggestions.\n * @param input\n * @param ctx\n */\nexport async function getSearchSuggestionsAction(input: AutoSuggestInput, ctx: IActionContext): Promise<Autosuggestions | null> {\n // If no input is provided fail out\n if (!input || !input.searchQuery) {\n throw new Error('[getSearchSuggestionsAction]No valid Input was provided, failing');\n }\n\n const autosuggest: Autosuggestions = {};\n\n const autoSuggestPromises = [_getAutoSuggest(input, autosuggest, ctx)];\n return Promise.all(autoSuggestPromises).then(() => {\n return autosuggest;\n });\n}\n\n/**\n * Returns inventory in stock sortable refiner value.\n * @param channelInventoryConfiguration - The channelInventoryConfiguration.\n * @param isInStock - The flag indicating whether is getting in-stock refiner or out-of-stock refiner.\n * @returns Refiners.\n */\nconst getInventorySortableRefinerValue = (\n channelInventoryConfiguration: ChannelInventoryConfiguration,\n isInStock: boolean\n): ProductRefinerValue | undefined => {\n if (channelInventoryConfiguration && channelInventoryConfiguration.ProductAvailabilitySortableAttributeRecordId) {\n return {\n RefinerRecordId: channelInventoryConfiguration.ProductAvailabilitySortableAttributeRecordId,\n DataTypeValue: AttributeDataType.TrueFalse,\n LeftValueBoundString: isInStock ? 'true' : 'false',\n RightValueBoundString: isInStock ? 'true' : 'false',\n UnitText: '',\n RowNumber: 0,\n Count: 0,\n ExtensionProperties: [],\n RefinerSourceValue: ProductRefinerSource.Attribute\n };\n }\n return undefined;\n};\n\nasync function _getAutoSuggest(input: AutoSuggestInput, autosuggest: Autosuggestions, ctx: IActionContext): Promise<void> {\n const catalogId = getCatalogId(ctx.requestContext);\n let productSearchCriteria: ProductSearchCriteria = {\n SearchCondition: input.searchQuery && input.searchQuery.length > 0 ? input.searchQuery : '',\n Context: {\n ChannelId: +ctx.requestContext.apiSettings.channelId,\n CatalogId: catalogId\n }\n };\n\n if (ctx.requestContext.app.config?.productListInventoryDisplay === ProductListInventoryFilteringOptions.HideOOS) {\n const channelInventoryConfiguration = await getInventoryConfigurationAsync({ callerContext: ctx });\n const isInStockRefiner = true;\n const inventoryRefinerValue = getInventorySortableRefinerValue(channelInventoryConfiguration, isInStockRefiner);\n\n if (inventoryRefinerValue) {\n productSearchCriteria = {\n ...productSearchCriteria,\n Refinement: [inventoryRefinerValue]\n };\n }\n }\n\n const searchCriteria: SearchSuggestionCriteria = {\n ProductSearchCriteria: productSearchCriteria,\n HitPrefix: input.hitPrefix,\n HitSuffix: input.hitSuffix,\n SuggestionType: input.suggestionType\n };\n\n const searchSuggestions = await getSearchSuggestionsAsync(\n { callerContext: ctx, queryResultSettings: { Paging: { Top: input.topResultsCount } } },\n searchCriteria\n );\n\n if (searchSuggestions && searchSuggestions.length > 0) {\n // Generate image url\n searchSuggestions.map(\n (item: SearchSuggestion) =>\n (item.ImageUrl = item.ImageUrl ? generateImageUrl(item.ImageUrl, ctx.requestContext.apiSettings) : '')\n );\n\n autosuggest.AllSearchResults = searchSuggestions;\n } else {\n ctx.telemetry.error(\n `[getSearchSuggestionsAction] unable to get availabilites for search with suggestion type ${searchCriteria.SuggestionType}`\n );\n }\n}\n\nexport const getSearchSuggestionsActionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/search/get-auto-suggest-suggestions',\n action: <IAction<Autosuggestions>>getSearchSuggestionsAction,\n input: createInput\n});\n\nexport default getSearchSuggestionsActionDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport MsDyn365, { getRichTextHtml } from '@msdyn365-commerce/core';\nimport { ProductRefiner, ProductRefinerSource, ProductRefinerValue, SearchSuggestion } from '@msdyn365-commerce/retail-proxy';\nimport { format, getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISearchData } from '../search.data';\nimport { ISearchProps } from '../search.props.autogenerated';\n\nexport interface ISearchCategorySuggestProps {\n searchCategorySuggestClass: string;\n searchPageURL: string;\n searchQsp: string | undefined;\n hitPrefix: string;\n hitSuffix: string;\n autoSuggestProps: ISearchProps<ISearchData>;\n searchText: string;\n searchRefiners: ProductRefiner[] | undefined;\n suggestions: SearchSuggestion[] | undefined;\n telemetryContent?: ITelemetryContent;\n shouldShowFullPath?: boolean;\n}\n\nexport interface ISearchCategoryViewProps {\n title: React.ReactNode;\n text: React.ReactNode[];\n}\n\nlet payLoad: IPayLoad;\n\n/**\n * CategorySuggestionsComponent.\n * @param props\n */\nexport const CategorySuggestionsComponent = (props: ISearchCategorySuggestProps): ISearchCategoryViewProps | undefined => {\n const {\n suggestions,\n searchText,\n autoSuggestProps: {\n resources: { categorySuggestionHeading }\n }\n } = props;\n\n const reactNodes: React.ReactNode[] = [];\n payLoad = getPayloadObject('click', props.telemetryContent!, '');\n\n suggestions?.map(item => {\n reactNodes.push(_assembleNode(item, props));\n });\n\n const titleNode = _renderTitle(categorySuggestionHeading, searchText);\n\n return { title: titleNode, text: reactNodes };\n};\n\nconst _renderTitle = (categorySuggestionHeading: string, searchText: string) => {\n const categoryAutoSuggestionHeading = categorySuggestionHeading\n ? format(categorySuggestionHeading, searchText)\n : `Search \"${searchText}\" in categories`;\n\n return <li className='msc-autoSuggest__categoryResults-title'>{categoryAutoSuggestionHeading}</li>;\n};\n\nconst _assembleNode = (item: SearchSuggestion, props: ISearchCategorySuggestProps) => {\n const { searchText, hitPrefix, hitSuffix, shouldShowFullPath } = props;\n\n const splitValue = shouldShowFullPath ? item.Value : item.Value && item.Value.split('|').pop();\n const ariaLabel = splitValue\n ? splitValue.replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '')\n : item.Value && item.Value.replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n payLoad.contentAction.etext = item.Value;\n const attribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n return (\n <li className='msc-autoSuggest__categoryResults-item' key={item.Id}>\n <a aria-label={ariaLabel} href={_generateLink(item, searchText, props)} {...attribute}>\n {_generateLink(item, searchText, props) && _getHighlightedText(splitValue ? splitValue : '', hitPrefix, hitSuffix)}\n </a>\n </li>\n );\n};\n\nconst _generateLink = (suggestion: SearchSuggestion, searchText: string, props: ISearchCategorySuggestProps): string => {\n return suggestion && suggestion.Id ? _getCategoryLink(suggestion.Id, searchText, props) : '';\n};\n\nconst _getCategoryLink = (id: string, searchText: string, props: ISearchCategorySuggestProps): string => {\n const { searchPageURL, searchQsp, searchRefiners } = props;\n\n if (!MsDyn365.isBrowser) {\n return '';\n }\n\n const queryUrl = new URL(searchPageURL, window.location.href);\n\n if (searchQsp && searchText) {\n queryUrl.searchParams.set(searchQsp, searchText);\n }\n\n const categoryRefiners = searchRefiners?.find(refiners => {\n return refiners.SourceValue === ProductRefinerSource.Category;\n });\n const refiner = categoryRefiners?.Values?.find(item => {\n return item.RefinerRecordId === Number.parseInt(id, 10);\n });\n\n const encodedRefiner = refiner && JSON.stringify(compressRefiners([refiner]));\n if (encodedRefiner) {\n queryUrl.searchParams.set('refiners', encodedRefiner);\n }\n\n return queryUrl.href;\n};\n\nconst _getHighlightedText = (suggestion: string, hitPrefix: string, hitSuffix: string): JSX.Element => {\n const formattedText = suggestion\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '<strong>')\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '</strong>');\n\n // eslint-disable-next-line react/no-danger\n return <span dangerouslySetInnerHTML={getRichTextHtml(formattedText)} />;\n};\n\n// TODO: This code is currently duplicated in categoryautosuggest need to either remove one of these files\n// or move this code to a common place\nconst compressedRefinerKeys = [\n 'DataTypeValue',\n 'LeftValueBoundString',\n 'RefinerRecordId',\n 'RefinerSourceValue',\n 'RightValueBoundString',\n 'UnitText'\n];\n\n/**\n * Compressed a list of refiners for use in URLs.\n * @param refiners The uncompressed refiners.\n */\nconst compressRefiners = (refiners: ProductRefinerValue[]) => {\n const compressedRefiners: (string | number)[][] = [];\n\n refiners.forEach(refiner => {\n const compressedRefiner: (string | number)[] = [];\n compressedRefinerKeys.forEach(refinerKey => {\n compressedRefiner.push(refiner[refinerKey]);\n });\n compressedRefiners.push(compressedRefiner);\n });\n\n return compressedRefiners;\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Button } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface ISearchFormProps {\n hideSearchLabel: boolean | undefined;\n isSearchFormExpanded?: boolean | undefined;\n disableSubmitSearch: boolean | undefined;\n searchTextInput: React.RefObject<HTMLInputElement>;\n maxChars: number;\n searchQsp: string;\n searchPlaceholder: string;\n query: string;\n ariaLabelCancel: string;\n ariaLabelSearch: string;\n ariaLabelSubmit: string;\n handleCancelSearchChange(): void;\n handleInputChange(query: string): void;\n}\n\nexport interface ISearchFormViewProps {\n input: React.ReactNode;\n submitBtn: React.ReactNode;\n cancelBtn: React.ReactNode;\n}\n\n/**\n * On Input Change functionality.\n * @param handleInputChange -Input change function.\n * @returns Set updated input value.\n */\nconst onInputChangeFunction = (handleInputChange: (query: string) => void) => (event: React.ChangeEvent<HTMLInputElement>) => {\n handleInputChange(event.target.value || '');\n};\nexport const FormComponent = (props: ISearchFormProps): ISearchFormViewProps => {\n const {\n searchQsp,\n searchPlaceholder,\n hideSearchLabel,\n searchTextInput,\n handleInputChange,\n maxChars,\n disableSubmitSearch,\n handleCancelSearchChange,\n query,\n ariaLabelCancel,\n ariaLabelSearch,\n ariaLabelSubmit\n } = props;\n\n const onInputChange = onInputChangeFunction(handleInputChange);\n\n const inputNode = !hideSearchLabel ? (\n <input\n className='ms-search__form-control'\n type='text'\n aria-label={ariaLabelSearch}\n name={searchQsp}\n placeholder={searchPlaceholder}\n ref={searchTextInput}\n onChange={onInputChange}\n maxLength={maxChars}\n value={query}\n />\n ) : (\n <input\n className='ms-search__form-control'\n type='text'\n aria-label={ariaLabelSearch}\n name={searchQsp}\n placeholder={searchPlaceholder}\n ref={searchTextInput}\n onChange={onInputChange}\n value={query}\n />\n );\n\n const submitBtnNode = !disableSubmitSearch && <Button className='ms-search__form-submitSearch' aria-label={ariaLabelSubmit} />;\n\n const cancelBtNoden = (\n <Button\n className={!disableSubmitSearch ? 'ms-search__form-cancelSearch' : 'ms-search__form-cancelSearchNoSumbit'}\n aria-label={ariaLabelCancel}\n onClick={handleCancelSearchChange}\n type='button'\n />\n );\n\n return { input: inputNode, cancelBtn: cancelBtNoden, submitBtn: submitBtnNode };\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport MsDyn365, { getRichTextHtml } from '@msdyn365-commerce/core';\nimport { SearchSuggestion } from '@msdyn365-commerce/retail-proxy';\nimport { getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISearchData } from '../search.data';\nimport { ISearchProps } from '../search.props.autogenerated';\n\nexport interface ISearchKeywordSuggestProps {\n searchKeywordSuggestClass: string;\n searchPageURL: string;\n searchQsp: string | undefined;\n hitPrefix: string;\n hitSuffix: string;\n autoSuggestProps: ISearchProps<ISearchData>;\n searchText: string;\n suggestions: SearchSuggestion[] | undefined;\n telemetryContent?: ITelemetryContent;\n}\n\nexport interface ISearchKeywordViewProps {\n text: React.ReactNode[];\n}\n\nlet payLoad: IPayLoad;\n\n/**\n * KeywordSuggestionsComponent.\n * @param props\n */\nexport const KeywordSuggestionsComponent = (props: ISearchKeywordSuggestProps): ISearchKeywordViewProps | undefined => {\n const { suggestions, hitPrefix, hitSuffix } = props;\n\n payLoad = getPayloadObject('click', props.telemetryContent!, '');\n\n const reactNodes: React.ReactNode[] = [];\n\n suggestions?.map(item => {\n reactNodes.push(_assembleNode(item, hitPrefix, hitSuffix, props));\n });\n\n return { text: reactNodes };\n};\n\nconst _assembleNode = (item: SearchSuggestion, hitPrefix: string, hitSuffix: string, props: ISearchKeywordSuggestProps) => {\n const ariaLabel =\n item.Value && item.Value.replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n payLoad.contentAction.etext = ariaLabel;\n const attribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n return (\n <li className='msc-autoSuggest__keywordResults-item' key={item.Id}>\n <a aria-label={ariaLabel} href={_generateLink(item, hitPrefix, hitSuffix, props)} {...attribute}>\n {_generateLink(item, hitPrefix, hitSuffix, props) &&\n _getHighlightedText(item.Value ? item.Value : '', hitPrefix, hitSuffix)}\n </a>\n </li>\n );\n};\n\nconst _generateLink = (suggestion: SearchSuggestion, hitPrefix: string, hitSuffix: string, props: ISearchKeywordSuggestProps): string => {\n const { searchPageURL, searchQsp } = props;\n\n const formattedLink = (suggestion.Value as string)\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '')\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n\n if (!MsDyn365.isBrowser) {\n return '';\n }\n\n const queryUrl = new URL(searchPageURL, window.location.href);\n if (searchQsp && formattedLink) {\n queryUrl.searchParams.set(searchQsp, formattedLink);\n }\n\n return queryUrl.href;\n};\n\nconst _getHighlightedText = (suggestion: string, hitPrefix: string, hitSuffix: string): JSX.Element => {\n const formattedText = suggestion\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '<strong>')\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '</strong>');\n\n // eslint-disable-next-line react/no-danger\n return <span dangerouslySetInnerHTML={getRichTextHtml(formattedText)} />;\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Button, getPayloadObject, getTelemetryAttributes, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface ISearchLabelProps {\n isSearchFormExpanded: boolean;\n searchLabelClass: string;\n searchLabelArialLabel: string;\n searchtext: string;\n searchCollapsedLabel: React.RefObject<HTMLButtonElement>;\n hideSearchLabel?: boolean;\n telemetryContent: ITelemetryContent;\n handleCancelSearchChange(): void;\n}\n\nexport const LabelComponent = (props: ISearchLabelProps) => {\n const {\n searchLabelClass,\n searchLabelArialLabel,\n isSearchFormExpanded,\n searchtext,\n searchCollapsedLabel,\n hideSearchLabel,\n handleCancelSearchChange,\n telemetryContent\n } = props;\n const payLoad = getPayloadObject('click', telemetryContent, searchtext, '');\n const attributes = getTelemetryAttributes(telemetryContent, payLoad);\n\n return (\n <div className={searchLabelClass}>\n <Button\n className='ms-search__icon'\n aria-expanded={isSearchFormExpanded}\n aria-label={searchLabelArialLabel}\n onClick={handleCancelSearchChange}\n innerRef={searchCollapsedLabel}\n {...attributes}\n >\n {!hideSearchLabel && (\n <span className='ms-search__icon-text' aria-hidden>\n {searchtext}\n </span>\n )}\n </Button>\n </div>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { PriceComponent } from '@msdyn365-commerce/components';\nimport { getRichTextHtml, IActionContext, IImageSettings, Image, ITelemetry } from '@msdyn365-commerce/core';\nimport { SearchSuggestion } from '@msdyn365-commerce/retail-proxy';\nimport { getProductPageUrlSync, ObjectExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n getPayloadObject,\n getTelemetryAttributes,\n INodeProps,\n IPayLoad,\n ITelemetryContent,\n NodeTag\n} from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISearchData } from '../search.data';\nimport { ISearchProps } from '../search.props.autogenerated';\n\n/**\n * Search product suggest resources.\n */\nexport interface ISearchProductSuggestResources {\n freePriceText: string;\n}\n\nexport interface ISearchProductSuggestProps {\n searchProductSuggestClass: string;\n searchPageURL: string;\n searchQsp: string | undefined;\n hitPrefix: string;\n hitSuffix: string;\n autoSuggestProps: ISearchProps<ISearchData>;\n searchText: string;\n suggestions: SearchSuggestion[] | undefined;\n telemetry: ITelemetry;\n moduleType: string;\n moduleId: string;\n telemetryContent?: ITelemetryContent;\n resources?: ISearchProductSuggestResources;\n}\n\nexport interface ISearchProductViewProps {\n title: React.ReactNode;\n items: ISearchProductItemViewProps[];\n}\n\nexport interface ISearchProductItemViewProps {\n text: React.ReactNode;\n thumbnail: React.ReactNode;\n price: React.ReactNode;\n LiProduct: INodeProps;\n AProduct: INodeProps;\n id: string | undefined;\n}\n\nlet payLoad: IPayLoad;\nlet telemetryContent: ITelemetryContent | undefined;\n\n/**\n * ProductSuggestionsComponent.\n * @param props\n */\nexport const ProductSuggestionsComponent = (props: ISearchProductSuggestProps): ISearchProductViewProps | undefined => {\n const {\n suggestions,\n hitSuffix,\n hitPrefix,\n autoSuggestProps: {\n context: { actionContext },\n resources: { productSuggestionHeading }\n },\n moduleType,\n moduleId\n } = props;\n const reactNodes: ISearchProductItemViewProps[] = [];\n telemetryContent = props.telemetryContent;\n payLoad = getPayloadObject('click', props.telemetryContent!, '');\n\n suggestions?.map(item => {\n reactNodes.push(_assembleNode(item, hitPrefix, hitSuffix, actionContext, props, moduleType, moduleId));\n });\n\n const titleNode = _renderTitle(productSuggestionHeading);\n\n return { title: titleNode, items: reactNodes };\n};\n\nconst _renderTitle = (productSuggestionHeading: string) => {\n const productAutoSuggestionHeading = productSuggestionHeading ? productSuggestionHeading : 'Go to products';\n\n return <li className='msc-autoSuggest__productResults-title'>{productAutoSuggestionHeading}</li>;\n};\n\nconst _assembleNode = (\n item: SearchSuggestion,\n hitPrefix: string,\n hitSuffix: string,\n actionContext: IActionContext,\n props: ISearchProductSuggestProps,\n moduleType: string,\n moduleId: string\n): ISearchProductItemViewProps => {\n const altText =\n item.Value && item.Value.replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n\n const price = item.Value3?.Value?.DecimalValue;\n return {\n text: _getHighlightedText(item.Value ? item.Value : '', hitPrefix, hitSuffix),\n thumbnail: _renderThumbnail(item, altText ? altText : '', props),\n price: !ObjectExtensions.isNullOrUndefined(price) && _renderPrice(price, price, moduleId, moduleType, props),\n LiProduct: _getLiWrapper(),\n AProduct: _getAWrapper(item, hitPrefix, hitSuffix, actionContext, props),\n id: item.Id\n };\n};\n\nconst _getLiWrapper = () => {\n return {\n className: 'msc-autoSuggest__productResults-item',\n tag: 'li' as NodeTag\n };\n};\n\nconst _getAWrapper = (\n item: SearchSuggestion,\n hitPrefix: string,\n hitSuffix: string,\n actionContext: IActionContext,\n props: ISearchProductSuggestProps\n) => {\n const {\n autoSuggestProps: { context }\n } = props;\n const ariaLabel =\n item.Value && item.Value.replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n\n payLoad.contentAction.recid = item.Id;\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\n const productPrice = context.cultureFormatter.formatCurrency(item.Value3!.Value!.DecimalValue!);\n\n return {\n className: 'msc-autoSuggest__productResults-item',\n tag: 'a' as NodeTag,\n 'aria-label': `${ariaLabel!} ${productPrice}`,\n href: _generateLink(item, hitPrefix, hitSuffix, actionContext),\n ...attribute\n };\n};\n\nconst _generateLink = (suggestion: SearchSuggestion, hitPrefix: string, hitSuffix: string, actionContext: IActionContext) => {\n const formattedLink = (suggestion.Value as string)\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '')\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n return suggestion.Value && suggestion.Id\n ? getProductPageUrlSync(formattedLink, (suggestion.Id as unknown) as number, actionContext, undefined)\n : '';\n};\n\nconst _getHighlightedText = (suggestion: string, hitPrefix: string, hitSuffix: string): JSX.Element => {\n const formattedText = suggestion\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '<strong>')\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '</strong>');\n\n return (\n // eslint-disable-next-line react/no-danger\n <span className='msc-price msc-autoSuggest__productResults-item-text' dangerouslySetInnerHTML={getRichTextHtml(formattedText)} />\n );\n};\n\nconst _renderPrice = (\n adjustedPrice: number,\n basePrice: number,\n moduleId: string,\n moduleType: string,\n props: ISearchProductSuggestProps\n): JSX.Element | null => {\n const {\n autoSuggestProps: { context }\n } = props;\n\n return (\n <PriceComponent\n id={moduleId}\n typeName={moduleType}\n context={context}\n data={{\n price: {\n CustomerContextualPrice: adjustedPrice,\n BasePrice: basePrice\n }\n }}\n className='msc-autoSuggest__productResults-item-price'\n freePriceText={props.resources?.freePriceText}\n />\n );\n};\n\nconst _renderThumbnail = (suggestion: SearchSuggestion, altText: string, props: ISearchProductSuggestProps): JSX.Element | null => {\n const {\n autoSuggestProps: {\n context: {\n request: { gridSettings }\n },\n config: { imageSettings }\n }\n } = props;\n if (imageSettings) {\n imageSettings.cropFocalRegion = true;\n }\n\n if (!suggestion || !suggestion.ImageUrl) {\n props.telemetry.error('Search suggestion content is empty, module wont render.');\n return null;\n }\n\n const defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=40&h=40&m=6', w: 0, h: 0 },\n lg: { q: 'w=40&h=40&m=6', w: 0, h: 0 },\n xl: { q: 'w=40&h=40&m=6', w: 0, h: 0 }\n },\n lazyload: true,\n cropFocalRegion: true\n };\n\n return (\n <Image\n requestContext={props.autoSuggestProps.context.actionContext.requestContext}\n altText={altText}\n className='msc-autoSuggest__productResults-item-img'\n src={suggestion.ImageUrl}\n gridSettings={gridSettings!}\n imageSettings={imageSettings ? imageSettings : defaultImageSettings}\n loadFailureBehavior='empty'\n />\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Autosuggestions } from '@msdyn365-commerce/commerce-entities';\nimport MsDyn365, { getCatalogId, getUrlSync } from '@msdyn365-commerce/core';\nimport { ProductRefiner, ProductRefinerSource, ProductsDataActions } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions, ObjectExtensions, Random, validateCatalogId } from '@msdyn365-commerce-modules/retail-actions';\nimport { createSearchStateInput } from '@msdyn365-commerce-modules/search-utilities';\nimport { getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent, KeyCodes } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { debounce } from 'lodash';\nimport { Spinner, SpinnerSize } from 'office-ui-fabric-react';\nimport * as React from 'react';\n\nimport getSearchSuggestionsAction, { AutoSuggestInput, SuggestionType } from './actions/get-auto-suggest-suggestions';\nimport {\n CategorySuggestionsComponent,\n FormComponent,\n ISearchCategoryViewProps,\n ISearchKeywordViewProps,\n ISearchProductViewProps,\n KeywordSuggestionsComponent,\n LabelComponent,\n ProductSuggestionsComponent\n} from './components';\nimport { ISearchData } from './search.data';\nimport { ISearchProps, ISuggestionTypeCriterionData, SuggestionTypeCriterionSuggestionType } from './search.props.autogenerated';\n\nexport interface ISearchState {\n isSearchFormExpanded: boolean;\n searchText: string;\n searchKeywordSuggestClass: string;\n searchProductSuggestClass: string;\n searchCategorySuggestClass: string;\n suggestions: Autosuggestions | undefined;\n searchRefiners?: ProductRefiner[] | undefined;\n autoSuggestAriaLabel: string;\n isInitialState: boolean;\n isLoadingAutoSuggest?: boolean;\n}\n\nexport interface ISearchViewProps extends ISearchProps<ISearchData> {\n Search: IModuleProps;\n AutoSuggestAriaLabel: INodeProps;\n AutoSuggestAriaLabelText: string;\n searchText: string;\n AutoSuggest: INodeProps;\n KeywordSuggest: INodeProps;\n ProductSuggest: INodeProps;\n CategorySuggest: INodeProps;\n SearchForm: INodeProps;\n FormWrapper: INodeProps;\n UlKeyword: INodeProps;\n UlProduct: INodeProps;\n UlCategory: INodeProps;\n label: React.ReactNode;\n form: React.ReactNode;\n autosuggestKeyword?: ISearchKeywordViewProps;\n autosuggestProduct?: ISearchProductViewProps;\n autosuggestCategory?: ISearchCategoryViewProps;\n callbacks: {\n handleCancelSearchChange(): void;\n handleCancelSearchFocused?(): void;\n };\n isSearchFormExpanded: boolean;\n isLoadingAutoSuggest?: boolean;\n isLoadingNode?: React.ReactNode;\n}\n\n/**\n *\n * Search module.\n * @extends {React.Component<ISearchProps<ISearchData>, ISearchState>}\n */\nclass Search extends React.Component<ISearchProps<ISearchData>, ISearchState> {\n private readonly searchTextInput: React.RefObject<HTMLInputElement>;\n\n private readonly searchCollapsedLabel: React.RefObject<HTMLButtonElement>;\n\n private readonly formReference: React.RefObject<HTMLButtonElement>;\n\n private readonly maxChars: number;\n\n private readonly topResultsCount?: number;\n\n private readonly hitPrefix: string = '{';\n\n private readonly hitSuffix: string = '}';\n\n private readonly waitTime: number = 500;\n\n private readonly autoSuggestResultScreenReaderDiv: React.RefObject<HTMLDivElement>;\n\n private readonly autoSuggestResultDiv: React.RefObject<HTMLDivElement>;\n\n private readonly searchFormClass: string;\n\n private readonly searchLabelClass: string;\n\n private readonly telemetryContent: ITelemetryContent;\n\n private loadSuggestionsRequestId?: string;\n\n private inputSuggestionType: ISuggestionTypeCriterionData[];\n\n // @ts-expect-error\n private cancellabelDebounce: debounce;\n\n public constructor(props: ISearchProps<ISearchData>) {\n super(props);\n this.searchTextInput = React.createRef();\n this.searchCollapsedLabel = React.createRef();\n this.autoSuggestResultScreenReaderDiv = React.createRef();\n this.autoSuggestResultDiv = React.createRef();\n this.formReference = React.createRef();\n this.state = {\n isSearchFormExpanded: false,\n searchText: '',\n searchKeywordSuggestClass: 'ms-search__autoSuggest__keyword',\n searchProductSuggestClass: 'ms-search__autoSuggest__product',\n searchCategorySuggestClass: 'ms-search__autoSuggest__category',\n suggestions: undefined,\n searchRefiners: undefined,\n autoSuggestAriaLabel: '',\n isInitialState: true,\n isLoadingAutoSuggest: false\n };\n this.maxChars =\n (this.props.context &&\n this.props.context.app &&\n this.props.context.app.config &&\n this.props.context.app.config.searchInputMaxLength) ||\n 50;\n\n this.inputSuggestionType = [];\n this.topResultsCount = this.props.config && this.props.config.topResultsCount ? this.props.config.topResultsCount : 5;\n this.searchFormClass = 'ms-search__form';\n this.searchLabelClass = 'ms-search__label';\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n\n this._initSuggestionTypes();\n }\n\n public async componentDidMount(): Promise<void> {\n document.body && document.body.addEventListener('mousedown', this._focusOutTarget);\n window && window.addEventListener('keyup', this._keyup);\n }\n\n public componentWillUnmount(): void {\n document.body && document.body.removeEventListener('mousedown', this._focusOutTarget, false);\n window && window.removeEventListener('keyup', this._keyup, false);\n }\n\n public componentDidUpdate(): void {\n const {\n config: { hideSearchLabel }\n } = this.props;\n const { isSearchFormExpanded, isInitialState } = this.state;\n\n if (!this.props.context.request.params.isEditor) {\n if (!hideSearchLabel && isSearchFormExpanded) {\n this.searchTextInput && this.searchTextInput.current && this.searchTextInput.current.focus();\n } else if (!isInitialState) {\n this.searchCollapsedLabel && this.searchCollapsedLabel.current && this.searchCollapsedLabel.current.focus();\n }\n }\n }\n\n public shouldComponentUpdate(nextProps: ISearchProps<ISearchData>, nextState: ISearchState): boolean {\n if (this.state === nextState && this.props === nextProps) {\n return false;\n }\n return true;\n }\n\n // eslint-disable-next-line complexity -- ignore complexity.\n public render(): JSX.Element {\n const {\n context,\n resources: { searchtext, searchLabelArialLabel, cancelBtnAriaLabel, searchBtnAriaLabel, submitBtnAriaLabel },\n config: { hideSearchLabel, disableSubmitSearch, searchplaceholderText, shouldShowFullCategoryPath, className = '' }\n } = this.props;\n\n const {\n isSearchFormExpanded,\n searchText,\n searchKeywordSuggestClass,\n searchProductSuggestClass,\n searchCategorySuggestClass,\n suggestions,\n searchRefiners,\n isLoadingAutoSuggest\n } = this.state;\n\n const searchQsp = (context && context.app && context.app.config && context.app.config.searchQueryStringParameter) || 'q';\n const searchPageURL = getUrlSync('search', context && context.actionContext) || '';\n const searchURL = this._appendQueryParams(searchPageURL, searchText, searchQsp);\n const searchPlaceholder = searchplaceholderText && searchplaceholderText.length > 0 ? searchplaceholderText : 'Search in Fabrikam';\n\n const keywordSuggestions = suggestions?.AllSearchResults?.filter(\n suggestion => suggestion.SuggestionType === SuggestionType.Keyword || suggestion.SuggestionType === SuggestionType.None\n );\n const productSuggestions = suggestions?.AllSearchResults?.filter(\n suggestion => suggestion.SuggestionType === SuggestionType.Product\n );\n const categoryRefiners = searchRefiners?.find(refiner => {\n return refiner.SourceValue === ProductRefinerSource.Category;\n });\n const categorySuggestions = suggestions?.AllSearchResults?.filter(suggestion => {\n if (suggestion.SuggestionType !== SuggestionType.Category) {\n return false;\n }\n const refiner = categoryRefiners?.Values?.find(item => {\n return `${item.RefinerRecordId ?? 0}` === suggestion.Id;\n });\n\n return !ObjectExtensions.isNullOrUndefined(refiner);\n });\n\n const viewProps: ISearchViewProps = {\n ...(this.props as ISearchProps<ISearchData>),\n\n Search: {\n moduleProps: this.props,\n className: `${classnames('ms-search', className)} ${disableSubmitSearch ? 'no-submit' : 'with-submit'}`\n },\n AutoSuggestAriaLabel: {\n tag: 'div',\n className: 'msc-autoSuggest__screen-reader',\n 'aria-live': 'assertive',\n ref: this.autoSuggestResultScreenReaderDiv\n },\n AutoSuggestAriaLabelText: this.state.autoSuggestAriaLabel,\n searchText: this.state.searchText,\n AutoSuggest: {\n ref: this.autoSuggestResultDiv,\n className: 'ms-search__autoSuggest'\n },\n KeywordSuggest: {\n className: searchKeywordSuggestClass\n },\n ProductSuggest: {\n className: searchProductSuggestClass\n },\n CategorySuggest: {\n className: searchCategorySuggestClass\n },\n SearchForm: {\n className: `${this.searchFormClass} ${isSearchFormExpanded ? 'bx-show' : 'bx-hide'}`\n },\n FormWrapper: {\n tag: 'form',\n ref: this.formReference,\n className: 'ms-search__searchForm',\n 'aria-label': 'Search',\n name: 'searchForm',\n role: 'search',\n action: searchURL,\n autoComplete: 'off',\n onSubmit: this._handleSubmit\n },\n UlKeyword: {\n tag: 'ul',\n className: classnames('msc-autoSuggest__keywordResults-items', className)\n },\n UlProduct: {\n tag: 'ul',\n className: classnames('msc-autoSuggest__productResults-items', className)\n },\n UlCategory: {\n tag: 'ul',\n className: classnames('msc-autoSuggest__categoryResults-items', className)\n },\n label: LabelComponent({\n isSearchFormExpanded,\n searchLabelClass: `${this.searchLabelClass} ${isSearchFormExpanded ? 'bx-hide' : 'bx-show'}`,\n searchtext,\n searchLabelArialLabel,\n searchCollapsedLabel: this.searchCollapsedLabel,\n hideSearchLabel,\n handleCancelSearchChange: this._handleCancelSearchChange,\n telemetryContent: this.telemetryContent\n }),\n form: FormComponent({\n ariaLabelCancel: cancelBtnAriaLabel,\n ariaLabelSearch: searchBtnAriaLabel,\n ariaLabelSubmit: submitBtnAriaLabel,\n hideSearchLabel,\n searchTextInput: this.searchTextInput,\n disableSubmitSearch,\n handleInputChange: this._handleInputChange,\n handleCancelSearchChange: this._handleCancelSearchChange,\n maxChars: this.maxChars,\n searchQsp,\n searchPlaceholder,\n query: searchText\n }),\n autosuggestKeyword:\n searchText &&\n searchText.length > 0 &&\n (isLoadingAutoSuggest || (keywordSuggestions && ArrayExtensions.hasElements(keywordSuggestions)))\n ? KeywordSuggestionsComponent({\n searchKeywordSuggestClass,\n searchPageURL,\n searchQsp,\n hitPrefix: this.hitPrefix,\n hitSuffix: this.hitSuffix,\n autoSuggestProps: this.props,\n searchText,\n suggestions: keywordSuggestions,\n telemetryContent: this.telemetryContent\n })\n : undefined,\n autosuggestProduct:\n searchText &&\n searchText.length > 0 &&\n (isLoadingAutoSuggest || (productSuggestions && ArrayExtensions.hasElements(productSuggestions)))\n ? ProductSuggestionsComponent({\n searchProductSuggestClass,\n searchPageURL,\n searchQsp,\n hitPrefix: this.hitPrefix,\n hitSuffix: this.hitSuffix,\n autoSuggestProps: this.props,\n searchText,\n suggestions: productSuggestions,\n telemetry: this.props.telemetry,\n moduleType: this.props.typeName,\n moduleId: this.props.id,\n telemetryContent: this.telemetryContent,\n resources: this.props.resources\n })\n : undefined,\n autosuggestCategory:\n searchText &&\n searchText.length > 0 &&\n (isLoadingAutoSuggest || (categorySuggestions && ArrayExtensions.hasElements(categorySuggestions)))\n ? CategorySuggestionsComponent({\n searchCategorySuggestClass,\n searchPageURL,\n searchQsp,\n hitPrefix: this.hitPrefix,\n hitSuffix: this.hitSuffix,\n autoSuggestProps: this.props,\n searchText,\n suggestions: categorySuggestions,\n searchRefiners,\n telemetryContent: this.telemetryContent,\n shouldShowFullPath: shouldShowFullCategoryPath\n })\n : undefined,\n callbacks: {\n handleCancelSearchChange: this._handleCancelSearchChange,\n handleCancelSearchFocused: this._handleCancelSearchFocused\n },\n isSearchFormExpanded: this.state.isSearchFormExpanded,\n isLoadingAutoSuggest,\n isLoadingNode: this._isLoadingNode()\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n private _initSuggestionTypes() {\n const suggestionTypes = this.props.config.suggestionTypeCriterion;\n\n const suggestions = ArrayExtensions.unique(ArrayExtensions.validValues(suggestionTypes));\n if (!ArrayExtensions.hasElements(suggestions)) {\n this.inputSuggestionType = [\n { SuggestionType: SuggestionTypeCriterionSuggestionType.keyword },\n { SuggestionType: SuggestionTypeCriterionSuggestionType.product },\n { SuggestionType: SuggestionTypeCriterionSuggestionType.scopedCategory }\n ];\n return;\n }\n\n const validSuggestions = suggestions.filter(suggestion => suggestion.SuggestionType);\n if (ArrayExtensions.hasElements(validSuggestions)) {\n this.inputSuggestionType = validSuggestions;\n return;\n }\n\n this.inputSuggestionType = [];\n }\n\n /**\n * Function to create the ReactNode for loading Autosuggest result.\n * @returns ReachNode for loading Autosuggest result.\n */\n private readonly _isLoadingNode = (): React.ReactNode => {\n const loadingText = this.props.resources.autoSuggestResultLoadingMessage;\n return <Spinner className='msc-autoSuggest__loadingResult' label={loadingText} size={SpinnerSize.medium} labelPosition='right' />;\n };\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private readonly _focusOutTarget = (e: any): void => {\n const { suggestions } = this.state;\n\n if (suggestions && suggestions.AllSearchResults && e.target.closest('.ms-search') === null) {\n this._clearAutoSuggestState();\n }\n };\n\n private readonly _keyup = (e: KeyboardEvent): void => {\n const { suggestions } = this.state;\n\n if (suggestions && suggestions.AllSearchResults && e.keyCode === KeyCodes.Escape) {\n this._clearAutoSuggestState();\n } else if (this.state.isSearchFormExpanded && e.keyCode === KeyCodes.Escape) {\n if (this.state.isSearchFormExpanded) {\n this.setState({ isSearchFormExpanded: false });\n }\n }\n\n if (\n !(\n (this.formReference.current && this.formReference.current.contains((e.target as unknown) as Node)) ||\n (this.autoSuggestResultDiv.current && this.autoSuggestResultDiv.current.contains((e.target as unknown) as Node))\n )\n ) {\n if (suggestions && suggestions.AllSearchResults) {\n this._clearAutoSuggestState();\n }\n\n if (this.state.isSearchFormExpanded) {\n this.setState({ isSearchFormExpanded: false });\n }\n }\n };\n\n private readonly _clearAutoSuggestState = (): void => {\n const {\n context: { actionContext },\n data: { searchState }\n } = this.props;\n\n if (this.searchTextInput.current && this.searchTextInput.current.value.length > 0) {\n searchState.searchText = '';\n searchState.defaultBasicSearchUrl = '';\n searchState.searchQueryStringParameter = '';\n actionContext ? actionContext.update(createSearchStateInput(searchState), searchState) : null;\n this.searchTextInput.current.value = '';\n }\n\n this.setState({ searchText: '', suggestions: undefined, searchRefiners: undefined });\n };\n\n private async _getSearchSuggestions(loadSuggestionsRequestId: string, query: string) {\n try {\n const searchSuggestions = await getSearchSuggestionsAction(\n new AutoSuggestInput(query, this.topResultsCount, this._getSuggestionType(), this.hitPrefix, this.hitSuffix),\n this.props.context.actionContext\n );\n if (loadSuggestionsRequestId !== this.loadSuggestionsRequestId) {\n return undefined;\n }\n return searchSuggestions;\n } catch (error) {\n if (loadSuggestionsRequestId !== this.loadSuggestionsRequestId) {\n return undefined;\n }\n this.setState({ suggestions: undefined, searchRefiners: undefined, autoSuggestAriaLabel: this._setAutoSuggestResultCount() });\n this.props.telemetry.exception(error);\n this.props.telemetry.debug('Unable to get auto suggest results');\n return undefined;\n }\n }\n\n private async _updateSearchRefiners(loadSuggestionsRequestId: string, query: string, suggestions: Autosuggestions | undefined) {\n try {\n const refiners = await this._getSearchRefiners(query);\n if (loadSuggestionsRequestId !== this.loadSuggestionsRequestId) {\n return;\n }\n this.setState({\n suggestions,\n searchRefiners: refiners,\n autoSuggestAriaLabel: this._setAutoSuggestResultCount(suggestions),\n isLoadingAutoSuggest: false\n });\n } catch (error) {\n if (loadSuggestionsRequestId !== this.loadSuggestionsRequestId) {\n return;\n }\n this.setState({ suggestions, searchRefiners: undefined, autoSuggestAriaLabel: this._setAutoSuggestResultCount(suggestions) });\n this.props.telemetry.exception(error);\n this.props.telemetry.debug('Unable to get refiners results');\n }\n }\n\n private _loadSuggestions(query: string) {\n this.cancellabelDebounce = debounce(async () => {\n this.setState({ isLoadingAutoSuggest: true });\n const loadSuggestionsRequestId = Random.Guid.generateGuid();\n this.loadSuggestionsRequestId = loadSuggestionsRequestId;\n const searchSuggestions = await this._getSearchSuggestions(loadSuggestionsRequestId, query);\n await this._updateSearchRefiners(loadSuggestionsRequestId, query, searchSuggestions);\n }, this.waitTime);\n\n setTimeout(() => {\n this.cancellabelDebounce();\n }, 0);\n }\n\n private readonly _handleInputChange = (query: string): void => {\n if (!query || query.length <= this.maxChars) {\n this.setState({ searchText: query });\n }\n\n if (this.cancellabelDebounce) {\n this.cancellabelDebounce.cancel();\n }\n\n const {\n context,\n data: { searchState }\n } = this.props;\n\n if (context) {\n if (query && query.length > 0) {\n if (query.length > this.maxChars) {\n return;\n }\n\n if (ArrayExtensions.hasElements(this.inputSuggestionType)) {\n this._loadSuggestions(query);\n }\n\n searchState.searchText = query;\n } else {\n this.setState({ suggestions: undefined, searchRefiners: undefined });\n searchState.searchText = '';\n }\n context.actionContext.update(createSearchStateInput(searchState), searchState);\n }\n };\n\n private _getSuggestionType(): string {\n const distinctSuggestionTypes: string[] = this.inputSuggestionType.map(\n suggestionTypeItem => suggestionTypeItem.SuggestionType!.charAt(0).toUpperCase() + suggestionTypeItem.SuggestionType!.slice(1)\n );\n return distinctSuggestionTypes.join(',');\n }\n\n private async _getSearchRefiners(searchText: string): Promise<ProductRefiner[]> {\n const { actionContext: ctx } = this.props.context;\n const catalogId = getCatalogId(ctx.requestContext);\n validateCatalogId(catalogId);\n return ProductsDataActions.getProductSearchRefinersAsync(\n { callerContext: ctx },\n {\n SearchCondition: searchText,\n Context: {\n ChannelId: +ctx.requestContext.apiSettings.channelId,\n CatalogId: catalogId\n }\n }\n );\n }\n\n private readonly _handleSubmit = (\n e: React.MouseEvent<HTMLElement> | React.KeyboardEvent<HTMLElement> | React.FormEvent<HTMLFormElement>\n ): void => {\n const {\n config: { disableSubmitSearch },\n context: {\n actionContext,\n app: {\n config: { searchQueryStringParameter }\n }\n }\n } = this.props;\n\n const query = this.searchTextInput.current && this.searchTextInput.current.value;\n e.preventDefault();\n\n if (!query || (query && query.length === 0) || disableSubmitSearch) {\n this.searchTextInput && this.searchTextInput.current && this.searchTextInput.current.focus();\n } else {\n const searchQsp = searchQueryStringParameter || 'q';\n const searchURL = this._appendQueryParams(getUrlSync('search', actionContext) || '', query, searchQsp);\n document.location.href = searchURL;\n }\n };\n\n private readonly _handleCancelSearchChange = (): void => {\n const { isSearchFormExpanded, suggestions } = this.state;\n\n if (!isSearchFormExpanded) {\n this.setState({\n isSearchFormExpanded: true,\n searchText: '',\n isInitialState: false\n });\n } else {\n if (suggestions && suggestions.AllSearchResults) {\n this._clearAutoSuggestState();\n }\n this.setState({ isSearchFormExpanded: false });\n }\n };\n\n private readonly _handleCancelSearchFocused = (): void => {\n const { suggestions } = this.state;\n if (!(suggestions && suggestions.AllSearchResults)) {\n this._clearAutoSuggestState();\n this.setState({ isSearchFormExpanded: false });\n }\n };\n\n private readonly _appendQueryParams = (route: string, query: string, qsp: string): string => {\n if (!MsDyn365.isBrowser) {\n return '';\n }\n\n const queryUrl = new URL(route, window.location.href);\n if (qsp && query) {\n queryUrl.searchParams.set(qsp, query);\n }\n\n return queryUrl.href;\n };\n\n private readonly _setAutoSuggestResultCount = (result?: Autosuggestions) => {\n if (this.autoSuggestResultScreenReaderDiv.current !== null) {\n const ariaLiveRegion = this.autoSuggestResultScreenReaderDiv.current;\n const suggestResultString = this.props.resources.autoSuggestFoundMessage;\n const emptyResultString = this.props.resources.noAutoSuggestionMessage;\n ariaLiveRegion.innerText =\n result && result.AllSearchResults && result.AllSearchResults.length > 0 ? suggestResultString : emptyResultString;\n ariaLiveRegion.setAttribute('aria-live', 'assertive');\n return ariaLiveRegion.innerText;\n }\n return '';\n };\n}\n\nexport default Search;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { INodeProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISearchCategoryViewProps, ISearchFormViewProps, ISearchKeywordViewProps, ISearchProductViewProps } from './components';\nimport { ISearchViewProps } from './search';\n\nconst SearchView: React.FC<ISearchViewProps> = props => {\n const {\n Search,\n AutoSuggestAriaLabel,\n AutoSuggestAriaLabelText,\n searchText,\n AutoSuggest,\n KeywordSuggest,\n ProductSuggest,\n CategorySuggest,\n UlKeyword,\n UlProduct,\n UlCategory,\n form,\n autosuggestCategory,\n autosuggestKeyword,\n autosuggestProduct,\n SearchForm,\n FormWrapper,\n label,\n isLoadingAutoSuggest,\n isLoadingNode\n } = props;\n\n return (\n <Module {...Search}>\n {label}\n {_renderForm(form as ISearchFormViewProps, SearchForm, FormWrapper)}\n <Node {...AutoSuggest}>\n {searchText && searchText.length > 0 ? <Node {...AutoSuggestAriaLabel}>{AutoSuggestAriaLabelText}</Node> : ''}\n {_renderKeywordSuggestions(KeywordSuggest, UlKeyword, autosuggestKeyword, isLoadingAutoSuggest, isLoadingNode)}\n {_renderProductSuggestions(ProductSuggest, UlProduct, autosuggestProduct, isLoadingAutoSuggest, isLoadingNode)}\n {_renderCategorySuggestions(CategorySuggest, UlCategory, autosuggestCategory, isLoadingAutoSuggest, isLoadingNode)}\n </Node>\n </Module>\n );\n};\n\nconst _renderForm = (form: ISearchFormViewProps, SearchForm: INodeProps, FormWrapper: INodeProps) => {\n return (\n <Node {...SearchForm}>\n <Node {...FormWrapper}>\n {form.input}\n {form.cancelBtn}\n {form.submitBtn}\n </Node>\n </Node>\n );\n};\n\nconst _renderKeywordSuggestions = (\n KeywordSuggest: INodeProps,\n UlKeyword: INodeProps,\n keywordSuggestions?: ISearchKeywordViewProps,\n isLoadingAutoSuggest?: boolean,\n isLoadingNode?: React.ReactNode\n) => {\n return (\n keywordSuggestions && (\n <Node {...KeywordSuggest}>\n <Node {...UlKeyword}>\n {isLoadingAutoSuggest && isLoadingNode}\n {!isLoadingAutoSuggest &&\n keywordSuggestions.text.map(text => {\n return text;\n })}\n </Node>\n </Node>\n )\n );\n};\n\nconst _renderProductSuggestions = (\n ProductSuggest: INodeProps,\n UlProduct: INodeProps,\n productSuggestions?: ISearchProductViewProps,\n isLoadingAutoSuggest?: boolean,\n isLoadingNode?: React.ReactNode\n) => {\n return (\n productSuggestions && (\n <Node {...ProductSuggest}>\n <Node {...UlProduct}>\n {productSuggestions.title}\n {isLoadingAutoSuggest && isLoadingNode}\n {!isLoadingAutoSuggest &&\n productSuggestions.items.map((item, index) => {\n return (\n <Node {...item.LiProduct} key={item.id || index}>\n <Node {...item.AProduct}>\n {item.thumbnail}\n {item.text}\n {item.price}\n </Node>\n </Node>\n );\n })}\n </Node>\n </Node>\n )\n );\n};\n\nconst _renderCategorySuggestions = (\n CategorySuggest: INodeProps,\n UlCategory: INodeProps,\n categorySuggestions?: ISearchCategoryViewProps,\n isLoadingAutoSuggest?: boolean,\n isLoadingNode?: React.ReactNode\n) => {\n return (\n categorySuggestions && (\n <Node {...CategorySuggest}>\n <Node {...UlCategory}>\n {categorySuggestions.title}\n {isLoadingAutoSuggest && isLoadingNode}\n {!isLoadingAutoSuggest &&\n categorySuggestions.text.map(text => {\n return text;\n })}\n </Node>\n </Node>\n )\n );\n};\n\nexport default SearchView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { SocialMedia, SocialMediaComponent } from '@msdyn365-commerce/components';\nimport MsDyn365 from '@msdyn365-commerce/core';\nimport { IModuleProps } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISocialShareItemConfig, ISocialShareItemProps, socialMedia } from './social-share-item.props.autogenerated';\n\nexport interface ISocialShareItemViewProps extends ISocialShareItemProps<ISocialShareItemConfig> {\n SocialShareItemElement: React.ReactNode | null;\n SocialShareItem: IModuleProps;\n}\n\n/**\n *\n * SocialShareItem component.\n * @extends {React.PureComponent<ISocialShareItemProps<ISocialShareItemConfig>>}\n */\nclass SocialShareItem extends React.PureComponent<ISocialShareItemProps<ISocialShareItemConfig>> {\n constructor(props: ISocialShareItemProps<ISocialShareItemConfig>) {\n super(props);\n\n this._getSocialShareItem = this._getSocialShareItem.bind(this);\n }\n\n public render(): JSX.Element | null {\n const viewprops = {\n ...this.props,\n SocialShareItem: {\n moduleProps: this.props,\n className: 'ms-social-share-item'\n },\n SocialShareItemElement: this._getSocialShareItem()\n };\n\n return this.props.renderView(viewprops) as React.ReactElement;\n }\n\n private _getSocialShareItem(): React.ReactNode | null {\n const src = this.props.config.icon;\n if (MsDyn365.isBrowser) {\n switch (this.props.config.socialMedia) {\n case socialMedia.facebook:\n return (\n <SocialMediaComponent\n socialMedia={SocialMedia.Facebook}\n postUrl={document.URL}\n context={this.context}\n id={`${this.props.id}_facebook`}\n typeName={this.props.typeName}\n data={{}}\n src={src}\n />\n );\n case socialMedia.twitter:\n return (\n <SocialMediaComponent\n socialMedia={SocialMedia.Twitter}\n postUrl={document.URL}\n context={this.context}\n id={`${this.props.id}_twitter`}\n typeName={this.props.typeName}\n data={{}}\n src={src}\n />\n );\n case socialMedia.pinterest:\n return (\n <SocialMediaComponent\n socialMedia={SocialMedia.Pinterest}\n postUrl={document.URL}\n context={this.context}\n id={`${this.props.id}_pinterest`}\n typeName={this.props.typeName}\n data={{}}\n src={src}\n />\n );\n case socialMedia.linkedin:\n return (\n <SocialMediaComponent\n socialMedia={SocialMedia.Linkedin}\n postUrl={document.URL}\n context={this.context}\n id={`${this.props.id}_linkedin`}\n typeName={this.props.typeName}\n data={{}}\n src={src}\n />\n );\n case socialMedia.mail:\n return (\n <SocialMediaComponent\n socialMedia={SocialMedia.Mail}\n postUrl={document.URL}\n context={this.context}\n id={`${this.props.id}_mail`}\n typeName={this.props.typeName}\n data={{}}\n src={src}\n />\n );\n default:\n return null;\n }\n }\n return null;\n }\n}\n\nexport default SocialShareItem;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Module } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nimport { ISocialShareItemViewProps } from './social-share-item';\n\nexport const SocialShareItemView: React.FC<ISocialShareItemViewProps> = props => {\n const { SocialShareItem, SocialShareItemElement } = props;\n\n if (!SocialShareItemElement) {\n props.context.telemetry.error('Social media is not valid, module wont render');\n return null;\n }\n return <Module {...SocialShareItem}>{SocialShareItemElement}</Module>;\n};\n\nexport default SocialShareItemView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IAdditionalContentData, ILinksData } from '../video-player.props.autogenerated';\n\n/**\n * IVideoPlayerAdditionalContentProps: Interface for\n * Video Player Additional Content Component props.\n */\nexport interface IVideoPlayerAdditionalContentProps {\n requestContext: Msdyn365.IRequestContext;\n additionalContent: IAdditionalContentData | undefined;\n handleAdditionalTextChange(event: Msdyn365.ContentEditableEvent): void;\n handleAdditionalParagraphChange(event: Msdyn365.ContentEditableEvent): void;\n handleAdditionalLinkTextChange(linkIndex: number, event: Msdyn365.ContentEditableEvent): void;\n}\n\n/**\n * IVideoPlayerAdditionalContentProps: Interface for\n * Video Player Additional Content view props.\n */\nexport interface IVideoPlayerAdditionalContentViewProps {\n additionalContentNode: INodeProps;\n additionalContentItems?: IVideoPlayerAdditionalContentItemViewProps;\n}\n\n/**\n * IVideoPlayerAdditionalContentProps: Interface for\n * Video Player Additional Content Item view props.\n */\nexport interface IVideoPlayerAdditionalContentItemViewProps {\n heading: React.ReactNode;\n text: React.ReactNode;\n links: React.ReactNode;\n additionalContentItemContainer: INodeProps;\n additionalContentItemLinks: INodeProps;\n}\n\n/**\n * Renders additional content heading.\n * @param additionalContentHeading - Additional content heading.\n * @param props - Video Player Additional content component props.\n * @returns Heading Node.\n */\nconst renderHeading = (additionalContentHeading: string, props: IVideoPlayerAdditionalContentProps) => {\n const requestContext = props.requestContext;\n return (\n <Msdyn365.Text\n text={additionalContentHeading}\n tag='p'\n className='ms-video-player__details__additional-content__text'\n editProps={{\n /**\n * On edit event for heading text change.\n * @param event - Change event.\n */\n onEdit: event => {\n props.handleAdditionalTextChange(event);\n },\n requestContext\n }}\n />\n );\n};\n\n/**\n * Renders additional content heading.\n * @param additionalContentParagraphText - Additional content paragraph text.\n * @param props - Video Player Additional content component props.\n * @returns Paragraph Node.\n */\nconst renderParagraph = (additionalContentParagraphText: string, props: IVideoPlayerAdditionalContentProps) => {\n const requestContext = props.requestContext;\n return (\n <Msdyn365.Text\n text={additionalContentParagraphText}\n tag='p'\n className='ms-video-player__details__additional-content__paragraph'\n editProps={{\n /**\n * On edit event for heading text change.\n * @param event - Change event.\n */\n onEdit: event => {\n props.handleAdditionalParagraphChange(event);\n },\n requestContext\n }}\n />\n );\n};\n\n/**\n * Renders additional content heading.\n * @param ctaLink - Additional content link.\n * @param props - Video Player Additional content component props.\n * @param linkIndex - Additional content link index.\n * @returns Link Node.\n */\nconst renderLinks = (ctaLink: ILinksData, props: IVideoPlayerAdditionalContentProps, linkIndex: number) => {\n const editableLink: Msdyn365.ILinksData = {\n ariaLabel: ctaLink.ariaLabel,\n className: 'ms-video-player__details__additional-content__cta__links',\n linkText: ctaLink.linkText,\n linkUrl: ctaLink.linkUrl.destinationUrl,\n openInNewTab: ctaLink.openInNewTab,\n role: 'link'\n };\n const requestContext = props.requestContext;\n return (\n <Msdyn365.Link\n key={linkIndex}\n link={editableLink}\n editProps={{\n /**\n * Handle additional Link Text change.\n * @param event - The keyboard event.\n */\n onTextChange: event => {\n props.handleAdditionalLinkTextChange(linkIndex, event);\n },\n requestContext\n }}\n />\n );\n};\n\n/**\n * Create node for each additonal content item.\n * @param item - Video Player additonal content item props.\n * @param props - Video Player Additional content component props.\n * @returns IVideoPlayerAdditionalContentItemViewProps.\n */\nconst getAdditionalContentItems = (\n item: IAdditionalContentData,\n props: IVideoPlayerAdditionalContentProps\n): IVideoPlayerAdditionalContentItemViewProps => {\n const headingNode = item.heading && renderHeading(item.heading, props);\n const paragraphNode = item.subtext && renderParagraph(item.subtext, props);\n const linksNode = item.links?.map((ctaLink: ILinksData, index: number) => {\n return renderLinks(ctaLink, props, index);\n });\n\n return {\n heading: headingNode,\n text: paragraphNode,\n links: linksNode,\n additionalContentItemContainer: { className: 'ms-video-player__details__additional-content__container' },\n additionalContentItemLinks: { className: 'ms-video-player__details__additional-content__cta' }\n };\n};\n\n/**\n * VideoPlayerAdditionalContent component.\n * @param props - Video Player Additional content component props.\n * @returns Video Player Additional content view props.\n */\nexport const videoPlayerAdditionalContent = (\n props: IVideoPlayerAdditionalContentProps\n): IVideoPlayerAdditionalContentViewProps | undefined => {\n const { additionalContent } = props;\n if (!additionalContent) {\n return undefined;\n }\n\n const reactNodes: IVideoPlayerAdditionalContentItemViewProps = getAdditionalContentItems(additionalContent, props);\n return {\n additionalContentNode: { className: 'ms-video-player__details__additional-content' },\n additionalContentItems: reactNodes\n };\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IPlayerData, IPlayerOptions, IPlayerResources, IVideoMetadata, Player } from '@msdyn365-commerce/components';\nimport * as MsDyn365 from '@msdyn365-commerce/core';\nimport {\n getPayloadObject,\n getTelemetryAttributes,\n getTelemetryObject,\n INodeProps,\n isMobile,\n ITelemetryContent,\n VariantType\n} from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IVideoPlayerAdditionalContentViewProps, videoPlayerAdditionalContent } from './components/additional-content';\nimport { ILinksData, IVideoPlayerConfig, IVideoPlayerProps } from './video-player.props.autogenerated';\n\nexport interface IVideoPlayerViewProps extends IVideoPlayerProps<{}> {\n player: React.ReactNode;\n title?: React.ReactNode;\n text?: React.ReactNode;\n links?: React.ReactNode;\n detailsContainer?: INodeProps;\n detailsContainerCta?: INodeProps;\n additionalContent?: IVideoPlayerAdditionalContentViewProps;\n handleText?(): void;\n handleParagraph?(): void;\n handleAdditionalText?(): void;\n handleAdditionalParagraph?(): void;\n handleLink?(): void;\n handleAdditionalLink?(): void;\n}\n\n/**\n *\n * VideoPlayer component.\n * @extends {React.PureComponent<IVideoPlayerProps<IVideoPlayerData>>}\n */\nclass VideoPlayer extends React.PureComponent<IVideoPlayerProps<IVideoPlayerConfig>> {\n private readonly telemetryContent: ITelemetryContent;\n\n private readonly isMobileDevice: boolean;\n\n public constructor(props: IVideoPlayerProps<IVideoPlayerConfig>) {\n super(props);\n this.isMobileDevice = isMobile({ variant: VariantType.Viewport, context: this.props.context.request }) === 'xs';\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n }\n\n public render(): JSX.Element {\n const options = {\n ...this.props.config,\n isMobileDevice: this.isMobileDevice\n };\n const video: MsDyn365.IVideoData = this.props.config.video;\n const playerResources: IPlayerResources = {\n playAriaLabel: this.props.resources.playLabel,\n pauseAriaLabel: this.props.resources.pauseLabel,\n playingAriaLabel: this.props.resources.playingLabel,\n pausedAriaLabel: this.props.resources.pausedLabel,\n muteAriaLabel: this.props.resources.muteLabel,\n unMuteAriaLabel: this.props.resources.unMuteLabel,\n fullScreenAriaLabel: this.props.resources.fullScreenLabel,\n exitFullScreenAriaLabel: this.props.resources.exitFullScreenLabel,\n seekBarLabel: this.props.resources.seekBarLabel,\n videoTimeDurationLabel: this.props.resources.videoTimeDurationLabel,\n closedCaptionLabel: this.props.resources.closedCaptionLabel\n };\n const videoMetaData: IVideoMetadata = {};\n\n if (video) {\n videoMetaData.videoId = video.id;\n videoMetaData.title = video.title;\n videoMetaData.duration = video.playTime;\n\n if (video.thumbnail) {\n videoMetaData.posterframeUrl = video.thumbnail.src;\n }\n\n if (video._links?.binaryReferences) {\n videoMetaData.videoBinaryReferences = video._links.binaryReferences;\n }\n }\n const videoPlayerData: IPlayerData = { options: options as IPlayerOptions, metaData: videoMetaData };\n const viewProps = {\n // Context for telemetry and raw data for C1 to do customization\n // Including computed data, state data and methods\n ...this.props,\n\n player: (\n <MsDyn365.Video className='' editProps={{ key: this.props.config.video, requestContext: this.props.context.request }}>\n <Player\n playerData={videoPlayerData}\n playerResources={playerResources}\n telemetryContent={this.telemetryContent}\n isEditor={this.props.context.request.params.isEditor}\n />\n </MsDyn365.Video>\n ),\n title: this._getVideoDetailsHeading(),\n text: this._getVideoDetailsParagraph(),\n links: this._getVideoDetailsLinks(),\n detailsContainer: { className: 'ms-video-player__details' },\n detailsContainerCTA: { className: 'ms-video-player__details__cta' },\n additionalContent: videoPlayerAdditionalContent({\n requestContext: this.props.context.request,\n additionalContent: this.props.config.additionalContent,\n handleAdditionalTextChange: this.handleAdditionalTextChange,\n handleAdditionalParagraphChange: this.handleAdditionalParagraphChange,\n handleAdditionalLinkTextChange: this.handleAdditionalLinkTextChange\n }),\n handleText: this.handleTextChange,\n handleParagraph: this.handleParagraphChange,\n handleAdditionalText: this.handleAdditionalTextChange,\n handleAdditionalParagraph: this.handleAdditionalParagraphChange,\n handleLink: this.handleLinkTextChange,\n handleAdditionalLink: this.handleAdditionalTextChange\n };\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n /**\n * Handle link text change.\n * @param linkIndex - The link index.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleLinkTextChange(linkIndex: number, event: MsDyn365.ContentEditableEvent): void {\n if (this.props.config.links && this.props.config.links[Number(linkIndex)]) {\n this.props.config.links[Number(linkIndex)].linkText = event.target.value;\n }\n }\n\n /**\n * Handle text change.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleTextChange = (event: MsDyn365.ContentEditableEvent): void => {\n this.props.config.heading!.text = event.target.value;\n };\n\n /**\n * Handle paragraph change.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleParagraphChange = (event: MsDyn365.ContentEditableEvent): void => {\n this.props.config.paragraph = event.target.value;\n };\n\n /**\n * Handle additional text change.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleAdditionalTextChange(event: MsDyn365.ContentEditableEvent): void {\n if (this.props.config.additionalContent) {\n this.props.config.additionalContent.heading = event.target.value;\n }\n }\n\n /**\n * Handle additional link text change.\n * @param linkIndex - The link index.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleAdditionalLinkTextChange(linkIndex: number, event: MsDyn365.ContentEditableEvent): void {\n const additionalContent = this.props.config.additionalContent ?? {};\n if (additionalContent.links) {\n additionalContent.links[Number(linkIndex)].linkText = event.target.value;\n }\n }\n\n /**\n * Handle additional paragraph change.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleAdditionalParagraphChange(event: MsDyn365.ContentEditableEvent): void {\n if (this.props.config.additionalContent) {\n this.props.config.additionalContent.subtext = event.target.value;\n }\n }\n\n /**\n * Get video details links.\n * @returns - React node.\n */\n private _getVideoDetailsLinks(): React.ReactNode[] | undefined {\n const { links } = this.props.config;\n const payLoad = getPayloadObject('click', this.telemetryContent, '');\n\n return links?.map((linkData: ILinksData, index: number) => {\n payLoad.contentAction.etext = linkData.linkText;\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\n const linkId = index;\n const editableLink: MsDyn365.ILinksData = {\n ariaLabel: linkData.ariaLabel,\n className: 'ms-video-player__details__cta__link',\n linkText: linkData.linkText,\n linkUrl: linkData.linkUrl.destinationUrl,\n openInNewTab: linkData.openInNewTab,\n role: 'button',\n additionalProperties: attributes\n };\n\n return (\n <MsDyn365.Link\n key={linkId}\n link={editableLink}\n editProps={{\n /**\n * Handle additional paragraph change.\n * @param event - The keyboard event.\n */\n onTextChange: event => {\n this.handleLinkTextChange(index, event);\n },\n requestContext: this.props.context.request\n }}\n />\n );\n });\n }\n\n private _getVideoDetailsHeading(): React.ReactNode | undefined {\n const { heading } = this.props.config;\n\n return (\n heading && (\n <MsDyn365.Text\n className='ms-video-player__details__title'\n tag={heading.tag ?? 'h1'}\n text={heading.text}\n editProps={{ onEdit: this.handleTextChange, requestContext: this.props.context.request }}\n />\n )\n );\n }\n\n private _getVideoDetailsParagraph(): React.ReactNode | undefined {\n const { paragraph } = this.props.config;\n\n return (\n paragraph && (\n <MsDyn365.RichTextComponent\n text={paragraph}\n className='ms-video-player__details__text'\n editProps={{ onEdit: this.handleParagraphChange, requestContext: this.props.context.request }}\n />\n )\n );\n }\n}\n\nexport default VideoPlayer;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IVideoPlayerAdditionalContentViewProps, IVideoPlayerViewProps } from './index';\n\n/**\n * Render Additional Content.\n * @param additionalContent - Additional content view props.\n * @returns JSX Element.\n */\nconst renderAdditionalContent = (additionalContent: IVideoPlayerAdditionalContentViewProps) => {\n if (additionalContent.additionalContentItems) {\n return (\n <Node {...additionalContent.additionalContentNode}>\n <>\n {additionalContent.additionalContentItems.heading}\n <Node {...additionalContent.additionalContentItems.additionalContentItemContainer}>\n {additionalContent.additionalContentItems.text}\n <Node {...additionalContent.additionalContentItems.additionalContentItemLinks}>\n {additionalContent.additionalContentItems.links}\n </Node>\n </Node>\n </>\n </Node>\n );\n }\n\n return null;\n};\n\nconst VideoPlayerView: React.FC<IVideoPlayerViewProps> = props => {\n return (\n <div id={props.id} className='ms-video-player' {...props.renderModuleAttributes(props)}>\n {props.player}\n <Node {...props.detailsContainer} className={props.detailsContainer ? props.detailsContainer.className : ''}>\n {props.title}\n {props.text}\n {props.additionalContent && renderAdditionalContent(props.additionalContent)}\n <Node {...props.detailsContainerCta} className={props.detailsContainerCta ? props.detailsContainerCta.className : ''}>\n {props.links}\n </Node>\n </Node>\n </div>\n );\n};\n\nexport default VideoPlayerView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { RatingComponent } from '@msdyn365-commerce/components';\nimport { ICoreContext } from '@msdyn365-commerce/core';\nimport { IHistogramItemViewProps, IRatingsHistogramData, IRatingsHistogramViewProps } from '@msdyn365-commerce-modules/ratings-reviews';\nimport { format, Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IRatingsHistogramProps, IRatingsHistogramResources } from '../definition-extensions/ratings-histogram.ext.props.autogenerated';\n\n/**\n * Histogram item.\n * @param props - Histogram Item ViewProps.\n * @returns Histogram Item node.\n */\nconst histogramItem = (props: IHistogramItemViewProps) => {\n return (\n <Node {...props.buttonProps}>\n {props.starLabel}\n {props.bar}\n </Node>\n );\n};\n\n/**\n * Average ratings.\n * @param data - Props data.\n * @param context - Histogram Item ViewProps.\n * @param typeName - Histogram Item ViewProps.\n * @param componentId - Histogram Item ViewProps.\n * @param resources - Module resource strings.\n * @returns Average ratings.\n */\nconst averageRating = (\n data: IRatingsHistogramData,\n context: ICoreContext,\n typeName: string,\n componentId: string,\n resources: IRatingsHistogramResources\n) => {\n const defaultAverageRating: number = 0;\n const reviewsCount = data.ratingsSummary.result?.reviewsCount ?? defaultAverageRating;\n const reviewsCountString = resources.numberOfReviewsString\n ? format(resources.numberOfReviewsString, reviewsCount)\n : `${reviewsCount} reviews`;\n\n return (\n <div className='ms-ratings-histogram__ratings'>\n <div className='ms-ratings-histogram__ratings__heading'>{data.ratingsSummary.result?.averageRating}</div>\n <div>\n <RatingComponent\n context={context}\n id={componentId}\n typeName={typeName}\n avgRating={data.ratingsSummary.result?.averageRating ?? defaultAverageRating}\n readOnly\n ariaLabel={format(resources.averageRatingAriaLabel, data.ratingsSummary.result?.averageRating, '5')}\n data={{}}\n />\n </div>\n <div className='ms-ratings-histogram__ratings__reviews'>{reviewsCountString}</div>\n </div>\n );\n};\n\n/**\n * Histogram view.\n * @param props - Ratings HistogramV iewProps.\n * @returns Histogram view module.\n */\nconst RatingsHistogramView: React.FC<IRatingsHistogramViewProps & IRatingsHistogramProps<{}>> = props => {\n const { heading, histogramItems, histogramProps, moduleProps, data, resources } = props;\n const context = props.context;\n const typeName = props.typeName;\n const moduleId = props.id;\n\n return (\n <Module {...moduleProps}>\n {heading}\n <div className='ms-ratings-histogram__container'>\n {averageRating(data, context, typeName, moduleId, resources)}\n <Node {...histogramProps}>\n {histogramItems.map(item => {\n return histogramItem(item);\n })}\n </Node>\n </div>\n </Module>\n );\n};\n\nexport default RatingsHistogramView;\n"],"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","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","cartLine","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","cartline","hasShippingMethod","_channelDeliveryOptio","DeliveryMode","PickupDeliveryModeCodes","some","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","disabled","isCartStateReady","isGiftCard","isOutOfStock","cartState","priceEditorResources","CartLinePriceEditor","getDefaultColorSwatchSelected","productData","_colorAttribute$Swatc","_colorAttribute$Swatc2","_colorAttribute$Swatc3","colorAttribute","attributeValue","_attributeValue$KeyNa","color","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","_estimatedAvailabilit","ratingCountAriaLabel","estimatedAvailabilites","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","invenLabel","TotalAvailableInventoryLevelLabel","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","catch","failedToAddPromoCodeErrorText","_onSubmitHandler","applyPromotionHandler","_renderForm","promoPlaceholderText","promoCodeApplyButtonText","attributes","onSubmit","_removePromotion","_event$currentTarget$","code","removePromoCodes","promoCodes","failedToRemovePromoCodeErrorText","_renderAppliedPromoCode","Coupons","removePromotionHandler","coupon","removePromoAriaLabelFormat","removePromoText","Code","TelemetryConstant","ApplyPromoCode","promoCodeHeadingText","quantityHeading","configurationObject","areInventoryRangesChecked","setAreInventoryRangesChecked","inventoryRangesList","setInventoryRangesList","setEstimatedAvailabilites","onlyShowPriceWhenAuthenticated","resp","getInventoryLevelRangesAsync","callerContext","getInvProfs","_props$data$products2","_response$ProductWare","Array","from","Set","searchCriteria","createInventoryAvailabilitySearchCriteria","getEstimatedAvailabilityAsync","ProductWarehouseInventoryAvailabilities","getEsimatedAvailability","showFilterDropdown","showSortDropdown","_configurationObject$","Inventorylabel","Inventorycode","TotalAvailableInventoryLevelCode","getInventory","inventoryCode","isToolTipOpen","setIsToolTipOpen","toggleTooltip","Tooltip","placement","boNote","backOrderShippingText","_invProfOos","_invProfOos2","currentInvString","currentInventory","invProfOos","ir","_ir$Profile","tempInvRange","Profile","hasOwnProperty","UpperBoundInclusive","productUnavailableText","valueType","property","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","updateCart","newCartObject","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","titleProps","enableSearchWrap","location","hasMultipleTerms","test","link","has","append","expandResultsText","refineResultsText","notFindingText","renderExpandOrRefineResults","loginToViewPricingAndAvailabilityText","supersededFromText","priceAndAvailabilityHeading","manufacturerCodes","setActiveProducts","searchTerm","codes","matchedProducts","unmatchedProducts","_p$ItemId","_p$ItemId2","matched","substring","GDNManufacturerCode","isEligibilityChecked","setEligibilityChecked","IsAssorted","_props$data$cart$resu3","ratingId","_totalRatings$toStrin","ActiveProductComponent","imgData","assembleNode","_item$links","headingNode","renderHeading","additionalContentHeading","Msdyn365","editProps","onEdit","handleAdditionalTextChange","paragraphNode","subtext","renderParagraph","additionalContentParagraphText","linksNode","links","ctaLink","renderLinks","linkIndex","editableLink","linkText","linkUrl","destinationUrl","openInNewTab","isOpenInNewTab","onTextChange","handleAdditionalLinkTextChange","additionalContentNode","additionalContentContainer","additionalContentItemLinks","activeImageAdditionalContent","additionalContent","CanvasCalculations","CanvasStyles","ImageMapper","_isDesktopViewPort","_context","getActiveImageWidth","activeImageReferenceValue","activeImageRefs","clientWidth","getActiveImageHeight","clientHeight","convertHexToRgb","hexColor","RegExp","exec","rValue","gValue","bValue","applyFadingTransition","coords","rgbColor","alpha","_this$_canvas$current","_this$_canvas$current2","halfDivisor","_canvas","getContext","buttonPadding","paddingAdjustment","buttonWidth","measureText","width","fillStyle","body","parentElement","fillText","drawButton","_this$_canvas$current3","_this$_canvas$current4","buttonTextClor","buttonHeight","buttonPositionX","buttonPositionY","arcsize","beginPath","moveTo","lineTo","arcTo","stroke","closePath","fill","expandAnimation","_this$props$imageMapp","buttonText","imageMapperResources","animationStartWidth","expandAnimationStartWidth","pointPositionX","pointPositionY","animationEndWidth","expandAnimationEndWidth","radius","expandRadius","rotation","startAngle","endAngle","textFadeInValue","textFadeInStartValue","buttonTextClorInRgb","animate","_this$_canvas$current5","_this$_canvas$current6","ellipse","requestAnimationFrame","textFadeInterval","collapseAnimation","_this$props$imageMapp2","collapseAnimationStartWidth","collapseAnimationEndWidth","clearMargin","clearHeight","clearWidth","collapseRadius","textFadeOutValue","textFadeOutStartValue","_this$_canvas$current7","_this$_canvas$current8","clearRect","drawCircle","_this$_canvas$current9","_this$_canvas$current10","viewPort","doubleMultiplier","strokeStyle","arc","PI","scaleCoords","imgWidth","defaultWidth","defaultScale","scale","coord","renderPrefilledAreas","areaMap","areas","area","computeCenter","scaledCoords","handleHoverOn","center","handleHoverOff","_this$_canvas$current11","canvasPositionX","defaultPositionX","canvasPositionY","defaultPositionY","height","click","hoverOn","onMouseEnter","hoverOff","onMouseLeave","renderAreas","_this$props$imageMapp3","_this$props$imageMapp4","_area$productSearchRe","xsRadius","extendedArea","areaKey","altTextWithProductName","productSearchResult","shape","join","alt","initCanvas","_this$getActiveImageW","_this$getActiveImageH","_this$_canvas$current12","_backgroundImage","_container","onLoad","defaultHeight","canvasWidth","canvasHeight","componentDidMount","shouldRender","_requestContext$gridS","imageData","useMap","ActiveImageConstants","ActiveImage","_defaultProductCardWidth","_defaultProdutCardHight","_activePoints","addActivePoints","_product$PrimaryImage","areaId","updateClientWidth","viewport","renderImageMapper","_this$props$config$ac","activePoints","configProduct","_configProduct$xPosit","_configProduct$yPosit","_configProduct$radius","xPosition","yPosition","activePoint","mappedArea","_activeImageClass","enterArea","leaveArea","activeImage","_activeImageRefs","altTextForSeeMoreButtonWithProductName","seeMoreButtonText","overlayClass","open","resetState","renderProductComponent","_this$state$area","_this$state$area$prim","_product$ItemId","baseImageUrl","productImageSettings","renderProductCard","_productCardDivRef","renderOverlay","getProductCardPositionX","_this$props$config$pr","_this$props$config$pr2","_defaultImageSettings","_area$center$","_area$center","defaultImageSettings","getDefaultImageSettings","productImageSettingsWidth","productCardWidth","leftAllignPosition","position","getProductCardPositionY","_this$props$config$pr3","_this$props$config$pr4","_defaultImageSettings2","productImageSettingsHeight","produtCardHight","_area$center$2","_area$center2","xl","lazyload","keyDown","enterKey","nodeName","escKey","handleTextChange","handleParagraphChange","paragraph","renderActiveImageDetailsLinks","_telemetryContent","linkData","linkId","willOpenInNewTab","handleLinkTextChange","renderActiveImageDetailsHeading","_heading$tag","renderActiveImageDetailsParagraph","getActiveImageId","activeImageId","_activeImageIdPart$","activeImageSource","split","decrementOne","_handleOutsideClick","_this$_productCardDiv","contains","timeoutInterval","images","getElementsByClassName","removeAttribute","viewProps","activePointContainer","activePointDetailsContainer","imageMapper","overlay","productCard","productCardleftPosition","productCardtopPosition","detailsContainer","detailsContainerCta","handleAdditionalParagraphChange","handleAdditionalText","handleAdditionalParagraph","handleAdditionalLinkText","_this$props$config$ad","activeImageView","top","left","BulkPurchase","_errorCssClass","_errorCssGlyphClass","collapseRef","_dimensionDropDownChange","_this$collapseRef$cur","reEvaluateHeight","_onErrorMessage","stateMessage","messageText","statusCssString","messageGlyph","_toggleCollapse","hasDimensionsInProps","hasDimensionsInData","container","content","_renderCollapseContent","_renderCollapseButton","_renderCollapse","bulkPurchaseHeaderTitle","_renderMainContent","isMobileDevice","userMessageNode","Alert","RichTextComponent","bulkPurchaseDescriptionText","_renderMatrix","_featureState$result","_this$props$data$orde","_this$props$data$cust","isMultipleCatalogsFeatureEnabled","validateCatalogId","ProductDimensionsMatrix","dimensions","orderTemplates","customerInformation","dimensionOnChange","onErrorMessage","isMultipleCatalogFeatureEnabledInHq","BulkPurchaseViewComponent","validateCartAsync","propsContext","cartResult","cartVersion","shouldRetry","Version","debug","AsyncResult","resolve","_validationResult$Val","validationResult","CartsDataActions","bypassCache","ValidationResultsByLineId","refreshCart","refreshError","validateError","cartLineQuantityUpdatedAsync","isQuantityLimitsFeatureEnabled","cartLineToUpdate","isUsingDefaultOrderSettingsMax","_modifiedProduct$Beha2","modifiedProduct","Behavior","MaximumQuantity","cartLineId","newQuantity","updateLineResult","updateCartLineQuantity","message","getProductByProductId","getProductByProductIdAndWarehouse","warehouseId","targetWarehouseValue","WarehouseId","_product$Behavior","InventoryLocationId","ProductPickUpOptionsForCartLineItems","getCacheKey","buildCacheKey","getCacheObjectType","dataCacheType","getPickUpOptionsForCartLineItems","channelId","Error","getCartState","getActiveCartProductsAction","ActiveCartProductsInput","Promise","ProductsDataActions","queryResultSettings","QueryResultSettingsProxy","getPagingFromInputDataOrDefaultValue","createObservableDataAction","inputData","PickUpInStore","_toggleBOPIS","isBopisSelected","storeSelectorStateManager","storeSelectorModuleId","openDialog","alreadySelectedLocation","OrgUnitNumber","FulfillmentStoreId","deliveryOptions","onLocationSelected","orgUnitLocation","updateCartLinePickupLocation","locationChangedHandler","_onLocationChangedCallback","ShippingAddress","clearCartLinePickupLocation","_getOrgUnitName","fulfillmentStoreId","orgUnitLocations","foundLocation","OrgUnitName","DeliveryOptions","_props$channelDeliver","retailMulitplePickupFeatureState","matchDeliveryOptions","productdeliveryOptions","storePickUpOptionList","deliveryOption","delivery","pickup","deliveryCode","callbacks","toggleBopis","defaultComponent","_renderShippingMethod","shipItText","pickupInStoretext","changeStoreText","orgUnitName","bopisSelected","toggleBOPIS","checked","shipitText","pickUpInStoreText","_getDeliveryOption","pickupStore","_deliveryOptions$Deli","ContainerProps","_assembleNode","foundProductAvailability","productPickUpOptions","_foundProductAvailabi","_product$Dimensions","_props$cartState","_context$request$chan","removeButtonText","removeItemClickHandler","moveToWishlistSuccessHandler","addToOrderTemplateButtonText","addToOrderTemplateButtonTooltip","addToOrderTemplateDialogResources","createOrderTemplateDialogResources","itemAddedToOrderTemplateDialogResources","duplicateItemsWhenAddingToOrderTemplateDialogResources","addToWishlistButtonText","removeFromWishlistButtonText","wishlists","defaultWishlistName","nameOfWishlist","availableQuantityInStock","isStockCheckEnabled","productAvailability","ProductAvailableQuantity","IsProductAvailable","AvailableQuantity","_getCartItemAvailableQuantity","_getCartItemMaxQuantity","maxQuantityByConfig","maxByQuantityLimitsFeature","maxByQuantityLimitsFeatureResult","maxCartlineQuantity","shouldSkipStockCheck","ItemTypeValue","ReleasedProductType","Service","ObjectExtensions","isNullOrUndefined","_getErrorMessage","lineId","_props$productAvailab","finalErrorMessages","productAvailabilites","outOfStockText","includeErrors","outOfRangeOneText","outOfRangeFormatText","checkForErrors","cartlinesErrors","ValidationResultsPairs","errorsFoundByLineId","ValidationFailures","validation","ErrorContext","onRemoveClickHandler","onRemoveClickFunction","payload","TelemetryEvent","RemoveFromCart","inventoryLbl","StockLevelLabel","StockLevelCode","isCustomPriceSelected","dimension","getProductUrlSync","isChannelTypeB2B","_cartline$CatalogId","set","CatalogId","getInvoiceDetailsPageUrlSync","cartlineId","hasError","isNullOrEmpty","CartLineItemComponent","catalogs","lineIndex","updateCartLinesQuantitySuccessHandler","priceCurrency","pickUpInStore","pickitUpText","remove","addToWishlist","AddToWishlistComponent","showButtonText","showStatusMessage","showRemoveButton","showButtonTooltip","ariaRole","onSuccess","addToOrderTemplate","AddToOrderTemplateComponent","shouldShowButtonFailedTooltip","disableButton","disableTooltip","assembleCartlines","reactNodes","isPickUpItem","isCartLineItemPickUpType","_productAvailability$","_productAvailability$2","_cartline$WarehouseId","shouldIgnoreWarehouse","InventLocationId","CartLineGroupItems","_assembleGroupInvoiceCartlines","cartLines","carLineViewProps","_assembleGroupCartlines","getGroupByStorePickup","groupBy","groupDelivery","cartLinesGroup","entries","deliveryType","groupByDeliveryType","keys","getPromotionData","ctx","promotionData","getPromotionOptionsForCartLineItems","PromotionOptionsForCartLineItems","promotionOptions","exception","Cart","_isMounted","promotionPopupId","promotionLinkClick","showPromotionDialog","promotionCloseButtonclick","_hidePromotionDialog","getImageSettings","removeItemFromCartHandler","cartlineToRemove","cartLineIds","removeCartLines","validateCart","updateCartlineQuantity","cartlineToUpdate","cartActionResult","_cartActionResult$err","lineUpdateFailure","validationResults","LocalizedMessage","errorDetails","fulfillmentStoreIdUpdated","isCartValid","_this$props$data$cart","getOrderQuantityLimitsFeatureFlag","_isChannelLimitsFeatureEnabled","showAvailablePromotions","_this$props$data$cart2","_this$props$data$cart3","_cart$cart$CartLines","guestCheckoutUrl","backToShoppingUrl","checkoutURL","getCheckoutURL","isCartEmpty","_getCartLines","emailDeliveryModeCode","EmailDeliveryModeCode","validInventoryAcrossCartLines","validateCartLinesInventory","isValid","RetailMultiplePickupFeatureState","multiplePickUpEnabled","currentCatalogId","getCartLinesGroup","Checkout","checkoutBySignInAttributes","GuestCheckout","checkoutByGuestAttributes","BackToShopping","backtoShoppingAttributes","cartLineGroup","_updateCartLineErrorForInvalidInventory","cartTitle","CartlinesWrapper","OrderSummaryWrapper","OrderSummaryItems","_getPromoCode","_getPromotions","orderSummaryHeading","invoiceSummaryTitle","orderSummaryTitle","orderSummaryLineitems","_getOrderSummaryLineItems","invoiceSummaryLineitems","_getInvoiceSummaryLineItems","checkoutAsSignInUserButton","checkoutButtonTitle","checkoutAsGuestButton","showGuestCheckoutButton","guestCheckoutButtonTitle","expressCheckoutButton","paymentExpress","ExpressCheckoutSectionWrapper","backToShoppingButton","backToShoppingButtonTitle","createTemplateFromCartButton","_displayAddCartToTemplate","SaveCartToOrderTemplateComponent","_generateAddToOrderTemplateDialogResources","_generateOrderTemplateNameDialogResources","linesAddedToOrderTemplateDialogResources","_generateLinesAddedToOrderTemplateDialogResources","_generateDuplicateItemsWhenAddingToOrderTemplateDialogResources","createOrderTemplateFromCartButton","createOrderTemplateFromCartButtonTooltip","checkoutBlockedDueToUnavailableFunds","storeSelector","waitingComponent","Waiting","cartLoadingStatus","cartLoadingErrorMessage","cartDataResult","isEmpty","OrderSummaryErrors","_getOrderSummaryErrors","_this$props$data$cart4","_cart$cart","showPromotionPopup","promotions","promotionLinkText","promotionPopupHeading","onCloseButtonClick","onSeeAllClick","titleId","promotionMessageWrapper","promotionMessage","promotionStringHeading","promotionSeeAllLink","promotionDialog","_promotion","_promotion$Promotion","Promotion","cartPromotions","promotionCloseButtonAriaLabel","cartLineInventoryValidationResult","productIdWithErrors","productIdWithError","_element$data","outOfStockErrorMessage","allErrors","_cartline$data","_cartline$data$produc","fullError","Wrapper","assertive","outOfStockErrorMessageHeader","header","errors","InvoiceSummary","orderTotalLabel","totalAmountLabel","invoiceLabel","_featureState$result2","channelConfiguration","retailMultiplePickUpOptionEnabled","isShowOrHideTaxEnabled","isEnableShowOrHideSalesTaxECommerceEnabled","OrderSummary","subTotalLabel","itemsWithCountLabel","shippingLabel","estimatedShippingLabel","otherChargeLabel","taxLabel","estimatedTaxLabel","orderTotal","totalDiscountsLabel","toBeCalculatedText","yetToBeCalculatedText","freeText","isTaxIncludedInPrice","IsTaxIncludedInPrice","isShowTaxBreakup","collapseTimeOut","duplicatePromotionErrorText","addToOrderTemplateHeader","noOrderTemplatesMessage","noOrderTemplatesDescription","createAnOrderTemplateButtonText","createNewOrderTemplateButtonText","cancelOrderTemplateCreationButtonText","selectTemplatesText","addToTemplateButtonText","lineItemsText","_generateItemAddedToOrderTemplateDialogResources","viewOrderTemplateButtonText","continueShoppingButtonText","itemAddedToOrderTemplateHeaderItemOneText","itemAddedToOrderTemplateHeaderItemFormatText","itemAddedToOrderTemplateHeaderMessageText","linesAddedToOrderTemplateHeaderItemsOneText","linesAddedToOrderTemplateHeaderItemsFormatText","linesAddedToOrderTemplateHeaderLinesOneText","linesAddedToOrderTemplateHeaderLinesFormatText","linesAddedToOrderTemplateHeaderMessageText","linesAddedToOrderTemplateCustomPriceAlertMessageText","duplicatedProductsHeader","duplicatedProductsDescription","updateQuantityButtonText","cancelDuplicateItemsButtonText","orderTemplateHeaderLabel","createOrderTemplateHeader","orderTemplateTitleLabel","orderTemplateTitle","orderTemplateNameAriaLabel","orderTemplateDescription","createOrderTemplateDescription","defaultOrderTemplateName","orderTemplateButtonLabel","createOrderTemplateButtonText","orderTemplateCancelButtonLabel","cancelNewOrderTemplateCreationButtonText","_this$props$data$feat2","_this$props$data$feat3","_this$props$data$cata","modules","storeSelectorId","CartLineItems","productDeliveryOptions","updateMaxQuantityForCartLineItem","maxQuantityForCartLineItem","warehouseAggregation","productDimensionTypeSize","productDimensionTypeColor","productDimensionTypeConfiguration","productDimensionTypeStyle","productDimensionTypeAmount","quantityDisplayText","discountStringText","shippingCharges","salesAgreementPricePrompt","removeCartButtonText","shipInsteadDisplayText","pickItUpDisplayText","changeStoreDisplayText","errorMessageOutOfRangeOneLeft","errorMessageOutOfRangeFormat","showOutOfStockErrors","addToOrderTemplateMessage","addItemToOrderTemplateError","isAbsoluteUrl","urlCheck","returnURL","origin","_featureStatuses$find2","featureStatuses","_featureStatuses$find","_cartConfiguration$Ig","cartConfiguration","IgnoreOrderSettings","defaultOrderQuantityLimitsFeatureConfig","platform","enableDefaultOrderQuantityLimits","customerInfo","IsB2b","_featureStatuses$find3","isChannelLimitsFeatureEnabledInHq","_this$props$data$feat4","_featureState$result3","_this$props$data$chan","_this$props$data$cata2","_this$props$data$chan2","_this$props$data$cart5","cartLinesPickUpOptions","_renderCartlines","cartEmptyText","_cartLine$cartlineId","renderCartLinesGroupHeader","pickUpText","shippingText","emailShippingText","titleSeparate","_cartLine$pickUpInSto4","groupTitle","renderCartLinesGroupTitle","_cartLine$pickUpInSto","_cartLine$pickUpInSto2","_cartLine$pickUpInSto3","_props$cart","_props$cart2","errorData","renderModuleAttributes","emailshippingText","emptyCartText","renderCartLinesGroup","_renderInvoiceSummarylines","invoiceSummaryLines","invoices","giftCard","loyalty","_renderOrderSummarylines","orderSummaryLines","subtotal","shipping","tax","totalDiscounts","_applyPromotionHandler","promoCodTotalDiscount","InvoiceSummaryLine","cssLabel","_buildPaymentSummarySection","_computedLoyaltyAmount","checkoutState","loyaltyAmount","TotalAmount","invoiceLines","invoiceLine","InvoiceAmount","InvoiceId","giftCardAmount","_computeGiftCardAmount","giftCardTotalValue","giftCardExtends","giftCardCounter","Balance","totalAmountAfterGiftCard","loyaltyLabel","giftcardLabel","OrderSummaryLine","_buildOrderSummarySection","getDeliveryMode","featureSate","pickupDeliveryMode","dM","SubtotalAmount","SubtotalAmountWithoutTax","TaxAmount","TaxOnNonShippingCharges","DiscountAmount","OtherChargeAmount","canShip","hasDeliveryMethod","getDeliveryConfiguration","deliveryModes","taxOnShippingCharge","TaxOnShippingCharge","shippingChargeAmount","ShippingChargeAmount","otherChargeAmount","taxOnNonShippingCharges","isTaxGreaterThanZero","otherChargeAmountTotal","subtotalAmountActual","customerAccountAmount","customerAccount","customerAccountLabel","ProductCollection","handleHeadingChange","validProducts","DimensionSwatchDisplayTypes","initProductState","productCollectionProducts","equals","listType","getProductPriceForSelectedProducts","ProductPriceForSelectedProductsInput","IsMasterProduct","_getProduct","productPrice","_this$state$productsD","breaCrumbType","productComparisonButtonSlot","productComparisonButton","reviewCountAriaLabelValue","ratingCountAriaLabelSingleUser","ProductContainer","productComponent","_product$MasterProduc","_getSeeAllButton","headingLabel","discountIds","searchPageLink","seeAllButtonText","shouldDisplaySeeAllButton","recommendationListId","isCarousel","layout","headingComponent","updatedProducts","getProductData","productCollectionViewProps","SingleSlideCarouselComponentProps","SingleSlideCarousel","flipperPrevLabel","flipperNextLabel","parentId","ProductCollectionContainer","GridComponentProps","seeAllButton","_renderCarousel","carouselContainer","_renderProduct","_renderGrid","gridContainer","_renderNoProduct","noProductToRenderText","QuickOrderDrawer","_toggle","isManuallyToggled","collapseProps","drawerGlyphClass","toggleGlyphClassName","animateGlyph","drawerOpenGlyph","openGlyph","closeGlyph","drawerCloseGlyph","drawerClass","toggleButtonProps","block","_generateDrawerButtonInnerMarkup","collapseState","drawerButtonTextClass","toggleButtonClassName","moduleHeadingText","moduleDescriptionText","_generateGlyphMarkup","glyphClass","QuickOrderFormComponent","productTextInput","quantityTextInput","quickOrderState","maxChars","disableAddtoCart","ariaLabelQuantity","ariaLabelProduct","ariaLabelAddtoCart","addQuantityPlaceholderText","handleQuantityChange","handleInputChange","handleAddToCartClick","onInputChange","onInputChangeFunction","onQuantityInputChange","onQuantityChangeFunction","productNode","quantityNode","pattern","maxLength","addToCartBtn","userMessage","QuickOrderProduct","simpleProduct","isSelected","QuickOrderDesktopHeaderCellsComponent","columnWithNumberClassName","quickOrderProductNumberText","quickOrderProductText","quickOrderUnitPriceText","quickOrderUnitOfMeasureText","quickOrderQuantityText","quickOrderTotalText","quickOrderActionsText","QuickOrderMobileHeaderCellsComponent","QuickOrderTableHeaderComponent","rowClassName","headerCells","QuickOrderTableRowProductImageComponent","_props$data$product$P","_props$imageSettings","OmniChannelMedia","containerClassName","QuickOrderExtraActionsPopupComponent","QuickOrderDesktopTableRowCellComponent","_cartLine$LineId","_dimension$DimensionV","dimensionValue","quickOrderProductDimensionsSeparator","UnitOfMeasureSymbol","quickOrderInputQuantityAriaLabel","quickOrderDecrementButtonAriaLabel","quickOrderIncrementButtonAriaLabel","quickOrderRemoveItemButtonAriaLabel","QuickOrderMobileTableRowCellComponent","quickOrderQuantityMobileText","QuickOrderTableRowComponent","QuickOrderTableComponent","setIsMobile","quickOrderProducts","updateViewport","headerClassName","quickOrderProduct","QuickOrder","waitTime","dimensionUpdateQueue","FinitePromiseQueue","initializedDimensions","cssClassNameConfigure","quickOrderCallbacks","initializeDimension","initializedDimension","add","dimensionSelectedAsync","selectedDimensionId","selectedDimensionValueId","_this$state$productDi","size","enqueue","_updateDimensions","FinitePromiseQueueError","ProcessWasDiscardedFromTheQueue","getDropdownName","_getDropdownName","changeUpdatingDimension","isUpdatingDimension","_handleInputChange","productResponse","inputQuantityText","quantityInput","HTMLInputElement","cancellableDebounce","cancel","isQuickOrderFormExpanded","_debounce","getScanResult","GetScanResultInput","results","Product","ProductDimensionFull","_addItemToCart","quickOrderAddedToCartSuccessMessage","quickOrderAddedToCartFailureMessage","_validateCart","getDeliveryOptionsAsync","defaultDeliveryOption","productAvailableQuantity","_updateAvailability","shouldValidateQuantityLimits","_shouldValidateQuantityLimits","addProductToCartInput","availableQuantity","orderQuantityLimitsFeatureIsEnabled","isAddEmailDeliveryItemToCart","inputProductText","maxQtyLimitReachedMessage","_getMaxQtyMessage","_result$errorDetails","isOrderQuantityLimitsFeatureEnabledInSiteSettings","_getConcatenatedMaxQtyMessage","quickOrderMaxQuantityLimitText","quickOrderAlreadyItemQuantityText","_handleQuantityChange","currentValue","inputElement","setAttribute","_updateDimensionValue","productDimensionFull","newValueId","DimensionValues","_this$state$productRe","dimensionsToUpdate","productDimensionErrorState","otherError","clearOtherErrorState","configureErrors","errorState","mappedDimensions","selectedProduct","reject","newProduct","getSelectedVariant","SelectedVariantInput","getDimensionsForSelectedVariant","GetDimensionsForSelectedVariantInput","variantProduct","newAvailableQuantity","getProductAvailabilitiesForSelectedVariant","ProductAvailabilitiesForSelectedVariantInput","productAvailable","_getDimensionErrorString","quickOrderproductDimensionTypeColorErrorMessage","quickOrderproductDimensionTypeConfigurationErrorMessage","quickOrderproductDimensionTypeSizeErrorMessage","quickOrderproductDimensionTypeAmountErrorMessage","quickOrderproductDimensionTypeStyleErrorMessage","_updateProductAvailability","_productResponse$Dime","missingDimensions","_getConfigureErrors","quickOrderWrongQuantityErrorMsg","quickOrderOutofStockErrorMsg","quickOrderFormClass","quickOrderFormProductContent","quickOrderFormMsgContent","quickOrderModuleHeading","quickOrderModuleDescription","quickOrderAddtobag","quickOrderProductQuantityInputLabel","quickOrderProductInputLabel","quickOrderProductDimensionTypeColor","quickOrderProductDimensionTypeConfiguration","quickOrderSelectDimensionFormatString","quickOrderProductDimensionTypeSize","quickOrderProductDimensionTypeStyle","quickOrderProductDimensionTypeAmount","quickAddQuantityPlaceholderText","productConfigureResources","selectDimensionFormatString","quickOrderProps","contentProps","isB2B","drawer","quickOrderForm","quickOrderList","_renderQuickOrderTable","form","configure","getProductConfigure","_initQuickOrderProducts","tableClassName","productInventoryInfo","maxQuantityForLineItem","addedQuantity","_item$ItemId","_this$state$productRe2","minInventory","renderConfigure","containerProps","dropdowns","renderConfigureDropdown","dropdown","labelContainerProps","select","renderForm","quickOrderProductContent","quickOrderMsgContent","tenantId","inputIsValid","requestUrl","serviceEndpoint","sendRequest","userReviewData","headers","Authorization","authorization","SubmitUserReviewInput","onClickSubmit","ReviewModal","SubmitReview","submitButtonAttribute","Cancel","cancelButtonAttribute","modalCSS","cancelButton","discardReviewButtonText","submitButton","submitDisabled","submitReviewButtonText","ratingsInput","ratingLabel","ratingsLabel","titleInput","titleLabel","textInput","textLabel","privacyPolicyUrl","privacyPolicyLink","autoComplete","inputRow","errorMessageText","userReview","reviewId","editReviewModalTitle","writeReviewModalTitle","stripWhiteSpacesFromString","reviewText","reviewTitle","selectRatingAriaLabel","initialRating","parentType","onRatingChange","selectRatingLabel","reviewTitleMaxLength","renderContextId","onTitleChange","reviewTitleAriaLabel","htmlFor","reviewTitleLabel","reviewTextMaxLength","rows","reviewAriaLabel","reviewTextLabel","policyTextBlocks","privacyPolicyTextFormat","isSeparatorAtStart","startsWith","isSeparatorAtEnd","endsWith","PrivacyPolicy","privacyPolicyAttribute","rel","privacyPolicyTitle","submitReview","onReviewComplete","onReviewSubmission","getRnrPartnerId","userEmail","emailAddress","userName","token","getRnrAuthEndpointId","submitUserReview","review","submittedDateTime","helpfulPositive","helpfulNegative","firstName","getReviewInput","GetUserReviewInput","update","TOGGLE_REVIEW_MODAL_BUTTON_ID","TOGGLE_EDIT_MODAL_BUTTON_CARD_ID","HistogramItems","ratingsSummary","totalRatingsCount","renderItem","star5Count","star4Count","star3Count","star2Count","star1Count","stars","totalCount","percentage","formattedPercent","Intl","NumberFormat","barItemAriaLabel","starLabel","bar","Progress","buttonProps","AverageRatingNumber","summary","averageRating","TotalReviews","RatingsHistogram","selectFilterBy","completeClass","histogramItems","averageRatingAriaLabel","averageNumber","totalReviews","ratingsSummaryProps","histogramProps","filterKey","createRatingsReviewsStateInput","histogramItem","authToken","requestBody","concernCategory","requestHeader","isHelpful","ReviewConcernCategory","ReportReviewConcernInput","ReviewCount","currentPage","reviewsCount","reviewsShownOnEachPage","pageReviewCountText","_getReviewStartNumber","_getReviewEndNumber","PageControls","previousPageClick","_getPreviousPageData","nextPageClick","_getNextPageData","Next","nextAttribute","Previous","previousAttribute","_hasPreviousPage","_paginationAriaLabel","pageReviewAriaLabel","previousButtonText","_hasNextPage","nextButtonText","_getPagesCount","_getReviewsShown","ceil","isNextPage","page","pageModifier","pageReviewCount","updateReviews","selectedFilterByOption","reportConcernDropdownOptions","radioPairs","pairs","inputId","reportedKey","onRadioChange","reviewRatingNarratorText","voteHelpfulButton","isVoted","isVotedFor","votedReviews","approved","isUserReview","isOboRequest","yesButtonText","noButtonText","voteCount","onClickMethod","updateReviewHelpfulness","editButton","toggleWriteReviewModal","editReviewCardText","renderDate","DateTimeFormat","month","year","_unused","toggleReportReviewModal","reportToggle","reportConcernText","reportedReviews","reportedText","reportedReviewId","SubmitHelpfulnessVoteInput","ReviewsList","mostHelpfulSortOptionText","mostRecentSortOptionText","highestRatedSortOptionText","lowestRatedSortOptionText","filterByDropdownOptions","allRatinsFilterByOptionText","fiveStarFilterByOptionText","fourStarFilterByOptionText","threeStarFilterByOptionText","twoStarFilterByOptionText","oneStarFilterByOptionText","reviewsListCallbacks","updateReviewTitle","userReviewTitle","updateReviewText","userReviewText","updateRating","userReviewRating","onReviewSubmitted","isSuccessful","isReviewModalOpen","hasReviewError","toggleModal","_toggleReviewModal","updateReviewHelpfulnessVote","toggleReportModal","isReportModalOpen","_onReportModalOpen","_onReportModalClose","reportReview","_reportReviewCallback","updateFilterByDropdown","updateSortByDropdown","reviewsList","pagingInfo","listOfReviews","isFilterApplied","ratingsReviewsState","filterKeyValue","dropdownItemsCount","filterByOption","selectedIndex","_userReview","_reviewCard","_reviewCards","reviewList","reviewElements","isTakenDown","isPublished","cardProps","ratingHelpfulLabel","wasReviewHelpfulText","like","dislike","edit","report","responseName","userResponse","responderName","responseText","responseDate","cardBodyProps","responseProps","reviewProps","controlsProps","headerProps","ReviewCard","_userReportModalToggle","reportingReviewId","_userReviewModal","_onTitleChange","_onTextChange","_onRatingChange","_onReviewComplete","_userReviewModalToggle","isSuccess","_reportReviewModal","submitReviewAttribute","SuccessButton","successAttribute","cancelAttribute","SpamAdvertising","reportSpamText","OffensiveContent","offensiveContentText","Profanity","profanityContentText","headerSubmitted","feedbackThankYouText","cancelReportReviewText","reportReviewButtonText","succesfulButton","okReportReviewText","reportMessage","reportModalMessage","reportSubmittedMessage","radioButtons","ReportReviewModal","_onRadioChange","_reportReview","hasReportError","reported","reportReviewConcern","getUserToken","_value","reportedReview","skipItems","getSelectedProductIdFromActionInput","getReviewsForGivenProduct","GetProductReviewsInput","getRnrEndpointId","_updateVoteUi","alreadyExists","concat","submitHelpfulnessVote","showSpinner","reviewModal","reportReviewModal","filterByDropdown","filterByDropdownText","controlledByParent","sortByDropdown","sortByDropdownText","refineReviewsProps","reviewsListProps","reviewCards","pageControls","noReviewsMessage","noReviewsWithFilterMessage","noReviewsWithSelectedFilterMessage","filterByOptions","buildReviewCard","createReviewModal","createReportModal","SignInMessage","SignInButton","SignIn","WriteReview","writeReviewCallbacks","userInfo","signInMessage","signInButton","signInLabel","signInAriaLabel","editReviewButtonText","reviewButtonLabel","_buildUserReviewModal","SearchState","SuggestionType","AutoSuggestInput","searchText","suggestionType","hitPrefix","hitSuffix","searchQuery","topResultsCount","_getAutoSuggest","autosuggest","_ctx$requestContext$a","productSearchCriteria","SearchCondition","Context","ChannelId","inventoryRefinerValue","getInventorySortableRefinerValue","channelInventoryConfiguration","isInStock","ProductAvailabilitySortableAttributeRecordId","RowNumber","Attribute","getInventoryConfigurationAsync","Refinement","ProductSearchCriteria","HitPrefix","HitSuffix","searchSuggestions","getSearchSuggestionsAsync","ImageUrl","AllSearchResults","autoSuggestPromises","CategorySuggestionsComponent","suggestions","autoSuggestProps","categorySuggestionHeading","_renderTitle","categoryAutoSuggestionHeading","shouldShowFullPath","splitValue","pop","_generateLink","_getHighlightedText","suggestion","_getCategoryLink","_categoryRefiners$Val","searchPageURL","searchQsp","searchRefiners","queryUrl","categoryRefiners","Category","encodedRefiner","compressRefiners","formattedText","dangerouslySetInnerHTML","getRichTextHtml","compressedRefinerKeys","compressedRefiners","compressedRefiner","refinerKey","FormComponent","searchPlaceholder","hideSearchLabel","searchTextInput","disableSubmitSearch","handleCancelSearchChange","ariaLabelCancel","ariaLabelSearch","ariaLabelSubmit","inputNode","submitBtnNode","cancelBtn","submitBtn","KeywordSuggestionsComponent","formattedLink","LabelComponent","searchLabelClass","searchLabelArialLabel","isSearchFormExpanded","searchtext","searchCollapsedLabel","ProductSuggestionsComponent","productSuggestionHeading","productAutoSuggestionHeading","_item$Value","Value3","DecimalValue","thumbnail","_renderThumbnail","_renderPrice","LiProduct","_getLiWrapper","AProduct","_getAWrapper","recid","_props$resources","Search","_isLoadingNode","loadingText","autoSuggestResultLoadingMessage","Spinner","SpinnerSize","medium","labelPosition","_focusOutTarget","closest","_clearAutoSuggestState","_keyup","keyCode","KeyCodes","Escape","formReference","autoSuggestResultDiv","searchState","defaultBasicSearchUrl","searchQueryStringParameter","createSearchStateInput","cancellabelDebounce","inputSuggestionType","_loadSuggestions","_handleSubmit","searchURL","_appendQueryParams","_handleCancelSearchChange","isInitialState","_handleCancelSearchFocused","route","_setAutoSuggestResultCount","autoSuggestResultScreenReaderDiv","ariaLiveRegion","suggestResultString","autoSuggestFoundMessage","emptyResultString","noAutoSuggestionMessage","innerText","searchKeywordSuggestClass","searchProductSuggestClass","searchCategorySuggestClass","autoSuggestAriaLabel","isLoadingAutoSuggest","searchInputMaxLength","searchFormClass","_initSuggestionTypes","params","isEditor","_suggestions$AllSearc","_suggestions$AllSearc2","_suggestions$AllSearc3","cancelBtnAriaLabel","searchBtnAriaLabel","submitBtnAriaLabel","searchplaceholderText","shouldShowFullCategoryPath","keywordSuggestions","Keyword","None","productSuggestions","categorySuggestions","_item$RefinerRecordId","AutoSuggestAriaLabel","AutoSuggestAriaLabelText","AutoSuggest","KeywordSuggest","ProductSuggest","CategorySuggest","SearchForm","FormWrapper","UlKeyword","UlProduct","UlCategory","autosuggestKeyword","autosuggestProduct","autosuggestCategory","handleCancelSearchFocused","isLoadingNode","suggestionTypes","suggestionTypeCriterion","unique","validSuggestions","loadSuggestionsRequestId","getSearchSuggestionsAction","_getSuggestionType","_getSearchRefiners","Random","Guid","generateGuid","_getSearchSuggestions","_updateSearchRefiners","suggestionTypeItem","charAt","slice","_renderKeywordSuggestions","_renderProductSuggestions","_renderCategorySuggestions","SocialShareItem","_getSocialShareItem","viewprops","SocialShareItemElement","icon","socialMedia","SocialMediaComponent","SocialMedia","Facebook","postUrl","Twitter","Pinterest","Linkedin","Mail","SocialShareItemView","getAdditionalContentItems","additionalContentItemContainer","videoPlayerAdditionalContent","additionalContentItems","VideoPlayer","options","video","playerResources","playAriaLabel","playLabel","pauseAriaLabel","pauseLabel","playingAriaLabel","playingLabel","pausedAriaLabel","pausedLabel","muteAriaLabel","muteLabel","unMuteAriaLabel","unMuteLabel","fullScreenAriaLabel","fullScreenLabel","exitFullScreenAriaLabel","exitFullScreenLabel","seekBarLabel","videoTimeDurationLabel","closedCaptionLabel","videoMetaData","_video$_links","videoId","duration","playTime","posterframeUrl","_links","binaryReferences","videoBinaryReferences","videoPlayerData","metaData","player","Player","playerData","_getVideoDetailsHeading","_getVideoDetailsParagraph","_getVideoDetailsLinks","detailsContainerCTA","handleText","handleParagraph","handleLink","handleAdditionalLink","componentId","_data$ratingsSummary$","_data$ratingsSummary$2","_data$ratingsSummary$3","_data$ratingsSummary$4","_data$ratingsSummary$5","_data$ratingsSummary$6","reviewsCountString","numberOfReviewsString"],"sourceRoot":""}