{"version":3,"file":"static/js/10.da3cb474abbb3dff6678.chunk.js","mappings":"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","sources":["webpack://Msdyn365.Commerce.Online/./src/modules/bulk-purchase/bulk-purchase.tsx?9fd5","webpack://Msdyn365.Commerce.Online/./src/components/LoginToViewPricing.component.tsx?4d0c","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/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/themes/gardner-theme/views/components/product.component.tsx?a667","webpack://Msdyn365.Commerce.Online/./src/themes/gardner-theme/views/components/addToCart.component.tsx?89c0","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/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/product-collection/product-collection.tsx?4008","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/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/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/social-share-item/social-share-item.tsx?bbcb","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/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/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-b2c/views/components/product.component.tsx?7a8d","webpack://Msdyn365.Commerce.Online/./src/themes/gardner-theme-b2c/views/components/addToCart.component.tsx?25ed","webpack://Msdyn365.Commerce.Online/./src/themes/gardner-theme/views/search-result-container.view.tsx?c8d6","webpack://Msdyn365.Commerce.Online/./src/modules/active-image/active-image.view.tsx?a935","webpack://Msdyn365.Commerce.Online/./src/modules/bulk-purchase/bulk-purchase.view.tsx?feac","webpack://Msdyn365.Commerce.Online/./src/modules/cart/cart.view.tsx?d8c2","webpack://Msdyn365.Commerce.Online/./src/modules/product-collection/product-collection.view.tsx?5d36","webpack://Msdyn365.Commerce.Online/./src/modules/quick-order/quick-order.view.tsx?a96d","webpack://Msdyn365.Commerce.Online/./src/modules/search/search.view.tsx?1505","webpack://Msdyn365.Commerce.Online/./src/modules/social-share-item/social-share-item.view.tsx?2d3e","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","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/promocode.component.tsx?5a9f","webpack://Msdyn365.Commerce.Online/./src/themes/gardner-theme/views/components/cartlineitem.component.tsx?4855","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/modules/fabrikam/views/components/promocode.component.tsx?d9d6","webpack://Msdyn365.Commerce.Online/./src/themes/gardner-theme/models/SupersessionKey.ts?818f","webpack://Msdyn365.Commerce.Online/./src/invoice-summary-lineitem.tsx?5f61","webpack://Msdyn365.Commerce.Online/./src/validate-cart.ts?cd50","webpack://Msdyn365.Commerce.Online/./src/order-summary-lineitem.tsx?8a98","webpack://Msdyn365.Commerce.Online/./src/Common/get-product.ts?0a21","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/modules/ratings-histogram/component/components.tsx?f324","webpack://Msdyn365.Commerce.Online/./src/actions/submit-user-review.ts?ac78","webpack://Msdyn365.Commerce.Online/./src/common/rnrInterface.ts?f761"],"sourcesContent":["/*!\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 {\n productDimensions?: IProductDimensionsWithAvailabilitiesFull[];\n}\n\n/**\n * View for the bulk purchase module.\n */\nexport interface IBulkPurchaseViewProps extends IBulkPurchaseProps {\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 {\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 = React.createRef();\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
\n {this._renderCollapseButton(`${className}__collapse-button`)}\n {this._renderCollapse(`${className}__collapse`)}\n
\n );\n }\n\n private _renderCollapseButton(className: string): React.ReactElement {\n return (\n \n {this.props.resources.bulkPurchaseHeaderTitle}\n \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 \n {this._renderMainContent(`${className}__main-content`)}\n \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 \n \n {this.state.stateMessage.messageText}\n \n ) : (\n undefined\n );\n\n return (\n
\n {!isMobileDevice && (\n
\n \n
\n )}\n {userMessageNode}\n {this._renderMatrix(`${className}__matrix-container`)}\n
\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 }\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","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","/*!\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 {\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>}\n */\n@observer\nclass RatingsHistogram extends React.PureComponent> {\n constructor(props: IRatingsHistogramProps) {\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 \n ),\n averageNumber: ratingsSummary && ,\n totalReviews: ratingsSummary && ,\n ratingsSummaryProps: { className: 'ms-ratings-histogram__summary' },\n heading: heading && (\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 = props => {\n const { heading, histogramItems, histogramProps, moduleProps } = props;\n\n return (\n \n {heading}\n \n {histogramItems.map(item => {\n return histogramItem(item);\n })}\n \n \n );\n};\n\nconst histogramItem = (props: IHistogramItemViewProps) => {\n return (\n \n {props.starLabel}\n {props.bar}\n {props.percentage}\n \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 { 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 = 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 {noReviewsMessage};\n }\n\n return (\n \n {heading}\n {averageRating}\n {reviewCount}\n \n {sortByDropdown}\n {filterByDropdown}\n \n \n {userReview && buildReviewCard(userReview)}\n {reviewCards.map(review => {\n return buildReviewCard(review);\n })}\n \n {reviewCards.length === 0 && state.isFilterApplied && noReviewsWithFilterMessage}\n {pageControls}\n {createReviewModal(reviewModal, moduleProps)}\n {createReportModal(reportReviewModal, state)}\n \n );\n};\n\nconst buildReviewCard = (props: IReviewCardViewProps) => {\n return (\n \n \n {props.rating}\n {props.name}\n \n \n \n {props.reviewTitle}\n {props.date}\n {props.reviewText}\n \n \n {props.responseName}\n {props.responseDate}\n {props.responseText}\n \n \n {props.ratingHelpfulLabel}\n {props.like}\n {props.dislike}\n {props.edit}\n {props.report}\n \n \n \n );\n};\n\nconst createReviewModal = (props: IReviewModalViewProps, moduleProps: IModuleProps): JSX.Element => {\n return (\n \n {props.modalHeader}\n \n \n \n {props.rating}\n {props.ratingLabel}\n \n \n {props.titleLabel}\n {props.titleInput}\n \n \n {props.textLabel}\n {props.textInput}\n \n {props.privacyPolicyUrl}\n {props.error}\n \n \n \n {props.submitButton}\n {props.cancelButton}\n \n \n );\n};\n\nconst createReportModal = (props: IReportReviewModalViewProps, state: IReviewsListState): JSX.Element => {\n return (\n \n {state.reported ? props.headerSubmitted : props.header}\n \n {state.reported ? props.reportSubmittedMessage : [props.reportMessage, props.radioButtons, props.error]}\n \n {state.reported ? props.succesfulButton : [props.submitButton, props.cancelButton]}\n \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

{props.text}

;\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 \n {text}\n \n );\n};\n\ninterface IModalToggleProps {\n innerRef: React.RefObject | undefined;\n id: string;\n text: string;\n ariaLabel: string;\n telemetryContent?: ITelemetryContent;\n onClick(): void;\n}\n\nexport const ModalToggle: React.FC = (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 \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 {\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>}\n */\nclass WriteReview extends React.PureComponent, IWriteReviewState> {\n private readonly _modalToggleRef: React.RefObject | 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) {\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();\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: ,\n signInButton: (\n \n ),\n modalToggle: !Msdyn365.isOboRequest(this.props.context.request) && product && (\n \n ),\n reviewModal: this._buildUserReviewModal(),\n heading: heading && heading.text && (\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): void => {\n this.writeReviewCallbacks.updateReviewTitle(event.target.value);\n };\n\n private readonly _onTextChange = (event: React.ChangeEvent): 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 = props => {\n const { heading, signInMessage, signInButton, modalToggle, reviewModal, moduleProps } = props;\n const isAuthenticated = props.context.request.user.isAuthenticated;\n return (\n \n {heading}\n {!isAuthenticated ? (\n <>\n {signInMessage}\n {signInButton}\n \n ) : (\n <>\n {modalToggle}\n {createReviewModal(reviewModal, moduleProps)}\n \n )}\n \n );\n};\n\nconst createReviewModal = (props: IReviewModalViewProps, moduleProps: IModuleProps): JSX.Element => {\n return (\n \n {props.modalHeader}\n \n \n \n {props.rating}\n {props.ratingLabel}\n \n \n {props.titleLabel}\n {props.titleInput}\n \n \n {props.textLabel}\n {props.textInput}\n \n {props.privacyPolicyUrl}\n {props.error}\n \n \n \n {props.submitButton}\n {props.cancelButton}\n \n \n );\n};\n\nexport default WriteReviewView;\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 { }\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;\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
\r\n \r\n {unitOfMeasure}\r\n \r\n
\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
\r\n \r\n {inventoryAvailabilityLabel}\r\n \r\n
\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;\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 = ({\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();\r\n const [productImageUrl = productImageUrlFromSwatch, setProductImageUrl] = useState();\r\n const [selectedSwatchItems] = useState(new Dictionary());\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;\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
\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;\r\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\r\n const dimensionType = dimensionTypeValue as DimensionTypes;\r\n const swatches = item.Swatches?.map(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 \r\n );\r\n })\r\n }\r\n
\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(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 ? \r\n
\r\n
\r\n {renderProductPlacementImage(imageSettings, context.request.gridSettings, productImageUrl,\r\n product.PrimaryImageUrl, product.Name, context)}\r\n
\r\n
\r\n
\r\n {product.Name}\r\n
\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
\r\n
\r\n : \r\n
\r\n {renderProductPlacementImage(imageSettings, context.request.gridSettings, productImageUrl, product.PrimaryImageUrl, product.Name, context)}\r\n
\r\n
\r\n
\r\n {product.Name}\r\n
\r\n {renderPrice(context, typeName, id, product.BasePrice, product.Price, savingsText, freePriceText, originalPriceText, currentPriceText, isPriceMinMaxEnabled, priceResources)}\r\n {isUnitOfMeasureEnabled && renderProductUnitOfMeasure(product.DefaultUnitOfMeasure)}\r\n
\r\n }\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 (

\r\n {description}\r\n

);\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 \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 \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 \r\n );\r\n}\r\n\r\nexport const ProductComponent: React.FunctionComponent = msdyn365Commerce.createComponentOverride(\r\n 'Product',\r\n { component: ProductCard, ...PriceComponentActions }\r\n);\r\n\r\nexport default ProductComponent;\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 = ({productId, onAddToCart, addToCartButtonText}) => {\r\n\r\n const [ quantity , setQuantity ] = React.useState(1);\r\n\r\n const handleQuantityChange = (e: React.ChangeEvent) => {\r\n setQuantity(e.target.valueAsNumber);\r\n }\r\n const handleAddToCart = () => onAddToCart(productId, quantity);\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n )\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 {}\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

{description}

;\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 \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 \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 ;\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 = ({\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
\n
\n {renderProductPlacementImage(\n context.actionContext.requestContext,\n imageSettings,\n context.request.gridSettings,\n product.PrimaryImageUrl,\n product.Name\n )}\n
\n
\n

{product.Name}

\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
\n
\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 {\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 {\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 {\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 | React.FocusEvent;\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;\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 {\n private readonly _backgroundImage: React.RefObject;\n\n private readonly _container: React.RefObject;\n\n private readonly _canvas: React.RefObject;\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 \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
\n \n \n \n {this.renderAreas()}\n \n
\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 | React.FocusEvent;\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 & IImageMapperProps, IActiveImageState>}\n */\nexport class ActiveImage extends React.PureComponent & 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;\n\n private readonly _activeImageClass: string;\n\n private readonly _productCardDivRef: React.RefObject;\n\n public constructor(props: IActiveImageProps & 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 = 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 \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 \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
\n
\n {!this._isDesktopViewPort &&
\n
\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 &&
};\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 {\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 \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 \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 {\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>) => {\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 {\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,\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 \n \n {cartLine.FulfillmentStoreId ? (\n
\n {orgUnitName}\n \n
\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>;\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;\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 \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 \n ),\n addToWishlist:\n isAuthenticated && product && !isCustomPriceSelected ? (\n \n ) : (\n undefined\n ),\n addToOrderTemplate:\n isAuthenticated && orderTemplates && product ? (\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 {\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 {\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>}\n */\n@observer\nclass Cart extends React.Component> {\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) {\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 {\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, 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:

{resources.cartTitle}

,\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

{resources.invoiceSummaryTitle}

\n ) : (\n

{resources.orderSummaryTitle}

\n )\n ) : null,\n orderSummaryLineitems: this._getOrderSummaryLineItems(),\n invoiceSummaryLineitems: this._getInvoiceSummaryLineItems(),\n checkoutAsSignInUserButton: !isCartEmpty ? (\n \n {resources.checkoutButtonTitle}\n \n ) : null,\n checkoutAsGuestButton:\n !isCartEmpty && !isAuthenticated && this.props.config.showGuestCheckoutButton ? (\n \n {resources.guestCheckoutButtonTitle}\n \n ) : null,\n expressCheckoutButton: !isCartEmpty ? this.props.slots.paymentExpress : null,\n ExpressCheckoutSectionWrapper: { className: 'msc-express-payment-container-in-cart-page' },\n backToShoppingButton: (\n \n {resources.backToShoppingButtonTitle}\n \n ),\n createTemplateFromCartButton:\n this._displayAddCartToTemplate() && products ? (\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: ,\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) => {\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
\n {fullError}\n
\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 \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 \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 {\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 {\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 {\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): 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 \n {props.resources.promotionStringHeading}\n \n ),\n promotionSeeAllLink: (\n \n {` `}\n {promotionLinkText} {` `}\n \n ),\n promotionDialog: (\n \n \n
\n {promotionPopupHeading}\n
\n
\n \n
    \n {promotions.map(_promotion => {\n return (\n
  • \n {_promotion.Promotion?.OfferName} {` `}\n
  • \n );\n })}\n
\n
\n \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 { 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 {\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, IProductComponentState> {\n private readonly telemetryContent: ITelemetryContent;\n\n private readonly productPrices: ProductPrice[];\n\n constructor(props: IProductCollectionProps) {\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 {\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 \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,\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 => {\n const context = this.props.context as ICoreContext;\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,\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 \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 => {\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 \n {this.props.resources.seeAllButtonText}\n \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 { 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 {\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
\n \n {this._generateDrawerButtonInnerMarkup(collapseProps.isOpen)}\n \n \n
\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

{this.props.moduleHeadingText}

\n \n {this.props.moduleDescriptionText}\n \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 ;\n }\n\n private _toggle(e: React.MouseEvent | React.KeyboardEvent): 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;\n quantityTextInput: React.RefObject;\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;\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) => {\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) => {\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
\n

\n {ariaLabelProduct}\n

\n \n
\n );\n\n const quantityNode = (\n
\n

\n {ariaLabelQuantity}\n

\n \n
\n );\n\n const addtoCartNode = (\n
\n \n {ariaLabelAddtoCart}\n \n
\n );\n\n const userMessageNode =\n quickOrderState && quickOrderState.stateMessage ? (\n \n \n {quickOrderState.stateMessage.messageText}\n \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 {}\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 = (props: IQuickOrderTableHeaderProps) => {\n const { resources } = props;\n const columnWithNumberClassName = `${props.className}__row__column-with-number`;\n return (\n <>\n \n \n \n {resources.quickOrderProductNumberText}\n {resources.quickOrderProductText}\n {resources.quickOrderUnitPriceText}\n {resources.quickOrderUnitOfMeasureText}\n {resources.quickOrderQuantityText}\n {resources.quickOrderTotalText}\n {resources.quickOrderActionsText}\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 = (props: IQuickOrderTableHeaderProps) => {\n const { resources } = props;\n return (\n <>\n \n {resources.quickOrderProductNumberText}\n \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 = (props: IQuickOrderTableHeaderProps) => {\n const rowClassName = `${props.className}__row`;\n\n let headerCells: JSX.Element;\n if (props.isMobile) {\n headerCells = ;\n } else {\n headerCells = ;\n }\n\n return (\n \n {headerCells}\n \n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IComponentProps, ICoreContext, 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 {\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 = (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
\n \n
\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 = (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
\n
\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 = (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 \n \n \n {product.ItemId}\n \n
\n \n {product.Name}\n \n \n {product.Dimensions?.map(dimension => dimension.DimensionValue?.Value)\n .filter(dimensionValue => !StringExtensions.isNullOrWhitespace(dimensionValue))\n .join(props.resources.quickOrderProductDimensionsSeparator)}\n \n
\n \n {cartLine.Price}\n {cartLine.UnitOfMeasureSymbol}\n \n \n \n {cartLine.TotalAmount}\n \n \n )}\n {_hasNextPage(currentPage, reviewsCount, reviewsShownOnEachPage) && (\n \n {resources.nextButtonText}\n \n )}\n
\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>;\n isOpen: boolean;\n returnRef: React.RefObject | undefined;\n reportedKey: string;\n hasError: boolean;\n telemetryContent?: ITelemetryContent;\n onModalToggle(): void;\n onRadioChange(event: React.ChangeEvent): 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:

{props.resources.reportConcernText}

,\n headerSubmitted:

{props.resources.feedbackThankYouText}

,\n cancelButton: (\n \n ),\n submitButton: (\n \n ),\n succesfulButton: (\n \n ),\n reportMessage:

{props.resources.reportModalMessage}

,\n reportSubmittedMessage:

{props.resources.reportSubmittedMessage}

,\n radioButtons: radioPairs(props),\n error: (\n \n {props.resources.errorMessageText}\n \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
\n \n \n
\n );\n }\n\n return
{pairs}
;\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>;\n isUserReview?: boolean;\n parentId: string;\n parentType: string;\n reportedReviews: string[];\n returnRef: React.RefObject | 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:

{props.review.userName}

,\n rating: rating(props),\n date:

{renderDate(props, props.review.submittedDateTime)}

,\n reviewTitle:

{props.review.title}

,\n reviewText:

{props.review.reviewText}

,\n ratingHelpfulLabel: props.isUserReview ? (\n undefined\n ) : (\n

{props.resources.wasReviewHelpfulText}

\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

{props.review.userResponse.responderName}

\n ) : (\n undefined\n ),\n responseText: props.review.userResponse ? (\n

{props.review.userResponse.responseText}

\n ) : (\n undefined\n ),\n responseDate: props.review.userResponse ? (\n

{renderDate(props, props.review.userResponse.submittedDateTime)}

\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 \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 \n );\n }\n return (\n \n );\n};\n\nconst editButton = (props: IReviewCardProps) => {\n if (props.isUserReview && !isOboRequest(props.context.request)) {\n return (\n \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 \n );\n }\n\n if (props.reportedReviews.includes(props.review.reviewId!)) {\n return

{props.resources.reportedText}

;\n }\n\n const ref = props.review.reviewId === props.reportedReviewId ? props.returnRef : undefined;\n\n return (\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 { 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 {\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, IReviewsListState>}\n */\n@observer\nclass ReviewsList extends React.Component, 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;\n\n private readonly _userReportModalToggle: React.RefObject;\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) {\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();\n this._userReportModalToggle = React.createRef();\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, 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 \n ),\n sortByDropdown: (\n \n ),\n averageRating: ratingsSummary && (\n \n ),\n reviewCount: (\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 \n ),\n noReviewsMessage: (\n \n {resources.noReviewsMessage}\n \n ),\n noReviewsWithFilterMessage: (\n \n {resources.noReviewsWithSelectedFilterMessage}\n \n ),\n heading: heading && heading.text && (\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): void => {\n this.reviewsListCallbacks.updateReviewTitle(event.target.value);\n };\n\n private readonly _onTextChange = (event: React.ChangeEvent): 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) => {\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 { 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 {\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 {\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: >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;\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
  • {categoryAutoSuggestionHeading}
  • ;\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
  • \n \n {_generateLink(item, searchText, props) && _getHighlightedText(splitValue ? splitValue : '', hitPrefix, hitSuffix)}\n \n
  • \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'), '')\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n\n // eslint-disable-next-line react/no-danger\n return ;\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;\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) => {\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 \n ) : (\n \n );\n\n const submitBtnNode = !disableSubmitSearch && \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 { 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;\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
  • {productAutoSuggestionHeading}
  • ;\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'), '')\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n\n return (\n // eslint-disable-next-line react/no-danger\n \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 \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 \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 {\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, ISearchState>}\n */\nclass Search extends React.Component, ISearchState> {\n private readonly searchTextInput: React.RefObject;\n\n private readonly searchCollapsedLabel: React.RefObject;\n\n private readonly formReference: React.RefObject;\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;\n\n private readonly autoSuggestResultDiv: React.RefObject;\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) {\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 {\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, 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),\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 ;\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 {\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 | React.KeyboardEvent | React.FormEvent\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 { 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 {\n SocialShareItemElement: React.ReactNode | null;\n SocialShareItem: IModuleProps;\n}\n\n/**\n *\n * SocialShareItem component.\n * @extends {React.PureComponent>}\n */\nclass SocialShareItem extends React.PureComponent> {\n constructor(props: ISocialShareItemProps) {\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 \n );\n case socialMedia.twitter:\n return (\n \n );\n case socialMedia.pinterest:\n return (\n \n );\n case socialMedia.linkedin:\n return (\n \n );\n case socialMedia.mail:\n return (\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 * 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 {\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 {\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 {\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>}\n */\nclass VideoPlayer extends React.PureComponent> {\n private readonly telemetryContent: ITelemetryContent;\n\n private readonly isMobileDevice: boolean;\n\n public constructor(props: IVideoPlayerProps) {\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 \n \n \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 {\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 \n )\n );\n }\n\n private _getVideoDetailsParagraph(): React.ReactNode | undefined {\n const { paragraph } = this.props.config;\n\n return (\n paragraph && (\n \n )\n );\n }\n}\n\nexport default VideoPlayer;\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","/*--------------------------------------------------------------\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","/*--------------------------------------------------------------\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","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 { 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 const trimmedQuery = query.trim();\r\n\r\n const hasMultipleTerms = /\\s|-/g.test(trimmedQuery);\r\n\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 { 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 { 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 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 { 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 { 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 { 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 { 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 { 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","/*--------------------------------------------------------------\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 { 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 { 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 {\r\n CartLine,\r\n CommerceProperty,\r\n DiscountLine,\r\n DiscountLineType,\r\n SalesLine\r\n} 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 /** 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 /** 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 /** 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 * 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 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'>{productDimension.DimensionValue?.Value}</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'>{productDimension.DimensionValue?.Value}</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'>{productDimension.DimensionValue?.Value}</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'>{productDimension.DimensionValue?.Value}</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={\r\n props.data.cartLine.Quantity && props.data.cartLine.Quantity > zeroQuantity\r\n ? {\r\n price: {\r\n CustomerContextualPrice: props.data.cartLine.Price\r\n }\r\n }\r\n : {\r\n price: {\r\n CustomerContextualPrice: props.data.cartLine.Price\r\n }\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 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 (\r\n (discountLine.Percentage === numberZero ||\r\n (discountLine.DiscountLineTypeValue && discountLine.DiscountLineTypeValue === DiscountLineType.TenderTypeDiscount)) &&\r\n cartLine.Price &&\r\n cartLine.Price > numberZero &&\r\n cartLine.Quantity &&\r\n cartLine.Quantity !== numberZero\r\n ) {\r\n const effectiveAmount = discountLine.EffectiveAmount ?? numberZero;\r\n updatedPercent = Number(\r\n ((effectiveAmount / (cartLine.Price * cartLine.Quantity)) * fullPercentage).toFixed(decimalPrecision)\r\n );\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>{discountLine.OfferName ? discountLine.OfferName : ''}</span>\r\n <span className='msc-cart-line-item-product-discount-price'>\r\n <PriceComponent\r\n data={\r\n props.isSalesLine\r\n ? {\r\n price: {\r\n // @ts-expect-error -- Auto suppressed.\r\n CustomerContextualPrice: props.data.cartLine.PeriodicDiscount\r\n }\r\n }\r\n : {\r\n price: {\r\n CustomerContextualPrice: discountLine.EffectiveAmount,\r\n BasePrice: discountLine.EffectiveAmount\r\n }\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}`\r\n : 'msc-cart-line__product-inventory-label';\r\n\r\n return <p className={inventoryCssName}>{props.inventoryInformationLabel}</p>;\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 = !!(\r\n cartline.DeliveryMode &&\r\n channelDeliveryOptionConfig.PickupDeliveryModeCodes?.some(deliveryMode => deliveryMode !== cartline.DeliveryMode)\r\n );\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'>{`${props.resources.shippingChargesText}:`}</label>\r\n <span className='shipping-value'>{priceComponent}</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 (\r\n 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'>{`${String(otherCharge.Description)}:`}</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 ''\r\n );\r\n }) ?? undefined\r\n );\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 IsInvoiceLine = cartLine.IsInvoiceLine;\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>{props.errorMessage}</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 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>{product.DefaultUnitOfMeasure}</span>\r\n </div>\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(\r\n props.data.cartLine.ExtensionProperties,\r\n 'CourseId',\r\n CommercePropertyValueEnum.string\r\n );\r\n // No quantity selector for invoice line or for courseId\r\n if (\r\n !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'>{resources.quantityDisplayString}</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\r\n className={classNames('msc-cart-line__quantity', {\r\n 'single-quantity': props.data.cartLine.Quantity === singleQuantity\r\n })}\r\n >\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'>{props.data.cartLine.Quantity}</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={\r\n isSalesLine\r\n ? {\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 : {\r\n price: {\r\n CustomerContextualPrice: props.data.cartLine.NetAmountWithoutTax,\r\n BasePrice: props.data.cartLine.NetPrice\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-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'}\r\n fallBackSrc={fallbackImageUrl}\r\n altText={productName}\r\n gridSettings={props.gridSettings}\r\n imageSettings={imageSettings}\r\n loadFailureBehavior='empty'\r\n />\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}\r\n {!IsInvoiceLine && '-'}\r\n {productName}\r\n </a>\r\n {/* <div className='msc-cart-line__product__invoice-terms'>\r\n <span>Terms</span>\r\n <span>Allowable Freight by 15th</span>\r\n </div> */}\r\n {ArrayExtensions.hasElements(productDimensions) ? (\r\n <div className='msc-cart-line__product-variants'>{productDimensions}</div>\r\n ) : (\r\n ''\r\n )}\r\n <div className='msc-cart-line__product-price'>\r\n <PriceComponent\r\n data={\r\n isSalesLine\r\n ? {\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 : {\r\n price: {\r\n CustomerContextualPrice: props.data.cartLine.NetAmountWithoutTax,\r\n BasePrice: props.data.cartLine.NetPrice\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-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'>{renderShippingLabel}</div>}\r\n {renderOtherCharges}\r\n </div>\r\n {generateQuantityAndPrice()}\r\n {props.data.cartLine.IsInvoiceLine && props.data.cartState && props.resources.priceEditorResources && (\r\n <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 { 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","/*!\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","export enum SupersessionKey {\r\n SupersededId = 'superseded-from-id',\r\n SupersededName = 'superseded-from-name',\r\n Inventory = 'inventory'\r\n}\r\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 { 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 { 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 { 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 { 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 { 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 { 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 { 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"],"names":["BulkPurchase","React","constructor","props","super","_errorCssClass","_errorCssGlyphClass","collapseRef","_dimensionDropDownChange","_this$collapseRef$cur","this","current","reEvaluateHeight","_onErrorMessage","errorMessage","setState","stateMessage","messageText","statusCssString","messageGlyph","isOpen","_toggleCollapse","state","isExpanded","render","_this$props$data$prod","hasDimensionsInProps","ArrayExtensions","hasElements","productDimensions","hasDimensionsInData","data","result","viewProps","_objectSpread","container","moduleProps","className","classnames","config","content","_renderCollapseContent","renderView","_renderCollapseButton","_renderCollapse","Button","onClick","title","resources","bulkPurchaseHeaderTitle","Collapse","ref","_renderMainContent","isMobileDevice","isMobile","variant","VariantType","Viewport","context","request","userMessageNode","Alert","color","undefined","RichTextComponent","text","bulkPurchaseDescriptionText","_renderMatrix","_featureState$result","_this$props$data$orde","_this$props$data$cust","featureState","isMultipleCatalogsFeatureEnabled","find","item","Name","IsEnabled","catalogId","getCatalogId","validateCatalogId","ProductDimensionsMatrix","dimensions","orderTemplates","customerInformation","dimensionOnChange","onErrorMessage","isMultipleCatalogFeatureEnabledInHq","LoginToViewPricingComponent","loginText","priceComponent","shouldBlockPricing","arguments","length","user","signInUrl","isAuthenticated","href","RatingsHistogram","handleHeadingChange","event","heading","target","value","selectFilterBy","bind","ratingsSummary","ratingCount","totalRatingsCount","completeClass","classname","callbacks","histogramItems","HistogramItems","locale","averageRating","RatingComponent","avgRating","ariaLabel","format","averageRatingAriaLabel","readOnly","hideCount","id","typeName","averageNumber","AverageRatingNumber","summary","totalReviews","TotalReviews","ratingsSummaryProps","Msdyn365","tag","editProps","onEdit","requestContext","histogramProps","stars","filterKey","actionContext","update","createRatingsReviewsStateInput","__decorate","observer","histogramItem","Node","Object","assign","buttonProps","starLabel","bar","percentage","Module","map","buildReviewCard","cardProps","headerProps","rating","name","cardBodyProps","reviewProps","reviewTitle","date","reviewText","responseProps","responseName","responseDate","responseText","controlsProps","ratingHelpfulLabel","like","dislike","edit","report","createReviewModal","modal","modalHeader","modalBody","form","inputRow","ratingLabel","titleLabel","titleInput","textLabel","textInput","privacyPolicyUrl","error","modalFooter","submitButton","cancelButton","createReportModal","reported","headerSubmitted","header","reportSubmittedMessage","reportMessage","radioButtons","succesfulButton","filterByDropdown","noReviewsMessage","noReviewsWithFilterMessage","pageControls","refineReviewsProps","reportReviewModal","reviewsListProps","reviewCards","reviewCount","reviewModal","sortByDropdown","userReview","isFilterApplied","review","SignInMessage","SignInButton","telemetryContent","payLoad","getPayloadObject","TelemetryConstant","SignIn","attributes","getTelemetryAttributes","ModalToggle","innerRef","WriteReview","writeReviewCallbacks","toggleModal","_toggleReviewModal","updateReviewTitle","updateReviewText","updateRating","onReviewSubmitted","isSuccessful","isReviewModalOpen","hasReviewError","submitReview","_onTitleChange","_onTextChange","_onRatingChange","_modalToggleRef","getTelemetryObject","telemetryPageName","friendlyName","telemetry","product","userInfo","signInMessage","signInButton","signInLabel","signInAriaLabel","modalToggle","editReviewButtonText","reviewButtonLabel","TOGGLE_REVIEW_MODAL_BUTTON_ID","_buildUserReviewModal","ReviewModal","parentId","parentType","onModalToggle","onTitleChange","onTextChange","onRatingChange","onReviewComplete","renderContextId","returnRef","hasError","getDefaultColorSwatchSelected","productData","_colorAttribute$Swatc","_colorAttribute$Swatc2","_colorAttribute$Swatc3","AttributeValues","colorAttribute","attributeValue","_attributeValue$KeyNa","KeyName","toLocaleLowerCase","DimensionTypes","defaultSwatch","Swatches","IsDefault","updateProductUrl","productDetailsPageUrl","coreContext","queryString","sourceUrl","URL","apiSettings","baseUrl","search","pathname","renderProductUnitOfMeasure","unitOfMeasure","renderLabel","price","ratingAriaLabelText","ratingCountAriaLabelText","reviewCountArialableText","getReviewAriaLabel","getRatingAriaLabel","ratingAriaLabel","roundedRating","toFixed","renderPrice","basePrice","adjustedPrice","savingsText","freePriceText","originalPriceText","currentPriceText","isPriceMinMaxEnabled","priceResources","BasePrice","AdjustedPrice","CustomerContextualPrice","PriceComponent","loginToViewPricingText","renderProductPlacementImage","imageSettings","gridSettings","imageUrl","fallbackImageUrl","altText","img","src","fallBackSrc","imageProps","cropFocalRegion","Image","loadFailureBehavior","ProductComponent","msdyn365Commerce","createComponentOverride","component","_ref","_product$Name","_product$RecordId","_getProductImageUrlFr","_getProductPageUrlFro","ratingCountAriaLabel","allowBack","quickViewButton","isEnabledProductDescription","inventoryLabel","dimensionAvailabilities","productUrl","getProductPageUrlSync","RecordId","Number","MIN_VALUE","productImageUrlFromSwatch","app","dimensionToPreSelectInProductCard","none","PrimaryImageUrl","ProductImageUrls","generateImageUrl","getProductImageUrlFromDefaultColorSwatch","productPageUrlFromSwatch","SwatchValue","getProductPageUrlFromDefaultSwatch","productPageUrl","setProductPageUrl","useState","productImageUrl","setProductImageUrl","selectedSwatchItems","Dictionary","enableStockCheck","updatePageAndImageUrl","swatchItem","dimensionType","setValue","StringExtensions","isNullOrWhitespace","productPageUrlWithSwatch","includes","newUrl","searchParams","delete","toString","swatchProductImageUrl","productImageUrls","newImageUrl","attribute","isUnitOfMeasureEnabled","unitOfMeasureDisplayType","onTelemetryClick","cultureFormatter","formatCurrency","Price","AverageRating","TotalRatings","DefaultUnitOfMeasure","description","Description","attributeValues","_item$KeyName$toLocal","_item$KeyName","_item$Swatches$map","_item$Swatches","dimensionTypeValue","dimensionsToDisplayOnProductCard","dimensionsInProductCard","shouldDisplayDimension","swatches","_item$RecordId","_swatchItem$SwatchVal","_swatchItem$SwatchVal2","_dimensionAvailabilit","itemId","colorHexCode","SwatchColorHexCode","SwatchImageUrl","isDefault","isDisabled","dimensionAvailability","_swatchItem$SwatchVal3","some","swatch","ProductComponentSwatchComponent","onSelectDimension","key","hideRating","moduleTypeName","moduleId","totalRatings","numberRatings","renderRating","inventoryAvailabilityLabel","quickview","selectedDimensions","getValues","DimensionTypeValue","convertDimensionTypeToProductDimensionType","DimensionValue","Value","selectedProductId","renderQuickView","AddToCartListComponent","productId","onAddToCart","addToCartButtonText","quantity","setQuantity","type","min","max","onChange","e","valueAsNumber","handleAddToCart","ratingId","_totalRatings$toStrin","ActiveProductComponent","imgData","assembleNode","_item$links","headingNode","renderHeading","additionalContentHeading","handleAdditionalTextChange","paragraphNode","subtext","renderParagraph","additionalContentParagraphText","linksNode","links","ctaLink","index","renderLinks","linkIndex","editableLink","linkText","linkUrl","destinationUrl","openInNewTab","isOpenInNewTab","role","link","handleAdditionalLinkTextChange","additionalContentNode","additionalContentContainer","additionalContentItemLinks","activeImageAdditionalContent","additionalContent","CanvasCalculations","CanvasStyles","ImageMapper","_isDesktopViewPort","_context","getActiveImageWidth","MsDyn365","isBrowser","activeImageReferenceValue","activeImageRefs","clientWidth","getActiveImageHeight","clientHeight","convertHexToRgb","hexColor","RegExp","exec","rValue","parseInt","gValue","bValue","applyFadingTransition","coords","rgbColor","alpha","_this$_canvas$current","_this$_canvas$current2","halfDivisor","_canvas","getContext","buttonPadding","paddingAdjustment","buttonWidth","measureText","width","fillStyle","document","body","parentElement","getAttribute","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","Math","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","preventDefault","hoverOn","onMouseEnter","hoverOff","onMouseLeave","renderAreas","_this$props$imageMapp3","_this$props$imageMapp4","_area$productSearchRe","xsRadius","extendedArea","areaKey","altTextWithProductName","replace","productSearchResult","shape","join","onFocus","onBlur","tabIndex","alt","initCanvas","_this$getActiveImageW","_this$getActiveImageH","_this$_canvas$current12","_backgroundImage","_container","onLoad","defaultHeight","canvasWidth","canvasHeight","style","componentDidMount","componentDidUpdate","shouldComponentUpdate","nextProps","shouldRender","_requestContext$gridS","imageData","useMap","ActiveImageConstants","ActiveImage","_defaultProductCardWidth","_defaultProdutCardHight","_activePoints","addActivePoints","_product$PrimaryImage","push","areaId","primaryImageUrl","updateClientWidth","viewport","Browser","renderImageMapper","_this$props$config$ac","productResults","products","activePoints","configProduct","ItemId","_configProduct$xPosit","_configProduct$yPosit","_configProduct$radius","xPosition","yPosition","activePoint","JSON","stringify","mappedArea","_activeImageClass","enterArea","leaveArea","activeImage","_activeImageRefs","altTextForSeeMoreButtonWithProductName","seeMoreButtonText","overlayClass","window","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","viewports","lg","w","productCardWidth","leftAllignPosition","position","getProductCardPositionY","_this$props$config$pr3","_this$props$config$pr4","_defaultImageSettings2","productImageSettingsHeight","h","produtCardHight","_area$center$2","_area$center2","xs","q","xl","lazyload","keyDown","enterKey","nodeName","escKey","handleTextChange","handleParagraphChange","paragraph","renderActiveImageDetailsLinks","_telemetryContent","linkData","contentAction","etext","linkId","willOpenInNewTab","additionalProperties","handleLinkTextChange","renderActiveImageDetailsHeading","_heading$tag","renderActiveImageDetailsParagraph","getActiveImageId","activeImageId","_activeImageIdPart$","activeImageSource","split","decrementOne","_handleOutsideClick","_this$_productCardDiv","contains","addEventListener","setTimeout","timeoutInterval","images","getElementsByClassName","Array","from","removeAttribute","componentWillUnmount","removeEventListener","activePointContainer","activePointDetailsContainer","imageMapper","overlay","productCard","productCardleftPosition","productCardtopPosition","detailsContainer","detailsContainerCta","handleAdditionalParagraphChange","handleAdditionalText","handleAdditionalParagraph","handleAdditionalLinkText","_this$props$config$ad","ProductPickUpOptionsForCartLineItems","getCacheKey","buildCacheKey","getCacheObjectType","dataCacheType","async","getPickUpOptionsForCartLineItems","input","channelId","Error","cart","getCartState","getActiveCartProductsAction","ActiveCartProductsInput","response","Promise","resolve","ProductsDataActions","callerContext","queryResultSettings","QueryResultSettingsProxy","getPagingFromInputDataOrDefaultValue","createObservableDataAction","action","inputData","PickUpInStore","_toggleBOPIS","isBopisSelected","storeSelectorStateManager","cartline","cartState","storeSelectorModuleId","openDialog","alreadySelectedLocation","OrgUnitNumber","FulfillmentStoreId","deliveryOptions","onLocationSelected","orgUnitLocation","deliveryMode","updateCartLinePickupLocation","cartLineId","LineId","location","then","status","locationChangedHandler","catch","_onLocationChangedCallback","DeliveryMode","ShippingAddress","clearCartLinePickupLocation","_getOrgUnitName","fulfillmentStoreId","orgUnitLocations","foundLocation","OrgUnitName","DeliveryOptions","_props$channelDeliver","retailMulitplePickupFeatureState","channelDeliveryOptionConfig","matchDeliveryOptions","productdeliveryOptions","storePickUpOptionList","deliveryOption","delivery","pickup","deliveryCode","Code","PickupDeliveryModeCodes","pickupDeliveryModeCode","option","toggleBopis","defaultComponent","_renderShippingMethod","cartLine","shipItText","pickupInStoretext","changeStoreText","orgUnitName","bopisSelected","toggleBOPIS","checked","shipitText","pickUpInStoreText","_getDeliveryOption","pickupStore","_deliveryOptions$Deli","ContainerProps","_assembleNode","foundProductAvailability","productPickUpOptions","_product$Behavior","_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","maxQuantity","_getCartItemMaxQuantity","maxQuantityByConfig","isQuantityLimitsFeatureEnabled","maxByQuantityLimitsFeature","maxByQuantityLimitsFeatureResult","maxCartlineQuantity","Behavior","MaximumQuantity","shouldSkipStockCheck","ItemTypeValue","ReleasedProductType","Service","IsInvoiceLine","ObjectExtensions","isNullOrUndefined","_getErrorMessage","currentQuantity","lineId","_props$productAvailab","finalErrorMessages","productAvailabilites","outOfStockText","includeErrors","outOfRangeOneText","outOfRangeFormatText","checkForErrors","cartlinesErrors","ValidationResultsPairs","errorsFoundByLineId","filter","i","ValidationFailures","forEach","validation","ErrorContext","Quantity","onRemoveClickHandler","onRemoveClickFunction","payload","TelemetryEvent","RemoveFromCart","inventoryLbl","StockLevelLabel","inventoryCode","StockLevelCode","toLowerCase","isCustomPriceSelected","Dimensions","dimension","getProductUrlSync","isChannelTypeB2B","_cartline$CatalogId","fullUrl","set","CatalogId","getInvoiceDetailsPageUrlSync","cartlineId","isNullOrEmpty","CartLineItemComponent","catalogs","isOutOfStock","lineIndex","isQuantityEditable","quantityOnChange","updateCartLinesQuantitySuccessHandler","inventoryInformationLabel","inventoryLabelClassName","isCartStateReady","showShippingChargesForLineItems","priceCurrency","channel","Currency","pickUpInStore","pickitUpText","remove","addToWishlist","AddToWishlistComponent","showButtonText","showStatusMessage","showRemoveButton","showButtonTooltip","ariaRole","onSuccess","addToOrderTemplate","AddToOrderTemplateComponent","shouldShowButtonFailedTooltip","disableButton","disableTooltip","assembleCartlines","cartlines","reactNodes","getProductByProductIdAndWarehouse","ProductId","WarehouseId","getProductByProductId","isPickUpItem","isCartLineItemPickUpType","_productAvailability$","_productAvailability$2","_cartline$WarehouseId","shouldIgnoreWarehouse","InventLocationId","toUpperCase","CartLineGroupItems","hasInvoiceLine","_assembleGroupInvoiceCartlines","cartLines","carLineViewProps","_assembleGroupCartlines","getGroupByStorePickup","items","groupBy","groupDelivery","cartLinesGroup","entries","deliveryType","groupByDeliveryType","keys","getPromotionData","ctx","promotionData","getPromotionOptionsForCartLineItems","PromotionOptionsForCartLineItems","promotionOptions","exception","Cart","_isMounted","promotionPopupId","promotionLinkClick","showPromotionDialog","promotionCloseButtonclick","_hidePromotionDialog","getImageSettings","sm","removeItemFromCartHandler","cartlineToRemove","cartLineIds","removeCartLines","validateCart","warning","debug","updateCartlineQuantity","cartlineToUpdate","cartLineQuantityUpdatedAsync","cartActionResult","message","_cartActionResult$err","lineUpdateFailure","validationResults","LocalizedMessage","errorDetails","fulfillmentStoreIdUpdated","isCartValid","_this$props$data$cart","getOrderQuantityLimitsFeatureFlag","_isChannelLimitsFeatureEnabled","showAvailablePromotions","CartLines","reaction","_this$props$data$cart2","_this$props$data$cart3","nextState","_this$props$context$r","_cart$cart$CartLines","_this$props$data$feat","guestCheckoutUrl","getUrlSync","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","promoCode","_getPromoCode","_getPromotions","removePromoAriaLabelFormat","orderSummaryHeading","invoiceSummaryTitle","orderSummaryTitle","orderSummaryLineitems","_getOrderSummaryLineItems","invoiceSummaryLineitems","_getInvoiceSummaryLineItems","checkoutAsSignInUserButton","disabled","checkoutButtonTitle","checkoutAsGuestButton","showGuestCheckoutButton","guestCheckoutButtonTitle","expressCheckoutButton","slots","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","Modal","toggle","ModalHeader","ModalBody","_promotion","_promotion$Promotion","Promotion","OfferName","ModalFooter","cartPromotions","promotionCloseButtonAriaLabel","cartLineInventoryValidationResult","productIdWithErrors","productIdWithError","element","_element$data","outOfStockErrorMessage","allErrors","_cartline$data","_cartline$data$produc","fullError","line","Wrapper","assertive","outOfStockErrorMessageHeader","errors","InvoiceSummary","orderTotalLabel","totalAmountLabel","invoiceLabel","_this$props","_featureState$result2","_this$props$context$r2","channelConfiguration","retailMultiplePickUpOptionEnabled","isShowOrHideTaxEnabled","isEnableShowOrHideSalesTaxECommerceEnabled","OrderSummary","subTotalLabel","itemsWithCountLabel","shippingLabel","estimatedShippingLabel","otherChargeLabel","otherCharges","taxLabel","estimatedTaxLabel","orderTotal","totalDiscountsLabel","toBeCalculatedText","yetToBeCalculatedText","freeText","priceFree","isTaxIncludedInPrice","IsTaxIncludedInPrice","isShowTaxBreakup","PromoCodeComponent","promoCodeHeadingText","promoPlaceholderText","promoCodeApplyButtonText","appliedPromoCodeHeadingText","collapseTimeOut","removePromoText","invalidPromoCodeErrorText","failedToAddPromoCodeErrorText","failedToRemovePromoCodeErrorText","duplicatePromoCodeErrorText","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","PickupDeliveryModeCode","modules","storeSelectorId","CartLineItems","productDeliveryOptions","updateMaxQuantityForCartLineItem","maxQuantityForCartLineItem","warehouseAggregation","sizeString","productDimensionTypeSize","colorString","productDimensionTypeColor","configString","productDimensionTypeConfiguration","styleString","productDimensionTypeStyle","amountString","productDimensionTypeAmount","quantityDisplayString","quantityDisplayText","inputQuantityAriaLabel","decrementButtonAriaLabel","incrementButtonAriaLabel","discountStringText","shippingChargesText","shippingCharges","salesAgreementPricePrompt","priceEditorResources","removeCartButtonText","shipInsteadDisplayText","pickItUpDisplayText","changeStoreDisplayText","errorMessageOutOfRangeOneLeft","errorMessageOutOfRangeFormat","showOutOfStockErrors","addToOrderTemplateMessage","addItemToOrderTemplateError","isAbsoluteUrl","urlCheck","returnURL","origin","AsyncResult","validateCartAsync","_featureStatuses$find2","featureStatuses","_featureStatuses$find","_cartConfiguration$Ig","cartConfiguration","IgnoreOrderSettings","_this$props$context","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","ProductCollection","_getProductsDimensionsAvailabilities","dimensionsToDisplayAsSwatch","dimensionsAsSwatchType","validProducts","validValues","productsDimensionAvailabilities","getDimensionAvailabilitiesForProductSearchResultAction","DimensionAvailabilitiesForProductSearchResultInput","DimensionSwatchDisplayTypes","initProductState","productPrices","productCollectionProducts","productCollection","equals","listType","getProductPriceForSelectedProducts","ProductPriceForSelectedProductsInput","p","IsMasterProduct","_getProduct","productPrice","_this$state$productsD","trace","allowBackNavigation","breaCrumbType","breadcrumbType","quickviewSlot","productComparisonButtonSlot","productComparisonButton","reviewCountAriaLabelValue","ratingCountAriaLabelSingleUser","priceRangeSeparator","ProductContainer","productComponent","_product$MasterProduc","masterProductId","MasterProductId","_getActivePrice","productsList","getPriceForProductSearchResult","PriceForProductSearchResultInput","_getSeeAllButton","headingLabel","recommendation","discountIds","searchPageLink","url","seeAllButtonText","enableAffiliationBasedPricing","shouldDisplaySeeAllButton","recommendationListId","isCarousel","layout","headingComponent","updatedProducts","getProductData","productCollectionViewProps","SingleSlideCarouselComponentProps","SingleSlideCarousel","flipperPrevLabel","flipperPrevious","flipperNextLabel","flipperNext","ProductCollectionContainer","GridComponentProps","seeAllButton","QuickOrderDrawer","_toggle","isManuallyToggled","collapseProps","drawerGlyphClass","toggleGlyphClassName","animateGlyph","drawerOpenGlyph","openGlyph","closeGlyph","drawerCloseGlyph","children","drawerClass","toggleButtonProps","block","_generateDrawerButtonInnerMarkup","collapseState","drawerButtonTextClass","toggleButtonClassName","moduleHeadingText","moduleDescriptionText","_generateGlyphMarkup","glyphClass","onToggle","QuickOrderFormComponent","productTextInput","quantityTextInput","quickOrderState","maxChars","disableAddtoCart","ariaLabelQuantity","ariaLabelProduct","ariaLabelAddtoCart","addQuantityPlaceholderText","handleQuantityChange","handleInputChange","handleAddToCartClick","onInputChange","onInputChangeFunction","onQuantityInputChange","onQuantityChangeFunction","productNode","quantityNode","pattern","maxLength","placeholder","addToCartBtn","userMessage","QuickOrderProduct","simpleProduct","isSelected","observable","QuickOrderDesktopHeaderCellsComponent","columnWithNumberClassName","quickOrderProductNumberText","quickOrderProductText","quickOrderUnitPriceText","quickOrderUnitOfMeasureText","quickOrderQuantityText","quickOrderTotalText","quickOrderActionsText","QuickOrderMobileHeaderCellsComponent","QuickOrderTableHeaderComponent","rowClassName","headerCells","QuickOrderTableRowProductImageComponent","_props$context$reques","_props$data$product$P","_props$imageSettings","getFallbackImageUrl","OmniChannelMedia","containerClassName","QuickOrderExtraActionsPopupComponent","QuickOrderDesktopTableRowCellComponent","_cartLine$LineId","_dimension$DimensionV","dimensionValue","quickOrderProductDimensionsSeparator","UnitOfMeasureSymbol","IncrementalQuantity","currentCount","quickOrderInputQuantityAriaLabel","quickOrderDecrementButtonAriaLabel","quickOrderIncrementButtonAriaLabel","isGiftCard","IsGiftCard","TotalAmount","quickOrderRemoveItemButtonAriaLabel","QuickOrderMobileTableRowCellComponent","quickOrderQuantityMobileText","QuickOrderTableRowComponent","QuickOrderTableComponent","setIsMobile","isMobileView","quickOrderProducts","updateViewport","headerClassName","quickOrderProduct","QuickOrder","waitTime","dimensionUpdateQueue","FinitePromiseQueue","initializedDimensions","Set","cssClassNameConfigure","quickOrderCallbacks","initializeDimension","initializedDimension","add","dimensionSelectedAsync","selectedDimensionId","selectedDimensionValueId","_this$state$productDi","size","enqueue","_updateDimensions","FinitePromiseQueueError","ProcessWasDiscardedFromTheQueue","getDropdownName","_getDropdownName","changeUpdatingDimension","isUpdatingDimension","_handleInputChange","query","productText","productResponse","inputQuantityText","quantityInput","HTMLInputElement","cancellableDebounce","cancel","isQuickOrderFormExpanded","_debounce","getScanResult","GetScanResultInput","results","Product","ProductDimensionFull","_addItemToCart","quickOrderAddedToCartSuccessMessage","quickOrderAddedToCartFailureMessage","_validateCart","_this$props$context$a","getDeliveryOptionsAsync","defaultDeliveryOption","productAvailableQuantity","_updateAvailability","shouldValidateQuantityLimits","_shouldValidateQuantityLimits","addProductToCartInput","count","availableQuantity","orderQuantityLimitsFeatureIsEnabled","isAddEmailDeliveryItemToCart","addProductToCart","inputProductText","substatus","maxQtyLimitReachedMessage","_getMaxQtyMessage","_result$errorDetails","isOrderQuantityLimitsFeatureEnabledInSiteSettings","_getConcatenatedMaxQtyMessage","quickOrderMaxQuantityLimitText","quickOrderAlreadyItemQuantityText","_handleQuantityChange","currentValue","inputElement","isNaN","setAttribute","_updateDimensionValue","productDimensionFull","newValueId","DimensionValues","_this$state$productRe","dimensionsToUpdate","productDimensionErrorState","otherError","clearOtherErrorState","configureErrors","errorState","mappedDimensions","ExtensionProperties","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","device","Type","quickOrderFormClass","quickOrderFormProductContent","quickOrderFormMsgContent","quickOrderModuleHeading","quickOrderModuleDescription","quickOrderAddtobag","quickOrderProductQuantityInputLabel","quickOrderProductInputLabel","quickOrderProductDimensionTypeColor","quickOrderProductDimensionTypeConfiguration","quickOrderSelectDimensionFormatString","quickOrderProductDimensionTypeSize","quickOrderProductDimensionTypeStyle","quickOrderProductDimensionTypeAmount","quickAddQuantityPlaceholderText","productConfigureResources","selectDimensionFormatString","quickOrderProps","contentProps","isB2B","drawer","quickOrderForm","quickOrderList","_renderQuickOrderTable","configure","getProductConfigure","_initQuickOrderProducts","tableClassName","productInventoryInfo","_cart$result","maxQuantityForLineItem","addedQuantity","_item$ItemId","_this$state$productRe2","minInventory","computed","reviewId","tenantId","authToken","inputIsValid","requestUrl","serviceEndpoint","requestBody","concernCategory","requestHeader","headers","Authorization","sendRequest","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","selectedSortByOption","selectedFilterByOption","reportConcernDropdownOptions","radioPairs","pairs","inputId","reportedKey","onRadioChange","htmlFor","reviewRatingNarratorText","voteHelpfulButton","isVoted","isVotedFor","votedReviews","approved","isUserReview","isOboRequest","label","yesButtonText","noButtonText","voteCount","helpfulPositive","helpfulNegative","onClickMethod","updateReviewHelpfulness","editButton","TOGGLE_EDIT_MODAL_BUTTON_CARD_ID","toggleWriteReviewModal","editReviewCardText","renderDate","Intl","DateTimeFormat","month","day","year","Date","_unused","toggleReportReviewModal","reportToggle","reportConcernText","reportedReviews","reportedText","reportedReviewId","SubmitHelpfulnessVoteInput","ReviewsList","sortByDropdownOptions","mostHelpfulSortOptionText","mostRecentSortOptionText","highestRatedSortOptionText","lowestRatedSortOptionText","filterByDropdownOptions","allRatinsFilterByOptionText","fiveStarFilterByOptionText","fourStarFilterByOptionText","threeStarFilterByOptionText","twoStarFilterByOptionText","oneStarFilterByOptionText","reviewsListCallbacks","userReviewTitle","userReviewText","userReviewRating","updateReviewHelpfulnessVote","toggleReportModal","isReportModalOpen","_onReportModalOpen","_onReportModalClose","reportReview","_reportReviewCallback","updateFilterByDropdown","updateSortByDropdown","reviewsList","pagingInfo","totalItems","listOfReviews","ratingsReviewsState","filterKeyValue","dropdownItemsCount","filterByOption","selectedIndex","_userReview","_reviewCard","_reviewCards","reviewList","reviewElements","isTakenDown","isPublished","userName","submittedDateTime","wasReviewHelpfulText","userResponse","responderName","ReviewCard","_userReportModalToggle","reportingReviewId","_userReviewModal","_onReviewComplete","_userReviewModalToggle","modalCSS","isSuccess","_reportReviewModal","SubmitReview","submitReviewAttribute","SuccessButton","successAttribute","Cancel","cancelAttribute","SpamAdvertising","reportSpamText","OffensiveContent","offensiveContentText","Profanity","profanityContentText","applicationNode","returnFocusRef","feedbackThankYouText","cancelReportReviewText","reportReviewButtonText","okReportReviewText","reportModalMessage","errorMessageText","ReportReviewModal","_onRadioChange","_reportReview","hasReportError","currentTarget","reportReviewConcern","getRnrPartnerId","getUserToken","getRnrAuthEndpointId","_value","reportedReview","notification","selectedOption","skipItems","getSelectedProductIdFromActionInput","getReviewsForGivenProduct","GetProductReviewsInput","getRnrEndpointId","_updateVoteUi","alreadyExists","list","concat","submitHelpfulnessVote","token","showSpinner","LabeledDropdown","labelText","filterByDropdownText","dropdownId","dropdownOptions","onSelectOption","controlledByParent","sortByDropdownText","noReviewsWithSelectedFilterMessage","sortByOptions","filterByOptions","SearchState","SuggestionType","ProductListInventoryFilteringOptions","AutoSuggestInput","searchText","top","suggestionType","hitPrefix","hitSuffix","searchQuery","topResultsCount","_getAutoSuggest","autosuggest","_ctx$requestContext$a","productSearchCriteria","SearchCondition","Context","ChannelId","productListInventoryDisplay","HideOOS","inventoryRefinerValue","getInventorySortableRefinerValue","channelInventoryConfiguration","isInStock","ProductAvailabilitySortableAttributeRecordId","RefinerRecordId","DataTypeValue","AttributeDataType","TrueFalse","LeftValueBoundString","RightValueBoundString","UnitText","RowNumber","Count","RefinerSourceValue","ProductRefinerSource","Attribute","getInventoryConfigurationAsync","Refinement","searchCriteria","ProductSearchCriteria","HitPrefix","HitSuffix","searchSuggestions","getSearchSuggestionsAsync","Paging","Top","ImageUrl","AllSearchResults","autoSuggestPromises","all","CategorySuggestionsComponent","suggestions","autoSuggestProps","categorySuggestionHeading","_renderTitle","categoryAutoSuggestionHeading","shouldShowFullPath","splitValue","pop","Id","_generateLink","_getHighlightedText","suggestion","_getCategoryLink","_categoryRefiners$Val","searchPageURL","searchQsp","searchRefiners","queryUrl","categoryRefiners","refiners","SourceValue","Category","refiner","Values","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","moduleType","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","focus","searchURL","_appendQueryParams","_handleCancelSearchChange","isInitialState","_handleCancelSearchFocused","route","qsp","_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","autoComplete","onSubmit","UlKeyword","UlProduct","UlCategory","autosuggestKeyword","autosuggestProduct","autosuggestCategory","handleCancelSearchFocused","isLoadingNode","suggestionTypes","suggestionTypeCriterion","unique","validSuggestions","loadSuggestionsRequestId","getSearchSuggestionsAction","_getSuggestionType","_getSearchRefiners","Random","Guid","generateGuid","_getSearchSuggestions","_updateSearchRefiners","suggestionTypeItem","charAt","slice","SocialShareItem","_getSocialShareItem","viewprops","SocialShareItemElement","icon","socialMedia","SocialMediaComponent","SocialMedia","Facebook","postUrl","Twitter","Pinterest","Linkedin","Mail","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","ProductRefinerValueDataTypeValue","ProductRefinerTypeValue","isRangeType","dataTypeValue","Decimal","Integer","findMatchingRefinementCriterion","productRefinerValue","refinementCriteria","refinementCriterion","isMatchingRefinementCriterion","getUpdatedRefinementCriteria","itemToggleNotification","currentRefinementCriteria","updatedRefinementCriteria","toggledItemFound","selectedCriterion","isSelecting","next","rangeStart","rangeEnd","Text","parentProductRefinerHierarchy","RefinerTypeValue","RefinerType","SingleSelect","child","matchingIndex","findIndex","criterion","splice","ChoiceSummary","closeButtonGlyph","_onClick","stopPropagation","clearAll","selectedRefiner","_getSelectedRefinerChoice","onChoiceClicked","itemClicked","choiceClicked","nextItemToFocus","nextSibling","selectedRefinersMap","selectedChoices","channelInventoryConfigurationId","refinerHierarchy","choice","parent","hierarchy","_getKeyForRefinerValue","clearAllText","classNames","choiceAriaLabel","closeAriaLabel","clearAllAttributes","urlBuilder","choiceFormat","choiceRangeValueFormat","overallFormat","rangeFormat","refinerValueName","refinerName","_formatPrice","LeftValueBoundLocalizedString","amount","currency","selected","textContent","trim","ErrorMessage","FeatureSearchResultItem","productName","productRecordId","fallbackImage","featureSimilarDescriptionTitle","featureSimilarLooksTitle","Link","modalNode","autoFocus","zIndex","modalHeaderNode","modalTitle","modalFooterNode","modalCloseButtonText","getInventoryLabel","inventoryAttribute","TextValue","ProductSearchResultItems","swatchItemAriaLabel","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","_onRangeUpdateEnd","_handleRangeTooltipText","_changeMin","_changeMax","_finishChangeMin","_finishChangeMax","minInput","maxInput","selectedRefinementCriterion","initialMin","initialMax","String","minValue","maxValue","labels","sliderKeyString","sliderThumbs","isChecked","validationErrorMin","validationErrorMax","touchedMin","touchedMax","previousProps","updateSliderProps","refineItemCommonProps","rangeType","_renderInputFields","_renderSlider","_ref3","_this$props$selectedR5","_this$props$selectedR6","_ref4","_this$props$selectedR7","_this$props$selectedR8","formAttrs","rangeNameFormat","minInputClassName","maxInputClassName","formattedSelectedMin","_getFormattedSelectedValue","formattedSelectedMax","minLabel","maxLabel","placeholderTextMax","ariaAttributes","Slider","inForm","step","orientation","showLabels","showTooltip","onChangeEnd","debounce","handleTooltipText","_changeValue","inputType","selectedKey","touchedKey","_getInputWithoutFormatting","selectedMinValue","minTouched","maxNum","validationErrorNaN","_focus","_validateRange","selectedMaxValue","maxTouched","minNum","touched","validationError","validationErrorRange","inputAsNum","get","sliderChangeNotification","eventType","firstThumbValue","secondThumbValue","_focusOnSliderThumb","getElementById","tooltip","RefineItem","anchorType","_productRefinerValue$","productCountAriaLabel","singleProductCountAriaLabel","refineItemAriaLabel","refineItemsAriaLabel","attrs","_objectWithoutProperties","_excluded","isSingleSelect","itemTypeClassName","Rating","_renderRating","productCount","refineMenuItemAriaLabel","_getRefinerUrl","_renderSwatch","_this$props$parentPro","_this$props$parentPro2","_productRefinerValue$2","hasColor","hasImage","swatchItems","checkIfShouldDisplayAsSwatch","SwatchComponent","isSelectionEnabled","isRefineItem","ratingUserCountAriaLabel","ratingSingleUserCountAriaLabel","_productRefinerValue$3","refinerRating","ratingRefiner","selectedRefinerValues","selectedRating","defaultChkProductCount","ratingComponentClass","productCountAriaLabelValue","RefineSubmenu","_onToggleItem","_onToggleSubmenu","isExpandedOnInitialLoad","expanded","productRefinerHierarchy","timeout","_renderChildItems","_renderRange","_renderSingleMultiSelect","refinerValuesList","listItems","selectedValue","_getRangeType","DisplayTemplateValue","DisplayTemplate","Range","SliderWithBars","onUpdateRefiners","prevState","Separator","separator","Title","expandRefinersCount","SearchResultContainer","SearchResultContainer_1","sortOptions","sortByOptionRelevanceDesc","sortByOptionNameAsc","sortByOptionNameDesc","sortByOptionPriceAsc","sortByOptionPriceDesc","sortByOptionRatingDesc","sortByOptionBestSelling","sortByOptionNewScore","sortByOptionTrendingScore","_pageType","urlTokens","pageType","_viewport","expandrefinerCount","defaultPageNumber","isListPageStateUpdated","_updateListPageState","listPageState","_this$props$config$it","_this$props$config$it2","querySorting","sorting","parse","decodeURIComponent","currentPageNumber","skip","itemsPerPage","sortingCritera","Columns","pageSize","totalProductCount","activeFilters","hydrateRefinersFromUrl","featureProduct","_this$props$data$list","_this$props$data$list2","activeProducts","_this$props$data$list3","_this$props$data$list4","_getSearchResultModal","SearchResultModal","modalIsOpen","_toggleModal","_getCollectionTitle","collectionTitle","category","getFriendlyName","NameTranslations","productCountNumber","productCountText","numberOfProducts","oneProduct","TitleContainer","titlePrefix","searchTextPrefix","titleText","titleCount","_getCategoryHierarchy","categoryHierarchy","CategoryHierarchyContainer","categoryHierarchyList","categoryLinkAriaLabel","Url","categoryHierarchySeparator","_getSortingDropDown","activeDropdown","_getCurrentlySelectedOption","sortingState","_getAllSortByOptions","dropdownOption","SortingContainer","sortByDropDown","labelClassname","sortByDropdownLabel","dropdownClassname","toggleColor","_updateSortByDropdown","_sortAndFilterContainerRef","_getPagination","getCurrentUrl","skipCount","previousText","nextText","UncontrolledPagination","paginationAriaLabel","startingItem","_renderPrev","_renderNext","previousAriaLabel","nextAriaLabel","_getRefineMenu","tempRangeTypeTODO","inputRange","validRefiners","updateRefinerPanel","_shouldHideFromRefiners","activeRefiners","_getexpandRefinerCount","expandedRefiners","RefineMenuContainer","RefinerSectionContainer","_refineItemCommonProps","_onUpdateRefiners","_buildRefinerUrl","_this$props$data$prod2","inventoryAwareSortableAttributeId","_getChoiceSummary","_this$props$data$prod3","selectedRefiners","choiceSummaryLabel","_onChoiceClicked","_buildRefinerUrlForChoiceSummary","_getProducts","_this$props$slots","_this$props$data$prod4","shouldAllowBackNavigation","breadCrumbType","shouldAllowBack","isPriceMinMaxFeatureState","history","pushState","buildListPageUrl","_getSortColumnFromSelectedOption","transaction","searchConfiguration","mappedConfiguration","sortColumn","_getSortCriteriaColumn","_this$props$data$list5","sortCriteria","queryColumns","parseQueryParam","mappedSearchConfiguration","mappedSearchConfig","activeSortColumn","activeMappedConfig","ColumnName","IsDescending","_this$props$data$list6","newRefinementCriteria","dropdownElementId","dropdownElement","selectedChoice","isClearAll","refinerCount","one","two","three","four","paginationPreviousText","paginationNextText","_updateViewport","pending","validationErrorNotNumber","validationErrorNotRange","static","nameTranslations","_nameTranslation","nameTranslation","Language","_this$props$context$a2","_listPageState$active","_listPageState$sortin","_newListPageState$cur","_newListPageState$sor","_newListPageState$act","_this$props$context$r3","_this$props$context$r4","_this$props$context$r5","newListPageState","GetFullProductsByCollectionInput","Skip","Sorting","recordId","Recommendation","includeAttributes","getCollectionProducts","_newListPageState$cur2","_newListPageState$sor2","_newListPageState$act2","_this$props$context$r6","_this$props$context$r7","refinerInput","RefinersByCollectionInput","getCollectionRefinersAction","_listPageState$result","_listPageState$result2","_this$props$context$r8","_this$props$data$list7","_this$props$data$list8","searchProduct","errorText","resultCategoryNotFoundText","resultSearchNotFoundText","productsComponent","featureComponent","searchResultContainerViewProps","TitleViewProps","disableHierarchy","refineMenu","pagination","ProductsContainer","ProductSectionContainer","CategoryNavContainer","RefineAndProductSectionContainer","choiceSummary","searchResultModal","FeatureSearchContainer","similarLookProduct","_getViewport","DescriptionInterval","renderProductCards","_props$data$listPageS","renderProductCardsDescription","_props$data$products$","_props$data$featureSt","isAllowBack","quickviewslot","loginToViewPricing","renderProducts","_props$data$listPageS2","productDescriptionInterval","productDescriptionIntervalRemainder0","productDescriptionIntervalRemainder9","renderTitleCount","renderCategoryHierarchy","createSearchResultModal","modalProps","isRecoSearchPage","createModalBody","renderSort","submenu","renderRefinerMobile","renderRefiner","renderTitle","productCardimageSettings","md","image","getProductPrice","pricing","productRecId","pr","_props$context$action","filterText","partNoHeading","descriptionHeading","availabilityHeading","listPriceHeading","yourPriceHeading","goToCartText","continueShoppingText","addToCartModalHeading","addToCartText","productSearchResults","enableProdutDescription","listView","eligbilityList","setEligbilityList","_props$data$products","itemIds","GetProductEligibilityInput","eligibilityData","GetProductEligibilityAction","getExtensionPropertyValueByKey","CommercePropertyValueEnum","string","IsEligible","getProductEligibility","setIsExpanded","modalOpen","setModalOpen","addedProduct","setAddedProduct","productPricing","setProductPricing","_productSearchResults","_cart$result2","foundProduct","ProductTypeValue","addToCartBehavior","getProductSupersessionProperty","extensionKey","properties","_properties$find","Key","StringValue","Popup","productQuantity","navigationUrl","dialogStrings","headerItemOneText","headerItemFormatText","headerMessageText","_renderProductsListView","_props$data$cart$resu2","_productSearchResults2","courseInCartText","courseId","Table","SupersessionKey","SupersededId","SupersededName","Inventory","renderAddtoCartButton","_props$data$cart$resu","invoiceInCartText","colSpan","textAlign","productEligibilityText","setModalProps","estimatedAvailabilites","quantityHeading","configurationObject","areInventoryRangesChecked","setAreInventoryRangesChecked","inventoryRangesList","setInventoryRangesList","setEstimatedAvailabilites","onlyShowPriceWhenAuthenticated","resp","getInventoryLevelRangesAsync","getInvProfs","_props$data$products2","_response$ProductWare","createInventoryAvailabilitySearchCriteria","getEstimatedAvailabilityAsync","ProductWarehouseInventoryAvailabilities","getEsimatedAvailability","showFilterDropdown","showSortDropdown","_configurationObject$","console","log","Inventorylabel","Inventorycode","TotalAvailableInventoryLevelLabel","TotalAvailableInventoryLevelCode","getInventory","isToolTipOpen","setIsToolTipOpen","toggleTooltip","Tooltip","placement","boNote","backOrderShippingText","_invProfOos","_invProfOos2","currentInvString","currentInventory","invProfOos","ir","_ir$Profile","tempInvRange","Profile","hasOwnProperty","UpperBoundInclusive","productUnavailableText","_estimatedAvailabilit","invenLabel","titleProps","enableSearchWrap","trimmedQuery","hasMultipleTerms","test","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","activeImageView","left","BulkPurchaseViewComponent","_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","otherCharge","tax","totalDiscounts","_renderCarousel","carouselContainer","_renderProduct","_renderGrid","gridContainer","_renderNoProduct","noProductToRenderText","renderConfigure","containerProps","dropdowns","renderConfigureDropdown","dropdown","labelContainerProps","select","renderForm","quickOrderProductContent","quickOrderMsgContent","_renderForm","_renderKeywordSuggestions","_renderProductSuggestions","_renderCategorySuggestions","SocialShareItemView","componentId","_data$ratingsSummary$","_data$ratingsSummary$2","_data$ratingsSummary$3","_data$ratingsSummary$4","_data$ratingsSummary$5","_data$ratingsSummary$6","reviewsCountString","numberOfReviewsString","cartLineItemFunctions","renderProductDimensions","dimensionStrings","productDimension","_productDimension$Dim","_productDimension$Dim2","_productDimension$Dim3","_productDimension$Dim4","ProductDimensionType","Color","Configuration","Size","Style","DiscountLines","discountLine","_discountLine$OfferId","OfferId","isSalesLine","PeriodicDiscount","EffectiveAmount","Percentage","discountPercent","_discountLine$Percent","updatedPercent","DiscountLineTypeValue","DiscountLineType","TenderTypeDiscount","_discountLine$Effecti","effectiveAmount","inventoryCssName","_cartline$ChargeLines","hasShippingMethod","_channelDeliveryOptio","shippingChargeLines","ChargeLines","chargeLine","IsShipping","freightFee","reduce","chargeTotal","_chargeLine$Calculate","CalculatedAmount","_cartline$ChargeLines2","_otherCharges$map","chargeline","itemIndex","_props$primaryImageUr","destructDimensionStrings","renderProductUnitPrice","renderDiscountLines","renderInventoryLabel","renderShippingLabel","renderOtherCharges","productAttribute","imgeClassName","cartLineContentClassName","newValue","generateErrorMessage","renderUnitOfMeasure","NetAmount","NetAmountWithoutTax","NetPrice","generateQuantityAndPrice","nodes","_props$maxQuantity","_props$data$product$I","CartLinePriceEditor","PromoCode","_onInputChangeHandler","promoCodeInputValue","canApply","_applyPromotion","appliedPromo","addPromoCode","_onSubmitHandler","applyPromotionHandler","_removePromotion","_event$currentTarget$","code","removePromoCodes","promoCodes","_renderAppliedPromoCode","Coupons","removePromotionHandler","coupon","ApplyPromoCode","valueType","property","COUPON_ATTRIBUTE_KEY","getCouponCodeMap","enteredCode","foundCode","couponMapping","c","_c$fromCouponCode","fromCouponCode","_foundCode$toCouponCo","mondaysDate","formatDate","getMondayOfCurrentWeek","toCouponCode","tcc","_onInputChange","_cart","addAttributeToCart","attrKey","attrValue","attributeArray","attributeObj","TextValueTranslations","attrIdx","a","_a$Name","updateCart","newCartObject","removeAttributeFromCart","_a$Name2","_calculateDiscount","discountAmount","DiscountCode","DiscountCost","totalCouponDiscountAmount","_coupon$Code","isCollapseOpen","getFullYear","getMonth","padStart","getDate","today","getDay","diff","setDate","_applyPromotionHandler","promoCodTotalDiscount","InvoiceSummaryLine","cssLabel","_buildPaymentSummarySection","_computedLoyaltyAmount","checkoutState","loyaltyAmount","invoiceLines","invoiceLine","InvoiceAmount","InvoiceId","giftCardAmount","_computeGiftCardAmount","giftCardTotalValue","giftCardExtends","giftCardCounter","Balance","totalAmountAfterGiftCard","loyaltyLabel","giftcardLabel","propsContext","cartResult","cartVersion","shouldRetry","Version","_validationResult$Val","validationResult","CartsDataActions","bypassCache","ValidationResultsByLineId","refreshCart","refreshError","validateError","cartLineToUpdate","isUsingDefaultOrderSettingsMax","_modifiedProduct$Beha2","modifiedProduct","newQuantity","updateLineResult","updateCartLineQuantity","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","warehouseId","targetWarehouseValue","InventoryLocationId","SubmitUserReviewInput","userReviewData","authorization","onClickSubmit","submitButtonAttribute","cancelButtonAttribute","discardReviewButtonText","submitDisabled","submitReviewButtonText","ratingsInput","ratingsLabel","privacyPolicyLink","editReviewModalTitle","writeReviewModalTitle","stripWhiteSpacesFromString","selectRatingAriaLabel","initialRating","selectRatingLabel","reviewTitleMaxLength","reviewTitleAriaLabel","reviewTitleLabel","reviewTextMaxLength","rows","reviewAriaLabel","reviewTextLabel","policyTextBlocks","privacyPolicyTextFormat","isSeparatorAtStart","startsWith","isSeparatorAtEnd","endsWith","PrivacyPolicy","privacyPolicyAttribute","rel","privacyPolicyTitle","onReviewSubmission","userEmail","emailAddress","submitUserReview","firstName","getReviewInput","GetUserReviewInput","renderItem","star5Count","star4Count","star3Count","star2Count","star1Count","totalCount","formattedPercent","NumberFormat","barItemAriaLabel","Progress"],"sourceRoot":""}