{"version":3,"file":"static/js/8.6e67609b5912b25034ae.chunk.js","mappings":"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","sources":["webpack://Citta2.0/./src/components/price-component.tsx?ed26","webpack://Citta2.0/./src/modules/citta-promo-banner/components/close-button.tsx?7ba2","webpack://Citta2.0/./src/modules/citta-promo-banner/components/links.tsx?a64a","webpack://Citta2.0/./src/modules/citta-promo-banner/components/text.tsx?2035","webpack://Citta2.0/./src/modules/citta-promo-banner/citta-promo-banner.tsx?f097","webpack://Citta2.0/./src/modules/citta-promo-banner/citta-promo-banner.view.tsx?4353","webpack://Citta2.0/./src/modules/citta-search-result-container/citta-search-result-container.props.autogenerated.ts?7a73","webpack://Citta2.0/./src/modules/citta-search-result-container/components/link.tsx?c700","webpack://Citta2.0/./src/modules/citta-search-result-container/components/product-search-result-items.tsx?8c10","webpack://Citta2.0/./src/modules/citta-search-result-container/components/feature-search-result-item.tsx?568d","webpack://Citta2.0/./src/modules/citta-search-result-container/components/title.tsx?b899","webpack://Citta2.0/./src/modules/citta-search-result-container/components/separator.tsx?b8dd","webpack://Citta2.0/./src/modules/citta-search-result-container/components/utilities.ts?bb91","webpack://Citta2.0/./src/modules/citta-search-result-container/components/range-refine-item.tsx?e0d5","webpack://Citta2.0/./src/modules/citta-search-result-container/components/refine-item.tsx?a159","webpack://Citta2.0/./src/modules/citta-search-result-container/components/choice-summary.tsx?db37","webpack://Citta2.0/./src/modules/citta-search-result-container/components/modal.tsx?ec98","webpack://Citta2.0/./src/modules/citta-search-result-container/components/refine-submenu.tsx?a4fd","webpack://Citta2.0/./src/modules/citta-search-result-container/components/error-message.tsx?2d94","webpack://Citta2.0/./src/modules/citta-search-result-container/citta-search-result-container.tsx?b687","webpack://Citta2.0/./src/components/citta-search-result/utilities.ts?1d16","webpack://Citta2.0/./src/components/citta-search-result/range-refine-item.tsx?f68a","webpack://Citta2.0/./src/components/citta-search-result/refine-item.tsx?5a16","webpack://Citta2.0/./src/components/citta-search-result/refine-submenu.tsx?ad28","webpack://Citta2.0/./src/components/citta-search-result/url-utils.ts?88cb","webpack://Citta2.0/./src/components/citta-search-result/citta-refiners.tsx?b326","webpack://Citta2.0/./src/components/citta-picture.tsx?de55","webpack://Citta2.0/./src/modules/citta-search-result-container/components/product-component.tsx?8073","webpack://Citta2.0/./src/modules/citta-search-result-container/citta-search-result-container.view.tsx?15fd","webpack://Citta2.0/./src/modules/citta-search/actions/get-auto-suggest-suggestions.ts?357b","webpack://Citta2.0/./src/modules/citta-search/components/citta-search.keywordsuggest.tsx?fcba","webpack://Citta2.0/./src/modules/citta-search/components/citta-search.productsuggest.tsx?89f1","webpack://Citta2.0/./src/modules/citta-search/components/citta-search.categorysuggest.tsx?2fc6","webpack://Citta2.0/./src/modules/citta-search/components/citta-search.form.tsx?f887","webpack://Citta2.0/./src/modules/citta-search/components/citta-search.label.tsx?585c","webpack://Citta2.0/./src/modules/citta-search/citta-search.tsx?9717","webpack://Citta2.0/./src/modules/citta-search/citta-search.view.tsx?861d","webpack://Citta2.0/./src/themes/citta/views/checkout.view.tsx?084a","webpack://Citta2.0/./src/themes/citta/views/components/promocode.component.tsx?26ab","webpack://Citta2.0/./src/themes/citta/views/components/product-collection-component.tsx?595b","webpack://Citta2.0/./src/themes/citta/views/product-collection.view.tsx?2634","webpack://Citta2.0/./src/modules/bulk-purchase/bulk-purchase.tsx?9fd5","webpack://Citta2.0/./src/modules/bulk-purchase/bulk-purchase.view.tsx?feac","webpack://Citta2.0/./src/modules/header/components/header-preferred-store.tsx?ee9c","webpack://Citta2.0/./src/modules/header/components/logo.tsx?f27e","webpack://Citta2.0/./src/modules/header/components/nav-icon.tsx?2475","webpack://Citta2.0/./src/modules/header/header.tsx?e91a","webpack://Citta2.0/./src/modules/header/header.view.tsx?cf0f","webpack://Citta2.0/./src/modules/product-collection/product-collection.tsx?4008","webpack://Citta2.0/./src/modules/product-collection/product-collection.view.tsx?5d36","webpack://Citta2.0/./src/modules/promo-banner/components/close-button.tsx?063b","webpack://Citta2.0/./src/modules/promo-banner/components/links.tsx?2587","webpack://Citta2.0/./src/modules/promo-banner/components/text.tsx?782b","webpack://Citta2.0/./src/modules/promo-banner/promo-banner.tsx?9ee9","webpack://Citta2.0/./src/modules/promo-banner/promo-banner.view.tsx?7f77","webpack://Citta2.0/./src/modules/quick-order-grid/components/add-to-list/add-to-cart-selected-items.tsx?de21","webpack://Citta2.0/./src/modules/quick-order-grid/components/quick-order-grid-actions.tsx?ca97","webpack://Citta2.0/./src/modules/quick-order-grid/components/quick-order-grid-drawer.tsx?8701","webpack://Citta2.0/./src/modules/quick-order-grid/components/quick-order-grid-form.tsx?5cbb","webpack://Citta2.0/./src/modules/quick-order-grid/components/quick-order-grid-product.ts?187e","webpack://Citta2.0/./src/modules/quick-order-grid/components/quick-order-grid-table/components/quick-order-grid-table-header-component.tsx?69b3","webpack://Citta2.0/./src/modules/quick-order-grid/components/quick-order-grid-table/components/quick-order-grid-table-row-component.tsx?cd92","webpack://Citta2.0/./src/modules/quick-order-grid/components/quick-order-grid-table/quick-order-grid-table-component.tsx?7cbc","webpack://Citta2.0/./src/modules/quick-order-grid/quick-order-grid.tsx?fddf","webpack://Citta2.0/./src/modules/quick-order-grid/quick-order-grid.view.tsx?f941","webpack://Citta2.0/./src/modules/ratings-histogram/component/components.tsx?f324","webpack://Citta2.0/./src/modules/ratings-histogram/ratings-histogram.tsx?f6bc","webpack://Citta2.0/./src/modules/ratings-histogram/ratings-histogram.view.tsx?5bff","webpack://Citta2.0/./src/modules/search-result-container/components/choice-summary.tsx?3f71","webpack://Citta2.0/./src/modules/search-result-container/components/error-message.tsx?6302","webpack://Citta2.0/./src/modules/search-result-container/components/feature-search-result-item.tsx?71fa","webpack://Citta2.0/./src/modules/search-result-container/components/link.tsx?52c2","webpack://Citta2.0/./src/modules/search-result-container/components/modal.tsx?d78e","webpack://Citta2.0/./src/modules/search-result-container/components/product-search-result-items.tsx?5174","webpack://Citta2.0/./src/modules/search-result-container/components/separator.tsx?4ea6","webpack://Citta2.0/./src/modules/search-result-container/components/title.tsx?c269","webpack://Citta2.0/./src/modules/search-result-container/components/range-refine-item.tsx?6288","webpack://Citta2.0/./src/modules/search-result-container/components/refine-item.tsx?a594","webpack://Citta2.0/./src/modules/search-result-container/components/refine-submenu.tsx?1292","webpack://Citta2.0/./src/modules/search-result-container/components/utilities.ts?8569","webpack://Citta2.0/./src/modules/search-result-container/search-result-container.tsx?7500","webpack://Citta2.0/./src/modules/search-result-container/search-result-container.view.tsx?b779","webpack://Citta2.0/./src/search-state.ts?dd10"],"sourcesContent":["import { __assign } from \"tslib\";\r\nimport { msdyn365Commerce } from '@msdyn365-commerce/core';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\n\r\nvar PriceComponentActions = {};\r\nvar Price = function (props: any) {\r\n if (props.data.price.CustomerContextualPrice === undefined) {\r\n return null;\r\n }\r\n return (React.createElement(\"span\", { className: classnames('msc-price', props.className) }, showStrikethroughPricing(props) ? renderCurrentPriceWithOriginalPrice(props) : renderCurrentPrice(props)));\r\n};\r\nvar showStrikethroughPricing = function (props: any) {\r\n var originalPrice = getOriginalPrice(props);\r\n if (originalPrice && props.data.price.CustomerContextualPrice) {\r\n return originalPrice > props.data.price.CustomerContextualPrice;\r\n }\r\n return false;\r\n};\r\nvar getOriginalPrice = function (props: any) {\r\n return Math.max(props.data.price.BasePrice || 0, props.data.price.TradeAgreementPrice || 0, props.data.price.AdjustedPrice || 0);\r\n};\r\nvar renderCurrentPrice = function (props: any) {\r\n var initialPrice = formatCurrency(props, props.data.price.CustomerContextualPrice);\r\n return (React.createElement(\"span\", { className: 'msc-price__actual', itemProp: 'price' }, initialPrice));\r\n};\r\nvar formatCurrency = function (props: any, price: any) {\r\n if (price === undefined) {\r\n return undefined;\r\n }\r\n if (price === 0 && props.freePriceText) {\r\n return props.freePriceText;\r\n }\r\n let returnPrice = `$${price}`;\r\n try {\r\n var formatter = new Intl.NumberFormat(props.context.cultureFormatter.locale, {\r\n style: 'currency',\r\n currency: props.context.cultureFormatter.currencyCode,\r\n currencyDisplay: 'narrowSymbol'\r\n });\r\n returnPrice = formatter.format(price)\r\n\r\n } catch {}\r\n return returnPrice;\r\n};\r\nvar renderCurrentPriceWithOriginalPrice = function (props: any) {\r\n var originalPrice = getOriginalPrice(props);\r\n var initialPrice = formatCurrency(props, originalPrice);\r\n return (React.createElement(React.Fragment, null,\r\n React.createElement(\"span\", { className: 'sr-only' },\r\n ' ',\r\n props.originalPriceText,\r\n ' ',\r\n initialPrice,\r\n ' ',\r\n props.currentPriceText,\r\n ' ',\r\n renderCurrentPrice(props)),\r\n React.createElement(\"span\", { className: 'msc-price__strikethrough', \"aria-hidden\": 'true' }, initialPrice),\r\n React.createElement(\"span\", { \"aria-hidden\": 'true' }, renderCurrentPrice(props)),\r\n props.savingsText && React.createElement(\"span\", { className: 'msc-price__savings' }, props.savingsText)));\r\n};\r\n\r\nconst PriceComponent: React.FunctionComponent = msdyn365Commerce.createComponent(\r\n 'Product',\r\n { component: msdyn365Commerce.createComponent('Price', __assign({ component: Price }, PriceComponentActions)) }\r\n);\r\n\r\nexport default PriceComponent","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n/* eslint-disable no-duplicate-imports */\r\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nexport interface IPromoBannerCloseButton {\r\n closeButtonAriaLabel?: string;\r\n label?: string;\r\n telemetryContent?: ITelemetryContent;\r\n onClose(): void;\r\n\r\n}\r\n\r\nexport const PromoBannerCloseButton: React.FC = ({ closeButtonAriaLabel, label, telemetryContent, onClose }) => {\r\n const payLoad = getPayloadObject('click', telemetryContent!, TelemetryConstant.PromoBannerClose);\r\n const attributes = getTelemetryAttributes(telemetryContent!, payLoad);\r\n return (\r\n \r\n );\r\n};","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n/* eslint-disable no-duplicate-imports */\r\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, onTelemetryClick } from '@msdyn365-commerce-modules/utilities';\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport * as React from 'react';\r\nimport { ILinksData } from '../citta-promo-banner.props.autogenerated';\r\n\r\nexport interface IPromoBannerLinks {\r\n links: ILinksData[];\r\n requestContext: Msdyn365.IRequestContext;\r\n telemetryContent: ITelemetryContent;\r\n onTextChange?(index: number): (event: Msdyn365.ContentEditableEvent) => void;\r\n}\r\n\r\nexport const PromoBannerLinks: React.FC = ({ links, requestContext, onTextChange, telemetryContent }) => {\r\n const editableLinks = _mapEditableLinks(links, telemetryContent);\r\n return(\r\n \r\n {editableLinks && editableLinks.length ?\r\n \r\n : null\r\n }\r\n \r\n );\r\n};\r\n\r\nconst _mapEditableLinks = (linkdata: ILinksData[], telemetryContent: ITelemetryContent): Msdyn365.ILinksData[] | null => {\r\n if(!linkdata || linkdata.length === 0) {\r\n return null;\r\n }\r\n const editableLinks: Msdyn365.ILinksData[] = [];\r\n linkdata.forEach((link,index) => {\r\n // Construct telemetry attribute to render\r\n const payLoad = getPayloadObject('click', telemetryContent, '', '');\r\n const linkText = link.linkText ? link.linkText : '';\r\n payLoad.contentAction.etext = linkText;\r\n const attributes = getTelemetryAttributes(telemetryContent, payLoad);\r\n const editableLink: Msdyn365.ILinksData = {\r\n ariaLabel: link.ariaLabel,\r\n className: 'ms-promo-banner__link',\r\n linkText: link.linkText,\r\n linkUrl: link.linkUrl.destinationUrl,\r\n openInNewTab: link.openInNewTab,\r\n role: 'button',\r\n additionalProperties: attributes,\r\n onClick: onTelemetryClick(telemetryContent, payLoad, linkText)\r\n };\r\n editableLinks.push(editableLink);\r\n });\r\n\r\n return editableLinks;\r\n};\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n/* eslint-disable no-duplicate-imports */\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport * as React from 'react';\r\n\r\nexport interface IPromoBannerText {\r\n text: string;\r\n requestContext: Msdyn365.IRequestContext;\r\n onTextChange(event: Msdyn365.ContentEditableEvent): void;\r\n}\r\n\r\nexport const PromoBannerText: React.FC = ({ text, onTextChange, requestContext }) => {\r\n return(\r\n \r\n );\r\n};","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n/* eslint-disable no-duplicate-imports */\r\nimport { getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport { Carousel } from '@msdyn365-commerce/components';\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\nimport { PromoBannerCloseButton, PromoBannerLinks, PromoBannerText } from './components';\r\nimport { IBannerMessagesData, ICittaPromoBannerProps } from './citta-promo-banner.props.autogenerated';\r\n\r\nexport interface IPromoBannerState {\r\n animating: boolean;\r\n isVisible: boolean;\r\n activeIndex: number;\r\n}\r\n\r\nexport interface IPromoBannerViewProps extends ICittaPromoBannerProps<{}>, IPromoBannerState {\r\n promoBannerProps: IModuleProps;\r\n contentProps: INodeProps ;\r\n bannerMessages: IBannerMessagesData[];\r\n PromoBannerTextProps: INodeProps;\r\n PromoBannerLinksProps: INodeProps;\r\n CarouselProps: INodeProps;\r\n closeButton?: React.ReactNode;\r\n className: string;\r\n onDismiss(): void;\r\n handleText(): void;\r\n handleLinks(): void;\r\n}\r\n\r\n/**\r\n *\r\n * PromoBannerModule component\r\n * @extends {React.PureComponent>}\r\n */\r\nclass PromoBanner extends React.PureComponent, IPromoBannerState> {\r\n public state: IPromoBannerState = {\r\n animating: false,\r\n isVisible: true,\r\n activeIndex: 0\r\n };\r\n\r\n private telemetryContent: ITelemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!,\r\n this.props.friendlyName,\r\n this.props.telemetry);\r\n\r\n public render(): JSX.Element | null {\r\n const { bannerMessages, dismissEnabled, interval, hideFlipper, autoplay, className= '' } = this.props.config;\r\n const { closeButtonAriaLabel, closeButtonLabel } = this.props.resources;\r\n const { isVisible, activeIndex } = this.state;\r\n\r\n if (!isVisible) {\r\n this.props.context.telemetry.error('Promo banner content is empty, module wont render.');\r\n return null;\r\n }\r\n\r\n const viewProps = {\r\n // Context for telemetry and raw data for C1 to do customization\r\n // Including computed data, state data and methods\r\n ...this.props,\r\n className: classnames('ms-promo-banner', className),\r\n isVisible, // state data\r\n onDismiss: this._onDismiss, // methods\r\n handleLinks: this.handleLinkClick,\r\n handleText: this.handleTextChange,\r\n\r\n promoBannerProps: { className: classnames('ms-promo-banner', className), moduleProps: this.props, role: 'banner' },\r\n PromoBannerTextProps: {\r\n tag: PromoBannerText\r\n },\r\n PromoBannerLinksProps: {\r\n tag: PromoBannerLinks,\r\n telemetryContent: this.telemetryContent\r\n },\r\n contentProps: { className: 'ms-promo-banner__content' },\r\n bannerMessages: bannerMessages,\r\n activeIndex: activeIndex,\r\n CarouselProps: {\r\n tag: Carousel,\r\n className: 'ms-promo-banner__carousel',\r\n activeIndex: activeIndex,\r\n next: this._next,\r\n previous: this._previous,\r\n onIndicatorsClickHandler: this._goToIndex,\r\n hideIndicator: hideFlipper,\r\n interval: interval,\r\n hideFlipper: hideFlipper,\r\n autoplay: autoplay\r\n },\r\n closeButton: dismissEnabled && \r\n };\r\n\r\n return this.props.renderView(viewProps) as React.ReactElement;\r\n }\r\n public handleTextChange = (event: Msdyn365.ContentEditableEvent) => {\r\n if(this.props.config.bannerMessages && this.props.config.bannerMessages[0]) {\r\n this.props.config.bannerMessages[0].text = event.target.value;\r\n }\r\n }\r\n\r\n public handleLinkClick = () => {\r\n // console.log('mlmlm')\r\n //const links = this.props.config.bannerMessages[1].links;\r\n // console.log('links', links)\r\n }\r\n\r\n public handleLinkTextChange = (linkIndex: number) => (event: Msdyn365.ContentEditableEvent) => {\r\n if(this.props.config.bannerMessages && this.props.config.bannerMessages[1]) {\r\n const links = this.props.config.bannerMessages[1].links;\r\n if(links) {\r\n links[linkIndex].linkText = event.target.value;\r\n }\r\n }\r\n };\r\n\r\n private _next = (): void => {\r\n const nextIndex = this._isLastItem() ? 0 : this.state.activeIndex + 1;\r\n this._goToIndex(nextIndex);\r\n };\r\n\r\n private _previous = (): void => {\r\n const nextIndex = this._isFirstItem() ? (this.props.config.bannerMessages ? this.props.config.bannerMessages.length - 1 : 0) : this.state.activeIndex - 1;\r\n this._goToIndex(nextIndex);\r\n };\r\n\r\n private _goToIndex = (index: number): void => {\r\n if (this.state.animating) {\r\n return;\r\n }\r\n this.setState({ activeIndex: index });\r\n };\r\n\r\n private _isFirstItem = () => this.state.activeIndex === 0;\r\n\r\n private _isLastItem = () => this.props.config.bannerMessages && this.state.activeIndex === this.props.config.bannerMessages.length - 1;\r\n\r\n private _onDismiss = (): void => {\r\n this.setState({ isVisible: false });\r\n };\r\n}\r\n\r\nexport default PromoBanner;\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n/* eslint-disable no-duplicate-imports */\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\nimport { IPromoBannerViewProps } from './citta-promo-banner';\r\n\r\nconst PromoBannerView: React.FC = props => {\r\n const {\r\n promoBannerProps,\r\n contentProps,\r\n closeButton,\r\n bannerMessages,\r\n PromoBannerTextProps,\r\n PromoBannerLinksProps,\r\n CarouselProps,\r\n handleLinks,\r\n handleText\r\n } = props;\r\n const slides = bannerMessages && bannerMessages.map((message, index) => {\r\n if (message.links?.length) {\r\n return ( \r\n \r\n {message.text && }\r\n {message.links && message.links.length > 0 && }\r\n \r\n );\r\n }\r\n return (\r\n \r\n {message.text && }\r\n {message.links && message.links.length > 0 && }\r\n \r\n );\r\n });\r\n if(bannerMessages.length > 0){\r\n return (\r\n \r\n \r\n {closeButton}\r\n \r\n );\r\n }\r\n return null;\r\n};\r\nexport default PromoBannerView;\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 * ICittaSearchResultContainer contentModule 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\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 const enum expandedMenusOnLoad {\r\n none = 'none',\r\n first = 'first',\r\n all = 'all'\r\n}\r\n\r\nexport interface ICittaSearchResultContainerConfig extends Msdyn365.IModuleConfig {\r\n itemsPerPage?: number;\r\n allowBackNavigation?: boolean;\r\n imageSettings?: Msdyn365.IImageSettings;\r\n className?: string;\r\n expandRefinersCount?: expandRefinersCount;\r\n disableHierarchy?: boolean;\r\n includeAttributes?: boolean;\r\n enableAffiliationBasedPricing?: boolean;\r\n expandedMenusOnLoad?: expandedMenusOnLoad;\r\n refinersToBeHidden?: string;\r\n refinersToBeUpdated?: string;\r\n tagsToIgnore?: string;\r\n salesLineTagKey?: string;\r\n}\r\n\r\nexport interface ICittaSearchResultContainerResources {\r\n noResultsForRefinersText: string;\r\n resultCategoryNotFoundText: string;\r\n resultSearchNotFoundText: string;\r\n paginationAriaLabel: string;\r\n priceFree: 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 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 modalTitle: string;\r\n modalCloseButtonText: string;\r\n minValueSliderThumbAriaLabel: string;\r\n maxValueSliderThumbAriaLabel: string;\r\n featureSimilarLooksTitle: string;\r\n}\r\n\r\nexport interface ICittaSearchResultContainerProps extends Msdyn365.IModule {\r\n resources: ICittaSearchResultContainerResources;\r\n config: ICittaSearchResultContainerConfig;\r\n}\r\n","import * as React from 'react';\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 }) => ( {text} );","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport { ProductComponent } from '@msdyn365-commerce/components';\r\nimport { ICoreContext, IImageSettings } from '@msdyn365-commerce/core';\r\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\nimport { ICittaSearchResultContainerResources } from '../citta-search-result-container.props.autogenerated';\r\n\r\ninterface IProductSearchResultItems {\r\n products: ProductSearchResult[];\r\n context: ICoreContext;\r\n resources: ICittaSearchResultContainerResources;\r\n imageSettings?: IImageSettings;\r\n moduleType: string;\r\n moduleId: string;\r\n allowBackNavigation?: boolean;\r\n telemetryContent: ITelemetryContent;\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}) => {\r\n\r\n return (\r\n\r\n
    \r\n {products.map((product: ProductSearchResult, index: number) => (\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 * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { getFallbackImageUrl, getProductPageUrlSync } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent ,onTelemetryClick } from '@msdyn365-commerce-modules/utilities';\r\nimport { ICoreContext, IGridSettings, IImageData, IImageSettings, Image} from '@msdyn365-commerce/core';\r\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\nimport { ICittaSearchResultContainerResources } from '../citta-search-result-container.props.autogenerated';\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: ICittaSearchResultContainerResources;\r\n imageSettings?: IImageSettings;\r\n moduleType: string;\r\n moduleId: string;\r\n telemetryContent?: ITelemetryContent;\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}) => {\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\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(imageSettings, context.request.gridSettings, product.PrimaryImageUrl, product.Name, fallbackImage)}\r\n
\r\n
\r\n
\r\n

{resources.featureSimilarLooksTitle}

\r\n {renderProductTitle(product?.Name)}\r\n
\r\n
\r\n );\r\n\r\n};\r\n\r\nfunction renderProductPlacementImage(imageSettings?: IImageSettings, gridSettings?: IGridSettings, imageUrl?: string, altText?: string, fallbackImage?: string,): 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: gridSettings,\r\n imageSettings: imageSettings,\r\n fallBackSrc: fallbackImage\r\n };\r\n return (\r\n \r\n );\r\n}\r\n\r\nfunction renderProductTitle(title?: string): JSX.Element | null {\r\nreturn

{title}

;\r\n}","import * as React from 'react';\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","import * as React from 'react';\r\ninterface ISeparator {\r\n separator: string;\r\n}\r\n\r\nexport const Separator: React.FC = ({ separator }) => ( {separator} );","import { ITelemetry } from '@msdyn365-commerce/core';\r\nimport { AttributeDataType, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\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 const 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 const 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 const 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 * 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 * 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 * 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 * 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 */\r\nexport function isRangeType(dataTypeValue: number | undefined): boolean {\r\n return dataTypeValue === AttributeDataType.Currency ||\r\n dataTypeValue === AttributeDataType.Decimal ||\r\n dataTypeValue === AttributeDataType.Integer;\r\n}\r\n\r\n/**\r\n * Find the refinement criterion associated with this product refiner value\r\n * @param productRefinerValue product refiner value to match\r\n * @param refinementCriteria selected refinement criteria\r\n */\r\nexport function findMatchingRefinementCriterion(\r\n productRefinerValue: ProductRefinerValue,\r\n refinementCriteria: ProductRefinerValue[]\r\n): ProductRefinerValue | undefined {\r\n // if the value is a range, then match only on data type value; otherwise match on item string\r\n return refinementCriteria.find(\r\n (refinementCriterion: ProductRefinerValue) => isMatchingRefinementCriterion(productRefinerValue, refinementCriterion)\r\n );\r\n}\r\n\r\n/**\r\n * Find the refinement criterion associated with this product refiner value\r\n * @param productRefinerValue product refiner value to match\r\n * @param refinementCriteria selected refinement criteria\r\n */\r\nexport function isMatchingRefinementCriterion(\r\n productRefinerValue: ProductRefinerValue,\r\n refinementCriterion: ProductRefinerValue\r\n): boolean {\r\n // if the value is a range, then match only on data type value; otherwise match on item string\r\n return refinementCriterion.RefinerRecordId === productRefinerValue.RefinerRecordId &&\r\n refinementCriterion.RefinerSourceValue === productRefinerValue.RefinerSourceValue &&\r\n refinementCriterion.DataTypeValue === productRefinerValue.DataTypeValue &&\r\n (isRangeType(refinementCriterion.DataTypeValue) || refinementCriterion.LeftValueBoundString === productRefinerValue.LeftValueBoundString);\r\n}\r\n\r\nexport function getUpdatedRefinementCriteria(\r\n itemToggleNotification: IRefineItemToggleNotification,\r\n currentRefinementCriteria: ProductRefinerValue[]): ProductRefinerValue[] {\r\n const updatedRefinementCriteria: ProductRefinerValue[] = [];\r\n let toggledItemFound = false;\r\n currentRefinementCriteria.forEach((selectedCriterion: ProductRefinerValue) => {\r\n if (isMatchingRefinementCriterion(itemToggleNotification.productRefinerValue, selectedCriterion)) {\r\n toggledItemFound = true;\r\n if (itemToggleNotification.isSelecting) {\r\n const next = {\r\n ...selectedCriterion,\r\n LeftValueBoundString: itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}` || selectedCriterion.LeftValueBoundString,\r\n RightValueBoundString: itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}` || selectedCriterion.RightValueBoundString,\r\n };\r\n updatedRefinementCriteria.push(next);\r\n\r\n } // else the item is being de-selected, so omit it from the refinement criteria\r\n } else {\r\n // keep existing criterion because it is not in the item toggle notification\r\n updatedRefinementCriteria.push(selectedCriterion);\r\n }\r\n });\r\n\r\n if (!toggledItemFound) {\r\n const next = {\r\n ...itemToggleNotification.productRefinerValue,\r\n LeftValueBoundString: itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}` || itemToggleNotification.productRefinerValue.LeftValueBoundString,\r\n RightValueBoundString: itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}` || itemToggleNotification.productRefinerValue.RightValueBoundString,\r\n };\r\n updatedRefinementCriteria.push(next);\r\n\r\n // If single select, then deselect any others in the parent refiner group\r\n if ((itemToggleNotification.productRefinerValue.DataTypeValue === AttributeDataType.Text || itemToggleNotification.productRefinerValue.DataTypeValue === AttributeDataType.TrueFalse) &&\r\n itemToggleNotification.parentProductRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect) {\r\n itemToggleNotification.parentProductRefinerHierarchy.Values.forEach((child: ProductRefinerValue) => {\r\n if (child.RefinerRecordId === next.RefinerRecordId && child.LeftValueBoundString === next.LeftValueBoundString) {\r\n // do nothing\r\n } else {\r\n const matchingIndex = updatedRefinementCriteria.findIndex((criterion: ProductRefinerValue) => isMatchingRefinementCriterion(child, criterion));\r\n if (matchingIndex > -1) {\r\n updatedRefinementCriteria.splice(matchingIndex, 1);\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n return updatedRefinementCriteria;\r\n}\r\n\r\nexport function formatPrice(\r\n amount: string | undefined,\r\n currency: string | undefined,\r\n locale: string | undefined,\r\n telemetry: ITelemetry): string {\r\n if (!amount || !currency) {\r\n telemetry.trace(`[refine-menu.utilities.formatPrice] could not format price for ${amount} ${currency}`);\r\n return amount || '';\r\n }\r\n const priceAmount = (amount && Number(amount)) || 0;\r\n let result: string;\r\n\r\n try {\r\n result = new Intl.NumberFormat(locale, {\r\n style: 'currency',\r\n currencyDisplay: 'symbol',\r\n currency: currency,\r\n minimumFractionDigits: 0\r\n }).format(priceAmount);\r\n } catch (e) {\r\n result = `${priceAmount} ${currency}`;\r\n telemetry.warning(`[refine-menu.utilities.formatPrice] Failed to format price for ${result}: ${e}`);\r\n }\r\n\r\n return result;\r\n}","import { Slider } from '@msdyn365-commerce-modules/utilities';\r\nimport debounce from 'lodash/debounce';\r\nimport { computed } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport { formatPrice } from './utilities';\r\n\r\ntype InputType = 'Min' | 'Max';\r\n\r\nimport { IRefineItemProps, IRefineItemState } from './refine-item';\r\n\r\nexport type RangeRefineItemType = 'slider' | 'input';\r\n\r\n/**\r\n * Range refine item properties\r\n */\r\nexport interface IRangeRefineItemProps extends IRefineItemProps {\r\n rangeType: RangeRefineItemType;\r\n minValueSliderThumbAriaLabel?: string;\r\n maxValueSliderThumbAriaLabel?: string;\r\n}\r\n\r\n/**\r\n * Range refine item state\r\n */\r\nexport interface IRangeRefineItemState extends IRefineItemState {\r\n validationErrorMin: string | undefined;\r\n validationErrorMax: string | undefined;\r\n selectedMin: string | undefined;\r\n selectedMax: string | undefined;\r\n touchedMin: boolean;\r\n touchedMax: boolean;\r\n}\r\n\r\n/**\r\n * RangeRefineItem component (controlled by RefineSubmenu)\r\n */\r\n@observer\r\nexport default class RangeRefineItem extends React.Component {\r\n private _formattedPriceReverseLookup: Map = new Map();\r\n\r\n private minInput: React.RefObject;\r\n private maxInput: React.RefObject;\r\n\r\n @computed get currencyCode(): string {\r\n return this.props.productRefinerValue.UnitText || '';\r\n }\r\n\r\n constructor(props: IRangeRefineItemProps) {\r\n super(props);\r\n this._onRangeUpdate = this._onRangeUpdate.bind(this);\r\n this._onRangeUpdateEnd = this._onRangeUpdateEnd.bind(this);\r\n this._handleRangeTooltipText = this._handleRangeTooltipText.bind(this);\r\n this._changeMin = this._changeMin.bind(this);\r\n this._changeMax = this._changeMax.bind(this);\r\n this._finishChangeMin = this._finishChangeMin.bind(this);\r\n this._finishChangeMax = this._finishChangeMax.bind(this);\r\n\r\n this.minInput = React.createRef();\r\n this.maxInput = React.createRef();\r\n\r\n const { selectedRefinementCriterion } = this.props;\r\n const initialMin = selectedRefinementCriterion && selectedRefinementCriterion.LeftValueBoundString || '0';\r\n const initialMax = selectedRefinementCriterion && selectedRefinementCriterion.RightValueBoundString || undefined;\r\n this.state = {\r\n isChecked: false,\r\n validationErrorMin: undefined,\r\n validationErrorMax: undefined,\r\n selectedMin: initialMin,\r\n selectedMax: initialMax,\r\n touchedMin: false,\r\n touchedMax: false\r\n };\r\n }\r\n\r\n public render(): JSX.Element | undefined {\r\n const { productRefinerValue, parentProductRefinerHierarchy, refineItemCommonProps } = this.props;\r\n\r\n if (!productRefinerValue || !parentProductRefinerHierarchy) {\r\n refineItemCommonProps.telemetry.error('Cannot render refine value range without productRefinerValue and parentProductRefinerHierarchy');\r\n return undefined;\r\n }\r\n\r\n if (this.props.rangeType === 'input') {\r\n return this._renderInputFields();\r\n }\r\n\r\n return this._renderSlider();\r\n }\r\n\r\n private _renderInputFields(): JSX.Element | undefined {\r\n const { isDisabled, parentProductRefinerHierarchy, refineItemCommonProps } = this.props;\r\n const { selectedMin, selectedMax, touchedMin, touchedMax, validationErrorMin, validationErrorMax } = this.state;\r\n\r\n const rangeAriaLabel = (refineItemCommonProps.rangeNameFormat || '{0}').replace('{0}', (parentProductRefinerHierarchy.KeyName || ''));\r\n const formAttrs = {\r\n 'aria-label': rangeAriaLabel,\r\n 'aria-disabled': isDisabled\r\n };\r\n\r\n // To enable price formatting of selected fields, this is the approach:\r\n // initial value: min=0 formatted as price, max=undefined\r\n // onFocus/onChange: convert to number (unformat) and mark as touched to indicate value is being edited\r\n // onBlur: validate and format entered value as price\r\n const minInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-min ${validationErrorMin ? 'refine-submenu__input-range--error' : ''}`;\r\n const maxInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-max ${validationErrorMax ? 'refine-submenu__input-range--error' : ''}`;\r\n const minLabelClassName = 'ms-refine-submenu__input-range-label refine-submenu__input-range-label-min';\r\n const maxLabelClassName = 'ms-refine-submenu__input-range-label refine-submenu__input-range-label-max';\r\n const formattedSelectedMin = this._getFormattedSelectedValue(selectedMin, touchedMin, validationErrorMin);\r\n const formattedSelectedMax = this._getFormattedSelectedValue(selectedMax, touchedMax, validationErrorMax);\r\n return (\r\n
\r\n \r\n \r\n {validationErrorMin &&\r\n {validationErrorMin}\r\n }\r\n {validationErrorMax && validationErrorMin !== validationErrorMax &&\r\n {validationErrorMax}\r\n }\r\n
\r\n );\r\n }\r\n\r\n private _renderSlider(): JSX.Element | undefined {\r\n const { isDisabled, productRefinerValue, parentProductRefinerHierarchy, selectedRefinementCriterion } = this.props;\r\n const min = productRefinerValue.LeftValueBoundString;\r\n const max = productRefinerValue.RightValueBoundString;\r\n const selectedMin = selectedRefinementCriterion && selectedRefinementCriterion.LeftValueBoundString || productRefinerValue.LeftValueBoundString || '0';\r\n const selectedMax = selectedRefinementCriterion && selectedRefinementCriterion.RightValueBoundString || productRefinerValue.RightValueBoundString || max;\r\n const sliderId = `slider_${parentProductRefinerHierarchy.RecordId}_${productRefinerValue.RefinerRecordId}`;\r\n const ariaAttributes = {\r\n 'aria-disabled': isDisabled\r\n };\r\n\r\n const minPrice = this._formatPrice(min);\r\n const maxPrice = this._formatPrice(max);\r\n const selectedMinPrice =this._formatPrice(selectedMin);\r\n const selectedMaxPrice =this._formatPrice(selectedMax);\r\n\r\n return (\r\n \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 { onToggle, parentProductRefinerHierarchy, productRefinerValue, refineItemCommonProps, selectedRefinementCriterion } = this.props;\r\n const max = selectedRefinementCriterion && selectedRefinementCriterion.RightValueBoundString || undefined;\r\n\r\n const maxNum = max ? Number(max) : undefined;\r\n\r\n if (isNaN(minInput)) {\r\n this.setState({validationErrorMin: refineItemCommonProps.validationErrorNaN});\r\n this._focus('Min');\r\n return false;\r\n }\r\n\r\n if (this._validateRange(minInput, maxNum)) {\r\n onToggle({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: minInput,\r\n rangeEnd: maxNum\r\n });\r\n return true;\r\n } else {\r\n this._focus('Min');\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private _finishChangeMax(event: React.FocusEvent): boolean {\r\n const selectedMaxValue = this._getInputWithoutFormatting(event.currentTarget.value);\r\n this.setState({\r\n selectedMax: selectedMaxValue,\r\n maxTouched: false\r\n });\r\n const maxInput = Number(selectedMaxValue);\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue, refineItemCommonProps, selectedRefinementCriterion } = this.props;\r\n const min = selectedRefinementCriterion && selectedRefinementCriterion.LeftValueBoundString || '0';\r\n\r\n const minNum = Number(min);\r\n\r\n if (isNaN(maxInput)) {\r\n this.setState({validationErrorMax: refineItemCommonProps.validationErrorNaN});\r\n this._focus('Max');\r\n return false;\r\n }\r\n\r\n if (this._validateRange(minNum, maxInput)) {\r\n if (productRefinerValue) {\r\n onToggle({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: minNum,\r\n rangeEnd: maxInput\r\n });\r\n } else {\r\n this._focus('Max');\r\n }\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private _focus(inputType: InputType): void {\r\n const ref = inputType === 'Max' ? this.maxInput : this.minInput;\r\n\r\n setTimeout(() => {\r\n if (ref && ref.current) {\r\n ref.current.focus();\r\n }\r\n }, 50);\r\n }\r\n\r\n private _getFormattedSelectedValue(selected: string | undefined, touched: boolean, validationError: string | undefined): string | undefined {\r\n if (touched || validationError || selected === undefined) {\r\n return selected;\r\n }\r\n return this._formatPrice(selected);\r\n }\r\n\r\n private _validateRange(min: number, max: number | undefined): boolean {\r\n const { refineItemCommonProps } = this.props;\r\n if (max === undefined) {\r\n return true;\r\n }\r\n\r\n if (min > max) {\r\n this.setState({\r\n validationErrorMin: refineItemCommonProps.validationErrorRange,\r\n validationErrorMax: refineItemCommonProps.validationErrorRange\r\n });\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private _formatPrice(amount: string | undefined): string {\r\n const locale = this.props.refineItemCommonProps.locale;\r\n const result = formatPrice(amount, this.currencyCode, locale, this.props.refineItemCommonProps.telemetry);\r\n\r\n if (amount !== undefined && !this._formattedPriceReverseLookup.has(result)) {\r\n this._formattedPriceReverseLookup.set(result, amount);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private _getInputWithoutFormatting(input: string): string {\r\n // First try to cast raw input to a number\r\n const inputAsNum = Number(input);\r\n if (!isNaN(inputAsNum)) {\r\n return input;\r\n }\r\n\r\n // Otherwise try a reverse lookup and fall back to the raw input if all else fails\r\n const reverseLookupResult = this._formattedPriceReverseLookup.get(input);\r\n return reverseLookupResult || input;\r\n }\r\n\r\n // NOTE: Fix types once Shared Components build pipeline bug fixed\r\n // tslint:disable-next-line:no-any\r\n private _onRangeUpdate(sliderChangeNotification: any): void {\r\n // Need to filter out mousemove events as these cause errors after the menu updates and slider re-renders\r\n if (sliderChangeNotification.eventType !== 'mousemove') {\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\r\n if (productRefinerValue && sliderChangeNotification) {\r\n onToggle({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: sliderChangeNotification.firstThumbValue,\r\n rangeEnd: sliderChangeNotification.secondThumbValue\r\n });\r\n\r\n this._focusOnSliderThumb(sliderChangeNotification);\r\n }\r\n }\r\n }\r\n\r\n // tslint:disable-next-line\r\n private _onRangeUpdateEnd(sliderChangeNotification: any): void {\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\r\n if (productRefinerValue && sliderChangeNotification) {\r\n onToggle({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: sliderChangeNotification.firstThumbValue,\r\n rangeEnd: sliderChangeNotification.secondThumbValue\r\n });\r\n\r\n this._focusOnSliderThumb(sliderChangeNotification);\r\n }\r\n }\r\n\r\n // tslint:disable-next-line\r\n private _focusOnSliderThumb(sliderChangeNotification: any): void {\r\n if (sliderChangeNotification.id) {\r\n const element = document.getElementById(`${sliderChangeNotification.id}range`);\r\n if (!!element) {\r\n setTimeout(\r\n () => {\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}","import { getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { RatingComponent } from '@msdyn365-commerce/components';\r\nimport { ICoreContext } from '@msdyn365-commerce/core';\r\nimport { ProductRefinerSource, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\r\nimport { IRefineItemCommonProps } from './refine-item.props.common';\r\n\r\n/**\r\n * RefineItem properties\r\n */\r\nexport interface IRefineItemProps {\r\n\r\n parentProductRefinerHierarchy: IProductRefinerHierarchy;\r\n productRefinerValue: ProductRefinerValue;\r\n selectedRefinementCriterion: ProductRefinerValue | undefined;\r\n 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 /** The telemetry content */\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 anchorType: React.RefObject;\r\n private payLoad: IPayLoad;\r\n\r\n constructor(props: IRefineItemProps) {\r\n super(props);\r\n this._onClick = this._onClick.bind(this);\r\n this.state = {\r\n isChecked: !!this.props.selectedRefinementCriterion\r\n };\r\n this.anchorType = React.createRef();\r\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, '');\r\n }\r\n\r\n // tslint:disable-next-line:max-func-body-length\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 index,\r\n // @ts-ignore\r\n children,\r\n onToggle,\r\n context,\r\n telemetryContent,\r\n ...attrs\r\n } = this.props;\r\n if (!productRefinerValue) {\r\n refineItemCommonProps.telemetry.error('[refine-item] Cannot render refineItem without productRefinerValue');\r\n return undefined;\r\n }\r\n if (!productRefinerValue.LeftValueBoundString) {\r\n refineItemCommonProps.telemetry.warning(`[refine-item] RefineItem without LeftValueBoundString: ${JSON.stringify(productRefinerValue)}`);\r\n }\r\n const isSingleSelect = parentProductRefinerHierarchy.RefinerTypeValue === 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 if (productRefinerValue.LeftValueBoundString) {\r\n this.payLoad.contentAction.etext = productRefinerValue.LeftValueBoundLocalizedString;\r\n const attribute = getTelemetryAttributes(telemetryContent!, this.payLoad);\r\n const refinerRating = parseInt(productRefinerValue.LeftValueBoundString, 10);\r\n const ratingRefiner = this.props.selectedRefinerValues?.find(value => value.DataTypeValue === productRefinerValue.DataTypeValue);\r\n const selectedRating = parseInt(ratingRefiner?.LeftValueBoundString || '0', 10);\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 return (\r\n \r\n \r\n \r\n {productRefinerValue.Count !== undefined && `(${productRefinerValue.Count})`}\r\n \r\n \r\n );\r\n } else {\r\n return undefined;\r\n }\r\n } else {\r\n this.payLoad.contentAction.etext = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString;\r\n const attribute = getTelemetryAttributes(telemetryContent!, this.payLoad);\r\n return (\r\n
  • \r\n \r\n \r\n {productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString}\r\n {productRefinerValue.Count !== undefined && ` (${productRefinerValue.Count})`}\r\n \r\n \r\n
  • \r\n );\r\n }\r\n }\r\n\r\n private _getRefinerUrl(): string {\r\n const { urlBuilder, parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\r\n\r\n if (productRefinerValue) {\r\n return urlBuilder({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: !selectedRefinementCriterion\r\n });\r\n }\r\n\r\n return '';\r\n }\r\n\r\n private _onClick = (e: React.MouseEvent): void => {\r\n e.preventDefault();\r\n\r\n const { parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\r\n if (productRefinerValue) {\r\n this.props.onToggle({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: !selectedRefinementCriterion\r\n });\r\n\r\n setTimeout(\r\n () => {\r\n this.anchorType.current && this.anchorType.current.focus();\r\n },\r\n 0\r\n );\r\n }\r\n }\r\n}","import { getPayloadObject, getTelemetryAttributes, IPayLoad } from '@msdyn365-commerce-modules/utilities';\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\r\nimport classnames from 'classnames';\r\nimport { get } from 'lodash';\r\nimport { computed } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\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.Component {\r\n private closeButtonGlyph: string = 'msi-close-btn';\r\n private payLoad: IPayLoad;\r\n\r\n @computed get selectedRefinersMap(): IRefinerMap[] {\r\n const { selectedChoices } = this.props;\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 } = 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, index: number) => {\r\n const listItemProps = {\r\n 'aria-posinset': index,\r\n 'aria-setsize': items.length\r\n };\r\n\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 && {clearAllText}}\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 const priceAmount = (amount && Number(amount)) || 0;\r\n const locale = get(this.props, 'context.request.locale', 'en-US');\r\n let result: string;\r\n\r\n try {\r\n result = new Intl.NumberFormat(locale, {\r\n style: 'currency',\r\n currencyDisplay: 'symbol',\r\n currency: currency,\r\n minimumFractionDigits: 0\r\n }).format(priceAmount);\r\n } catch (e) {\r\n result = `${priceAmount} ${currency}`;\r\n this.props.telemetry.warning(`Failed to format price for ${result}: ${e}`);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private _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')!.indexOf('choice-summary__clear-all') > -1;\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: 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(selected => (itemClicked.innerText && itemClicked.innerText.trim()) === selected.key);\r\n return (result && result.value) || undefined;\r\n }\r\n}\r\n","import {\r\n Button,\r\n Modal,\r\n ModalBody,\r\n ModalFooter,\r\n ModalHeader\r\n} 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 className: string\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\nexport const SearchResultModal = (props: ISearchResultModalProps):ISearchResultModalViewProps => {\r\n return {\r\n modal: modalNode(props),\r\n modalHeader: modalHeaderNode(props),\r\n modalFooter: modalFooterNode(props),\r\n modalBody: \r\n };\r\n};\r\n\r\nconst modalNode = (props: ISearchResultModalProps) => {\r\n return (\r\n \r\n );\r\n};\r\n\r\nconst modalHeaderNode = (props: ISearchResultModalProps) => {\r\n return (\r\n \r\n {props.resources.modalTitle}\r\n \r\n );\r\n};\r\n\r\nconst modalFooterNode = (props: ISearchResultModalProps) => {\r\n return (\r\n \r\n \r\n \r\n );\r\n};","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport * as React from 'react';\r\n\r\nimport { Button, Collapse, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport {IAny, ICoreContext, IGeneric} from '@msdyn365-commerce/core';\r\nimport { DisplayTemplate, ProductRefinerSource, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\r\nimport RangeRefineItem, { RangeRefineItemType } from './range-refine-item';\r\nimport RefineItem from './refine-item';\r\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\r\nimport { IRefineItemCommonProps } from './refine-item.props.common';\r\nimport { findMatchingRefinementCriterion, isRangeType } from './utilities';\r\n\r\n/**\r\n * Properties associated with the RefineSubmenu component\r\n */\r\nexport interface IRefineSubmenuProps {\r\n tempRangeTypeTODO: RangeRefineItemType;\r\n minValueSliderThumbAriaLabel?: string;\r\n maxValueSliderThumbAriaLabel?: string;\r\n productRefinerHierarchy: IProductRefinerHierarchy;\r\n selectedRefinerValues: ProductRefinerValue[];\r\n refineItemCommonProps: IRefineItemCommonProps;\r\n isDisabled: boolean;\r\n isExpandedOnInitialLoad: boolean;\r\n context: ICoreContext>;\r\n moduleId: string;\r\n moduleTypeName: string;\r\n /** The telemetry content */\r\n telemetryContent?: ITelemetryContent;\r\n onUpdateRefiners(notfication: Readonly): void;\r\n urlBuilder(refiner: IRefineItemToggleNotification): string;\r\n}\r\n\r\n/**\r\n * Refine submenu state\r\n */\r\nexport interface IRefineSubmenuState extends React.ComponentState {\r\n expanded: boolean;\r\n}\r\n\r\n/**\r\n *\r\n * The RefineSubmenu component renders the submenu category and child items.\r\n * This computed observes the stateful category hierarchy object.\r\n * @extends {React.PureComponent}\r\n */\r\nclass RefineSubmenu extends React.Component {\r\n constructor(props: IRefineSubmenuProps) {\r\n super(props);\r\n\r\n this._onToggleItem = this._onToggleItem.bind(this);\r\n this._onToggleSubmenu = this._onToggleSubmenu.bind(this);\r\n\r\n const isExpanded = this.props.isExpandedOnInitialLoad;\r\n // if (this.props.productRefinerHierarchy.DataTypeValue === ProductRefinerValueDataTypeValue.Range) {\r\n // isExpanded = true;\r\n // }\r\n\r\n this.state = {\r\n expanded: isExpanded\r\n };\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { productRefinerHierarchy, refineItemCommonProps } = this.props;\r\n\r\n if (!productRefinerHierarchy) {\r\n refineItemCommonProps.telemetry.error('Cannot render submenu without refiner hierarchy data');\r\n }\r\n\r\n if((productRefinerHierarchy.SourceValue === ProductRefinerSource.Rating) && (this.props.context.app.config.hideRating)) {\r\n return null;\r\n }\r\n return (\r\n
    \r\n \r\n {productRefinerHierarchy.KeyName}\r\n \r\n \r\n {this._renderChildItems(productRefinerHierarchy)}\r\n \r\n
    \r\n );\r\n }\r\n\r\n private _renderChildItems(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n if (isRangeType(productRefinerHierarchy.DataTypeValue)) {\r\n return this._renderRange(productRefinerHierarchy);\r\n }\r\n return this._renderSingleMultiSelect(productRefinerHierarchy);\r\n }\r\n\r\n private _renderSingleMultiSelect(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n const { isDisabled, refineItemCommonProps, selectedRefinerValues, context } = this.props;\r\n const isSingleSelect = (productRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect) && (productRefinerHierarchy.SourceValue === ProductRefinerSource.Rating);\r\n const role = isSingleSelect ? { role: 'radiogroup' } : undefined;\r\n const refinerValuesList = (productRefinerHierarchy.Values || []);\r\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\r\n if (!child) {\r\n refineItemCommonProps.telemetry.error(\r\n `[refine-submenu] Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\r\n );\r\n return null;\r\n }\r\n\r\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\r\n\r\n return (\r\n refinerValuesList.find(value => value.RefinerRecordId === selectedValue.RefinerRecordId))}\r\n refineItemCommonProps={refineItemCommonProps}\r\n onToggle={this._onToggleItem}\r\n urlBuilder={this.props.urlBuilder}\r\n isDisabled={isDisabled}\r\n key={index}\r\n index= {index}\r\n context = {context}\r\n moduleId={this.props.moduleId}\r\n moduleTypeName={this.props.moduleTypeName}\r\n telemetryContent={this.props.telemetryContent}\r\n />\r\n );\r\n });\r\n return (\r\n
      \r\n {listItems}\r\n
    \r\n );\r\n }\r\n\r\n private _getRangeType(productRefinerHierarchy: IProductRefinerHierarchy): 'input' | 'slider' {\r\n if (productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Range ||\r\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Slider ||\r\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.SliderWithBars) {\r\n return 'slider';\r\n }\r\n return 'input';\r\n }\r\n\r\n private _renderRange(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n const { isDisabled, refineItemCommonProps, selectedRefinerValues, context, minValueSliderThumbAriaLabel, maxValueSliderThumbAriaLabel } = this.props;\r\n const submenuClassNamePrefix = 'ms-refine-submenu__item list-group-item refine-submenu__item';\r\n const refinerValuesList = (productRefinerHierarchy.Values || []);\r\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\r\n if (!child) {\r\n refineItemCommonProps.telemetry.error(\r\n `Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\r\n );\r\n return null;\r\n }\r\n\r\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\r\n\r\n const rangeType = this._getRangeType(productRefinerHierarchy);\r\n const key = selectedRefinementCriterion ? `${selectedRefinementCriterion.LeftValueBoundString}-${selectedRefinementCriterion.RightValueBoundString}` : `not-selected-${index}`;\r\n return (\r\n
  • \r\n \r\n
  • \r\n );\r\n });\r\n return
      {listItems}
    ;\r\n }\r\n\r\n private _onToggleItem(itemToggleNotification: IRefineItemToggleNotification): void {\r\n this.props.onUpdateRefiners(itemToggleNotification);\r\n }\r\n\r\n private _onToggleSubmenu(): void {\r\n this.setState(prevState => ({\r\n expanded: !prevState.expanded\r\n }));\r\n }\r\n}\r\n\r\nexport default RefineSubmenu;","import * as React from 'react';\r\ninterface IErrorMessage {\r\n text?: string;\r\n}\r\n\r\nexport const ErrorMessage: React.FC = ({ text }) => {\r\n return (\r\n \r\n
    {text}
    \r\n
    \r\n );\r\n};"," /*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport {ArrayExtensions, getCustomer, GetCustomerInput } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { getTelemetryObject, ILabeledDropdownOnChangeNotification, ILabeledDropdownOption, IModuleProps, INodeProps, ITelemetryContent, LabeledDropdown, UncontrolledPagination } from '@msdyn365-commerce-modules/utilities';\r\nimport { CategoryHierarchy as CategoryHierarchyData, IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport MsDyn365 from '@msdyn365-commerce/core';\r\nimport { format, ProductPrice,ProductRefinerValue, ProjectionDomain, SortColumn, TextValueTranslation } from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n getActivePricesAsync\r\n} from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\nimport { AffiliationLoyaltyTier, CustomerAffiliation } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport classnames from 'classnames';\r\nimport { computed, observable, reaction, transaction } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport { buildListPageUrl, getCollectionProducts, getCurrentUrl, GetFullProductsByCollectionInput, parseQueryParam, sortOptions } from './actions';\r\nimport { ICittaSearchResultContainerData } from './citta-search-result-container.data';\r\nimport { expandRefinersCount, ICittaSearchResultContainerProps } from './citta-search-result-container.props.autogenerated';\r\nimport {\r\n ErrorMessage, FeatureSearchResultItem, getUpdatedRefinementCriteria, IChoiceSummaryClickNotification,\r\n IRefineItemCommonProps, IRefineItemToggleNotification, ISearchResultModalViewProps, isMatchingRefinementCriterion,Link, ModalToggle, ProductSearchResultItems, SearchResultModal, Separator, Title\r\n} from './components';\r\nimport ChoiceSummary from './components/choice-summary';\r\nimport RefineSubmenu from './components/refine-submenu';\r\n\r\nexport interface ISearchResultContainerViewProps extends ICittaSearchResultContainerProps {\r\n products?: React.ReactNode;\r\n className?: string;\r\n SearchResultContainer: IModuleProps;\r\n TitleViewProps: ITitleViewProps;\r\n categoryHierarchy: ICategoryHierarchyViewProps;\r\n pagination?: React.ReactNode;\r\n ProductsContainer: INodeProps;\r\n ProductSectionContainer: INodeProps;\r\n refineMenu: IRefineMenuViewProps;\r\n sortByOptions: ISortByViewProps;\r\n choiceSummary?: React.ReactNode;\r\n modalToggle: React.ReactNode;\r\n isMobile: boolean;\r\n CategoryNavContainer: INodeProps;\r\n RefineAndProductSectionContainer: INodeProps;\r\n errorMessage: React.ReactNode;\r\n FeatureSearchContainer: INodeProps;\r\n similarLookProduct?: React.ReactNode;\r\n productPrices?: ProductPrice[];\r\n toggleModal: Function;\r\n}\r\n\r\nexport interface ITitleViewProps {\r\n TitleContainer: INodeProps;\r\n title:ISearchResultTitle;\r\n}\r\n\r\nexport interface IRefineMenuViewProps {\r\n RefineMenuContainer: INodeProps;\r\n RefinerSectionContainer: INodeProps;\r\n refiners?: React.ReactNode[];\r\n}\r\n\r\nexport interface ICategoryHierarchyViewProps {\r\n categoryHierarchyList?: React.ReactNode[];\r\n categoryHierarchySeparator?: React.ReactNode;\r\n CategoryHierarchyContainer: INodeProps;\r\n}\r\n\r\nexport interface ISortByViewProps {\r\n SortingContainer: INodeProps;\r\n sortByDropDown?:React.ReactNode;\r\n}\r\n\r\nexport type GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\r\n\r\n/**\r\n * Title component for search result container\r\n */\r\nexport interface ISearchResultTitle {\r\n titlePrefix?: React.ReactNode;\r\n titleText?: React.ReactNode;\r\n titleCount?: React.ReactNode;\r\n}\r\n\r\nexport interface ISearchResultContainerState {\r\n sortingState: ISortByCollectionState;\r\n modalIsOpen: boolean;\r\n}\r\n\r\ninterface ISortByCollectionState {\r\n selectedSortByOption: ILabeledDropdownOption;\r\n pending: boolean;\r\n}\r\n\r\n/**\r\n *\r\n * SearchResultContainer component\r\n * @extends {React.PureComponent>}\r\n */\r\n@observer\r\nexport default class SearchResultContainer extends React.PureComponent, ISearchResultContainerState> {\r\n\r\n @computed get isMobile(): boolean {\r\n return (this._viewport === 'xs' || this._viewport === 'sm');\r\n }\r\n\r\n private sortByDropdownOptions: ILabeledDropdownOption[] = [\r\n { key: sortOptions.sortByOptionRelevanceDesc, value: this.props.resources.sortByOptionRelevanceDesc },\r\n { key: sortOptions.sortByOptionNameAsc, value: this.props.resources.sortByOptionNameAsc },\r\n { key: sortOptions.sortByOptionNameDesc, value: this.props.resources.sortByOptionNameDesc },\r\n { key: sortOptions.sortByOptionPriceAsc, value: this.props.resources.sortByOptionPriceAsc },\r\n { key: sortOptions.sortByOptionPriceDesc, value: this.props.resources.sortByOptionPriceDesc },\r\n { key: sortOptions.sortByOptionRatingDesc, value: this.props.resources.sortByOptionRatingDesc },\r\n ];\r\n private _refineItemCommonProps: IRefineItemCommonProps;\r\n private _pageType: string | undefined = this.props.context.request.urlTokens.pageType;\r\n @observable\r\n private _viewport: GridSize;\r\n\r\n private _modalToggleRef: React.RefObject;\r\n private _sortAndFilterContainerRef: React.RefObject;\r\n private expandrefinerCount: number | undefined = 0;\r\n private telemetryContent: ITelemetryContent;\r\n private productPrices: ProductPrice[];\r\n\r\n public static getFriendlyName(locale: string, nameTranslations?: TextValueTranslation[]): string | undefined {\r\n let nameTranslation: TextValueTranslation | undefined;\r\n if (locale && nameTranslations && nameTranslations.length > 0) {\r\n nameTranslation = nameTranslations.find(item => item.Language!.toLowerCase() === locale.toLowerCase());\r\n }\r\n\r\n return nameTranslation && nameTranslation.Text;\r\n }\r\n\r\n constructor(props: ICittaSearchResultContainerProps, state: ISearchResultContainerState) {\r\n super(props);\r\n this._viewport = props.context.request && props.context.request.device && props.context.request.device.Type === 'Mobile' ? 'xs' : 'lg';\r\n this._modalToggleRef = React.createRef();\r\n this._sortAndFilterContainerRef = React.createRef();\r\n this._toggleModal = this._toggleModal.bind(this);\r\n this._updateViewport = this._updateViewport.bind(this);\r\n this.productPrices=[];\r\n this.state = {\r\n sortingState: {\r\n pending: false,\r\n selectedSortByOption: this.sortByDropdownOptions[0]\r\n },\r\n modalIsOpen: false,\r\n };\r\n const {\r\n placeholderTextMax,\r\n minLabel,\r\n maxLabel,\r\n rangeNameFormat\r\n } = this.props.resources;\r\n\r\n const locale = this.props.context.request.locale;\r\n const telemetry = this.props.telemetry;\r\n const validationErrorNaN = this.props.resources.validationErrorNotNumber;\r\n const validationErrorRange = this.props.resources.validationErrorNotRange;\r\n this._refineItemCommonProps = {\r\n telemetry,\r\n locale,\r\n placeholderTextMax,\r\n minLabel,\r\n maxLabel,\r\n rangeNameFormat,\r\n validationErrorNaN,\r\n validationErrorRange\r\n };\r\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!,\r\n this.props.friendlyName,\r\n this.props.telemetry);\r\n\r\n // Initalization of list page\r\n this.props.data.products.then((products) => {\r\n this.props.data.listPageState.then((listPageState) => {\r\n if (this._pageType === 'Category') {\r\n listPageState.pageType = 'Category';\r\n } else {\r\n listPageState.pageType = 'Search';\r\n }\r\n\r\n let querySorting: SortColumn[] = [];\r\n\r\n if (this.props.context.request.query && this.props.context.request.query.sorting) {\r\n querySorting = JSON.parse(decodeURIComponent(this.props.context.request.query.sorting)) as SortColumn[];\r\n }\r\n\r\n listPageState.currentPageNumber = this.props.context.request.query && (+this.props.context.request.query.skip / (this.props.config.itemsPerPage || 10)) || 0;\r\n listPageState.sortingCritera = { Columns: querySorting };\r\n listPageState.pageSize = this.props.config.itemsPerPage || 10;\r\n listPageState.activeProducts = products.products;\r\n listPageState.totalProductCount = products.count;\r\n // Initialize reaction based on listPageState properties\r\n reaction(\r\n () => {\r\n return [listPageState.activeFilters && listPageState.activeFilters.length, listPageState.currentPageNumber, listPageState.sortingCritera && listPageState.sortingCritera.Columns && listPageState.sortingCritera.Columns.length];\r\n },\r\n () => {\r\n const input = new GetFullProductsByCollectionInput(\r\n listPageState.pageType,\r\n this.props.context.request.apiSettings,\r\n { Paging: { Top: this.props.config.itemsPerPage, Skip: Math.max((listPageState.pageSize * (listPageState.currentPageNumber || 0)), 0) }, count: true, Sorting: listPageState.sortingCritera || {} },\r\n listPageState.activeFilters || [],\r\n +(this.props.context.request.urlTokens.itemId || 0),\r\n this.props.context.request.query && this.props.context.request.query.q ? this.props.context.request.query.q : this.props.context.request.query?.productId,\r\n this.props && this.props.config && this.props.config.includeAttributes !== undefined && this.props.config.includeAttributes === true ? true : false,\r\n this.props.context.request.locale\r\n );\r\n getCollectionProducts(input, this.props.context.actionContext).then(productResults => {\r\n listPageState.activeProducts = productResults.products;\r\n listPageState.totalProductCount = productResults.count;\r\n this._getActivePrice().catch(ex=> {throw ex;});\r\n });\r\n }\r\n );\r\n\r\n });\r\n });\r\n\r\n if (this.props.context.request.query?.productId) {\r\n this.props.data.featureProduct.then((products) => {\r\n this.props.data.listPageState.then((listPageStateFeature) => {\r\n listPageStateFeature.featureProduct = products;\r\n\r\n });\r\n });\r\n }\r\n this._updateViewport();\r\n }\r\n\r\n public componentDidMount(): void {\r\n if (MsDyn365.isBrowser && window.addEventListener) {\r\n window.addEventListener('resize', this._updateViewport);\r\n this._updateViewport();\r\n }\r\n if (this.props.config.enableAffiliationBasedPricing &&\r\n this.props.context.actionContext.requestContext?.user?.isAuthenticated) {\r\n // tslint:disable-next-line:no-floating-promises\r\n this._getActivePrice();\r\n }\r\n }\r\n public componentWillUnmount(): void {\r\n if (MsDyn365.isBrowser && window.removeEventListener) {\r\n window.removeEventListener('resize', this._updateViewport);\r\n }\r\n }\r\n\r\n public render(): JSX.Element {\r\n const { imageSettings, className, allowBackNavigation } = this.props.config;\r\n const { resources } = this.props;\r\n const products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\r\n const searchProduct = (this.props.data.listPageState.result && this.props.data.listPageState.result.featureProduct) || null;\r\n let errorText = '';\r\n const breaCrumbType = this.props.context.app.config.breadcrumbType;\r\n const allowBack = allowBackNavigation && (breaCrumbType === 'back' || breaCrumbType === 'categoryAndBack');\r\n if(!products || products.length === 0) {\r\n errorText = this._pageType === 'Category'? resources.resultCategoryNotFoundText : resources.resultSearchNotFoundText;\r\n\r\n }\r\n const productsComponent = (\r\n \r\n );\r\n\r\n const featureComponent = (\r\n \r\n );\r\n\r\n const searchResultContainerViewProps = {\r\n ...this.props,\r\n products: productsComponent,\r\n TitleViewProps: this._getCollectionTitle(),\r\n categoryHierarchy: !this.props.config.disableHierarchy && this._getCategoryHierarchy(),\r\n refineMenu: this._getRefineMenu(),\r\n className: classnames('ms-search-result-container', className),\r\n SearchResultContainer: {\r\n moduleProps: this.props,\r\n className: classnames('ms-search-result-container', className)\r\n },\r\n sortByOptions: this.props.data.listPageState.result && this.props.data.listPageState.result.totalProductCount !== 0 ? this._getSortingDropDown(): null,\r\n pagination: this._getPagination(),\r\n ProductsContainer: { className: 'ms-search-result-container__Products' },\r\n ProductSectionContainer: {className: 'ms-search-result-container__product-section'},\r\n CategoryNavContainer: {className: 'ms-search-result-container__category-nav-section'},\r\n RefineAndProductSectionContainer: {className: 'ms-search-result-container__refine-product-section'},\r\n choiceSummary: this._getChoiceSummary(),\r\n modalToggle: this.props.data.listPageState.result && this.props.data.listPageState.result.totalProductCount !== 0 ?\r\n (\r\n \r\n ) : null,\r\n searchResultModal: this._getSearchResultModal(),\r\n isMobile: this.isMobile,\r\n errorMessage: errorText && (\r\n \r\n ),\r\n FeatureSearchContainer: { className: 'ms-feature-search-result' },\r\n similarLookProduct: this.props.data.listPageState.result && (this.props.data.listPageState.result.featureProduct !== null && this.props.data.listPageState.result.featureProduct !== undefined) ? featureComponent : null,\r\n productPrices: this.productPrices,\r\n toggleModal: this._toggleModal\r\n };\r\n return this.props.renderView(searchResultContainerViewProps) as React.ReactElement;\r\n }\r\n\r\n private _getActivePrice = async (): Promise => {\r\n let products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\r\n const productRecIds = ArrayExtensions.hasElements(products) ? products.map(prod => prod.RecordId) : [];\r\n const projectDomain: ProjectionDomain = { ChannelId: this.props.context.request.apiSettings.channelId, CatalogId: this.props.context.request.apiSettings.catalogId };\r\n const affliations: AffiliationLoyaltyTier[] = [];\r\n const customerInput = new GetCustomerInput(this.props.context.actionContext.requestContext.apiSettings);\r\n const customer = await getCustomer(customerInput, this.props.context.actionContext);\r\n\r\n if (customer && customer.CustomerAffiliations) {\r\n customer.CustomerAffiliations.forEach((affliation: CustomerAffiliation) => {\r\n const aff: AffiliationLoyaltyTier = { AffiliationId: affliation.RetailAffiliationId, CustomerId: customer.AccountNumber };\r\n affliations.push(aff);\r\n });\r\n }\r\n \r\n await getActivePricesAsync(\r\n { callerContext: this.props.context.actionContext, queryResultSettings: {} },\r\n projectDomain,\r\n productRecIds,\r\n new Date(),\r\n null,\r\n affliations,\r\n true\r\n ).then((activePricesResponse:ProductPrice[]) => {\r\n this.productPrices = activePricesResponse;\r\n products = products.map(prod => {\r\n const activePrice = activePricesResponse.find(price => price.ProductId === prod.RecordId);\r\n if (activePrice) {\r\n prod.Price = activePrice.CustomerContextualPrice ?? prod.Price;\r\n prod.BasePrice = Math.max(activePrice.BasePrice || 0, activePrice.TradeAgreementPrice || 0, activePrice.AdjustedPrice || 0);\r\n }\r\n return prod;\r\n });\r\n this.props.data.listPageState.then((listPageState) => {\r\n listPageState.activeProducts = products;\r\n });\r\n }).catch((error: Error) => {\r\n this.props.context.actionContext.trace(error.message);\r\n this.props.context.actionContext.telemetry.exception(error);\r\n this.props.context.actionContext.telemetry.debug(`[get Affiliation based price on search result container ]Error executing action`);\r\n throw new Error('[get Affiliation based price on search result container]Error executing action');\r\n });\r\n }\r\n private _getSearchResultModal = (): ISearchResultModalViewProps => {\r\n const {resources} = this.props;\r\n return SearchResultModal(\r\n {\r\n resources:{\r\n modalCloseButtonText: resources.modalCloseButtonText,\r\n modalTitle: resources.modalTitle\r\n },\r\n className: \"tetete\",\r\n isOpen:this.state.modalIsOpen,\r\n returnRef: this._modalToggleRef,\r\n onModalToggle: this._toggleModal\r\n });\r\n }\r\n\r\n private _getCollectionTitle = (): ITitleViewProps => {\r\n const { data, context, resources } = this.props;\r\n\r\n let collectionTitle: string | undefined = '';\r\n if (context && context.request && context.request.query && context.request.query.q) {\r\n collectionTitle = `\"${context.request.query.q}\"`;\r\n } else {\r\n collectionTitle = (data.category.result && SearchResultContainer.getFriendlyName(context.request.locale, data.category.result.NameTranslations)) ||\r\n (data.category.result && data.category.result.Name);\r\n }\r\n let productCountText = '';\r\n let productCountNumber: number | undefined;\r\n if (data.listPageState && data.listPageState.result && data.listPageState.result.totalProductCount !== undefined) {\r\n productCountNumber = data.listPageState.result.totalProductCount;\r\n } else if (data.products && data.products.result) {\r\n productCountNumber = data.products.result.count;\r\n }\r\n\r\n if (productCountNumber && productCountNumber !== 0) {\r\n productCountText = productCountNumber !== 1 ? format(this.props.resources.numberOfProducts, productCountNumber) : this.props.resources.oneProduct;\r\n } else {\r\n productCountText = format(this.props.resources.numberOfProducts, 0);\r\n }\r\n const titlePrefix = ;\r\n const titleText = collectionTitle && <Title className='ms-search-result__collection-title-text' text={collectionTitle} />;\r\n const titleCount = <Title className='ms-search-result__collection-title-count' text={productCountText} />;\r\n\r\n return {\r\n TitleContainer: { className: 'ms-search-result-container__title' },\r\n title:{\r\n titlePrefix: titlePrefix,\r\n titleText: titleText,\r\n titleCount: titleCount\r\n }\r\n };\r\n\r\n }\r\n private _getCategoryHierarchy = (): ICategoryHierarchyViewProps => {\r\n const { data } = this.props;\r\n const categoryHierarchy = data.categoryHierarchy.result;\r\n const categoryLinks =\r\n categoryHierarchy && categoryHierarchy.map((value: CategoryHierarchyData, index: number) => {\r\n\r\n return (\r\n <Link\r\n key={index}\r\n text={value.Name}\r\n ariaLabel={`${this.props.resources.categoryLinkAriaLabel} ${value.Name}`}\r\n href={value.Url}\r\n />\r\n );\r\n });\r\n const categoryLinkSeparator = <Separator separator='/' />;\r\n\r\n return {\r\n CategoryHierarchyContainer: { tag: 'nav', className: 'ms-search-result-container__category-hierarchy' },\r\n categoryHierarchyList: categoryLinks,\r\n categoryHierarchySeparator: categoryLinkSeparator\r\n };\r\n\r\n }\r\n\r\n private _getSortingDropDown = (): ISortByViewProps => {\r\n const { resources } = this.props;\r\n const activeDropdown = this._getCurrentlySelectedOption() || this.state.sortingState.selectedSortByOption;\r\n const dropdown = (\r\n <LabeledDropdown\r\n labelClassname='reviews-list-sort-by'\r\n labelText={resources.sortByDropdownLabel}\r\n dropdownId='categorySortByDropdown'\r\n dropdownClassname='reviews-list-dropdown'\r\n toggleColor='link'\r\n dropdownOptions={this.sortByDropdownOptions}\r\n selectedOption={activeDropdown}\r\n onSelectOption={this._updateSortByDropdown}\r\n ref={this._sortAndFilterContainerRef}\r\n />);\r\n return {\r\n SortingContainer: { className: 'ms-search-result-container__Sort-by-category' },\r\n sortByDropDown:dropdown\r\n };\r\n }\r\n\r\n private _getPagination = (): React.ReactNode => {\r\n const { config, context, data, resources } = this.props;\r\n const listPageState = data && data.listPageState && data.listPageState.result;\r\n const fullUrl = getCurrentUrl(context.request);\r\n const itemsPerPage = config.itemsPerPage || 10;\r\n const skipCount = listPageState && listPageState.currentPageNumber !== null ?\r\n (listPageState.currentPageNumber * (this.props.config.itemsPerPage || 10)) :\r\n ((this.props.context.request.query && +this.props.context.request.query.skip) || 0);\r\n const totalItems = listPageState && listPageState.totalProductCount || 0;\r\n const previousText = resources.flipperPrevious;\r\n const nextText = resources.flipperNext;\r\n if (totalItems <= itemsPerPage) {\r\n return null;\r\n }\r\n return (\r\n <UncontrolledPagination\r\n className='ms-search-result-container__pagination'\r\n role='navigation'\r\n aria-label={resources.paginationAriaLabel}\r\n url={fullUrl.href}\r\n qsp={'skip'}\r\n items={totalItems}\r\n itemsPerPage={itemsPerPage}\r\n startingItem={skipCount}\r\n previousText={<div className='msc-pagination__prev'><span className='ms-search-result__pagination-left' aria-hidden='true'/><span className='prev-text'>{previousText}</span></div>}\r\n nextText={<div className='msc-pagination__next'><span className='next-text'>{nextText}</span><span className='ms-search-result__pagination-right' aria-hidden='true'/></div>}\r\n previousAriaLabel={previousText}\r\n nextAriaLabel={nextText}\r\n telemetryContent={this.telemetryContent}\r\n />);\r\n }\r\n\r\n private _getRefineMenu = (): IRefineMenuViewProps => {\r\n const { data, context, config } = this.props;\r\n const tempRangeTypeTODO = context.request.query && context.request.query.inputRange ? 'input' : 'slider';\r\n const validRefiners = data.refiners.result && data.refiners.result.filter(refiner => {\r\n return refiner.Values.length > 0;\r\n });\r\n\r\n const activeRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n\r\n this._getexpandRefinerCount(validRefiners && validRefiners.length, config.expandRefinersCount);\r\n const expandedRefiners = this.expandrefinerCount;\r\n const subMenus = validRefiners && validRefiners.map((productRefinerHierarchy: IProductRefinerHierarchy, index: number) => {\r\n return (\r\n <RefineSubmenu\r\n productRefinerHierarchy={productRefinerHierarchy}\r\n selectedRefinerValues={activeRefiners}\r\n refineItemCommonProps={this._refineItemCommonProps}\r\n minValueSliderThumbAriaLabel={this.props.resources.minValueSliderThumbAriaLabel}\r\n maxValueSliderThumbAriaLabel={this.props.resources.maxValueSliderThumbAriaLabel}\r\n key={index}\r\n onUpdateRefiners={this._onUpdateRefiners}\r\n urlBuilder={this._buildRefinerUrl}\r\n isDisabled={false}\r\n isExpandedOnInitialLoad={expandedRefiners && expandedRefiners > index ? true : false}\r\n tempRangeTypeTODO={tempRangeTypeTODO}\r\n context = {context}\r\n moduleId={this.props.id}\r\n moduleTypeName={this.props.typeName}\r\n telemetryContent={this.telemetryContent}\r\n />\r\n );\r\n });\r\n \r\n return {\r\n RefineMenuContainer:{className: 'ms-search-result-container__refine-menu' },\r\n RefinerSectionContainer:{className: 'ms-search-result-container__refiner-section'},\r\n refiners: subMenus\r\n };\r\n\r\n }\r\n\r\n private _getChoiceSummary = (): React.ReactNode => {\r\n const { resources, data, telemetry } = this.props;\r\n const selectedRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n return (\r\n <ChoiceSummary\r\n classNames='ms-choice-summary-by-category'\r\n clearAllText={resources.clearAllText}\r\n label={resources.choiceSummaryLabel}\r\n selectedChoices={selectedRefiners}\r\n // @ts-ignore: NOTE Type-unsafe line below, null refinersByCategoryHierarchy case not handled\r\n refinerHierarchy={data.refiners.result}\r\n choiceFormat={resources.choiceFormat}\r\n choiceRangeValueFormat={resources.choiceRangeValueFormat}\r\n telemetry={telemetry}\r\n onChoiceClicked={this._onChoiceClicked}\r\n urlBuilder={this._buildRefinerUrlForChoiceSummary}\r\n choiceAriaLabel={resources.choiceAriaLabel}\r\n telemetryContent={this.telemetryContent}\r\n />\r\n );\r\n\r\n }\r\n\r\n private _updateSortByDropdown = (notification: ILabeledDropdownOnChangeNotification): void => {\r\n const { context } = this.props;\r\n const requestContext = context && context.request;\r\n const actionContext = context && context.actionContext;\r\n\r\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\r\n const error = `[sort-by-category] cannot sort without context: ${!requestContext ? 'requestContext ' : ''} ${!actionContext ? 'actionContext ' : ''} could not be found`;\r\n this.props.telemetry.warning(error);\r\n }\r\n\r\n window.history.pushState({}, '', buildListPageUrl(getCurrentUrl(this.props.context.request), undefined, [this._getSortColumnFromSelectedOption(notification.selectedOption)], undefined));\r\n transaction(() => {\r\n this.props.data.listPageState.result!.currentPageNumber = 0;\r\n this.props.data.listPageState.result!.sortingCritera = { Columns: [this._getSortColumnFromSelectedOption(notification.selectedOption)] };\r\n });\r\n }\r\n\r\n private _getSortColumnFromSelectedOption = (option: ILabeledDropdownOption): SortColumn => {\r\n const { data } = this.props;\r\n\r\n if (!data.searchConfiguration.result) {\r\n return {};\r\n }\r\n\r\n const mappedConfiguration = data.searchConfiguration.result.find((searchConfiguration) => { return searchConfiguration.key === option.key; });\r\n\r\n if (mappedConfiguration) {\r\n return mappedConfiguration.sortColumn;\r\n }\r\n\r\n return {};\r\n }\r\n\r\n private _getCurrentlySelectedOption = (): ILabeledDropdownOption | undefined => {\r\n const { data } = this.props;\r\n const sortCriteria = data.listPageState.result && data.listPageState.result.sortingCritera;\r\n\r\n const activeSortColumn =\r\n (sortCriteria && sortCriteria.Columns && sortCriteria.Columns[0]) ||\r\n (parseQueryParam<SortColumn[]>('sorting', this.props.context.request) || [])[0];\r\n\r\n if (activeSortColumn && data.searchConfiguration.result) {\r\n const activeMappedConfig = data.searchConfiguration.result.find((mappedSearchConfig) => {\r\n return (mappedSearchConfig.sortColumn.ColumnName === activeSortColumn.ColumnName) &&\r\n (mappedSearchConfig.sortColumn.IsDescending === activeSortColumn.IsDescending);\r\n });\r\n if (activeMappedConfig) {\r\n return this.sortByDropdownOptions.find((dropdownOption) => dropdownOption.key === activeMappedConfig.key);\r\n }\r\n }\r\n\r\n return;\r\n }\r\n\r\n private _onUpdateRefiners = (itemToggleNotification: IRefineItemToggleNotification): void => {\r\n const { context } = this.props;\r\n const requestContext = context && context.request;\r\n const actionContext = context && context.actionContext;\r\n\r\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\r\n const error = `Refine menu cannot refine search criteria: ${!requestContext ? 'requestContext ' : ''} ${!actionContext ? 'actionContext ' : ''} could not be found`;\r\n this.props.telemetry.warning(error);\r\n }\r\n\r\n const updatedRefinementCriteria = getUpdatedRefinementCriteria(itemToggleNotification, this.props.data.listPageState.result && this.props.data.listPageState.result.activeFilters || []);\r\n\r\n window.history.pushState({}, '', buildListPageUrl(getCurrentUrl(this.props.context.request), updatedRefinementCriteria));\r\n transaction(() => {\r\n this.props.data.listPageState.result!.currentPageNumber = 0;\r\n this.props.data.listPageState.result!.activeFilters = updatedRefinementCriteria;\r\n });\r\n }\r\n\r\n private _buildRefinerUrl = (itemToggleNotification: IRefineItemToggleNotification): string => {\r\n if (this.props.data.listPageState.result) {\r\n const newRefinementCriteria = getUpdatedRefinementCriteria(itemToggleNotification, this.props.data.listPageState.result.activeFilters || []);\r\n\r\n return buildListPageUrl(getCurrentUrl(this.props.context.request), newRefinementCriteria);\r\n } else {\r\n this.props.telemetry.warning(`[buildRefinerQueryString]List Page State Not available, unable to build refiner URL`);\r\n return '';\r\n }\r\n }\r\n\r\n private _onChoiceClicked = (notification: IChoiceSummaryClickNotification): void => {\r\n const { data, telemetry } = this.props;\r\n\r\n if (!data.listPageState.result) {\r\n telemetry.warning('[choice-summary-by-category._onChoiceClicked]ListPageState unavailable, unable to update refiners.');\r\n return;\r\n }\r\n\r\n let currentRefinementCriteria = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n\r\n if (!notification.clearAll) {\r\n const selectedChoice = notification.choiceClicked;\r\n if (!selectedChoice) {\r\n telemetry.warning('[choice-summary-by-category._onChoiceClicked] Choice could not be determined');\r\n return;\r\n }\r\n currentRefinementCriteria = currentRefinementCriteria.filter(\r\n (selectedCriterion: ProductRefinerValue) => !isMatchingRefinementCriterion(selectedChoice, selectedCriterion)\r\n );\r\n } else {\r\n currentRefinementCriteria = [];\r\n\r\n // set focus to sort and filter\r\n const dropdownElementId = this._sortAndFilterContainerRef.current && this._sortAndFilterContainerRef.current.props.dropdownId;\r\n const dropdownElement = dropdownElementId && document.getElementById(dropdownElementId);\r\n setTimeout(() => {\r\n dropdownElement && dropdownElement.focus();\r\n },\r\n 50);\r\n }\r\n\r\n const fullUrl = getCurrentUrl(this.props.context.request);\r\n window.history.pushState({}, '', buildListPageUrl(fullUrl, currentRefinementCriteria));\r\n data.listPageState.result.currentPageNumber = 0;\r\n data.listPageState.result.activeFilters = currentRefinementCriteria;\r\n }\r\n\r\n private _buildRefinerUrlForChoiceSummary = (selectedRefiner: ProductRefinerValue, isClearAll: boolean): string => {\r\n const { data, telemetry } = this.props;\r\n const fullUrl = getCurrentUrl(this.props.context.request);\r\n\r\n if (!data.listPageState.result) {\r\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl]ListPageState unavailable, unable to create refiner URL.');\r\n return fullUrl.href;\r\n }\r\n\r\n let currentRefinementCriteria = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n\r\n if (!isClearAll) {\r\n if (!selectedRefiner) {\r\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl] URL for Choice could not be determined');\r\n return fullUrl.href;\r\n }\r\n currentRefinementCriteria = currentRefinementCriteria.filter(\r\n (selectedCriterion: ProductRefinerValue) => !isMatchingRefinementCriterion(selectedRefiner, selectedCriterion)\r\n );\r\n } else {\r\n currentRefinementCriteria = [];\r\n }\r\n\r\n return buildListPageUrl(fullUrl, currentRefinementCriteria);\r\n }\r\n\r\n private _getViewport(): GridSize {\r\n const { context } = this.props;\r\n\r\n // always render in mobile viewport on a mobile device\r\n if (context.request && context.request.device && context.request.device.Type === 'Mobile') {\r\n return 'xs';\r\n }\r\n\r\n if (MsDyn365.isBrowser && window.innerWidth) {\r\n const gridSettings = context.request.gridSettings;\r\n if (gridSettings) {\r\n if (gridSettings.xs && window.innerWidth <= gridSettings.xs.w) {\r\n return 'xs';\r\n } else if (gridSettings.sm && window.innerWidth <= gridSettings.sm.w) {\r\n return 'sm';\r\n } else if (gridSettings.md && window.innerWidth <= gridSettings.md.w) {\r\n return 'md';\r\n } else if (gridSettings.lg && window.innerWidth <= gridSettings.lg.w) {\r\n return 'lg';\r\n } else {\r\n return 'xl';\r\n }\r\n }\r\n }\r\n\r\n return 'lg';\r\n }\r\n\r\n private _toggleModal(): void {\r\n this.setState({\r\n modalIsOpen: !this.state.modalIsOpen\r\n });\r\n }\r\n\r\n private _updateViewport(): void {\r\n this._viewport = this._getViewport();\r\n\r\n if (this.state.modalIsOpen && !this.isMobile) {\r\n this._toggleModal();\r\n }\r\n }\r\n\r\n private _getexpandRefinerCount = (validRefiners?: number, refinerCount?: expandRefinersCount): void => {\r\n switch(refinerCount) {\r\n case expandRefinersCount.all:\r\n this.expandrefinerCount = validRefiners;\r\n break;\r\n case expandRefinersCount.one:\r\n this.expandrefinerCount = 1;\r\n break;\r\n case expandRefinersCount.two:\r\n this.expandrefinerCount = 2;\r\n break;\r\n case expandRefinersCount.three:\r\n this.expandrefinerCount = 3;\r\n break;\r\n case expandRefinersCount.four:\r\n this.expandrefinerCount = 4;\r\n break;\r\n default:\r\n this.expandrefinerCount = 0;\r\n }\r\n }\r\n\r\n}\r\n","import { IRefineItemToggleNotification } from '@msdyn365-commerce-modules/search-result-container';\r\nimport { ITelemetry } from '@msdyn365-commerce/core';\r\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\r\n\r\n/**\r\n * Types of product refiner values\r\n */\r\nexport const enum ProductRefinerValueDataTypeValue {\r\n /**\r\n * Range slider is used for selections like price\r\n */\r\n Range = 1,\r\n\r\n /**\r\n * Range input is a different way to specify ranges and can be expressed with input boxes\r\n * as well as a set of discrete single-select type values\r\n */\r\n RangeInput = 4,\r\n\r\n /**\r\n * This is a discrete list item, either multi-select or single-select\r\n */\r\n List = 5,\r\n\r\n /**\r\n * Boolean types allows only single-select\r\n */\r\n Boolean = 6\r\n}\r\n\r\n/**\r\n * Types of product refiners\r\n */\r\nexport const enum ProductRefinerTypeValue {\r\n /**\r\n * Refiner values are single-select\r\n */\r\n Single = 0,\r\n\r\n /**\r\n * Refiner values are multi-select\r\n */\r\n Multi = 1\r\n}\r\n\r\n/**\r\n * ProductRefinerSource enum type.\r\n */\r\nexport const enum ProductRefinerSource {\r\n /**\r\n * The None member.\r\n */\r\n None = 0,\r\n /**\r\n * The Attribute member.\r\n */\r\n Attribute = 1,\r\n /**\r\n * The Category member.\r\n */\r\n Category = 2,\r\n /**\r\n * The Price member.\r\n */\r\n Price = 3,\r\n /**\r\n * The Rating member.\r\n */\r\n Rating = 4\r\n}\r\n\r\n/**\r\n * Find the refinement criterion associated with this product refiner value\r\n * @param productRefinerValue product refiner value to match\r\n * @param refinementCriteria selected refinement criteria\r\n */\r\nexport function findMatchingRefinementCriterion(\r\n productRefinerValue: ProductRefinerValue,\r\n refinementCriteria: ProductRefinerValue[]\r\n): ProductRefinerValue | undefined {\r\n // if the value is a range, then match only on data type value; otherwise match on item string\r\n return refinementCriteria.find(\r\n (refinementCriterion: ProductRefinerValue) => isMatchingRefinementCriterion(productRefinerValue, refinementCriterion)\r\n );\r\n}\r\n\r\n/**\r\n * Find the refinement criterion associated with this product refiner value\r\n * @param productRefinerValue product refiner value to match\r\n * @param refinementCriteria selected refinement criteria\r\n */\r\nexport function isMatchingRefinementCriterion(\r\n productRefinerValue: ProductRefinerValue,\r\n refinementCriterion: ProductRefinerValue\r\n): boolean {\r\n // if the value is a range, then match only on data type value; otherwise match on item string\r\n return (\r\n refinementCriterion.RefinerRecordId === productRefinerValue.RefinerRecordId &&\r\n refinementCriterion.RefinerSourceValue === productRefinerValue.RefinerSourceValue &&\r\n refinementCriterion.DataTypeValue === productRefinerValue.DataTypeValue &&\r\n (refinementCriterion.DataTypeValue === ProductRefinerValueDataTypeValue.Range ||\r\n refinementCriterion.LeftValueBoundString === productRefinerValue.LeftValueBoundString)\r\n );\r\n}\r\n\r\nexport function getUpdatedRefinementCriteria(\r\n itemToggleNotification: IRefineItemToggleNotification,\r\n currentRefinementCriteria: ProductRefinerValue[]): ProductRefinerValue[] {\r\n const updatedRefinementCriteria: ProductRefinerValue[] = [];\r\n let toggledItemFound = false;\r\n currentRefinementCriteria.forEach((selectedCriterion: ProductRefinerValue) => {\r\n if (isMatchingRefinementCriterion(itemToggleNotification.productRefinerValue, selectedCriterion)) {\r\n toggledItemFound = true;\r\n if (itemToggleNotification.isSelecting) {\r\n const next = {\r\n ...selectedCriterion,\r\n LeftValueBoundString: itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}` || selectedCriterion.LeftValueBoundString,\r\n RightValueBoundString: itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}` || selectedCriterion.RightValueBoundString,\r\n };\r\n updatedRefinementCriteria.push(next);\r\n\r\n } // else the item is being de-selected, so omit it from the refinement criteria\r\n } else {\r\n // keep existing criterion because it is not in the item toggle notification\r\n updatedRefinementCriteria.push(selectedCriterion);\r\n }\r\n });\r\n\r\n if (!toggledItemFound) {\r\n const next = {\r\n ...itemToggleNotification.productRefinerValue,\r\n LeftValueBoundString: itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}` || itemToggleNotification.productRefinerValue.LeftValueBoundString,\r\n RightValueBoundString: itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}` || itemToggleNotification.productRefinerValue.RightValueBoundString,\r\n };\r\n updatedRefinementCriteria.push(next);\r\n\r\n // If single select, then deselect any others in the parent refiner group\r\n if ((itemToggleNotification.productRefinerValue.DataTypeValue === ProductRefinerValueDataTypeValue.List || itemToggleNotification.productRefinerValue.DataTypeValue === ProductRefinerValueDataTypeValue.Boolean) &&\r\n itemToggleNotification.parentProductRefinerHierarchy.RefinerTypeValue === ProductRefinerTypeValue.Single) {\r\n itemToggleNotification.parentProductRefinerHierarchy.Values.forEach((child: ProductRefinerValue) => {\r\n if (child.RefinerRecordId === next.RefinerRecordId && child.LeftValueBoundString === next.LeftValueBoundString) {\r\n // do nothing\r\n } else {\r\n const matchingIndex = updatedRefinementCriteria.findIndex((criterion: ProductRefinerValue) => isMatchingRefinementCriterion(child, criterion));\r\n if (matchingIndex > -1) {\r\n updatedRefinementCriteria.splice(matchingIndex, 1);\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n return updatedRefinementCriteria;\r\n}\r\n\r\nexport function formatPrice(\r\n amount: string | undefined,\r\n currency: string | undefined,\r\n locale: string | undefined,\r\n telemetry: ITelemetry): string {\r\n if (!amount || !currency) {\r\n telemetry.trace(`[refine-menu.utilities.formatPrice] could not format price for ${amount} ${currency}`);\r\n return amount || '';\r\n }\r\n const priceAmount = (amount && Number(amount)) || 0;\r\n let result: string;\r\n\r\n try {\r\n result = new Intl.NumberFormat(locale, {\r\n style: 'currency',\r\n currencyDisplay: 'symbol',\r\n currency: currency\r\n }).format(priceAmount);\r\n } catch (e) {\r\n result = `${priceAmount} ${currency}`;\r\n telemetry.warning(`[refine-menu.utilities.formatPrice] Failed to format price for ${result}: ${e}`);\r\n }\r\n\r\n return result;\r\n}","import { Slider } from '@msdyn365-commerce-modules/utilities';\r\nimport debounce from 'lodash/debounce';\r\nimport { computed } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport { formatPrice } from './utilities';\r\n\r\ntype InputType = 'Min' | 'Max';\r\n\r\nimport { IRefineItemProps, IRefineItemState } from './refine-item';\r\n\r\nexport type RangeRefineItemType = 'slider' | 'input';\r\n\r\n/**\r\n * Range refine item properties\r\n */\r\nexport interface IRangeRefineItemProps extends IRefineItemProps {\r\n rangeType: RangeRefineItemType;\r\n minValueSliderThumbAriaLabel?: string;\r\n maxValueSliderThumbAriaLabel?: string;\r\n}\r\n\r\n/**\r\n * Range refine item state\r\n */\r\nexport interface IRangeRefineItemState extends IRefineItemState {\r\n validationErrorMin: string | undefined;\r\n validationErrorMax: string | undefined;\r\n selectedMin: string | undefined;\r\n selectedMax: string | undefined;\r\n touchedMin: boolean;\r\n touchedMax: boolean;\r\n}\r\n\r\n/**\r\n * RangeRefineItem component (controlled by RefineSubmenu)\r\n */\r\n@observer\r\nexport default class RangeRefineItem extends React.Component<IRangeRefineItemProps, IRangeRefineItemState> {\r\n private _formattedPriceReverseLookup: Map<string, string> = new Map();\r\n\r\n private minInput: React.RefObject<HTMLInputElement>;\r\n private maxInput: React.RefObject<HTMLInputElement>;\r\n\r\n @computed get currencyCode(): string {\r\n return this.props.productRefinerValue.UnitText || '';\r\n }\r\n\r\n constructor(props: IRangeRefineItemProps) {\r\n super(props);\r\n this._onRangeUpdate = this._onRangeUpdate.bind(this);\r\n this._onRangeUpdateEnd = this._onRangeUpdateEnd.bind(this);\r\n this._handleRangeTooltipText = this._handleRangeTooltipText.bind(this);\r\n this._changeMin = this._changeMin.bind(this);\r\n this._changeMax = this._changeMax.bind(this);\r\n this._finishChangeMin = this._finishChangeMin.bind(this);\r\n this._finishChangeMax = this._finishChangeMax.bind(this);\r\n\r\n this.minInput = React.createRef<HTMLInputElement>();\r\n this.maxInput = React.createRef<HTMLInputElement>();\r\n\r\n const { selectedRefinementCriterion } = this.props;\r\n const initialMin = selectedRefinementCriterion && selectedRefinementCriterion.LeftValueBoundString || '0';\r\n const initialMax = selectedRefinementCriterion && selectedRefinementCriterion.RightValueBoundString || undefined;\r\n this.state = {\r\n isChecked: false,\r\n validationErrorMin: undefined,\r\n validationErrorMax: undefined,\r\n selectedMin: initialMin,\r\n selectedMax: initialMax,\r\n touchedMin: false,\r\n touchedMax: false\r\n };\r\n }\r\n\r\n public render(): JSX.Element | undefined {\r\n const { productRefinerValue, parentProductRefinerHierarchy, refineItemCommonProps } = this.props;\r\n\r\n if (!productRefinerValue || !parentProductRefinerHierarchy) {\r\n refineItemCommonProps.telemetry.error('Cannot render refine value range without productRefinerValue and parentProductRefinerHierarchy');\r\n return undefined;\r\n }\r\n\r\n if (this.props.rangeType === 'input') {\r\n return this._renderInputFields();\r\n }\r\n\r\n return this._renderSlider();\r\n }\r\n\r\n private _renderInputFields(): JSX.Element | undefined {\r\n const { isDisabled, parentProductRefinerHierarchy, refineItemCommonProps } = this.props;\r\n const { selectedMin, selectedMax, touchedMin, touchedMax, validationErrorMin, validationErrorMax } = this.state;\r\n\r\n const rangeAriaLabel = (refineItemCommonProps.rangeNameFormat || '{0}').replace('{0}', (parentProductRefinerHierarchy.KeyName || ''));\r\n const formAttrs = {\r\n 'aria-label': rangeAriaLabel,\r\n 'aria-disabled': isDisabled\r\n };\r\n\r\n // To enable price formatting of selected fields, this is the approach:\r\n // initial value: min=0 formatted as price, max=undefined\r\n // onFocus/onChange: convert to number (unformat) and mark as touched to indicate value is being edited\r\n // onBlur: validate and format entered value as price\r\n const minInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-min ${validationErrorMin ? 'refine-submenu__input-range--error' : ''}`;\r\n const maxInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-max ${validationErrorMax ? 'refine-submenu__input-range--error' : ''}`;\r\n const minLabelClassName = 'ms-refine-submenu__input-range-label refine-submenu__input-range-label-min';\r\n const maxLabelClassName = 'ms-refine-submenu__input-range-label refine-submenu__input-range-label-max';\r\n const formattedSelectedMin = this._getFormattedSelectedValue(selectedMin, touchedMin, validationErrorMin);\r\n const formattedSelectedMax = this._getFormattedSelectedValue(selectedMax, touchedMax, validationErrorMax);\r\n return (\r\n <form className='ms-refine-submenu__input-range-refiner' {...formAttrs}>\r\n <label className={minLabelClassName}>\r\n {refineItemCommonProps.minLabel}\r\n <input\r\n className={minInputClassName}\r\n onChange={this._changeMin}\r\n onFocus={this._changeMin}\r\n onBlur={this._finishChangeMin}\r\n value={formattedSelectedMin}\r\n ref={this.minInput}\r\n />\r\n </label>\r\n <label className={maxLabelClassName}>\r\n {refineItemCommonProps.maxLabel}\r\n <input\r\n className={maxInputClassName}\r\n placeholder={formattedSelectedMax ? undefined : refineItemCommonProps.placeholderTextMax}\r\n onChange={this._changeMax}\r\n onFocus={this._changeMax}\r\n onBlur={this._finishChangeMax}\r\n value={formattedSelectedMax}\r\n ref={this.maxInput}\r\n />\r\n </label>\r\n {validationErrorMin &&\r\n <span className='ms-refine-submenu__input-range-error-text refine-submenu__input-range-min-error-text'>{validationErrorMin}</span>\r\n }\r\n {validationErrorMax && validationErrorMin !== validationErrorMax &&\r\n <span className='ms-refine-submenu__input-range-error-text refine-submenu__input-range-max-error-text'>{validationErrorMax}</span>\r\n }\r\n </form>\r\n );\r\n }\r\n\r\n private _renderSlider(): JSX.Element | undefined {\r\n const { isDisabled, productRefinerValue, parentProductRefinerHierarchy, selectedRefinementCriterion } = this.props;\r\n const min = productRefinerValue.LeftValueBoundString;\r\n const max = productRefinerValue.RightValueBoundString;\r\n const selectedMin = selectedRefinementCriterion && selectedRefinementCriterion.LeftValueBoundString || productRefinerValue.LeftValueBoundString || '0';\r\n const selectedMax = selectedRefinementCriterion && selectedRefinementCriterion.RightValueBoundString || productRefinerValue.RightValueBoundString || max;\r\n const sliderId = `slider_${parentProductRefinerHierarchy.RecordId}_${productRefinerValue.RefinerRecordId}`;\r\n const ariaAttributes = {\r\n 'aria-disabled': isDisabled\r\n };\r\n\r\n const minPrice = this._formatPrice(min);\r\n const maxPrice = this._formatPrice(max);\r\n const selectedMinPrice = this._formatPrice(selectedMin);\r\n const selectedMaxPrice = this._formatPrice(selectedMax);\r\n\r\n return (\r\n <Slider\r\n className={'ms-refine-submenu__range-refiner'}\r\n key={sliderId}\r\n id={sliderId}\r\n inForm={false}\r\n min={min && Number(min) || undefined}\r\n max={max && Number(max) || undefined}\r\n step={1}\r\n orientation={'horizontal'}\r\n labels={[\r\n {\r\n labelId: `${sliderId}_start`,\r\n labelString: `${minPrice}`,\r\n labelPositioning: 'start'\r\n },\r\n {\r\n labelId: `${sliderId}_end`,\r\n labelString: `${maxPrice}`,\r\n labelPositioning: 'end'\r\n }\r\n ]}\r\n showLabels={true}\r\n showTooltip={true}\r\n sliderThumbs={[\r\n {\r\n id: `${sliderId}_slider_thumb_start`,\r\n value: selectedMin && Number(selectedMin) || 0,\r\n ariaLabel: `${this.props.minValueSliderThumbAriaLabel} ${this.currencyCode}`,\r\n ariaValueText: `${selectedMinPrice}`\r\n },\r\n {\r\n id: `${sliderId}_slider_thumb_end`,\r\n value: Number(selectedMax) || Number(maxPrice),\r\n ariaLabel: `${this.props.maxValueSliderThumbAriaLabel} ${this.currencyCode}`,\r\n ariaValueText: `${selectedMaxPrice}`\r\n }\r\n ]}\r\n onChangeEnd={this._onRangeUpdateEnd}\r\n onChange={debounce(this._onRangeUpdate, 500)}\r\n handleTooltipText={this._handleRangeTooltipText}\r\n {...ariaAttributes}\r\n />\r\n );\r\n }\r\n\r\n private _changeMin(event: React.FocusEvent<HTMLInputElement>): void {\r\n this._changeValue(event, 'Min');\r\n }\r\n\r\n private _changeMax(event: React.FocusEvent<HTMLInputElement>): void {\r\n this._changeValue(event, 'Max');\r\n }\r\n\r\n private _changeValue(event: React.FocusEvent<HTMLInputElement>, inputType: InputType): void {\r\n const selectedKey = `selected${inputType}`;\r\n const touchedKey = `touched${inputType}`;\r\n this.setState({\r\n [selectedKey]: this._getInputWithoutFormatting(event.currentTarget.value),\r\n [touchedKey]: true\r\n });\r\n }\r\n\r\n private _finishChangeMin(event: React.FocusEvent<HTMLInputElement>): boolean {\r\n const selectedMinValue = this._getInputWithoutFormatting(event.currentTarget.value);\r\n this.setState({\r\n selectedMin: selectedMinValue,\r\n minTouched: false\r\n });\r\n const minInput = Number(selectedMinValue);\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue, refineItemCommonProps, selectedRefinementCriterion } = this.props;\r\n const max = selectedRefinementCriterion && selectedRefinementCriterion.RightValueBoundString || undefined;\r\n\r\n const maxNum = max ? Number(max) : undefined;\r\n\r\n if (isNaN(minInput)) {\r\n this.setState({ validationErrorMin: refineItemCommonProps.validationErrorNaN });\r\n this._focus('Min');\r\n return false;\r\n }\r\n\r\n if (this._validateRange(minInput, maxNum)) {\r\n onToggle({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: minInput,\r\n rangeEnd: maxNum\r\n });\r\n return true;\r\n } else {\r\n this._focus('Min');\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private _finishChangeMax(event: React.FocusEvent<HTMLInputElement>): boolean {\r\n const selectedMaxValue = this._getInputWithoutFormatting(event.currentTarget.value);\r\n this.setState({\r\n selectedMax: selectedMaxValue,\r\n maxTouched: false\r\n });\r\n const maxInput = Number(selectedMaxValue);\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue, refineItemCommonProps, selectedRefinementCriterion } = this.props;\r\n const min = selectedRefinementCriterion && selectedRefinementCriterion.LeftValueBoundString || '0';\r\n\r\n const minNum = Number(min);\r\n\r\n if (isNaN(maxInput)) {\r\n this.setState({ validationErrorMax: refineItemCommonProps.validationErrorNaN });\r\n this._focus('Max');\r\n return false;\r\n }\r\n\r\n if (this._validateRange(minNum, maxInput)) {\r\n if (productRefinerValue) {\r\n onToggle({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: minNum,\r\n rangeEnd: maxInput\r\n });\r\n } else {\r\n this._focus('Max');\r\n }\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private _focus(inputType: InputType): void {\r\n const ref = inputType === 'Max' ? this.maxInput : this.minInput;\r\n\r\n setTimeout(() => {\r\n if (ref && ref.current) {\r\n ref.current.focus();\r\n }\r\n }, 50);\r\n }\r\n\r\n private _getFormattedSelectedValue(selected: string | undefined, touched: boolean, validationError: string | undefined): string | undefined {\r\n if (touched || validationError || selected === undefined) {\r\n return selected;\r\n }\r\n return this._formatPrice(selected);\r\n }\r\n\r\n private _validateRange(min: number, max: number | undefined): boolean {\r\n const { refineItemCommonProps } = this.props;\r\n if (max === undefined) {\r\n return true;\r\n }\r\n\r\n if (min > max) {\r\n this.setState({\r\n validationErrorMin: refineItemCommonProps.validationErrorRange,\r\n validationErrorMax: refineItemCommonProps.validationErrorRange\r\n });\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private _formatPrice(amount: string | undefined): string {\r\n const locale = this.props.refineItemCommonProps.locale;\r\n const result = formatPrice(amount, this.currencyCode, locale, this.props.refineItemCommonProps.telemetry);\r\n if (this.props.productRefinerValue!.LeftValueBoundString === '0' && this.props.productRefinerValue!.RightValueBoundString === '0') {\r\n return result.slice(2);\r\n }\r\n if (amount !== undefined && !this._formattedPriceReverseLookup.has(result)) {\r\n this._formattedPriceReverseLookup.set(result, amount);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private _getInputWithoutFormatting(input: string): string {\r\n // First try to cast raw input to a number\r\n const inputAsNum = Number(input);\r\n if (!isNaN(inputAsNum)) {\r\n return input;\r\n }\r\n\r\n // Otherwise try a reverse lookup and fall back to the raw input if all else fails\r\n const reverseLookupResult = this._formattedPriceReverseLookup.get(input);\r\n return reverseLookupResult || input;\r\n }\r\n\r\n // NOTE: Fix types once Shared Components build pipeline bug fixed\r\n // tslint:disable-next-line:no-any\r\n private _onRangeUpdate(sliderChangeNotification: any): void {\r\n // Need to filter out mousemove events as these cause errors after the menu updates and slider re-renders\r\n if (sliderChangeNotification.eventType !== 'mousemove') {\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\r\n if (productRefinerValue && sliderChangeNotification) {\r\n onToggle({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: sliderChangeNotification.firstThumbValue,\r\n rangeEnd: sliderChangeNotification.secondThumbValue\r\n });\r\n\r\n this._focusOnSliderThumb(sliderChangeNotification);\r\n }\r\n }\r\n }\r\n\r\n // tslint:disable-next-line\r\n private _onRangeUpdateEnd(sliderChangeNotification: any): void {\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\r\n if (productRefinerValue && sliderChangeNotification) {\r\n onToggle({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: sliderChangeNotification.firstThumbValue,\r\n rangeEnd: sliderChangeNotification.secondThumbValue\r\n });\r\n\r\n this._focusOnSliderThumb(sliderChangeNotification);\r\n }\r\n }\r\n\r\n // tslint:disable-next-line\r\n private _focusOnSliderThumb(sliderChangeNotification: any): void {\r\n if (sliderChangeNotification.id) {\r\n const element = document.getElementById(sliderChangeNotification.id);\r\n if (!!element) {\r\n setTimeout(\r\n () => {\r\n element.focus();\r\n },\r\n 0);\r\n }\r\n }\r\n }\r\n\r\n private _handleRangeTooltipText(tooltip: number): string {\r\n return this._formatPrice(`${tooltip}`);\r\n }\r\n}","import { IRefineItemCommonProps, IRefineItemToggleNotification } from '@msdyn365-commerce-modules/search-result-container';\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { RatingComponent } from '@msdyn365-commerce/components';\r\nimport { ICoreContext } from '@msdyn365-commerce/core';\r\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\nimport { ProductRefinerSource, ProductRefinerTypeValue } from './utilities';\r\n\r\n/**\r\n * RefineItem properties\r\n */\r\nexport interface IRefineItemProps {\r\n\r\n parentProductRefinerHierarchy: IProductRefinerHierarchy;\r\n productRefinerValue: ProductRefinerValue;\r\n selectedRefinementCriterion: ProductRefinerValue | undefined;\r\n refineItemCommonProps: IRefineItemCommonProps;\r\n isDisabled: boolean;\r\n keyId: number;\r\n context: ICoreContext;\r\n moduleId: string;\r\n moduleTypeName: string;\r\n onToggle(notfication: Readonly<IRefineItemToggleNotification>): void;\r\n urlBuilder(refiner: IRefineItemToggleNotification): string;\r\n}\r\n\r\n/**\r\n * Refine item state\r\n */\r\nexport interface IRefineItemState extends React.ComponentState {\r\n isChecked: boolean;\r\n renderingError?: object;\r\n}\r\n\r\n/**\r\n * Single-select and multi-select refine item component (controlled by RefineSubmenu)\r\n */\r\nexport default class RefineItem extends React.Component<IRefineItemProps, IRefineItemState> {\r\n private anchorType: React.RefObject<HTMLAnchorElement>;\r\n\r\n constructor(props: IRefineItemProps) {\r\n super(props);\r\n this._onClick = this._onClick.bind(this);\r\n this.state = {\r\n isChecked: !!this.props.selectedRefinementCriterion\r\n };\r\n this.anchorType = React.createRef();\r\n }\r\n\r\n public render(): JSX.Element | undefined {\r\n const {\r\n isDisabled,\r\n refineItemCommonProps,\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n selectedRefinementCriterion,\r\n // @ts-ignore\r\n children,\r\n onToggle,\r\n context,\r\n keyId,\r\n ...attrs\r\n } = this.props;\r\n if (!productRefinerValue) {\r\n refineItemCommonProps.telemetry.error('[refine-item] Cannot render refineItem without productRefinerValue');\r\n return undefined;\r\n }\r\n if (!productRefinerValue.LeftValueBoundString) {\r\n refineItemCommonProps.telemetry.warning(`[refine-item] RefineItem without LeftValueBoundString: ${JSON.stringify(productRefinerValue)}`);\r\n }\r\n const isSingleSelect = parentProductRefinerHierarchy.RefinerTypeValue === ProductRefinerTypeValue.Single;\r\n let itemTypeClassName = isSingleSelect ? 'single-select' : 'multi-select';\r\n itemTypeClassName = `ms-refine-submenu-item ${itemTypeClassName}`;\r\n const inputType = isSingleSelect ? 'radio' : 'checkbox';\r\n const role = isSingleSelect ? 'radio' : undefined;\r\n itemTypeClassName = !!selectedRefinementCriterion ? `${itemTypeClassName}-checked` : itemTypeClassName;\r\n if (parentProductRefinerHierarchy.SourceValue === ProductRefinerSource.Rating) {\r\n if (productRefinerValue.LeftValueBoundString) {\r\n return (\r\n <li\r\n className='ms-refine-submenu-item'\r\n role='radio'\r\n aria-checked='false'\r\n id={`${parentProductRefinerHierarchy.KeyName!}_${productRefinerValue.LeftValueBoundLocalizedString}`}\r\n aria-label={`${parentProductRefinerHierarchy.KeyName!}_${productRefinerValue.LeftValueBoundLocalizedString}`}\r\n >\r\n <a\r\n href={this._getRefinerUrl()}\r\n aria-label={`${parentProductRefinerHierarchy.KeyName!}_${productRefinerValue.LeftValueBoundLocalizedString}`}\r\n onClick={this._onClick}\r\n >\r\n <RatingComponent\r\n avgRating={parseInt(productRefinerValue.LeftValueBoundString, 10)}\r\n ratingCount={productRefinerValue.LeftValueBoundLocalizedString ? productRefinerValue.LeftValueBoundLocalizedString : productRefinerValue.LeftValueBoundString}\r\n hideCount={false}\r\n readOnly={true}\r\n ariaLabel=''\r\n context={context}\r\n id={this.props.moduleId}\r\n typeName={this.props.moduleTypeName}\r\n data={{}}\r\n />\r\n <span className='refine-submenu-item__rating'>{productRefinerValue.Count !== undefined && `(${productRefinerValue.Count})`}</span>\r\n </a>\r\n </li>\r\n );\r\n } else {\r\n return undefined;\r\n }\r\n } else {\r\n return (\r\n <li className='ms-refine-submenu-item' role={role} id={`${parentProductRefinerHierarchy.KeyName!}_${productRefinerValue.LeftValueBoundString}_${keyId}`}>\r\n <a\r\n key={!!selectedRefinementCriterion ? 'true' : 'false'}\r\n ref={this.anchorType}\r\n href={this._getRefinerUrl()}\r\n tabIndex={0}\r\n onClick={this._onClick}\r\n className={itemTypeClassName}\r\n role={inputType}\r\n aria-checked={!!selectedRefinementCriterion}\r\n {...attrs}\r\n >\r\n <span className='checkmark'/>\r\n <span className='ms-refine-submenu-item__label'>\r\n {productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString}\r\n </span>\r\n </a>\r\n </li>\r\n );\r\n }\r\n }\r\n\r\n private _getRefinerUrl(): string {\r\n const { urlBuilder, parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\r\n\r\n if (productRefinerValue) {\r\n return urlBuilder({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: !selectedRefinementCriterion\r\n });\r\n }\r\n\r\n return '';\r\n }\r\n\r\n private _onClick = (e: React.MouseEvent<HTMLAnchorElement | HTMLInputElement>): void => {\r\n e.preventDefault();\r\n\r\n const { parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\r\n if (productRefinerValue) {\r\n this.props.onToggle({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: !selectedRefinementCriterion\r\n });\r\n\r\n setTimeout(\r\n () => {\r\n this.anchorType.current && this.anchorType.current.focus();\r\n },\r\n 0\r\n );\r\n }\r\n }\r\n}","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { findMatchingRefinementCriterion, IRefineItemCommonProps, IRefineItemToggleNotification, RangeRefineItemType } from '@msdyn365-commerce-modules/search-result-container';\r\nimport { Button, Collapse } from '@msdyn365-commerce-modules/utilities';\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { ICoreContext } from '@msdyn365-commerce/core';\r\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\nimport RangeRefineItem from './range-refine-item';\r\nimport RefineItem from './refine-item';\r\nimport { ProductRefinerTypeValue, ProductRefinerValueDataTypeValue } from './utilities';\r\n\r\n/**\r\n * Properties associated with the RefineSubmenu component\r\n */\r\nexport interface IRefineSubmenuProps {\r\n tempRangeTypeTODO: RangeRefineItemType;\r\n minValueSliderThumbAriaLabel?: string;\r\n maxValueSliderThumbAriaLabel?: string;\r\n productRefinerHierarchy: IProductRefinerHierarchy;\r\n selectedRefinerValues: ProductRefinerValue[];\r\n sortingCriteraValues?: string[];\r\n refineItemCommonProps: IRefineItemCommonProps;\r\n isDisabled: boolean;\r\n isExpandedOnInitialLoad: boolean;\r\n context: ICoreContext;\r\n moduleId: string;\r\n moduleTypeName: string;\r\n refinersToBeUpdated: string;\r\n onUpdateRefiners(notfication: Readonly<IRefineItemToggleNotification>): void;\r\n urlBuilder(refiner: IRefineItemToggleNotification): string;\r\n}\r\n\r\n/**\r\n * Refine submenu state\r\n */\r\nexport interface IRefineSubmenuState extends React.ComponentState {\r\n expanded: boolean;\r\n}\r\n\r\n/**\r\n *\r\n * The RefineSubmenu component renders the submenu category and child items.\r\n * This computed observes the stateful category hierarchy object.\r\n * @extends {React.PureComponent<IRefineSubmenuProps>}\r\n */\r\nclass RefineSubmenu extends React.Component<IRefineSubmenuProps, IRefineSubmenuState> {\r\n constructor(props: IRefineSubmenuProps) {\r\n super(props);\r\n\r\n this._onToggleItem = this._onToggleItem.bind(this);\r\n this._onToggleSubmenu = this._onToggleSubmenu.bind(this);\r\n\r\n let isExpanded = this.props.isExpandedOnInitialLoad;\r\n if (this.props.productRefinerHierarchy.DataTypeValue === ProductRefinerValueDataTypeValue.Range) {\r\n isExpanded = true;\r\n }\r\n\r\n this.state = {\r\n expanded: isExpanded\r\n };\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { productRefinerHierarchy, refineItemCommonProps, refinersToBeUpdated } = this.props;\r\n\r\n if (!productRefinerHierarchy) {\r\n refineItemCommonProps.telemetry.error('Cannot render submenu without refiner hierarchy data');\r\n }\r\n const refinersLists = refinersToBeUpdated && refinersToBeUpdated.split(',');\r\n let refinerName = productRefinerHierarchy.KeyName || '';\r\n refinersLists && refinersLists.map((refiners: string) => {\r\n if (refiners.split('|').length > 1 && refiners.split('|')[0].toLowerCase() === refinerName?.toLowerCase()) {\r\n refinerName = refiners.split('|')[1] && refiners.split('|')[1] || refinerName;\r\n }\r\n });\r\n\r\n return (\r\n <div className='ms-refine-submenu list-group'>\r\n <Button\r\n className={this.state.expanded ? 'ms-refine-submenu__toggle_expanded' : 'ms-refine-submenu__toggle_collapsed'}\r\n aria-label={refinerName || 'refiner.Name'}\r\n onClick={this._onToggleSubmenu}\r\n aria-expanded={this.state.expanded}\r\n >\r\n {refinerName}\r\n </Button>\r\n <Collapse isOpen={this.state.expanded} timeout={350}>\r\n {this._renderChildItems(productRefinerHierarchy)}\r\n </Collapse>\r\n </div>\r\n );\r\n }\r\n\r\n private _renderChildItems(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n switch (productRefinerHierarchy.DataTypeValue) {\r\n case ProductRefinerValueDataTypeValue.Range:\r\n case ProductRefinerValueDataTypeValue.RangeInput:\r\n return this._renderRange(productRefinerHierarchy);\r\n default:\r\n return this._renderSingleMultiSelect(productRefinerHierarchy);\r\n }\r\n }\r\n\r\n private _renderSingleMultiSelect(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n const { isDisabled, refineItemCommonProps, selectedRefinerValues, sortingCriteraValues, context } = this.props;\r\n const isSingleSelect = productRefinerHierarchy.RefinerTypeValue === ProductRefinerTypeValue.Single;\r\n const role = isSingleSelect ? { role: 'radiogroup' } : undefined;\r\n // const refinerValuesList = (productRefinerHierarchy.Values || []);\r\n const refinerValuesList = (productRefinerHierarchy.Values || []).sort(function (a:ProductRefinerValue,b:ProductRefinerValue){\r\n if(a.LeftValueBoundString && b.LeftValueBoundString){ return a.LeftValueBoundString.localeCompare(b.LeftValueBoundString)}\r\n return 0;\r\n });\r\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\r\n if (!child) {\r\n refineItemCommonProps.telemetry.error(\r\n `[refine-submenu] Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\r\n );\r\n return null;\r\n }\r\n\r\n let selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\r\n\r\n if (child.RightValueBoundString && sortingCriteraValues && sortingCriteraValues?.indexOf(child.RightValueBoundString) !== -1) {\r\n selectedRefinementCriterion = child;\r\n }\r\n return (\r\n <RefineItem\r\n parentProductRefinerHierarchy={productRefinerHierarchy}\r\n productRefinerValue={child}\r\n selectedRefinementCriterion={selectedRefinementCriterion}\r\n refineItemCommonProps={refineItemCommonProps}\r\n onToggle={this._onToggleItem}\r\n urlBuilder={this.props.urlBuilder}\r\n isDisabled={isDisabled}\r\n key={index}\r\n context={context}\r\n moduleId={this.props.moduleId}\r\n moduleTypeName={this.props.moduleTypeName}\r\n keyId = {index}\r\n />\r\n );\r\n });\r\n return (\r\n <ul className='ms-refine-submenu__list' {...role} aria-label={productRefinerHierarchy.KeyName}>\r\n {listItems}\r\n </ul>\r\n );\r\n }\r\n\r\n private _renderRange(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n const { isDisabled, refineItemCommonProps, selectedRefinerValues, context, minValueSliderThumbAriaLabel, maxValueSliderThumbAriaLabel } = this.props;\r\n const submenuClassNamePrefix = 'ms-refine-submenu__item list-group-item refine-submenu__item';\r\n const refinerValuesList = (productRefinerHierarchy.Values || []);\r\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\r\n if (!child) {\r\n refineItemCommonProps.telemetry.error(\r\n `Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\r\n );\r\n return null;\r\n }\r\n\r\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\r\n\r\n // TODO BUGBUG 22424559 determine only from the DataTypeValue once live example is working (can test with the tempRangeTypeTODO derived from QSP until then)\r\n const rangeType = (productRefinerHierarchy.DataTypeValue === ProductRefinerValueDataTypeValue.RangeInput || this.props.tempRangeTypeTODO === 'input') ?\r\n 'input' :\r\n 'slider';\r\n const key = selectedRefinementCriterion ? `${selectedRefinementCriterion.LeftValueBoundString}-${selectedRefinementCriterion.RightValueBoundString}` : `not-selected-${index}`;\r\n return (\r\n <li className={`${submenuClassNamePrefix}--range`} key={index}>\r\n <RangeRefineItem\r\n parentProductRefinerHierarchy={productRefinerHierarchy}\r\n productRefinerValue={child}\r\n selectedRefinementCriterion={selectedRefinementCriterion}\r\n refineItemCommonProps={refineItemCommonProps}\r\n onToggle={this._onToggleItem}\r\n urlBuilder={this.props.urlBuilder}\r\n isDisabled={isDisabled}\r\n rangeType={rangeType}\r\n key={key}\r\n context={context}\r\n minValueSliderThumbAriaLabel={minValueSliderThumbAriaLabel}\r\n maxValueSliderThumbAriaLabel={maxValueSliderThumbAriaLabel}\r\n moduleId={this.props.moduleId}\r\n moduleTypeName={this.props.moduleTypeName}\r\n keyId = {index}\r\n />\r\n </li>\r\n );\r\n });\r\n return <ul className='ms-refine-submenu__list list-unstyled'>{listItems}</ul>;\r\n }\r\n\r\n private _onToggleItem(itemToggleNotification: IRefineItemToggleNotification): void {\r\n this.props.onUpdateRefiners(itemToggleNotification);\r\n }\r\n\r\n private _onToggleSubmenu(): void {\r\n this.setState(prevState => ({\r\n expanded: !prevState.expanded\r\n }));\r\n }\r\n}\r\n\r\nexport default RefineSubmenu;","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport MsDyn365, { IRequestContext } from '@msdyn365-commerce/core';\r\nimport { ProductRefinerValue, SortColumn } from '@msdyn365-commerce/retail-proxy';\r\n\r\n/**\r\n * Refiner Compression:\r\n * Refiners contains a non-trivial amount of data that is required to successfully make\r\n * a refiner-based API call. To allow for deep-linking of refiners in the URL, refiner data\r\n * must be compressed so that URL max length is not exceeded. Refiners will be compressed into\r\n * the following array style index-based format:\r\n * [DataTypeValue, LeftValueBoundString, RefinerRecordId, RefinerSourceValue, RightValueBoundString, UnitText]\r\n */\r\nconst compressedRefinerKeys = ['DataTypeValue', 'LeftValueBoundString', 'RefinerRecordId', 'RefinerSourceValue', 'RightValueBoundString', 'UnitText'];\r\n\r\n/**\r\n * Hydrates compressed refiner data from URL\r\n * @param fullUrl The full URL of the page\r\n */\r\nexport const hydrateRefinersFromUrl = (requestContext: IRequestContext): ProductRefinerValue[] => {\r\n const compressedRefinerArray = parseQueryParam<(string | number)[][]>('refiners', requestContext);\r\n if (!compressedRefinerArray || !compressedRefinerArray.length) {\r\n return [];\r\n }\r\n\r\n return <ProductRefinerValue[]>compressedRefinerArray.map((compressedRefiner) => {\r\n try {\r\n const parsedRefiner: ProductRefinerValue = {};\r\n compressedRefinerKeys.forEach((refinerKey, index) => {\r\n // @ts-ignore: This line is intentionally not typesafe\r\n parsedRefiner[refinerKey] = compressedRefiner[index];\r\n });\r\n return parsedRefiner;\r\n } catch (e) {\r\n return undefined;\r\n }\r\n }).filter(Boolean);\r\n};\r\n\r\n/**\r\n * Compressed a list of refiners for use in URLs\r\n * @param refiners The uncompressed refiners\r\n */\r\nexport const compressRefiners = (refiners: ProductRefinerValue[]) => {\r\n const compressedRefiners: (string | number)[][] = [];\r\n\r\n refiners.forEach((refiner) => {\r\n const compressedRefiner: (string | number)[] = [];\r\n compressedRefinerKeys.forEach((refinerKey) => {\r\n // @ts-ignore: This line is intentionally not typesafe\r\n compressedRefiner.push(refiner[refinerKey]);\r\n });\r\n compressedRefiners.push(compressedRefiner);\r\n });\r\n\r\n return compressedRefiners;\r\n};\r\n\r\n/**\r\n * Method which creates a URL contiaining serialized active refiners\r\n * @param fullUrl The Current URL of the page\r\n * @param refiners The refiners which should be added to the URL\r\n */\r\nexport const buildListPageUrl = (fullUrl: URL, refiners?: ProductRefinerValue[], sortingColumns?: SortColumn[], skipCount?: number) => {\r\n // Refiner Change flow\r\n if (refiners !== undefined) {\r\n if (!refiners.length) {\r\n fullUrl.searchParams.delete('refiners');\r\n } else {\r\n fullUrl.searchParams.set('refiners', JSON.stringify(compressRefiners(refiners)));\r\n }\r\n\r\n // Adding or removing a refiner means we want to always load page 1\r\n fullUrl.searchParams.delete('skip');\r\n return fullUrl.href;\r\n }\r\n\r\n if (sortingColumns !== undefined) {\r\n if (!sortingColumns.length) {\r\n fullUrl.searchParams.delete('sorting');\r\n } else {\r\n fullUrl.searchParams.set('sorting', JSON.stringify(sortingColumns));\r\n }\r\n\r\n // Changing the sort means always load page 1\r\n fullUrl.searchParams.delete('skip');\r\n return fullUrl.href;\r\n }\r\n\r\n if (skipCount) {\r\n fullUrl.searchParams.set('skip', skipCount.toString());\r\n }\r\n\r\n return fullUrl.href;\r\n};\r\n\r\n/**\r\n * Parses a query param from the query object of the request context\r\n * @param key The query parameter key\r\n * @param requestContext The request context\r\n */\r\nexport const parseQueryParam = <T>(key: string, requestContext: IRequestContext): T | null => {\r\n if (requestContext.query && requestContext.query[key]) {\r\n return <T>JSON.parse(decodeURIComponent(requestContext.query[key]));\r\n }\r\n return null;\r\n};\r\n\r\n/**\r\n * Gets the current URL of the page from the request context\r\n * @param requestContext The request context\r\n */\r\nexport const getCurrentUrl = (requestContext: IRequestContext): URL => {\r\n if (MsDyn365.isBrowser) {\r\n return new URL(window.location.href);\r\n } else {\r\n // NOTE: Typing on requestURL is incorrect\r\n if (requestContext.url.requestUrl.href) {\r\n return new URL(requestContext.url.requestUrl.href);\r\n } else {\r\n return new URL(<string><unknown>(requestContext.url.requestUrl));\r\n }\r\n }\r\n};\r\n","import { getUpdatedRefinementCriteria, IRefineItemCommonProps, IRefineItemToggleNotification, ISearchResultContainerViewProps } from '@msdyn365-commerce-modules/search-result-container';\r\nimport { Button,ILabeledDropdownOption, INodeProps, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { SortColumn } from '@msdyn365-commerce/retail-proxy';\r\nimport { transaction } from 'mobx';\r\nimport * as React from 'react';\r\nimport { ICittaSearchResultContainerProps } from '../../modules/citta-search-result-container/citta-search-result-container.props.autogenerated';\r\nimport RefineSubmenu from './refine-submenu';\r\nimport { buildListPageUrl, getCurrentUrl } from './url-utils';\r\nexport interface ISortByViewProps {\r\n SortingContainer: INodeProps;\r\n sortByDropDown?: React.ReactNode;\r\n}\r\n\r\nexport interface ISortByProps {\r\n props: ISearchResultContainerViewProps & ICittaSearchResultContainerProps<{}>;\r\n}\r\n\r\nexport interface ISortByOptionsState {\r\n sortingState: ISortByCollectionState;\r\n}\r\n\r\ninterface ISortByCollectionState {\r\n selectedSortByOption: ILabeledDropdownOption;\r\n dropdownOpen: boolean;\r\n pending: boolean;\r\n}\r\nexport interface IRefineMenuViewProps {\r\n RefineMenuContainer: INodeProps;\r\n RefinerSectionContainer: INodeProps;\r\n refinersHeader: React.ReactNode;\r\n refiners?: React.ReactNode[];\r\n}\r\n\r\nconst sortOptions = {\r\n sortByOptionRelevanceDesc: 'Ranking-Desc',\r\n sortByOptionRatingAsc: 'AverageRating-Asc',\r\n sortByOptionRatingDesc: 'AverageRating-Desc',\r\n sortByOptionNameAsc: 'Name-Asc',\r\n sortByOptionNameDesc: 'Name-Desc',\r\n sortByOptionPriceAsc: 'Price-Asc',\r\n sortByOptionPriceDesc: 'Price-Desc'\r\n};\r\n\r\nexport interface IRefinerProps {\r\n props: ISearchResultContainerViewProps & ICittaSearchResultContainerProps<{}>;\r\n toggleModal: Function;\r\n}\r\n/** This component will be used to render Refiners on Citta category and search results page */\r\nexport default class CittaRefiners extends React.PureComponent<IRefinerProps> {\r\n private _refineItemCommonProps: IRefineItemCommonProps;\r\n \r\n private sortByDropdownOptions: ILabeledDropdownOption[] = [\r\n { key: sortOptions.sortByOptionRelevanceDesc, value: this.props.props.resources.sortByOptionRelevanceDesc },\r\n { key: sortOptions.sortByOptionNameAsc, value: this.props.props.resources.sortByOptionNameAsc },\r\n { key: sortOptions.sortByOptionNameDesc, value: this.props.props.resources.sortByOptionNameDesc },\r\n { key: sortOptions.sortByOptionPriceAsc, value: this.props.props.resources.sortByOptionPriceAsc },\r\n { key: sortOptions.sortByOptionPriceDesc, value: this.props.props.resources.sortByOptionPriceDesc },\r\n ];\r\n\r\n\r\n constructor(props: IRefinerProps) {\r\n super(props);\r\n const {\r\n placeholderTextMax,\r\n minLabel,\r\n maxLabel,\r\n rangeNameFormat\r\n } = props.props.resources;\r\n\r\n const locale = props.props.context.request.locale;\r\n const telemetry = props.props.telemetry;\r\n const validationErrorNaN = props.props.resources.validationErrorNotNumber;\r\n const validationErrorRange = props.props.resources.validationErrorNotRange;\r\n this._refineItemCommonProps = {\r\n telemetry,\r\n locale,\r\n placeholderTextMax,\r\n minLabel,\r\n maxLabel,\r\n rangeNameFormat,\r\n validationErrorNaN,\r\n validationErrorRange\r\n };\r\n\r\n this.state = {\r\n sortingState: {\r\n pending: false,\r\n dropdownOpen: false,\r\n selectedSortByOption: this.sortByDropdownOptions[0]\r\n }\r\n };\r\n\r\n this._renderRefiners = this._renderRefiners.bind(this);\r\n this._onClearRefiners = this._onClearRefiners.bind(this);\r\n this._getSortColumnFromSelectedOption = this._getSortColumnFromSelectedOption.bind(this);\r\n this._getSortingRefiner = this._getSortingRefiner.bind(this);\r\n\r\n }\r\n public render(): JSX.Element | null {\r\n const refineMenu: IRefineMenuViewProps = this._renderRefiners();\r\n const sortRefiner = this._getSortingRefiner();\r\n\r\n if (refineMenu.refiners) {\r\n return (\r\n \r\n <Node {...refineMenu.RefinerSectionContainer}>\r\n <Node {...refineMenu.RefineMenuContainer}>\r\n {refineMenu.refinersHeader}\r\n {sortRefiner.sortByDropDown}\r\n {refineMenu.refiners.map((submenu, index) => (\r\n <React.Fragment key={index}>\r\n {submenu}\r\n </React.Fragment>\r\n ))}\r\n </Node>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n private _onClearRefiners = (): void => {\r\n const { context } = this.props.props;\r\n const requestContext = context && context.request;\r\n const actionContext = context && context.actionContext;\r\n\r\n if (!requestContext || !actionContext || !this.props.props.data.listPageState.result) {\r\n const error = `Refine menu cannot refine search criteria: ${!requestContext ? 'requestContext ' : ''} ${!actionContext ? 'actionContext ' : ''} could not be found`;\r\n this.props.props.telemetry.warning(error);\r\n }\r\n\r\n window.history.pushState({}, '', buildListPageUrl(getCurrentUrl(requestContext), []));\r\n transaction(() => {\r\n this.props.props.data.listPageState.result!.currentPageNumber = 0;\r\n this.props.props.data.listPageState.result!.activeFilters = [];\r\n });\r\n }\r\n\r\n private _getSortingRefiner = (): ISortByViewProps => {\r\n const { data, context, config } = this.props.props;\r\n\r\n const tempRangeTypeTODO = context.request.query && context.request.query.inputRange ? 'input' : 'slider';\r\n const sortingCritera = (data.listPageState.result && data.listPageState.result.sortingCritera) || undefined;\r\n \r\n let sortByValues:string[] = [];\r\n const activeRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n\r\n if (data.searchConfiguration.result) {\r\n if (sortingCritera && sortingCritera.Columns?.length) {\r\n data.searchConfiguration!.result!.forEach((searchConfiguration) => { \r\n sortingCritera.Columns!.forEach (sortingC => {\r\n if (searchConfiguration.sortColumn.ColumnName === sortingC.ColumnName && searchConfiguration.sortColumn.IsDescending === sortingC.IsDescending) {\r\n sortByValues.push(searchConfiguration.key);\r\n }\r\n })\r\n });\r\n }\r\n }\r\n\r\n let sortByDropdownOptions = [\r\n {\r\n RefinerSourceValue: 1,\r\n DataValueType: 5,\r\n Count: 8,\r\n RowNumber: 0,\r\n RefinerRecordId: 0,\r\n UnitText: 'Sort By',\r\n RightValueBoundString: sortOptions.sortByOptionRelevanceDesc,\r\n LeftValueBoundString: this.props.props.resources.sortByOptionRelevanceDesc\r\n },\r\n {\r\n RefinerSourceValue: 1,\r\n DataValueType: 5,\r\n Count: 8,\r\n RowNumber: 0,\r\n RefinerRecordId: 0,\r\n UnitText: 'Sort By',\r\n RightValueBoundString: sortOptions.sortByOptionNameAsc,\r\n LeftValueBoundString: this.props.props.resources.sortByOptionNameAsc\r\n },\r\n {\r\n RefinerSourceValue: 1,\r\n DataValueType: 5,\r\n Count: 8,\r\n RowNumber: 0,\r\n RefinerRecordId: 0,\r\n UnitText: 'Sort By',\r\n RightValueBoundString: sortOptions.sortByOptionNameDesc,\r\n LeftValueBoundString: this.props.props.resources.sortByOptionNameDesc\r\n },\r\n {\r\n RefinerSourceValue: 1,\r\n DataValueType: 5,\r\n Count: 8,\r\n RowNumber: 0,\r\n RefinerRecordId: 0,\r\n UnitText: 'Sort By',\r\n RightValueBoundString: sortOptions.sortByOptionPriceAsc,\r\n LeftValueBoundString: this.props.props.resources.sortByOptionPriceAsc\r\n },\r\n {\r\n RefinerSourceValue: 1,\r\n DataValueType: 5,\r\n Count: 8,\r\n RowNumber: 0,\r\n RefinerRecordId: 0,\r\n UnitText: 'Sort By',\r\n RightValueBoundString: sortOptions.sortByOptionPriceDesc,\r\n LeftValueBoundString: this.props.props.resources.sortByOptionPriceDesc\r\n }\r\n ];\r\n\r\n let sortBy: IProductRefinerHierarchy = {\r\n KeyName: 'SortBy',\r\n Values: sortByDropdownOptions\r\n } ;\r\n const dropdown = (\r\n <RefineSubmenu\r\n productRefinerHierarchy={sortBy}\r\n sortingCriteraValues={sortByValues}\r\n selectedRefinerValues={activeRefiners}\r\n refineItemCommonProps={this._refineItemCommonProps}\r\n minValueSliderThumbAriaLabel={this.props.props.resources.minValueSliderThumbAriaLabel}\r\n maxValueSliderThumbAriaLabel={this.props.props.resources.maxValueSliderThumbAriaLabel}\r\n key={'sort-by-1'}\r\n onUpdateRefiners={this._updateDropDown}\r\n urlBuilder={this._buildRefinerUrl}\r\n isDisabled={false}\r\n isExpandedOnInitialLoad={false}\r\n tempRangeTypeTODO={tempRangeTypeTODO}\r\n context={context}\r\n moduleId={this.props.props.id}\r\n moduleTypeName={this.props.props.typeName}\r\n refinersToBeUpdated={config.refinersToBeUpdated || ''}\r\n />\r\n );\r\n return {\r\n SortingContainer: { className: 'ms-search-result-container__Sort-by-category' },\r\n sortByDropDown: dropdown\r\n };\r\n }\r\n\r\n private _updateDropDown = (notification: IRefineItemToggleNotification): void => {\r\n let sortColumn = this._getSortColumnFromSelectedOption(notification.productRefinerValue.RightValueBoundString || '')\r\n\r\n window.history.pushState({}, '', buildListPageUrl(getCurrentUrl(this.props.props.context.request), undefined, [sortColumn], undefined));\r\n transaction(() => {\r\n this.props.props.data.listPageState.result!.currentPageNumber = 0;\r\n this.props.props.data.listPageState.result!.sortingCritera = { Columns: [sortColumn] };\r\n });\r\n\r\n this.setState({\r\n sortingState: {\r\n dropdownOpen: false,\r\n pending: false,\r\n selectedSortByOption: this.sortByDropdownOptions[0]\r\n }\r\n });\r\n }\r\n\r\n private _getSortColumnFromSelectedOption = (type: string): SortColumn => {\r\n const { data } = this.props.props;\r\n\r\n if (!data.searchConfiguration.result) {\r\n return {};\r\n }\r\n\r\n const mappedConfiguration = data.searchConfiguration.result.find((searchConfiguration) => { return searchConfiguration.key === type; });\r\n\r\n if (mappedConfiguration) {\r\n return mappedConfiguration.sortColumn;\r\n }\r\n\r\n return {};\r\n }\r\n\r\n private _renderRefiners = (): IRefineMenuViewProps => {\r\n const { data, context, config } = this.props.props;\r\n\r\n const tempRangeTypeTODO = context.request.query && context.request.query.inputRange ? 'input' : 'slider';\r\n const validRefiners = data.refiners.result && data.refiners.result.filter(refiner => {\r\n return refiner.Values.length > 0;\r\n });\r\n const expandedMenusOnLoad = config.expandedMenusOnLoad || 'all';\r\n const activeRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n const refinersHeader =\r\n (\r\n <div className='refine-menu-header'>\r\n <div className='refine-menu-close'>\r\n <Button\r\n className={'refine-menu-close-button'}\r\n // @ts-ignore\r\n onClick={this.props.toggleModal}\r\n >{'x'}\r\n </Button>\r\n </div>\r\n\r\n <div className='refine-menu-header-text'>Refine</div>\r\n <div className='refine-menu-header-action'>\r\n <Button\r\n className={'refine-menu-header-action-link'}\r\n aria-label={'Clear'}\r\n // tslint:disable-next-line: react-this-binding-issue\r\n onClick={this._onClearRefiners}\r\n >{'Clear'}\r\n </Button>\r\n </div>\r\n </div>\r\n );\r\n\r\n \r\n let orderedRefiners: IProductRefinerHierarchy[] = [];\r\n\r\n if (validRefiners && validRefiners.length){\r\n let refinerCat = validRefiners.find(refiner => refiner.KeyName === 'Refiner Category');\r\n refinerCat && orderedRefiners.push(refinerCat)\r\n \r\n validRefiners.forEach(refiner => {\r\n \r\n if (refiner.KeyName !== 'Refiner Category') {\r\n orderedRefiners.push(refiner)\r\n }\r\n })\r\n }\r\n const subMenus = orderedRefiners && orderedRefiners.map((productRefinerHierarchy: IProductRefinerHierarchy, index: number) => {\r\n const hiddenRefinersList = config.refinersToBeHidden && config.refinersToBeHidden.toLowerCase().split(',');\r\n if (productRefinerHierarchy.KeyName !== 'Category' && (hiddenRefinersList ? (hiddenRefinersList.indexOf(productRefinerHierarchy.KeyName!.toLowerCase()) === -1 && productRefinerHierarchy.KeyName!.toLowerCase() !== 'rating') : true)) {\r\n let isExpanded: boolean;\r\n switch (expandedMenusOnLoad) {\r\n case 'none':\r\n isExpanded = false;\r\n break;\r\n case 'first':\r\n isExpanded = index === 0;\r\n break;\r\n case 'all':\r\n default:\r\n isExpanded = true;\r\n }\r\n if (context.request && context.request.device && context.request.device.Type === 'Mobile') {\r\n if (productRefinerHierarchy.KeyName === \"Refiner Category\") {\r\n isExpanded = true;\r\n }\r\n }\r\n\r\n return (\r\n <RefineSubmenu\r\n productRefinerHierarchy={productRefinerHierarchy}\r\n selectedRefinerValues={activeRefiners}\r\n refineItemCommonProps={this._refineItemCommonProps}\r\n minValueSliderThumbAriaLabel={this.props.props.resources.minValueSliderThumbAriaLabel}\r\n maxValueSliderThumbAriaLabel={this.props.props.resources.maxValueSliderThumbAriaLabel}\r\n key={index}\r\n onUpdateRefiners={this._onUpdateRefiners}\r\n urlBuilder={this._buildRefinerUrl}\r\n isDisabled={false}\r\n isExpandedOnInitialLoad={isExpanded}\r\n tempRangeTypeTODO={tempRangeTypeTODO}\r\n context={context}\r\n moduleId={this.props.props.id}\r\n moduleTypeName={this.props.props.typeName}\r\n refinersToBeUpdated={config.refinersToBeUpdated || ''}\r\n />\r\n );\r\n } else {\r\n return undefined;\r\n }\r\n });\r\n return {\r\n RefineMenuContainer: { className: 'ms-search-result-container__refine-menu' },\r\n RefinerSectionContainer: { className: 'ms-search-result-container__refiner-section' },\r\n refinersHeader: refinersHeader,\r\n refiners: subMenus\r\n };\r\n }\r\n\r\n private _buildRefinerUrl = (itemToggleNotification: IRefineItemToggleNotification): string => {\r\n if (this.props.props.data.listPageState.result) {\r\n const newRefinementCriteria = getUpdatedRefinementCriteria(itemToggleNotification, this.props.props.data.listPageState.result.activeFilters || []);\r\n\r\n return buildListPageUrl(getCurrentUrl(this.props.props.context.request), newRefinementCriteria);\r\n } else {\r\n this.props.props.telemetry.warning(`[buildRefinerQueryString]List Page State Not available, unable to build refiner URL`);\r\n return '';\r\n }\r\n }\r\n\r\n private _onUpdateRefiners = (itemToggleNotification: IRefineItemToggleNotification): void => {\r\n const { context } = this.props.props;\r\n const requestContext = context && context.request;\r\n const actionContext = context && context.actionContext;\r\n\r\n if (!requestContext || !actionContext || !this.props.props.data.listPageState.result) {\r\n const error = `Refine menu cannot refine search criteria: ${!requestContext ? 'requestContext ' : ''} ${!actionContext ? 'actionContext ' : ''} could not be found`;\r\n this.props.props.telemetry.warning(error);\r\n }\r\n\r\n const updatedRefinementCriteria = getUpdatedRefinementCriteria(itemToggleNotification, this.props.props.data.listPageState.result && this.props.props.data.listPageState.result.activeFilters || []);\r\n\r\n window.history.pushState({}, '', buildListPageUrl(getCurrentUrl(this.props.props.context.request), updatedRefinementCriteria));\r\n transaction(() => {\r\n this.props.props.data.listPageState.result!.currentPageNumber = 0;\r\n this.props.props.data.listPageState.result!.activeFilters = updatedRefinementCriteria;\r\n });\r\n }\r\n}\r\n","import { IGridSettings, IImageData, IImageSettings, Image } from '@msdyn365-commerce/core';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\nexport type PictureLoadFailureBehavior = 'default' | 'hide' | 'empty';\r\n\r\nexport interface IPictureState extends React.ComponentState {\r\n showHoverImg: boolean;\r\n}\r\nexport interface IPictureProps {\r\n loadFailureBehavior?: PictureLoadFailureBehavior;\r\n image1?: string;\r\n image2?: string;\r\n emptyImageUrl?: string;\r\n altText?: string;\r\n gridSettings: IGridSettings;\r\n imageSettings?: IImageSettings;\r\n className?: string;\r\n}\r\n/** The Picture component will return picture tag for an image based on ImageResize properties and settings needed to resize the image */\r\nexport default class CittaPicture extends React.PureComponent<IPictureProps, IPictureState> {\r\n\r\n public render(): JSX.Element | null {\r\n const { image1 = '', image2 = '', altText, gridSettings, imageSettings } = this.props;\r\n const img1: IImageData = {\r\n src: image1,\r\n altText: altText ? altText : ''\r\n };\r\n const img2: IImageData = {\r\n src: image2,\r\n altText: altText ? altText : ''\r\n };\r\n const imageProps = {\r\n gridSettings: gridSettings,\r\n imageSettings: imageSettings\r\n };\r\n return (\r\n <div className='images-container'>\r\n <Image\r\n {...img1}\r\n {...imageProps}\r\n loadFailureBehavior='empty'\r\n className={classnames('image1', this.props.className)}\r\n onMouseOver={this.handleMoveHover}\r\n />\r\n <Image\r\n {...img2}\r\n {...imageProps}\r\n loadFailureBehavior='hide'\r\n className={classnames((this.state?.showHoverImg ? 'image2 hoverImg ' : 'image2 hoverImg hideImg '), this.props.className)}\r\n onMouseOut={this.handleMoveOut}\r\n />\r\n </div>\r\n );\r\n }\r\n\r\n private handleMoveHover = () => {\r\n this.setState({ showHoverImg: true });\r\n }\r\n\r\n private handleMoveOut = () => {\r\n this.setState({ showHoverImg: false });\r\n }\r\n}\r\n","import { generateImageUrl, getProductPageUrlSync } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { format } from '@msdyn365-commerce-modules/utilities';\r\nimport { RatingComponent } from '@msdyn365-commerce/components';\r\nimport { IComponentProps, ICoreContext, IGridSettings, IImageSettings } from '@msdyn365-commerce/core';\r\nimport { ProductPrice, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\nimport CittaPicture from '../../../components/citta-picture';\r\n\r\nimport PriceComponent from '../../../components/price-component';\r\n\r\nexport interface IProductComponentProps extends IComponentProps<{ product?: ProductSearchResult }> {\r\n className?: string;\r\n imageSettings?: IImageSettings;\r\n savingsText?: string;\r\n freePriceText?: string;\r\n originalPriceText?: string;\r\n currentPriceText?: string;\r\n ratingAriaLabel?: string;\r\n salesLineTagKey?: string;\r\n tagsToIgnore?: string;\r\n}\r\n\r\n/**\r\n *\r\n * The ProductComponent renders the products.\r\n * @extends {React.PureComponent<IProductComponentProps>}\r\n */\r\nclass ProductComponent extends React.Component<IProductComponentProps> {\r\n\r\n constructor(props: IProductComponentProps) {\r\n super(props);\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const product = this.props.data.product;\r\n if (!product) {\r\n return null;\r\n }\r\n let imageOrientation: string = '';\r\n let onlineTags: string = '';\r\n let salesLineTag: string = '';\r\n let productImage1: string = '';\r\n let productImage2: string = '';\r\n let stockAvailabilityPropertyText: string = '';\r\n let stockAvailabilities: any[] = [];\r\n\r\n if (product.ExtensionProperties!.length > 0) {\r\n product.ExtensionProperties!.map(property => {\r\n if (property.Key === 'ProductImage1') {\r\n productImage1 = property.Value!.StringValue!;\r\n } else if (property.Key === 'ProductImage2') {\r\n productImage2 = property.Value!.StringValue!;\r\n }\r\n else if (property.Key === 'ProductAvailability') {\r\n stockAvailabilities.push({name: property.Value?.StringValue, value: property.Value?.IntegerValue});\r\n }\r\n });\r\n }\r\n if (product.AttributeValues!.length > 0) {\r\n product.AttributeValues!.map(property => {\r\n if (property.Name === 'Image Orientation') {\r\n imageOrientation = property.TextValue!;\r\n } else if (property.Name === 'Online Tags' || property.Name === \"Online Tags B2BN\" || property.Name === \"Online Tags B2BA\" || property.Name === \"Online Tags B2BI\") {\r\n onlineTags = property.TextValue!;\r\n if (this.props.tagsToIgnore && onlineTags) {\r\n let tags = this.props.tagsToIgnore.split('|');\r\n if (tags.includes(onlineTags)) {\r\n onlineTags = '';\r\n }\r\n }\r\n } else if (property.Name === this.props.salesLineTagKey) {\r\n salesLineTag = property.TextValue!;\r\n }\r\n });\r\n }\r\n\r\n const image1 = generateImageUrl(productImage1, this.props.context.request.apiSettings);\r\n const image2 = generateImageUrl(productImage2, this.props.context.request.apiSettings);\r\n\r\n const productUrl = getProductPageUrlSync(product.Name || '', product.RecordId, this.props.context && this.props.context.actionContext, undefined);\r\n\r\n // Construct telemetry attribute to render\r\n const attribute = this.props.context\r\n && this.props.context.telemetry\r\n && this.props.context.telemetry.setTelemetryAttribute\r\n && this.props.context.telemetry.setTelemetryAttribute(product.RecordId.toString(), {\r\n pid: product.RecordId,\r\n pname: product.Name,\r\n mname: this.props.id\r\n }\r\n );\r\n const productImageSettings = imageOrientation === 'Landscape' ? this._getLandscapeImageSettings(this.props.imageSettings) : this.props.imageSettings;\r\n return (\r\n <a href={productUrl} aria-label={this._renderLabel(product.Name, this.props.context.cultureFormatter.formatCurrency(product.Price), product.AverageRating, this.props.ratingAriaLabel)} className='msc-product' {...attribute}>\r\n <div className={(onlineTags && onlineTags !== '') ? 'product-placement__item-imagetag' : 'product-placement__item-imagetagnone'} style={onlineTags.toLocaleLowerCase().includes('essentials') ? {backgroundColor: \"black\"}: {}}>{onlineTags}</div>\r\n <div className='msc-product__image'>\r\n {this._renderProductPlacementImage(productImageSettings, this.props.context.request.gridSettings, product.PrimaryImageUrl, image1, image2, product.Name)}\r\n </div>\r\n <div className='msc-product__details'>\r\n <h4 className='msc-product__title'>{product.Name}</h4>\r\n {this._renderPrice(this.props.context, this.props.typeName, this.props.id, product.BasePrice, product.Price, this.props.savingsText, this.props.freePriceText, this.props.originalPriceText, this.props.currentPriceText)}\r\n {this._renderSalesLineTag(salesLineTag)}\r\n {this._renderDescription(product.Description)}\r\n {!this.props.context.app.config.hideRating && this._renderRating(this.props.context, this.props.typeName, this.props.id, product.AverageRating, product.TotalRatings, this.props.ratingAriaLabel)}\r\n {stockAvailabilityPropertyText}\r\n <div className=\"msc-product__availabilities\">\r\n {this._renderAvailabilities(stockAvailabilities)}\r\n </div>\r\n </div>\r\n </a>\r\n );\r\n }\r\n\r\n private _renderAvailabilities(stockAvailabilities: any[]) {\r\n return stockAvailabilities && stockAvailabilities.map(sA => <div className=\"msc-product__availabilities_product\">\r\n <span className={sA.value > 0 ? 'in-stock' : 'out-of-stock'}>{sA.name.match(/\\b(\\w)/g).join('')}</span>\r\n </div>\r\n )\r\n }\r\n\r\n private _renderLabel(name?: string, price?: string, rating?: number, ratingAriaLabel?: string): string {\r\n let ratingLabel = '';\r\n\r\n name = name || '';\r\n price = price || '';\r\n\r\n if (rating) {\r\n const roundedRating = rating.toFixed(2);\r\n ratingLabel = format(ratingAriaLabel || '', roundedRating, '5');\r\n }\r\n\r\n return (`${name} ${price} ${ratingLabel}`);\r\n }\r\n\r\n private _renderSalesLineTag(salesLineTag?: string): JSX.Element | null {\r\n if (salesLineTag! && salesLineTag !== '') {\r\n return (\r\n <div className='product-placement__item-saleslinetag'>{salesLineTag}</div>\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n private _renderDescription(description?: string): JSX.Element | null {\r\n return <p className='msc-product__text'>{description}</p>;\r\n }\r\n\r\n private _renderRating(context: ICoreContext, typeName: string, id: string, avgRating?: number, totalRatings?: number, ariaLabel?: string): JSX.Element | null {\r\n if (!avgRating) {\r\n return null;\r\n }\r\n\r\n const numRatings = totalRatings && totalRatings.toString() || undefined;\r\n\r\n return (\r\n <RatingComponent\r\n context={context}\r\n id={id}\r\n typeName={typeName}\r\n avgRating={avgRating}\r\n ratingCount={numRatings}\r\n readOnly={true}\r\n ariaLabel={ariaLabel || ''}\r\n data={{}}\r\n />\r\n );\r\n }\r\n\r\n private _renderPrice(context: ICoreContext, typeName: string, id: string, basePrice?: number, adjustedPrice?: number, savingsText?: string, freePriceText?: string, originalPriceText?: string, currentPriceText?: string): JSX.Element | null {\r\n const price: ProductPrice = {\r\n BasePrice: basePrice,\r\n AdjustedPrice: adjustedPrice,\r\n CustomerContextualPrice: adjustedPrice\r\n };\r\n\r\n return (\r\n <PriceComponent\r\n context={context}\r\n id={id}\r\n typeName={typeName}\r\n data={{ price: price }}\r\n // @ts-ignore\r\n savingsText={savingsText}\r\n freePriceText={freePriceText}\r\n originalPriceText={originalPriceText}\r\n />\r\n );\r\n }\r\n\r\n private _renderProductPlacementImage(imageSettings?: IImageSettings, gridSettings?: IGridSettings, imageUrl?: string, image1?: string, image2?: string, altText?: string): JSX.Element | null {\r\n if (!imageUrl || !gridSettings || !imageSettings) {\r\n return null;\r\n }\r\n return (\r\n <CittaPicture\r\n className='product-placement__item-image'\r\n image1={image1 ? image1 : imageUrl}\r\n image2={image2 ? image2 : ''}\r\n altText={altText}\r\n gridSettings={gridSettings}\r\n imageSettings={imageSettings}\r\n loadFailureBehavior='empty'\r\n />\r\n );\r\n }\r\n\r\n private _getLandscapeImageSettings(cmsImageSettings?: IImageSettings): IImageSettings {\r\n // tslint:disable-next-line: no-unnecessary-local-variable\r\n const landscapeImageSettings: IImageSettings = {\r\n viewports: {\r\n xs: { q: 'w=735&h=481&q=80&m=6&f=jpg', w: 735, h: 481 },\r\n sm: { q: 'w=467&h=303&q=80&m=6&f=jpg', w: 467, h: 303 },\r\n md: { q: 'w=563&h=366&q=80&m=6&f=jpg', w: 563, h: 366 },\r\n lg: { q: 'w=636&h=451&q=80&m=6&f=jpg', w: 636, h: 451 },\r\n xl: { q: 'w=974&h=693&q=80&m=6&f=jpg', w: 974, h: 693 }\r\n },\r\n disableLazyLoad: cmsImageSettings && cmsImageSettings.disableLazyLoad,\r\n lazyload: cmsImageSettings && cmsImageSettings.lazyload\r\n };\r\n\r\n return landscapeImageSettings;\r\n }\r\n}\r\n\r\nexport default ProductComponent;\r\n","import { ICategoryHierarchyViewProps, ISearchResultContainerViewProps, ITitleViewProps, ISearchResultModalViewProps } from '@msdyn365-commerce-modules/search-result-container';\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\nimport CittaRefiners from '../../components/citta-search-result/citta-refiners';\r\n// import CittaSortByOptions from '../../components/citta-search-result/citta-sortbyoptions';\r\nimport { ICittaSearchResultContainerProps } from './citta-search-result-container.props.autogenerated';\r\nimport ProductComponent from './components/product-component';\r\n\r\nconst SearchResultContainerView: React.FC<ISearchResultContainerViewProps & ICittaSearchResultContainerProps<{}>> = props => {\r\n const {\r\n SearchResultContainer,\r\n pagination,\r\n ProductsContainer,\r\n modalToggle,\r\n searchResultModal,\r\n TitleViewProps,\r\n categoryHierarchy,\r\n errorMessage,\r\n // @ts-ignore\r\n toggleModal\r\n } = props;\r\n\r\n return (\r\n <Module {...SearchResultContainer}>\r\n {renderCategoryHierarchy(categoryHierarchy)}\r\n <div className=\"filter-button-container\">\r\n {modalToggle}\r\n </div>\r\n {createSearchResultModal(searchResultModal, props, toggleModal)}\r\n {renderTitle(TitleViewProps)}\r\n <Node {...ProductsContainer}>\r\n {errorMessage}\r\n {renderProducts(props)}\r\n </Node>\r\n {pagination}\r\n </Module>\r\n );\r\n};\r\n\r\nfunction renderProducts(props: ISearchResultContainerViewProps & ICittaSearchResultContainerProps<{}>): JSX.Element | null {\r\n const { config, context, resources } = props;\r\n const liClass = 'ms-product-search-result__item';\r\n const isB2B = props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits === 'b2b';\r\n const products = (isB2B ? props.data.listPageState.result && props.data.listPageState.result.activeProducts && props.data.listPageState.result.activeProducts.filter((item) => item.ItemId !==\"GiftCard\") : props.data.listPageState.result && props.data.listPageState.result.activeProducts) || [];\r\n if (!products || products.length === 0) {\r\n return null;\r\n }\r\n return (\r\n <ul className='list-unstyled'>\r\n {products.map((product: ProductSearchResult, index: number) => (\r\n <li className={`${liClass} ${getImageOrientation(product) === 'Landscape' ? 'product-placement__item-limage' : 'product-placement__item-pimage'}`} key={index} >\r\n <ProductComponent\r\n context={context}\r\n imageSettings={config.imageSettings}\r\n freePriceText={resources.priceFree}\r\n originalPriceText={resources.originalPriceText}\r\n currentPriceText={resources.currentPriceText}\r\n ratingAriaLabel={resources.ratingAriaLabel}\r\n id={props.id}\r\n salesLineTagKey={config.salesLineTagKey}\r\n typeName={props.typeName}\r\n data={{ product: product }}\r\n tagsToIgnore={config.tagsToIgnore}\r\n />\r\n </li>\r\n ))}\r\n </ul>\r\n );\r\n}\r\n\r\nfunction getImageOrientation(product: ProductSearchResult): string {\r\n let imageOrientation: string = '';\r\n if (product.AttributeValues!.length > 0) {\r\n product.AttributeValues!.map(property => {\r\n if (property.Name === 'Image Orientation') {\r\n imageOrientation = property.TextValue!;\r\n }\r\n });\r\n }\r\n return imageOrientation;\r\n}\r\n\r\nconst createSearchResultModal = (modalProps: ISearchResultModalViewProps, props: ISearchResultContainerViewProps & ICittaSearchResultContainerProps<{}>, toggleModal: Function): JSX.Element => {\r\n return React.cloneElement(modalProps.modal, {className: \"category-refiner\"}, null, createModalBody(modalProps, props, toggleModal))\r\n};\r\n\r\nconst createModalBody = (modalProps: ISearchResultModalViewProps, props: ISearchResultContainerViewProps & ICittaSearchResultContainerProps<{}>, toggleModal: Function): JSX.Element | null => {\r\n return React.cloneElement(modalProps.modalBody, {}, null, renderRefineMenu(props, toggleModal));\r\n};\r\n\r\nfunction renderRefineMenu(props: ISearchResultContainerViewProps & ICittaSearchResultContainerProps<{}>, toggleModal: Function): JSX.Element {\r\n return (\r\n <CittaRefiners\r\n props={props}\r\n toggleModal={toggleModal}\r\n />\r\n );\r\n}\r\n\r\n// function renderSort(props: ISearchResultContainerViewProps & ICittaSearchResultContainerProps<{}>): JSX.Element {\r\n// return (\r\n// <CittaSortByOptions\r\n// props={props}\r\n// />\r\n// );\r\n// }\r\n\r\nconst renderCategoryHierarchy = (props: ICategoryHierarchyViewProps): JSX.Element | null => {\r\n const { CategoryHierarchyContainer, categoryHierarchyList, categoryHierarchySeparator } = props;\r\n if (categoryHierarchyList) {\r\n return (\r\n <Node {...CategoryHierarchyContainer}>\r\n {categoryHierarchyList.map((category, index) => (\r\n <React.Fragment key={index}>\r\n {category}\r\n {categoryHierarchyList && categoryHierarchyList[index + 1] && categoryHierarchySeparator}\r\n </React.Fragment>\r\n ))}\r\n </Node>\r\n );\r\n }\r\n\r\n return null;\r\n};\r\n\r\nconst renderTitle = (props: ITitleViewProps): JSX.Element | null => {\r\n const { title, TitleContainer } = props;\r\n if (title) {\r\n return (\r\n <Node {...TitleContainer}>\r\n <label style={{display: 'none'}} className=\"hide emarsys-collection-name\">{title.titleText}</label>\r\n <h2>\r\n {title.titleCount}\r\n </h2>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\n// const renderTitleCount = (props: ITitleViewProps): JSX.Element | null => {\r\n// const { title, TitleContainer } = props;\r\n// if (title) {\r\n// return (\r\n// <Node {...TitleContainer}>\r\n// <label className=\"hide emarsys-collection-name\">{title.titleText}</label>\r\n// <h5>\r\n// {title.titleCount}\r\n// </h5>\r\n// </Node>\r\n// );\r\n// }\r\n// return null;\r\n// };\r\n\r\nexport default SearchResultContainerView;","import { generateImageUrl } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { Autosuggestions } from '@msdyn365-commerce/commerce-entities';\r\nimport {\r\n CacheType, createObservableDataAction, IAction, IActionContext, IActionInput,\r\n ICreateActionContext\r\n} from '@msdyn365-commerce/core';\r\nimport { SearchSuggestion, SearchSuggestionCriteria } from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n getSearchSuggestionsAsync\r\n} from '@msdyn365-commerce/retail-proxy/dist/DataActions/StoreOperationsDataActions.g';\r\n\r\n// @ts-ignore\r\nexport const enum SuggestionType {\r\n Category = 'ScopedCategory',\r\n Keyword = 'Keyword',\r\n Product = 'Product',\r\n None = 'None'\r\n}\r\n\r\n/**\r\n * Input class for auto suggest search input\r\n */\r\nexport class AutoSuggestInput implements IActionInput {\r\n public searchQuery?: string;\r\n public topResultsCount?: number;\r\n public suggestionType?: string;\r\n public hitPrefix?: string;\r\n public hitSuffix?: string;\r\n\r\n constructor(searchText?: string, top?: number, suggestionType?: string, hitPrefix?: string, hitSuffix?: string) {\r\n this.searchQuery = searchText;\r\n this.topResultsCount = top;\r\n this.suggestionType = suggestionType;\r\n this.hitPrefix = hitPrefix;\r\n this.hitSuffix = hitSuffix;\r\n }\r\n\r\n public getCacheKey = () => `AutoSuggestSearchSuggestions`;\r\n public getCacheObjectType = () => 'AutoSuggestSearchSuggestions';\r\n public dataCacheType = (): CacheType => 'none';\r\n}\r\n\r\nconst createInput = (inputData: ICreateActionContext) => {\r\n return new AutoSuggestInput();\r\n};\r\n\r\n/**\r\n * Calls the Retail API and returns a auto-suggest suggestions\r\n */\r\nexport async function getSearchSuggestionsAction(input: AutoSuggestInput, ctx: IActionContext): Promise<Autosuggestions | null> {\r\n // If no input is provided fail out\r\n if (!input || !input.searchQuery) {\r\n throw new Error('[getSearchSuggestionsAction]No valid Input was provided, failing');\r\n }\r\n\r\n const autosuggest: Autosuggestions = {};\r\n\r\n const autoSuggestPromises = [\r\n _getAutoSuggest(input, autosuggest, ctx),\r\n ];\r\n return Promise.all(autoSuggestPromises).then(() => {\r\n return autosuggest;\r\n });\r\n}\r\n\r\nasync function _getAutoSuggest(\r\n input: AutoSuggestInput,\r\n autosuggest: Autosuggestions,\r\n ctx: IActionContext\r\n): Promise<void> {\r\n const searchCriteria: SearchSuggestionCriteria = {\r\n ProductSearchCriteria: {\r\n SearchCondition: input.searchQuery && input.searchQuery.length > 0 ? input.searchQuery : '',\r\n Context: {\r\n ChannelId: +ctx.requestContext.apiSettings.channelId,\r\n CatalogId: +ctx.requestContext.apiSettings.catalogId\r\n }\r\n },\r\n HitPrefix: input.hitPrefix,\r\n HitSuffix: input.hitSuffix,\r\n SuggestionType: input.suggestionType\r\n };\r\n\r\n const searchSuggestions = await getSearchSuggestionsAsync(\r\n { callerContext: ctx, queryResultSettings: { Paging: { Top: input.topResultsCount } } },\r\n searchCriteria\r\n );\r\n\r\n if (searchSuggestions && searchSuggestions.length > 0) {\r\n // Generate image url\r\n searchSuggestions.map(\r\n (item: SearchSuggestion) =>\r\n (item.ImageUrl = item.ImageUrl ? generateImageUrl(item.ImageUrl, ctx.requestContext.apiSettings) : '')\r\n );\r\n\r\n autosuggest.AllSearchResults = searchSuggestions;\r\n } else {\r\n ctx.telemetry.error(`[getSearchSuggestionsAction] unable to get availabilites for search with suggestion type ${searchCriteria.SuggestionType}`);\r\n }\r\n}\r\n\r\nexport default createObservableDataAction({\r\n id: '@msdyn365-commerce-modules/citta-search/get-auto-suggest-suggestions',\r\n action: <IAction<Autosuggestions>>getSearchSuggestionsAction,\r\n input: createInput\r\n});\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n\r\nimport * as React from 'react';\r\n\r\nimport { getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport { getRichTextHtml } from '@msdyn365-commerce/core';\r\nimport { SearchSuggestion } from '@msdyn365-commerce/retail-proxy';\r\n\r\nimport { ICittaSearchData } from '../citta-search.data';\r\nimport { ICittaSearchProps } from '../citta-search.props.autogenerated';\r\n\r\nexport interface ISearchKeywordSuggestProps {\r\n searchKeywordSuggestClass: string;\r\n searchPageURL: string;\r\n searchQsp: string | undefined;\r\n hitPrefix: string;\r\n hitSuffix: string;\r\n autoSuggestProps: ICittaSearchProps<ICittaSearchData>;\r\n searchText: string;\r\n suggestions: SearchSuggestion[] | undefined;\r\n telemetryContent?: ITelemetryContent;\r\n}\r\n\r\nexport interface ISearchKeywordViewProps {\r\n text: React.ReactNode[];\r\n}\r\n\r\nlet payLoad: IPayLoad;\r\n\r\n/**\r\n *\r\n * KeywordSuggestionsComponent\r\n */\r\nexport const KeywordSuggestionsComponent = (props: ISearchKeywordSuggestProps): ISearchKeywordViewProps | undefined => {\r\n const {\r\n suggestions,\r\n hitPrefix,\r\n hitSuffix\r\n } = props;\r\n\r\n if (!suggestions) {\r\n return undefined;\r\n }\r\n\r\n payLoad = getPayloadObject('click', props.telemetryContent!, '');\r\n\r\n const reactNodes: React.ReactNode[] = [];\r\n\r\n suggestions.map(item => {\r\n reactNodes.push(_assembleNode(item, hitPrefix, hitSuffix, props));\r\n });\r\n\r\n return { text: reactNodes };\r\n};\r\n\r\nconst _assembleNode = (item: SearchSuggestion, hitPrefix: string, hitSuffix: string, props: ISearchKeywordSuggestProps) => {\r\n const ariaLabel = item.Value &&\r\n (item.Value).replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\r\n payLoad.contentAction.etext = ariaLabel;\r\n const attribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\r\n return (\r\n <li className='msc-autoSuggest__keywordResults-item' key={item.Id}>\r\n <a\r\n aria-label={ariaLabel}\r\n href={_generateLink(item, hitPrefix, hitSuffix, props)}\r\n {...attribute}\r\n >\r\n {_generateLink(item, hitPrefix, hitSuffix, props) &&\r\n _getHighlightedText(item.Value ? item.Value : '', hitPrefix, hitSuffix)}\r\n </a>\r\n </li>\r\n );\r\n};\r\n\r\nconst _generateLink = (suggestion: SearchSuggestion, hitPrefix: string, hitSuffix: string, props: ISearchKeywordSuggestProps): string => {\r\n const { searchPageURL, searchQsp } = props;\r\n\r\n const formattedLink = (suggestion.Value as string)\r\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '')\r\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\r\n const route = searchPageURL || '';\r\n return formattedLink && formattedLink.length > 0\r\n ? `${route}${route.indexOf('?') === -1 ? '?' : '&'}${searchQsp}=${formattedLink}`\r\n : route;\r\n};\r\n\r\nconst _getHighlightedText = (suggestion: string, hitPrefix: string, hitSuffix: string): JSX.Element => {\r\n const formattedText = suggestion\r\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '<strong>')\r\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '</strong>');\r\n\r\n // tslint:disable:react-no-dangerous-html\r\n return <span dangerouslySetInnerHTML={getRichTextHtml(formattedText)} />;\r\n};\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n\r\nimport * as React from 'react';\r\n\r\nimport { PriceComponent } from '@msdyn365-commerce/components';\r\nimport { getRichTextHtml, IActionContext, ITelemetry } from '@msdyn365-commerce/core';\r\nimport { SearchSuggestion } from '@msdyn365-commerce/retail-proxy';\r\n\r\nimport { getProductPageUrlSync } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { getPayloadObject, getTelemetryAttributes, INodeProps, IPayLoad, ITelemetryContent, NodeTag } from '@msdyn365-commerce-modules/utilities';\r\nimport { ICittaSearchData } from '../citta-search.data';\r\nimport { ICittaSearchProps } from '../citta-search.props.autogenerated';\r\n\r\nexport interface ISearchProductSuggestProps {\r\n searchProductSuggestClass: string;\r\n searchPageURL: string;\r\n searchQsp: string | undefined;\r\n hitPrefix: string;\r\n hitSuffix: string;\r\n autoSuggestProps: ICittaSearchProps<ICittaSearchData>;\r\n searchText: string;\r\n suggestions: SearchSuggestion[] | undefined;\r\n telemetry: ITelemetry;\r\n moduleType: string;\r\n moduleId: string;\r\n telemetryContent?: ITelemetryContent;\r\n}\r\n\r\nexport interface ISearchProductViewProps {\r\n title: React.ReactNode;\r\n items: ISearchProductItemViewProps[];\r\n}\r\n\r\nexport interface ISearchProductItemViewProps {\r\n text: React.ReactNode;\r\n price: React.ReactNode;\r\n LiProduct: INodeProps;\r\n AProduct: INodeProps;\r\n id: string | undefined;\r\n}\r\n\r\nlet payLoad: IPayLoad;\r\nlet telemetryContent: ITelemetryContent | undefined;\r\n\r\n/**\r\n *\r\n * ProductSuggestionsComponent\r\n */\r\nexport const ProductSuggestionsComponent = (props: ISearchProductSuggestProps): ISearchProductViewProps | undefined => {\r\n const {\r\n suggestions,\r\n hitSuffix,\r\n hitPrefix,\r\n autoSuggestProps: {\r\n context: { actionContext },\r\n resources: { productSuggestionHeading }\r\n },\r\n moduleType,\r\n moduleId\r\n } = props;\r\n const reactNodes: ISearchProductItemViewProps[] = [];\r\n telemetryContent = props.telemetryContent;\r\n payLoad = getPayloadObject('click', props.telemetryContent!, '');\r\n\r\n if (!suggestions) {\r\n return undefined;\r\n }\r\n\r\n suggestions.map(item => {\r\n reactNodes.push(_assembleNode(item, hitPrefix, hitSuffix, actionContext, props, moduleType, moduleId));\r\n });\r\n\r\n const titleNode = _renderTitle(productSuggestionHeading);\r\n\r\n return { title: titleNode, items: reactNodes };\r\n};\r\n\r\nconst _renderTitle = (productSuggestionHeading: string) => {\r\n const productAutoSuggestionHeading = productSuggestionHeading ? productSuggestionHeading : 'Go to products';\r\n\r\n return <li className='msc-autoSuggest__productResults-title'>{productAutoSuggestionHeading}</li>;\r\n};\r\n\r\nconst _assembleNode = (\r\n item: SearchSuggestion,\r\n hitPrefix: string,\r\n hitSuffix: string,\r\n actionContext: IActionContext,\r\n props: ISearchProductSuggestProps,\r\n moduleType: string,\r\n moduleId: string\r\n): ISearchProductItemViewProps => {\r\n return {\r\n text: _getHighlightedText(item.Value ? item.Value : '', hitPrefix, hitSuffix),\r\n price:\r\n item.Id &&\r\n item.Value3 &&\r\n item.Value3.Value &&\r\n item.Value3.Value.DecimalValue &&\r\n _renderPrice(item.Value3.Value.DecimalValue, item.Value3.Value.DecimalValue, moduleId, moduleType, props),\r\n LiProduct: _getLiWrapper(),\r\n AProduct: _getAWrapper(item, hitPrefix, hitSuffix, actionContext),\r\n id: item.Id\r\n };\r\n};\r\n\r\nconst _getLiWrapper = () => {\r\n return {\r\n className: 'msc-autoSuggest__productResults-item',\r\n tag: 'li' as NodeTag\r\n };\r\n};\r\n\r\nconst _getAWrapper = (item: SearchSuggestion, hitPrefix: string, hitSuffix: string, actionContext: IActionContext) => {\r\n const ariaLabel = item.Value &&\r\n (item.Value).replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\r\n\r\n payLoad.contentAction.recid = item.Id;\r\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\r\n\r\n return {\r\n className: 'msc-autoSuggest__productResults-item',\r\n tag: 'a' as NodeTag,\r\n 'aria-label': ariaLabel,\r\n href: _generateLink(item, hitPrefix, hitSuffix, actionContext),\r\n ...attribute\r\n };\r\n};\r\n\r\nconst _generateLink = (suggestion: SearchSuggestion, hitPrefix: string, hitSuffix: string, actionContext: IActionContext) => {\r\n const formattedLink = (suggestion.Value as string).replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\r\n return suggestion.Value && suggestion.Id ?\r\n getProductPageUrlSync(formattedLink,suggestion.Id as unknown as number, actionContext, undefined) : '';\r\n};\r\n\r\nconst _getHighlightedText = (suggestion: string, hitPrefix: string, hitSuffix: string): JSX.Element => {\r\n const formattedText = suggestion\r\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '<strong>')\r\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '</strong>');\r\n\r\n // tslint:disable:react-no-dangerous-html\r\n return <span className='msc-price msc-autoSuggest__productResults-item-text' dangerouslySetInnerHTML={getRichTextHtml(formattedText)} />;\r\n};\r\n\r\nconst _renderPrice = (adjustedPrice: number, basePrice: number, moduleId: string, moduleType: string, props: ISearchProductSuggestProps): JSX.Element | null => {\r\n const {\r\n autoSuggestProps: { context }\r\n } = props;\r\n\r\n return (\r\n <PriceComponent\r\n id={moduleId}\r\n typeName={moduleType}\r\n context={context}\r\n data={{\r\n price: {\r\n CustomerContextualPrice: adjustedPrice,\r\n BasePrice: basePrice\r\n }\r\n }}\r\n className='msc-autoSuggest__productResults-item-price'\r\n />\r\n );\r\n};\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n\r\nimport * as React from 'react';\r\n\r\nimport { getRichTextHtml } from '@msdyn365-commerce/core';\r\nimport { ProductRefiner, ProductRefinerValue, SearchSuggestion } from '@msdyn365-commerce/retail-proxy';\r\n\r\nimport { format, getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport { ICittaSearchData } from '../citta-search.data';\r\nimport { ICittaSearchProps } from '../citta-search.props.autogenerated';\r\n\r\nexport interface ISearchCategorySuggestProps {\r\n searchCategorySuggestClass: string;\r\n searchPageURL: string;\r\n searchQsp: string | undefined;\r\n hitPrefix: string;\r\n hitSuffix: string;\r\n autoSuggestProps: ICittaSearchProps<ICittaSearchData>;\r\n searchText: string;\r\n searchRefiners: ProductRefiner[] | undefined;\r\n suggestions: SearchSuggestion[] | undefined;\r\n telemetryContent?: ITelemetryContent;\r\n}\r\n\r\nexport interface ISearchCategoryViewProps {\r\n title: React.ReactNode;\r\n text: React.ReactNode[];\r\n}\r\n\r\nlet payLoad: IPayLoad;\r\n\r\n/**\r\n *\r\n * CategorySuggestionsComponent\r\n */\r\nexport const CategorySuggestionsComponent = (props: ISearchCategorySuggestProps): ISearchCategoryViewProps | undefined => {\r\n const {\r\n suggestions,\r\n searchText,\r\n autoSuggestProps: {\r\n resources: { categorySuggestionHeading }\r\n }\r\n } = props;\r\n\r\n if (!suggestions) {\r\n return undefined;\r\n }\r\n\r\n const reactNodes: React.ReactNode[] = [];\r\n payLoad = getPayloadObject('click', props.telemetryContent!, '');\r\n\r\n suggestions.map(item => {\r\n reactNodes.push(_assembleNode(item, props));\r\n });\r\n\r\n const titleNode = _renderTitle(categorySuggestionHeading, searchText);\r\n\r\n return { title: titleNode, text: reactNodes };\r\n};\r\n\r\nconst _renderTitle = (categorySuggestionHeading: string, searchText: string) => {\r\n const categoryAutoSuggestionHeading = categorySuggestionHeading\r\n ? format(categorySuggestionHeading, searchText)\r\n : `Search \"${searchText}\" in categories`;\r\n\r\n return <li className='msc-autoSuggest__categoryResults-title'>{categoryAutoSuggestionHeading}</li>;\r\n};\r\n\r\nconst _assembleNode = (item: SearchSuggestion, props: ISearchCategorySuggestProps) => {\r\n const { searchText, hitPrefix, hitSuffix } = props;\r\n\r\n const splitValue = item.Value && item.Value.split('|').pop();\r\n const ariaLabel = splitValue\r\n ? splitValue.replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '')\r\n : item.Value && item.Value.replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\r\n payLoad.contentAction.etext = item.Value;\r\n const attribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\r\n return (\r\n <li className='msc-autoSuggest__categoryResults-item' key={item.Id}>\r\n <a aria-label={ariaLabel} href={_generateLink(item, searchText, props)} {...attribute}>\r\n {_generateLink(item, searchText, props) && _getHighlightedText(item.Value ? item.Value : '', hitPrefix, hitSuffix)}\r\n </a>\r\n </li>\r\n );\r\n};\r\n\r\nconst _generateLink = (suggestion: SearchSuggestion, searchText: string, props: ISearchCategorySuggestProps): string => {\r\n return suggestion && suggestion.Id ? _getCategoryLink(suggestion.Id, searchText, props) : '';\r\n};\r\n\r\nconst _getCategoryLink = (id: string, searchText: string, props: ISearchCategorySuggestProps): string => {\r\n const { searchPageURL, searchQsp, searchRefiners } = props;\r\n\r\n const route = searchPageURL || '';\r\n const urlPath = `${route}${route.indexOf('?') === -1 ? '?' : '&'}${searchQsp}=${searchText}`;\r\n const categoryRefiners =\r\n searchRefiners &&\r\n searchRefiners.find(refiners => {\r\n return refiners.KeyName === 'Category';\r\n });\r\n const refiner =\r\n categoryRefiners &&\r\n categoryRefiners.Values &&\r\n categoryRefiners.Values.find(item => {\r\n return item.RefinerRecordId === parseInt(id, 10);\r\n });\r\n\r\n const encodedRefiner = refiner && encodeURIComponent(JSON.stringify(compressRefiners([refiner])));\r\n\r\n return encodedRefiner ? `${urlPath}&refiners=${encodedRefiner}` : urlPath;\r\n};\r\n\r\nconst _getHighlightedText = (suggestion: string, hitPrefix: string, hitSuffix: string): JSX.Element => {\r\n let formattedText = suggestion\r\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '<strong>')\r\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '</strong>');\r\n formattedText = formattedText.split('|').pop() || '';\r\n\r\n // tslint:disable:react-no-dangerous-html\r\n return <span dangerouslySetInnerHTML={getRichTextHtml(formattedText)} />;\r\n};\r\n\r\n// TODO: This code is currently duplicated in categoryautosuggest need to either remove one of these files\r\n// or move this code to a common place\r\nconst compressedRefinerKeys = ['DataTypeValue', 'LeftValueBoundString', 'RefinerRecordId', 'RefinerSourceValue', 'RightValueBoundString', 'UnitText'];\r\n\r\n/**\r\n * Compressed a list of refiners for use in URLs\r\n * @param refiners The uncompressed refiners\r\n */\r\nconst compressRefiners = (refiners: ProductRefinerValue[]) => {\r\n const compressedRefiners: (string | number)[][] = [];\r\n\r\n refiners.forEach((refiner) => {\r\n const compressedRefiner: (string | number)[] = [];\r\n compressedRefinerKeys.forEach((refinerKey) => {\r\n // @ts-ignore: This line is intentionally not typesafe\r\n compressedRefiner.push(refiner[refinerKey]);\r\n });\r\n compressedRefiners.push(compressedRefiner);\r\n });\r\n\r\n return compressedRefiners;\r\n};\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n\r\nimport { Button } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nexport interface ISearchFormProps {\r\n hideSearchLabel: boolean | undefined;\r\n isSearchFormExpanded: boolean | undefined;\r\n disableSubmitSearch: boolean | undefined;\r\n searchTextInput: React.RefObject<HTMLInputElement>;\r\n maxChars: number;\r\n searchQsp: string;\r\n searchPlaceholder: string;\r\n query: string;\r\n ariaLabelCancel: string;\r\n ariaLabelSearch: string;\r\n ariaLabelSubmit: string;\r\n handleCancelSearchChange(): void;\r\n handleInputChange(query: string): void;\r\n handleSearchClick(): void;\r\n}\r\n\r\nexport interface ISearchFormViewProps {\r\n input: React.ReactNode;\r\n submitBtn: React.ReactNode;\r\n cancelBtn: React.ReactNode;\r\n searchBtn: React.ReactNode;\r\n}\r\n\r\nexport const FormComponent = (props: ISearchFormProps): ISearchFormViewProps => {\r\n const {\r\n searchQsp,\r\n searchPlaceholder,\r\n hideSearchLabel,\r\n isSearchFormExpanded,\r\n searchTextInput,\r\n handleInputChange,\r\n maxChars,\r\n disableSubmitSearch,\r\n handleCancelSearchChange,\r\n handleSearchClick,\r\n query,\r\n ariaLabelCancel,\r\n ariaLabelSearch,\r\n ariaLabelSubmit\r\n } = props;\r\n\r\n const onInputChange = (e: React.ChangeEvent<HTMLInputElement>): void => {\r\n handleInputChange(e.target.value || '');\r\n };\r\n\r\n const inputNode = !hideSearchLabel ? (\r\n <input\r\n className='ms-search__form-control'\r\n type='text'\r\n aria-label={isSearchFormExpanded ? 'Search expanded' : 'Search collapsed'}\r\n name={searchQsp}\r\n placeholder={searchPlaceholder}\r\n ref={searchTextInput}\r\n onChange={onInputChange}\r\n maxLength={maxChars}\r\n value={query}\r\n />\r\n ) : (\r\n <input\r\n className='ms-search__form-control'\r\n type='text'\r\n aria-label={ariaLabelSearch}\r\n name={searchQsp}\r\n placeholder={searchPlaceholder}\r\n ref={searchTextInput}\r\n onChange={onInputChange}\r\n value={query}\r\n />\r\n );\r\n\r\n const submitBtnNode = !disableSubmitSearch && (\r\n <Button className='ms-search__form-submitSearch' aria-label={ariaLabelSubmit} />\r\n );\r\n\r\n const searchBtnNode = !disableSubmitSearch && (\r\n <Button className='ms-search_form_startSearch' aria-label={ariaLabelSearch} onClick={handleSearchClick}></Button>\r\n );\r\n\r\n const cancelBtNoden = (\r\n <Button\r\n className={!disableSubmitSearch ? 'ms-search__form-cancelSearch' : 'ms-search__form-cancelSearchNoSumbit'}\r\n aria-label={ariaLabelCancel}\r\n onClick={handleCancelSearchChange}\r\n type='button'\r\n />\r\n );\r\n\r\n return {input: inputNode, cancelBtn: cancelBtNoden, submitBtn: submitBtnNode, searchBtn: searchBtnNode };\r\n};","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n\r\nimport { Button, getPayloadObject, getTelemetryAttributes, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nexport interface ISearchLabelProps {\r\n isSearchFormExpanded: boolean;\r\n searchLabelClass: string;\r\n searchLabelArialLabel: string;\r\n searchtext: string;\r\n searchCollapsedLabel: React.RefObject<HTMLButtonElement>;\r\n hideSearchLabel?: boolean;\r\n telemetryContent: ITelemetryContent;\r\n handleCancelSearchChange(): void;\r\n}\r\n\r\nexport const LabelComponent = (props: ISearchLabelProps) => {\r\n const { searchLabelClass, searchLabelArialLabel, isSearchFormExpanded, searchtext, searchCollapsedLabel, hideSearchLabel, handleCancelSearchChange, telemetryContent} = props;\r\n const payLoad = getPayloadObject('click', telemetryContent, searchtext, '');\r\n const attributes = getTelemetryAttributes(telemetryContent, payLoad);\r\n\r\n return (\r\n <div className={searchLabelClass}>\r\n <Button\r\n className='ms-search__icon'\r\n aria-expanded={isSearchFormExpanded}\r\n aria-label={searchLabelArialLabel}\r\n onClick={handleCancelSearchChange}\r\n innerRef={searchCollapsedLabel}\r\n {...attributes}\r\n >\r\n {!hideSearchLabel && <span className='ms-search__icon-text' aria-hidden={true}>{searchtext}</span>}\r\n </Button>\r\n </div>\r\n );\r\n};","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport classnames from 'classnames';\r\nimport { debounce } from 'lodash';\r\nimport * as React from 'react';\r\n\r\nimport { Autosuggestions } from '@msdyn365-commerce/commerce-entities';\r\nimport { getUrlSync } from '@msdyn365-commerce/core';\r\nimport { ProductRefiner } from '@msdyn365-commerce/retail-proxy';\r\nimport { getProductSearchRefinersAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\n\r\nimport { createSearchStateInput } from '@msdyn365-commerce-modules/search-utilities';\r\nimport { getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent, KeyCodes } from '@msdyn365-commerce-modules/utilities';\r\n\r\nimport getSearchSuggestionsAction, { AutoSuggestInput, SuggestionType } from './actions/get-auto-suggest-suggestions';\r\nimport { ICittaSearchData } from './citta-search.data';\r\nimport { ICittaSearchProps, ISuggestionTypeCriterionData } from './citta-search.props.autogenerated';\r\nimport {\r\n CategorySuggestionsComponent,\r\n FormComponent,\r\n ISearchCategoryViewProps,\r\n ISearchKeywordViewProps,\r\n ISearchProductViewProps,\r\n KeywordSuggestionsComponent,\r\n LabelComponent,\r\n ProductSuggestionsComponent\r\n} from './components';\r\n\r\nexport interface ISearchState {\r\n isSearchFormExpanded: boolean;\r\n searchText: string;\r\n searchKeywordSuggestClass: string;\r\n searchProductSuggestClass: string;\r\n searchCategorySuggestClass: string;\r\n suggestions: Autosuggestions | undefined;\r\n searchRefiners?: ProductRefiner[] | undefined;\r\n autoSuggestAriaLabel: string;\r\n isInitialState: boolean;\r\n inSearchMode: boolean;\r\n}\r\n\r\nexport interface ISearchViewProps extends ICittaSearchProps<ICittaSearchData> {\r\n Search: IModuleProps;\r\n AutoSuggestAriaLabel: INodeProps;\r\n AutoSuggestAriaLabelText: string;\r\n searchText: string;\r\n AutoSuggest: INodeProps;\r\n KeywordSuggest: INodeProps;\r\n ProductSuggest: INodeProps;\r\n CategorySuggest: INodeProps;\r\n SearchForm: INodeProps;\r\n SearchBtn: INodeProps;\r\n FormWrapper: INodeProps;\r\n BtnWrapper: INodeProps;\r\n UlKeyword: INodeProps;\r\n UlProduct: INodeProps;\r\n UlCategory: INodeProps;\r\n label: React.ReactNode;\r\n searchLabel: INodeProps;\r\n searchLabelText: string;\r\n form: React.ReactNode;\r\n autosuggestKeyword?: ISearchKeywordViewProps;\r\n autosuggestProduct?: ISearchProductViewProps;\r\n autosuggestCategory?: ISearchCategoryViewProps;\r\n callbacks: {\r\n handleCancelSearchChange(): void;\r\n handleSearchClick(): void;\r\n };\r\n isSearchFormExpanded: boolean;\r\n}\r\n\r\n/**\r\n *\r\n * Search module\r\n * @extends {React.Component<ICittaSearchProps<ICittaSearchData>, ISearchState>}\r\n */\r\nclass Search extends React.Component<ICittaSearchProps<ICittaSearchData>, ISearchState> {\r\n private searchTextInput: React.RefObject<HTMLInputElement>;\r\n private searchCollapsedLabel: React.RefObject<HTMLButtonElement>;\r\n private formReference: React.RefObject<HTMLButtonElement>;\r\n private maxChars: number;\r\n private inputSuggestionType?: ISuggestionTypeCriterionData[];\r\n private topResultsCount?: number;\r\n private hitPrefix: string = '{';\r\n private hitSuffix: string = '}';\r\n private waitTime: number = 500;\r\n private autoSuggestResultScreenReaderDiv: React.RefObject<HTMLDivElement>;\r\n private autoSuggestResultDiv: React.RefObject<HTMLDivElement>;\r\n private searchFormClass: string;\r\n private searchBtnClass: string;\r\n private searchLabelClass: string;\r\n private telemetryContent: ITelemetryContent;\r\n // @ts-ignore\r\n private cancellabelDebounce: debounce;\r\n\r\n constructor(props: ICittaSearchProps<ICittaSearchData>) {\r\n super(props);\r\n this.searchTextInput = React.createRef();\r\n this.searchCollapsedLabel = React.createRef();\r\n this.autoSuggestResultScreenReaderDiv = React.createRef();\r\n this.autoSuggestResultDiv = React.createRef();\r\n this.formReference = React.createRef();\r\n this.state = {\r\n isSearchFormExpanded: false,\r\n searchText: '',\r\n searchKeywordSuggestClass: 'ms-search__autoSuggest__keyword',\r\n searchProductSuggestClass: 'ms-search__autoSuggest__product',\r\n searchCategorySuggestClass: 'ms-search__autoSuggest__category',\r\n suggestions: undefined,\r\n searchRefiners: undefined,\r\n autoSuggestAriaLabel: '',\r\n isInitialState: true,\r\n inSearchMode: false\r\n };\r\n this.maxChars =\r\n (this.props.context &&\r\n this.props.context.app &&\r\n this.props.context.app.config &&\r\n this.props.context.app.config.searchInputMaxLength) ||\r\n 50;\r\n this.inputSuggestionType = this.props.config && this.props.config.suggestionTypeCriterion;\r\n this.topResultsCount = this.props.config && this.props.config.topResultsCount ? this.props.config.topResultsCount : 5;\r\n this.searchFormClass = 'ms-search__form';\r\n this.searchBtnClass = 'ms-search__btn';\r\n this.searchLabelClass = 'ms-search__label';\r\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!, this.props.friendlyName, this.props.telemetry);\r\n }\r\n\r\n public async componentDidMount(): Promise<void> {\r\n document.body && document.body.addEventListener('mousedown', this._focusOutTarget);\r\n window && window.addEventListener('keyup', this._keyup);\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n document.body && document.body.removeEventListener('mousedown', this._focusOutTarget, false);\r\n window && window.removeEventListener('keyup', this._keyup, false);\r\n }\r\n\r\n public componentDidUpdate(): void {\r\n const {\r\n config: { hideSearchLabel }\r\n } = this.props;\r\n const { isSearchFormExpanded, isInitialState } = this.state;\r\n\r\n if (!this.props.context.request.params.isEditor) {\r\n if (!hideSearchLabel && isSearchFormExpanded) {\r\n this.searchTextInput && this.searchTextInput.current && this.searchTextInput.current.focus();\r\n } else if (!isInitialState) {\r\n this.searchCollapsedLabel && this.searchCollapsedLabel.current && this.searchCollapsedLabel.current.focus();\r\n }\r\n }\r\n }\r\n\r\n // tslint:disable-next-line: cyclomatic-complexity max-func-body-length\r\n public render(): JSX.Element {\r\n const {\r\n context,\r\n resources: { searchtext, searchLabelArialLabel, cancelBtnAriaLabel, searchBtnAriaLabel, submitBtnAriaLabel },\r\n config: { hideSearchLabel, disableSubmitSearch, searchplaceholderText, className = '' }\r\n } = this.props;\r\n\r\n const {\r\n isSearchFormExpanded,\r\n searchText,\r\n searchKeywordSuggestClass,\r\n searchProductSuggestClass,\r\n searchCategorySuggestClass,\r\n suggestions,\r\n searchRefiners\r\n } = this.state;\r\n\r\n const searchQsp = (context && context.app && context.app.config && context.app.config.searchQueryStringParameter) || 'q';\r\n const searchPageURL = getUrlSync('search', context && context.actionContext) || '';\r\n const searchURL = this._appendQueryParams(searchPageURL, searchText, searchQsp);\r\n const searchPlaceholder = searchplaceholderText && searchplaceholderText.length > 0 ? searchplaceholderText : '';\r\n\r\n const keywordSuggestions =\r\n suggestions &&\r\n suggestions.AllSearchResults &&\r\n suggestions.AllSearchResults.filter(\r\n i => i.SuggestionType === SuggestionType.Keyword || i.SuggestionType === SuggestionType.None\r\n );\r\n const productSuggestions =\r\n suggestions &&\r\n suggestions.AllSearchResults &&\r\n suggestions.AllSearchResults.filter(i => i.SuggestionType === SuggestionType.Product);\r\n const categorySuggestions =\r\n suggestions &&\r\n suggestions.AllSearchResults &&\r\n suggestions.AllSearchResults.filter(i => i.SuggestionType === SuggestionType.Category);\r\n\r\n const viewProps: ISearchViewProps = {\r\n ...(this.props as ICittaSearchProps<ICittaSearchData>),\r\n\r\n Search: {\r\n moduleProps: this.props,\r\n className: `${classnames('ms-search', className)} ${disableSubmitSearch ? 'no-submit' : 'with-submit'}`,\r\n },\r\n AutoSuggestAriaLabel: {\r\n tag: 'div',\r\n className: 'msc-autoSuggest__screen-reader',\r\n 'aria-live': 'assertive',\r\n ref: this.autoSuggestResultScreenReaderDiv\r\n },\r\n AutoSuggestAriaLabelText: this.state.autoSuggestAriaLabel,\r\n searchText: this.state.searchText,\r\n AutoSuggest: {\r\n ref: this.autoSuggestResultDiv,\r\n className: 'ms-search__autoSuggest'\r\n },\r\n KeywordSuggest: {\r\n className: searchKeywordSuggestClass\r\n },\r\n ProductSuggest: {\r\n className: searchProductSuggestClass\r\n },\r\n CategorySuggest: {\r\n className: searchCategorySuggestClass\r\n },\r\n SearchForm: {\r\n className: `${this.searchFormClass} ${isSearchFormExpanded ? 'bx-show' : 'bx-hide'}`\r\n },\r\n SearchBtn: {\r\n className: `${this.searchBtnClass} ${isSearchFormExpanded ? 'bx-show' : 'bx-show'}`\r\n },\r\n BtnWrapper: {\r\n className: 'ms-search__btnWrapper',\r\n 'aria-label': 'Search',\r\n },\r\n FormWrapper: {\r\n tag: 'form',\r\n ref: this.formReference,\r\n className: 'ms-search__searchForm',\r\n 'aria-label': 'Search',\r\n name: 'searchForm',\r\n role: 'Search',\r\n action: searchURL,\r\n autoComplete: 'off',\r\n onSubmit: this._handleSubmit\r\n },\r\n UlKeyword: {\r\n tag: 'ul',\r\n className: classnames('msc-autoSuggest__keywordResults-items', className)\r\n },\r\n UlProduct: {\r\n tag: 'ul',\r\n className: classnames('msc-autoSuggest__productResults-items', className)\r\n },\r\n UlCategory: {\r\n tag: 'ul',\r\n className: classnames('msc-autoSuggest__categoryResults-items', className)\r\n },\r\n searchLabel: {\r\n tag: 'div',\r\n className: 'search-label',\r\n },\r\n searchLabelText: 'Search',\r\n label: LabelComponent({\r\n isSearchFormExpanded: isSearchFormExpanded,\r\n searchLabelClass: `${this.searchLabelClass} 'bx-show'}`,\r\n searchtext: searchtext,\r\n searchLabelArialLabel: searchLabelArialLabel,\r\n searchCollapsedLabel: this.searchCollapsedLabel,\r\n hideSearchLabel: hideSearchLabel,\r\n handleCancelSearchChange: this._handleCancelSearchChange,\r\n telemetryContent: this.telemetryContent\r\n }),\r\n // @ts-ignore\r\n form: FormComponent({\r\n ariaLabelCancel: cancelBtnAriaLabel,\r\n ariaLabelSearch: searchBtnAriaLabel,\r\n ariaLabelSubmit: submitBtnAriaLabel,\r\n hideSearchLabel: hideSearchLabel,\r\n searchTextInput: this.searchTextInput,\r\n isSearchFormExpanded: isSearchFormExpanded,\r\n disableSubmitSearch: disableSubmitSearch,\r\n handleInputChange: this._handleInputChange,\r\n handleCancelSearchChange: this._handleCancelSearchChange,\r\n handleSearchClick: this._handleSearchClick,\r\n maxChars: this.maxChars,\r\n searchQsp: searchQsp,\r\n searchPlaceholder: searchPlaceholder,\r\n query: searchText\r\n }),\r\n autosuggestKeyword:\r\n searchText && searchText.length > 0 && keywordSuggestions && keywordSuggestions.length > 0\r\n ? KeywordSuggestionsComponent({\r\n searchKeywordSuggestClass: searchKeywordSuggestClass,\r\n searchPageURL: searchPageURL,\r\n searchQsp: searchQsp,\r\n hitPrefix: this.hitPrefix,\r\n hitSuffix: this.hitSuffix,\r\n autoSuggestProps: this.props,\r\n searchText: searchText,\r\n suggestions: keywordSuggestions,\r\n telemetryContent: this.telemetryContent\r\n })\r\n : undefined,\r\n autosuggestProduct:\r\n searchText && searchText.length > 0 && productSuggestions && productSuggestions.length > 0\r\n ? ProductSuggestionsComponent({\r\n searchProductSuggestClass: searchProductSuggestClass,\r\n searchPageURL: searchPageURL,\r\n searchQsp: searchQsp,\r\n hitPrefix: this.hitPrefix,\r\n hitSuffix: this.hitSuffix,\r\n autoSuggestProps: this.props,\r\n searchText: searchText,\r\n suggestions: productSuggestions,\r\n telemetry: this.props.telemetry,\r\n moduleType: this.props.typeName,\r\n moduleId: this.props.id,\r\n telemetryContent: this.telemetryContent\r\n })\r\n : undefined,\r\n autosuggestCategory:\r\n searchText && searchText.length > 0 && categorySuggestions && categorySuggestions.length > 0\r\n ? CategorySuggestionsComponent({\r\n searchCategorySuggestClass: searchCategorySuggestClass,\r\n searchPageURL: searchPageURL,\r\n searchQsp: searchQsp,\r\n hitPrefix: this.hitPrefix,\r\n hitSuffix: this.hitSuffix,\r\n autoSuggestProps: this.props,\r\n searchText: searchText,\r\n suggestions: categorySuggestions,\r\n searchRefiners: searchRefiners,\r\n telemetryContent: this.telemetryContent\r\n })\r\n : undefined,\r\n callbacks: {\r\n handleCancelSearchChange: this._handleCancelSearchChange,\r\n handleSearchClick: this._handleSearchClick\r\n },\r\n isSearchFormExpanded: this.state.isSearchFormExpanded\r\n };\r\n\r\n return this.props.renderView(viewProps) as React.ReactElement;\r\n }\r\n\r\n // tslint:disable-next-line:no-any\r\n private _focusOutTarget = (e: any): void => {\r\n const { suggestions } = this.state;\r\n\r\n if (\r\n suggestions &&\r\n suggestions.AllSearchResults &&\r\n e.target.closest('.ms-search') === null\r\n ) {\r\n this._clearAutoSuggestState();\r\n }\r\n };\r\n\r\n private _keyup = (e: KeyboardEvent): void => {\r\n const { suggestions } = this.state;\r\n\r\n if (suggestions && suggestions.AllSearchResults && e.keyCode === KeyCodes.Escape) {\r\n this._clearAutoSuggestState();\r\n } else if (this.state.isSearchFormExpanded && e.keyCode === KeyCodes.Escape) {\r\n if (this.state.isSearchFormExpanded) {\r\n this.setState({ isSearchFormExpanded: false });\r\n window.document.body.classList.toggle('search-open', false);\r\n }\r\n }\r\n\r\n if (!((this.formReference.current && this.formReference.current.contains(e.target as unknown as Node)) ||\r\n (this.autoSuggestResultDiv.current && this.autoSuggestResultDiv.current.contains(e.target as unknown as Node)))) {\r\n if (suggestions && suggestions.AllSearchResults) {\r\n this._clearAutoSuggestState();\r\n }\r\n\r\n if (this.state.isSearchFormExpanded) {\r\n this.setState({ isSearchFormExpanded: false });\r\n window.document.body.classList.toggle('search-open', false);\r\n }\r\n }\r\n };\r\n\r\n private _clearAutoSuggestState = (): void => {\r\n const {\r\n context: { actionContext },\r\n data: { searchState }\r\n } = this.props;\r\n\r\n if (this.searchTextInput.current && this.searchTextInput.current.value.length > 0) {\r\n searchState.searchText = '';\r\n searchState.defaultBasicSearchUrl = '';\r\n searchState.searchQueryStringParameter = '';\r\n actionContext ? actionContext.update(createSearchStateInput(searchState), searchState) : null;\r\n this.searchTextInput.current.value = '';\r\n }\r\n\r\n this.setState({ searchText: '', suggestions: undefined, searchRefiners: undefined });\r\n };\r\n\r\n private _handleSearchClick = (): void => {\r\n console.log('handle search click')\r\n const { isSearchFormExpanded } = this.state;\r\n const updatedIsSearchFormExpanded = !isSearchFormExpanded;\r\n const headerElem = document.querySelector('.ms-header');\r\n if (headerElem) {\r\n if (updatedIsSearchFormExpanded) {\r\n headerElem.classList.add('lock-opaque');\r\n // window.document.body.classList.toggle('menu-open', true);\r\n window.document.body.classList.toggle('search-open', true);\r\n } else {\r\n if (document.documentElement.scrollTop < 2) {\r\n headerElem.classList.remove('lock-opaque');\r\n }\r\n // window.document.body.classList.toggle('menu-open', false);\r\n window.document.body.classList.toggle('search-open', false);\r\n }\r\n }\r\n this.setState({ isSearchFormExpanded: updatedIsSearchFormExpanded });\r\n }\r\n\r\n private _handleInputChange = (query: string): void => {\r\n if (!query || query.length < this.maxChars) {\r\n this.setState({ searchText: query });\r\n }\r\n\r\n if (this.cancellabelDebounce) {\r\n this.cancellabelDebounce.cancel();\r\n }\r\n\r\n const {\r\n telemetry,\r\n context,\r\n data: { searchState }\r\n } = this.props;\r\n\r\n if (context) {\r\n if (query && query.length > 0) {\r\n if (query.length > this.maxChars) {\r\n return;\r\n }\r\n\r\n this.cancellabelDebounce = debounce(\r\n () => {\r\n getSearchSuggestionsAction(\r\n new AutoSuggestInput(\r\n query,\r\n this.topResultsCount,\r\n this._getSuggestionType(this.inputSuggestionType),\r\n this.hitPrefix,\r\n this.hitSuffix\r\n ),\r\n context.actionContext\r\n )\r\n .then(results => {\r\n this._getSearchRefiners(query)\r\n .then(refiners => {\r\n this.setState({\r\n suggestions: results, searchRefiners: refiners,\r\n autoSuggestAriaLabel: this._setAutoSuggestResultCount(results)\r\n });\r\n })\r\n .catch(error => {\r\n this.setState({\r\n suggestions: results, searchRefiners: undefined,\r\n autoSuggestAriaLabel: this._setAutoSuggestResultCount(results)\r\n });\r\n telemetry.exception(error);\r\n telemetry.debug('Unable to get refiners results');\r\n });\r\n })\r\n .catch(error => {\r\n this.setState({\r\n suggestions: undefined, searchRefiners: undefined,\r\n autoSuggestAriaLabel: this._setAutoSuggestResultCount()\r\n });\r\n telemetry.exception(error);\r\n telemetry.debug('Unable to get auto suggest results');\r\n });\r\n },\r\n this.waitTime\r\n );\r\n\r\n setTimeout(\r\n () => {\r\n this.cancellabelDebounce();\r\n },\r\n 0\r\n );\r\n\r\n searchState.searchText = query;\r\n } else {\r\n this.setState({ suggestions: undefined, searchRefiners: undefined });\r\n searchState.searchText = '';\r\n }\r\n context.actionContext.update(createSearchStateInput(searchState), searchState);\r\n }\r\n };\r\n\r\n private _getSuggestionType = (suggestionTypes?: ISuggestionTypeCriterionData[]): string => {\r\n if (suggestionTypes && suggestionTypes.length > 0) {\r\n const distinctSuggestionTypes: string[] = [];\r\n suggestionTypes && suggestionTypes.forEach((suggestionTypeItem, index) => {\r\n suggestionTypeItem.SuggestionType && distinctSuggestionTypes.push(suggestionTypeItem.SuggestionType.charAt(0).toUpperCase() + suggestionTypeItem.SuggestionType.slice(1));\r\n });\r\n return distinctSuggestionTypes.join(',');\r\n }\r\n return 'Keyword, Product, ScopedCategory';\r\n };\r\n\r\n private async _getSearchRefiners(searchText: string): Promise<ProductRefiner[]> {\r\n const { actionContext: ctx } = this.props.context;\r\n return getProductSearchRefinersAsync(\r\n { callerContext: ctx },\r\n {\r\n SearchCondition: searchText,\r\n Context: {\r\n ChannelId: +ctx.requestContext.apiSettings.channelId,\r\n CatalogId: +ctx.requestContext.apiSettings.catalogId\r\n }\r\n }\r\n );\r\n }\r\n\r\n private _handleSubmit = (\r\n e: React.MouseEvent<HTMLElement> | React.KeyboardEvent<HTMLElement> | React.FormEvent<HTMLFormElement>\r\n ): void => {\r\n const {\r\n config: { disableSubmitSearch },\r\n context: {\r\n actionContext,\r\n app: {\r\n config: { searchQueryStringParameter }\r\n }\r\n }\r\n } = this.props;\r\n\r\n const query = this.searchTextInput.current && this.searchTextInput.current.value;\r\n e.preventDefault();\r\n\r\n if (!query || (query && query.length === 0) || disableSubmitSearch) {\r\n this.searchTextInput && this.searchTextInput.current && this.searchTextInput.current.focus();\r\n } else {\r\n const searchQsp = searchQueryStringParameter || 'q';\r\n const searchURL = this._appendQueryParams(getUrlSync('search', actionContext) || '', query, searchQsp);\r\n document.location.href = searchURL;\r\n }\r\n };\r\n\r\n private _handleCancelSearchChange = (): void => {\r\n const { isSearchFormExpanded, suggestions } = this.state;\r\n\r\n if (!isSearchFormExpanded) {\r\n this.setState({\r\n isSearchFormExpanded: true,\r\n searchText: '',\r\n isInitialState: false\r\n });\r\n } else {\r\n if (suggestions && suggestions.AllSearchResults) {\r\n this._clearAutoSuggestState();\r\n }\r\n\r\n this.setState({ isSearchFormExpanded: false });\r\n window.document.body.classList.toggle('search-open', false);\r\n }\r\n };\r\n\r\n private _appendQueryParams = (route: string, query: string, qsp: string): string => {\r\n if (route && route.length > 0) {\r\n return query && query.length > 0 ? `${route}${route.indexOf('?') === -1 ? '?' : '&'}${qsp}=${query}` : route;\r\n }\r\n return '';\r\n };\r\n\r\n private _setAutoSuggestResultCount = (result?: Autosuggestions) => {\r\n if (this.autoSuggestResultScreenReaderDiv.current !== null) {\r\n const ariaLiveRegion = this.autoSuggestResultScreenReaderDiv.current;\r\n const suggestResultString = this.props.resources.autoSuggestFoundMessage;\r\n const emptyResultString = this.props.resources.noAutoSuggestionMessage;\r\n ariaLiveRegion.innerText = result && (result.AllSearchResults && result.AllSearchResults.length > 0) ? suggestResultString : emptyResultString;\r\n ariaLiveRegion.setAttribute('aria-live', 'assertive');\r\n return ariaLiveRegion.innerText;\r\n } else {\r\n return '';\r\n }\r\n };\r\n}\r\n\r\nexport default Search;\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport * as React from 'react';\r\nimport { ISearchCategoryViewProps, ISearchFormViewProps, ISearchKeywordViewProps, ISearchProductViewProps } from './components';\r\n\r\nimport { INodeProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport { ISearchViewProps } from './citta-search';\r\n\r\nconst SearchView: React.FC<ISearchViewProps> = props => {\r\n const {\r\n Search,\r\n AutoSuggestAriaLabel,\r\n AutoSuggestAriaLabelText,\r\n searchText,\r\n AutoSuggest,\r\n KeywordSuggest,\r\n ProductSuggest,\r\n CategorySuggest,\r\n UlKeyword,\r\n UlProduct,\r\n UlCategory,\r\n form,\r\n searchLabel,\r\n searchLabelText,\r\n autosuggestCategory,\r\n autosuggestKeyword,\r\n autosuggestProduct,\r\n SearchForm,\r\n SearchBtn,\r\n FormWrapper,\r\n BtnWrapper\r\n } = props;\r\n\r\n return (\r\n <Module {...Search}>\r\n { /* @ts-ignore */}\r\n {_renderButton(form as ISearchFormViewProps, SearchBtn, BtnWrapper)}\r\n { /* @ts-ignore */}\r\n {_renderForm(form as ISearchFormViewProps, SearchForm, FormWrapper, searchLabel, searchLabelText)}\r\n <Node {...AutoSuggest}>\r\n {searchText && searchText.length > 0 ?\r\n <Node {...AutoSuggestAriaLabel}>{AutoSuggestAriaLabelText}</Node> : ''\r\n }\r\n {_renderKeywordSuggestions(KeywordSuggest, UlKeyword, autosuggestKeyword)}\r\n {_renderProductSuggestions(ProductSuggest, UlProduct, autosuggestProduct)}\r\n {_renderCategorySuggestions(CategorySuggest, UlCategory, autosuggestCategory)}\r\n </Node>\r\n </Module>\r\n );\r\n};\r\n\r\nconst _renderButton = (form: ISearchFormViewProps, SearchBtn: INodeProps, BtnWrapper: INodeProps) => {\r\n return (\r\n <Node {...SearchBtn}>\r\n <Node {...BtnWrapper}>\r\n {form.searchBtn}\r\n </Node>\r\n </Node>\r\n );\r\n};\r\n\r\nconst _renderForm = (form: ISearchFormViewProps, SearchForm: INodeProps, FormWrapper: INodeProps, searchLabel: INodeProps, searchLabelText: string) => {\r\n return (\r\n <Node {...SearchForm}>\r\n <Node {...FormWrapper}>\r\n {form.input}\r\n <span id='cancelBtn'>\r\n {form.cancelBtn}\r\n </span>\r\n </Node>\r\n </Node>\r\n );\r\n};\r\n\r\nconst _renderKeywordSuggestions = (\r\n KeywordSuggest: INodeProps,\r\n UlKeyword: INodeProps,\r\n keywordSuggestions?: ISearchKeywordViewProps\r\n) => {\r\n return (\r\n keywordSuggestions && (\r\n <Node {...KeywordSuggest}>\r\n <Node {...UlKeyword}>\r\n {keywordSuggestions.text.map(text => {\r\n return text;\r\n })}\r\n </Node>\r\n </Node>\r\n )\r\n );\r\n};\r\n\r\nconst _renderProductSuggestions = (\r\n ProductSuggest: INodeProps,\r\n UlProduct: INodeProps,\r\n productSuggestions?: ISearchProductViewProps\r\n) => {\r\n return (\r\n productSuggestions && (\r\n <Node {...ProductSuggest}>\r\n <Node {...UlProduct}>\r\n {productSuggestions.title}\r\n {productSuggestions.items.map((item, index) => {\r\n return (\r\n <Node {...item.LiProduct} key={item.id || index}>\r\n <Node {...item.AProduct}>\r\n {item.text}\r\n {item.price}\r\n </Node>\r\n </Node>\r\n );\r\n })}\r\n </Node>\r\n </Node>\r\n )\r\n );\r\n};\r\n\r\nconst _renderCategorySuggestions = (\r\n CategorySuggest: INodeProps,\r\n UlCategory: INodeProps,\r\n categorySuggestions?: ISearchCategoryViewProps\r\n) => {\r\n return (\r\n categorySuggestions && (\r\n <Node {...CategorySuggest}>\r\n <Node {...UlCategory}>\r\n {categorySuggestions.title}\r\n {categorySuggestions.text.map(text => {\r\n return text;\r\n })}\r\n </Node>\r\n </Node>\r\n )\r\n );\r\n};\r\n\r\nexport default SearchView;","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport msdyn365Commerce from '@msdyn365-commerce/core';\r\nimport { ICheckoutViewProps, IEmailDelivery, ILineItem, ILineItemDeliveryGroup, ILineItems, IPickUpAtStore } from '@msdyn365-commerce-modules/checkout';\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport { PriceComponent } from '@msdyn365-commerce/components';\r\nimport * as MsDyn365 from '@msdyn365-commerce/core';\r\nimport * as React from 'react';\r\nimport { ICheckoutProps } from '../definition-extensions/checkout.ext.props.autogenerated';\r\n\r\n\r\nexport const PickUpAtStoreComponent: React.FC<IPickUpAtStore> = ({ PickUpAtStore, label, location }) => (\r\n <Node {...PickUpAtStore}>\r\n {label}\r\n {location}\r\n </Node>\r\n);\r\n\r\nexport const EmailDeliveryComponent: React.FC<IEmailDelivery> = ({ EmailDelivery, label }) => (\r\n <Node {...EmailDelivery}>\r\n {label}\r\n </Node>\r\n);\r\n\r\nexport const LineItemComponent: React.FC<ILineItem> = ({ LineItem, item, pickUpAtStore, emailDelivery }) => (\r\n <Node {...LineItem}>\r\n {item}\r\n {pickUpAtStore && <PickUpAtStoreComponent {...pickUpAtStore} />}\r\n {emailDelivery && <EmailDeliveryComponent {...emailDelivery} />}\r\n </Node>\r\n);\r\n\r\nexport const LineItemGroupComponent: React.FC<ILineItemDeliveryGroup> = ({ LineItemDeliveryGroup, LineItemList, heading, lineItems }) => (\r\n <Node {...LineItemDeliveryGroup}>\r\n {heading}\r\n <Node {...LineItemList}>\r\n {lineItems.map(lineItem => (\r\n <LineItemComponent key={lineItem.LineId} {...lineItem} />\r\n ))}\r\n </Node>\r\n </Node>\r\n);\r\n\r\nexport const LineItemsComponent: React.FC<ILineItems> = ({ LineItems, Header, heading, editLink, itemsForPickup, itemsForShip, itemsForEmail }) => (\r\n <Node {...LineItems}>\r\n <Node {...Header}>\r\n {heading}\r\n {editLink}\r\n </Node>\r\n {itemsForPickup && <LineItemGroupComponent {...itemsForPickup} />}\r\n {itemsForEmail && <LineItemGroupComponent {...itemsForEmail} />}\r\n {itemsForShip && <LineItemGroupComponent {...itemsForShip} />}\r\n </Node>\r\n);\r\n\r\nfunction _renderOtherCharges(props: ICheckoutViewProps): React.ReactNode | null{\r\n const chargeAmountInclTax = props.data.checkout.result?.checkoutCart.cart.ChargeAmount && props.data.checkout.result?.checkoutCart.cart.ChargeAmount || 0;\r\n const shippingCharges = props.data.checkout.result?.checkoutCart.cart.ShippingChargeAmount && props.data.checkout.result?.checkoutCart.cart.ShippingChargeAmount || 0;\r\n const chargeLines = props.data.checkout.result?.checkoutCart.cart.ChargeLines;\r\n\r\n let otherChargesAmountFromLines = 0;\r\n let totalChargeAmountFromLines = 0;\r\n let chargesOverriden = false;\r\n let displayOtherChargesAmount = 0;\r\n let shippingChargesFromLines = 0;\r\n const freightChargeCode = props.context.app.config.freightChargeCode;\r\n\r\n if(chargeLines) {\r\n chargeLines.forEach(chargeLine => {\r\n const chargeAmountInclTaxLocal = chargeLine.CalculatedAmount ? chargeLine.CalculatedAmount : 0;\r\n if (chargeLine.ChargeCode != freightChargeCode) {\r\n otherChargesAmountFromLines += chargeAmountInclTaxLocal;\r\n }\r\n if (chargeLine.ChargeCode == freightChargeCode){\r\n shippingChargesFromLines += chargeAmountInclTaxLocal;\r\n }\r\n });\r\n }\r\n\r\n if(shippingChargesFromLines == 0 && shippingCharges != shippingChargesFromLines)\r\n {\r\n totalChargeAmountFromLines = shippingCharges + otherChargesAmountFromLines;\r\n }\r\n else{\r\n totalChargeAmountFromLines = shippingChargesFromLines + otherChargesAmountFromLines;\r\n }\r\n \r\n chargesOverriden = totalChargeAmountFromLines != chargeAmountInclTax;\r\n displayOtherChargesAmount = chargesOverriden ? 0 : otherChargesAmountFromLines;\r\n if (displayOtherChargesAmount == 0) {\r\n return null;\r\n }\r\n\r\n return (\r\n <p className={`msc-order-summary__line_other-charges`}>\r\n {displayOtherChargesAmount && displayOtherChargesAmount > 0 ? (\r\n <>\r\n <span className='msc-order-summary__label'>Other charges</span>\r\n <PriceComponent\r\n data={{\r\n price: { CustomerContextualPrice: displayOtherChargesAmount }\r\n }}\r\n freePriceText={undefined}\r\n context={props.context}\r\n id={props.id}\r\n typeName={props.typeName}\r\n className={'msc-order-summary__value'}\r\n />\r\n </>\r\n ) : null}\r\n </p>\r\n );\r\n}\r\n\r\n\r\nfunction _renderShippingInclTaxes(props: ICheckoutViewProps): React.ReactNode | null{\r\n const chargeLines = props.data.checkout.result?.checkoutCart.cart.ChargeLines;\r\n let chargeAmountInclTax = 0;\r\n if(chargeLines) {\r\n chargeLines.forEach(chargeLine => {\r\n if (chargeLine.IsShipping) {\r\n const chargeAmountInclTaxLocal = chargeLine.GrossAmount ? chargeLine.GrossAmount : 0;\r\n chargeAmountInclTax += chargeAmountInclTaxLocal;\r\n }\r\n });\r\n }\r\n if (chargeAmountInclTax == 0) {\r\n return props.orderSummary?.lines?.shipping;\r\n }\r\n\r\n return (\r\n <p className={`msc-order-summary__line-shipment`}>\r\n {chargeAmountInclTax && chargeAmountInclTax > 0 ? (\r\n <>\r\n <span className='msc-order-summary__label'>{props.resources.shippingLabel}</span>\r\n <PriceComponent\r\n data={{\r\n price: { CustomerContextualPrice: chargeAmountInclTax }\r\n }}\r\n freePriceText={undefined}\r\n context={props.context}\r\n id={props.id}\r\n typeName={props.typeName}\r\n className={'msc-order-summary__value'}\r\n />\r\n </>\r\n ) : null}\r\n </p>\r\n );\r\n}\r\n\r\nfunction _renderTotalSavings(props: ICheckoutViewProps): JSX.Element | null {\r\n\r\n const DiscountAmount = props.data.checkout.result?.checkoutCart.cart.DiscountAmount;\r\n return (\r\n <p className={`msc-order-summary__line--discount-amount`}>\r\n {DiscountAmount && DiscountAmount > 0 ? (\r\n <>\r\n <span className='msc-order-summary__label'>{props.resources.totalSavingsLabel}</span>\r\n <PriceComponent\r\n data={{\r\n price: { CustomerContextualPrice: DiscountAmount }\r\n }}\r\n freePriceText={undefined}\r\n context={props.context}\r\n id={props.id}\r\n typeName={props.typeName}\r\n className={'msc-order-summary__value'}\r\n />\r\n </>\r\n ) : null}\r\n </p>\r\n );\r\n}\r\n\r\nconst _renderOrderSummarylines = (props: ICheckoutViewProps & ICheckoutProps<{}>): JSX.Element | null => {\r\n const isB2B = props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits === 'b2b';\r\n const {orderSummary } = props;\r\n if (!orderSummary) {\r\n return null;\r\n }\r\n return (\r\n <div className='msc-order-summary-wrapper'>\r\n {orderSummary.heading}\r\n <div className='msc-order-summary__items'>\r\n {orderSummary.lines && (\r\n <>\r\n {isB2B ? orderSummary.lines.subtotal : _renderSubTotal(props)}\r\n {isB2B ? null : orderSummary.lines.totalDiscounts}\r\n {_renderShippingInclTaxes(props)}\r\n {_renderOtherCharges(props)}\r\n {/*hide on us*/}\r\n {props.config.hideTaxLine ? null : orderSummary.lines.tax}\r\n {_renderTotalOrder(props)}\r\n {orderSummary.lines.loyalty}\r\n {orderSummary.lines.giftCard}\r\n {isB2B ? null : orderSummary.lines.orderTotal}\r\n {isB2B? null : _renderTotalSavings(props)}\r\n </>\r\n )}\r\n </div>\r\n {_renderFreeShippingMessage(props)}\r\n {_getCheckoutSummaryText(props)}\r\n </div>\r\n );\r\n};\r\n\r\nfunction _renderFreeShippingMessage(props: ICheckoutViewProps & ICheckoutProps<{}>): JSX.Element | null {\r\n const shippingAmount = props.data.checkout.result?.checkoutCart.cart.DeliveryModeChargeAmount || 0;\r\n const OrderSubTotal = (props.data.checkout.result?.checkoutCart.cart.AmountDue || 0) - shippingAmount;\r\n \r\n const freeShippingAmount = props.config.freeShippingAmount;\r\n\r\n if (!freeShippingAmount || !OrderSubTotal || OrderSubTotal >= freeShippingAmount) {\r\n return null;\r\n }\r\n return <div className=\"shipping-to-free-message\">\r\n Spend an additional ${Math.ceil(freeShippingAmount - OrderSubTotal)} to get <b>FREE SHIPPING</b>\r\n </div>\r\n}\r\n\r\nfunction _renderSubTotal(props: ICheckoutViewProps): JSX.Element | null {\r\n var subtotal=0;\r\n props.data.checkout.result?.checkoutCart.cart.CartLines?.forEach((item)=>{\r\n subtotal += item.Price! * item.Quantity!;\r\n });\r\n const OrderSubTotal = subtotal;//props.data.checkout.result?.checkoutCart.cart.NetPrice;\r\n return (\r\n <p className={`msc-order-summary__line-sub-total`}>\r\n {OrderSubTotal && OrderSubTotal > 0 ? (\r\n <>\r\n <span className='msc-order-summary__label'>{props.resources.subTotalLabel}</span>\r\n <PriceComponent\r\n data={{\r\n price: { CustomerContextualPrice: OrderSubTotal }\r\n }}\r\n freePriceText={undefined}\r\n context={props.context}\r\n id={props.id}\r\n typeName={props.typeName}\r\n className={'msc-order-summary__value'}\r\n />\r\n </>\r\n ) : null}\r\n </p>\r\n );\r\n}\r\nfunction _renderTotalOrder(props: ICheckoutViewProps): JSX.Element | null {\r\n\r\n const OrderTotal = props.data.checkout.result?.checkoutCart.cart.TotalAmount;\r\n return (\r\n <p className={`msc-order-summary__line-order-total`}>\r\n {OrderTotal && OrderTotal > 0 ? (\r\n <>\r\n <span className='msc-order-summary__label'>{props.resources.totalAmountLabel}</span>\r\n <PriceComponent\r\n data={{\r\n price: { CustomerContextualPrice: OrderTotal }\r\n }}\r\n freePriceText={undefined}\r\n context={props.context}\r\n id={props.id}\r\n typeName={props.typeName}\r\n className={'msc-order-summary__value'}\r\n />\r\n </>\r\n ) : null}\r\n </p>\r\n );\r\n}\r\nconst _getCheckoutSummaryText = (props: ICheckoutViewProps & ICheckoutProps<{}>): React.ReactNode | undefined => {\r\n const { paragraph } = props.config;\r\n\r\n return (\r\n paragraph && (\r\n <MsDyn365.RichTextComponent\r\n text={paragraph}\r\n className='msc-order-summary__summary-text'\r\n />\r\n )\r\n );\r\n};\r\nconst CheckoutView: React.FC<ICheckoutViewProps & ICheckoutProps<{}>> = props => {\r\n const {\r\n canShow,\r\n checkoutProps,\r\n headerProps,\r\n hasSalesOrder,\r\n bodyProps,\r\n mainProps,\r\n mainControlProps,\r\n sideProps,\r\n sideControlFirstProps,\r\n sideControlSecondProps,\r\n termsAndConditionsProps,\r\n orderConfirmation,\r\n loading,\r\n alert,\r\n title,\r\n guidedForm,\r\n lineItems,\r\n placeOrderButton,\r\n termsAndConditions,\r\n keepShoppingButton\r\n } = props;\r\n\r\n let isBusy = false;\r\n if(msdyn365Commerce.isBrowser) {\r\n const url: string = decodeURI(window.location.search);\r\n const urlParams: URLSearchParams = new URLSearchParams(url);\r\n if (urlParams.get('paymentMethod') === 'AP' && urlParams.has('orderToken')) {\r\n const orderToken = urlParams.get('orderToken');\r\n const afterpayStatus = urlParams.get('status') || 'FAILURE';\r\n\r\n if (afterpayStatus === 'SUCCESS' && orderToken) {\r\n isBusy = true;\r\n }\r\n }\r\n }\r\n\r\n const isB2B = props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits === 'b2b';\r\n function _renderPlaceOrderCopy(): JSX.Element | null {\r\n return (\r\n <div className=\"place-order-copy\">\r\n <span>By clicking Place order you agree to your signed terms of business, please contact your account manager for further information.</span>\r\n </div>\r\n )\r\n }\r\n\r\n return (\r\n <Module {...checkoutProps}>\r\n {!hasSalesOrder && <Node {...headerProps}>{title}</Node>}\r\n {!hasSalesOrder &&\r\n <Node {...bodyProps} className={`${bodyProps.className} ${isBusy ? \"checkout-isbusy\" : \"\" }` }>\r\n {loading}\r\n {\r\n isBusy ? (\r\n <div className=\"afterpay-loading-wrapper\">\r\n <div className='afterpay-loading-wrapper-spinner' /> \r\n </div> \r\n ) : null\r\n }\r\n {alert}\r\n {canShow && (\r\n <>\r\n <Node {...mainProps}>\r\n {guidedForm}\r\n <Node {...termsAndConditionsProps}>\r\n {termsAndConditions}\r\n </Node>\r\n <Node {...mainControlProps}>\r\n {placeOrderButton}\r\n {keepShoppingButton}\r\n </Node>\r\n {isB2B? _renderPlaceOrderCopy() : null}\r\n </Node>\r\n <Node {...sideProps}>\r\n {_renderOrderSummarylines(props)}\r\n <Node {...sideControlFirstProps}>\r\n <Node {...termsAndConditionsProps}>\r\n {termsAndConditions}\r\n </Node>\r\n {placeOrderButton}\r\n {keepShoppingButton}\r\n </Node>\r\n {lineItems && <LineItemsComponent {...lineItems} />}\r\n <Node {...sideControlSecondProps}>\r\n <Node {...termsAndConditionsProps}>\r\n {termsAndConditions}\r\n </Node>\r\n {placeOrderButton}\r\n {keepShoppingButton}\r\n </Node>\r\n </Node>\r\n </>\r\n )}\r\n </Node>\r\n }\r\n {hasSalesOrder && orderConfirmation}\r\n </Module>\r\n );\r\n};\r\n\r\nexport default CheckoutView;\r\n","import * as React from 'react';\r\n\r\nimport { Button, format } from '@msdyn365-commerce-modules/utilities';\r\nimport { PriceComponent } from '@msdyn365-commerce/components';\r\nimport { 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\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 promoCodeApplyCallback?(): void;\r\n}\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\r\n constructor(props: IPromoCodeProps, state: IPromoCodeState) {\r\n super(props);\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 render(): JSX.Element {\r\n return (\r\n <div>\r\n <div className='msc-promo-code-heading'>{this.props.promoCodeHeadingText}</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'>{this.state.error}</p>\r\n {this._renderAppliedPromoCode(this.props)}\r\n </div>\r\n );\r\n }\r\n\r\n private _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: error,\r\n canApply: e.target.value ? true : false\r\n });\r\n }\r\n\r\n private _applyPromotion = (cartState: ICartState | undefined) => {\r\n if (!cartState || !cartState.cart) {\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(error => {\r\n this.setState({ error: this.props.failedToAddPromoCodeErrorText });\r\n });\r\n }\r\n\r\n private _renderForm = (promoPlaceholderText: string, promoCodeApplyButtonText: string, cartState: ICartState | undefined) => {\r\n const _onSubmit = (event: React.FormEvent<HTMLFormElement>) => {event.preventDefault(); this._applyPromotion(cartState);};\r\n const _applyPromotion = (event: React.MouseEvent<HTMLElement>) => {this._applyPromotion(cartState);};\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 >\r\n {promoCodeApplyButtonText}\r\n </Button>\r\n </div>\r\n </form>\r\n );\r\n }\r\n\r\n private _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: [\r\n code\r\n ]\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 private _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 _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>) => {this._removePromotion(props.cart, event);};\r\n\r\n return (\r\n <>\r\n <div className='msc-promo-code__discount'>\r\n <div className='msc-promo-code__discount-heading'>{this.props.appliedPromoCodeHeadingText}</div>\r\n <PriceComponent\r\n data={{\r\n price: {\r\n CustomerContextualPrice: props.cart.cart.DiscountAmount\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 <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 </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\nexport default PromoCode;","import { getProductPageUrlSync } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { format } from '@msdyn365-commerce-modules/utilities';\r\nimport { RatingComponent } from '@msdyn365-commerce/components';\r\nimport { IComponentProps, ICoreContext, IGridSettings, IImageData, IImageSettings, Image, msdyn365Commerce } from '@msdyn365-commerce/core';\r\nimport { ProductPrice, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport React from 'react';\r\nimport PriceComponent from '../../../../components/price-component';\r\n\r\nexport interface IProductComponentProps extends IComponentProps<{ product?: ProductSearchResult }> {\r\n className?: string;\r\n imageSettings?: IImageSettings;\r\n savingsText?: string;\r\n freePriceText?: string;\r\n originalPriceText?: string;\r\n currentPriceText?: string;\r\n ratingAriaLabel?: string;\r\n}\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 typeName,\r\n id\r\n}) => {\r\n const product = data.product;\r\n if (!product) {\r\n return null;\r\n }\r\n\r\n let imageOrientation: string = '';\r\n if (product.AttributeValues!.length > 0) {\r\n product.AttributeValues!.map(property => {\r\n if (property.Name === 'Image Orientation') {\r\n imageOrientation = property.TextValue!;\r\n }\r\n });\r\n }\r\n const productUrl = getProductPageUrlSync(product.Name || '', product.RecordId, context && context.actionContext, undefined);\r\n const productImageSettings = imageOrientation === 'Landscape' ? getLandscapeImageSettings(imageSettings) : imageSettings;\r\n\r\n // Construct telemetry attribute to render\r\n const attribute = context\r\n && context.telemetry\r\n && context.telemetry.setTelemetryAttribute\r\n && context.telemetry.setTelemetryAttribute(product.RecordId.toString(), {\r\n pid: product.RecordId,\r\n pname: product.Name,\r\n mname: id\r\n }\r\n );\r\n return (\r\n <a href={productUrl} aria-label={renderLabel(product.Name, context.cultureFormatter.formatCurrency(product.Price), product.AverageRating, ratingAriaLabel)} className='msc-product' {...attribute}>\r\n <div className='msc-product__image'>\r\n {renderProductPlacementImage(productImageSettings, context.request.gridSettings, product.PrimaryImageUrl, product.Name)}\r\n </div>\r\n <div className='msc-product__details'>\r\n <h4 className='msc-product__title'>{product.Name}</h4>\r\n {renderPrice(context, typeName, id, product.BasePrice, product.Price, savingsText, freePriceText, originalPriceText, currentPriceText)}\r\n {renderDescription(product.Description)}\r\n {renderRating(context, typeName, id, product.AverageRating, product.TotalRatings, ratingAriaLabel)}\r\n </div>\r\n </a>\r\n );\r\n};\r\n\r\nfunction renderLabel(name: string = '', price: string = '', rating?: number, ratingAriaLabel?: string): string {\r\n let ratingLabel = '';\r\n\r\n if (rating) {\r\n const roundedRating = rating.toFixed(2);\r\n ratingLabel = format(ratingAriaLabel || '', roundedRating, '5');\r\n }\r\n\r\n return (`${name} ${price} ${ratingLabel}`);\r\n}\r\n\r\nfunction renderDescription(description?: string): JSX.Element | null {\r\n return <p className='msc-product__text'>{description}</p>;\r\n}\r\n\r\nfunction renderRating(context: ICoreContext, typeName: string, id: string, avgRating?: number, totalRatings?: number, ariaLabel?: string): JSX.Element | null {\r\n if (!avgRating) {\r\n return null;\r\n }\r\n\r\n const numRatings = totalRatings && totalRatings.toString() || undefined;\r\n\r\n return (\r\n <RatingComponent\r\n context={context}\r\n id={id}\r\n typeName={typeName}\r\n avgRating={avgRating}\r\n ratingCount={numRatings}\r\n readOnly={true}\r\n ariaLabel={ariaLabel || ''}\r\n data={{}}\r\n />\r\n );\r\n}\r\n\r\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): JSX.Element | null {\r\n const price: ProductPrice = {\r\n BasePrice: basePrice,\r\n AdjustedPrice: adjustedPrice,\r\n CustomerContextualPrice: adjustedPrice\r\n };\r\n\r\n return (\r\n <PriceComponent\r\n context={context}\r\n id={id}\r\n typeName={typeName}\r\n data={{ price: price }}\r\n savingsText={savingsText}\r\n freePriceText={freePriceText}\r\n originalPriceText={originalPriceText}\r\n />\r\n );\r\n}\r\n\r\nfunction renderProductPlacementImage(imageSettings?: IImageSettings, gridSettings?: IGridSettings, imageUrl?: string, altText: string = ''): 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\r\n };\r\n const imageProps = {\r\n gridSettings: gridSettings,\r\n imageSettings: imageSettings\r\n };\r\n return (\r\n <Image {...img} {...imageProps} loadFailureBehavior='empty' />\r\n );\r\n}\r\n\r\nfunction getLandscapeImageSettings(cmsImageSettings?: IImageSettings): IImageSettings {\r\n // tslint:disable-next-line: no-unnecessary-local-variable\r\n const landscapeImageSettings: IImageSettings = {\r\n viewports: {\r\n xs: { q: 'w=390&h=292&q=80&m=6&f=jpg', w: 390, h: 292 },\r\n sm: { q: 'w=528&h=396&q=80&m=6&f=jpg', w: 528, h: 396 },\r\n md: { q: 'w=640&h=479&q=80&m=6&f=jpg', w: 640, h: 479 },\r\n lg: { q: 'w=584&h=437&q=80&m=6&f=jpg', w: 584, h: 437 },\r\n xl: { q: 'w=702&h=526&q=80&m=6&f=jpg', w: 702, h: 526 }\r\n },\r\n disableLazyLoad: cmsImageSettings && cmsImageSettings.disableLazyLoad,\r\n lazyload: cmsImageSettings && cmsImageSettings.lazyload\r\n };\r\n\r\n return landscapeImageSettings;\r\n}\r\n\r\n// @ts-ignore\r\nexport const ProductComponent: React.FunctionComponent<IProductComponentProps> = msdyn365Commerce.createComponent<IProductComponentProps>(\r\n 'Product',\r\n { component: ProductCard }\r\n);","import { IProductCollectionViewProps } from '@msdyn365-commerce-modules/product-collection';\r\nimport { INodeProps, Module, Node, NodeTag } from '@msdyn365-commerce-modules/utilities';\r\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\nimport {ProductComponent} from './components/product-collection-component';\r\n\r\nconst ProductCollectionView: React.FC<IProductCollectionViewProps> = props => {\r\n const { heading, ProductCollectionContainer, products, SingleSlideCarouselComponentProps, GridComponentProps, isCarousel } = props;\r\n if (products) {\r\n return (\r\n <Module {...ProductCollectionContainer}>\r\n {heading}\r\n {\r\n isCarousel ? _renderCarousel(SingleSlideCarouselComponentProps,props.config.productCollection.products,props) :\r\n _renderGrid(GridComponentProps, props.config.productCollection.products,props)\r\n }\r\n </Module>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst _renderCarousel = (carouselContainer: INodeProps, items: ProductSearchResult[],PropDetails: React.PropsWithChildren<IProductCollectionViewProps>): JSX.Element => {\r\n const isMobile = PropDetails.context && PropDetails.context.request && PropDetails.context.request.device.Type === 'Mobile'\r\n let mobileCarouselContainer = {\r\n tag: 'ul' as NodeTag,\r\n className: 'ms-product-collection__custom-carousel'\r\n }\r\n return (\r\n <Node {...(isMobile ? mobileCarouselContainer : carouselContainer)}>\r\n {items && items.map((item,index)=>_renderProduct(item,PropDetails,index))}\r\n </Node>\r\n );\r\n};\r\n\r\nconst _renderGrid = (gridContainer: INodeProps, items: ProductSearchResult[],PropDetails: React.PropsWithChildren<IProductCollectionViewProps>): JSX.Element => {\r\n return (\r\n <Node {...gridContainer}>\r\n {items && items.map((item,index)=>_renderProduct(item,PropDetails,index))}\r\n </Node>\r\n );\r\n};\r\n\r\nconst _renderProduct = (product: ProductSearchResult,PropDetails: React.PropsWithChildren<IProductCollectionViewProps>,index: number): JSX.Element => {\r\n const liClass = 'ms-product-collection__item';\r\n const orientationClass = getImageOrientation(product) === 'Landscape'? 'product-placement__item-limage' : 'product-placement__item-pimage';\r\n return (\r\n <li className={`${liClass} ${orientationClass}`} key={index} >\r\n <ProductComponent\r\n context={PropDetails.context}\r\n imageSettings={PropDetails.config.imageSettings}\r\n freePriceText={PropDetails.resources.priceFree}\r\n originalPriceText={PropDetails.resources.originalPriceText}\r\n currentPriceText={PropDetails.resources.currentPriceText}\r\n ratingAriaLabel={PropDetails.resources.ratingAriaLabel}\r\n id={PropDetails.id}\r\n typeName={PropDetails.typeName}\r\n data={{product: product}}\r\n />\r\n </li>\r\n );\r\n};\r\n\r\nfunction getImageOrientation(product: ProductSearchResult): string {\r\n let imageOrientation: string ='';\r\n if (product.AttributeValues!.length > 0) {\r\n product.AttributeValues!.map(property => {\r\n if (property.Name?.toLowerCase() === 'image orientation') {\r\n imageOrientation = property.TextValue!;\r\n }\r\n });\r\n }\r\n return imageOrientation;\r\n}\r\n\r\nexport default ProductCollectionView;","/*!\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 { Button, Collapse, IModuleProps, isMobile, VariantType } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { FeatureState } from '@msdyn365-commerce/retail-proxy';\nimport { IBulkPurchaseData } from './bulk-purchase.data';\nimport { IBulkPurchaseProps } from './bulk-purchase.props.autogenerated';\n\n/**\n * Additional optional props for the bulk purchase.\n */\nexport interface IBulkPurchaseExtendedProps extends IBulkPurchaseProps<IBulkPurchaseData> {\n productDimensions?: IProductDimensionsWithAvailabilitiesFull[];\n}\n\n/**\n * View for the bulk purchase module.\n */\nexport interface IBulkPurchaseViewProps extends IBulkPurchaseProps<IBulkPurchaseData> {\n container: IModuleProps;\n content: React.ReactElement;\n}\n\n/**\n * View for the bulk purchase module.\n */\nexport interface IBulkPurchaseState {\n isExpanded: boolean;\n}\n\n/**\n * Bulk-purchase module.\n */\nexport class BulkPurchase extends React.PureComponent<IBulkPurchaseExtendedProps, IBulkPurchaseState> {\n public static readonly className = 'ms-bulk-purchase';\n private readonly collapseRef: React.RefObject<Collapse> = React.createRef<Collapse>();\n\n public constructor(props: IBulkPurchaseExtendedProps) {\n super(props);\n\n this.state = {\n isExpanded: false\n };\n }\n\n public render(): React.ReactElement | null {\n const hasDimensionsInProps = ArrayExtensions.hasElements(this.props.productDimensions);\n const hasDimensionsInData = ArrayExtensions.hasElements(this.props.data.productDimensions?.result);\n if (!hasDimensionsInProps && !hasDimensionsInData) {\n return null;\n }\n\n const viewProps: IBulkPurchaseViewProps = {\n ...this.props,\n container: {\n moduleProps: this.props,\n className: classnames(BulkPurchase.className, this.props.config.className)\n },\n content: this._renderCollapseContent(`${BulkPurchase.className}__content`)\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n private _renderCollapseContent(className: string): React.ReactElement {\n return (\n <div className={className}>\n {this._renderCollapseButton(`${className}__collapse-button`)}\n {this._renderCollapse(`${className}__collapse`)}\n </div>\n );\n }\n\n private _renderCollapseButton(className: string): React.ReactElement {\n return (\n <Button\n className={className}\n onClick={this._toggleCollapse}\n aria-expanded={this.state.isExpanded}\n title={this.props.resources.bulkPurchaseHeaderTitle}\n >\n {this.props.resources.bulkPurchaseHeaderTitle}\n </Button>\n );\n }\n\n /**\n *This function is being used to handel variant change dropdown.\n */\n private _dimensionDropDownChange = () => {\n this.collapseRef.current?.reEvaluateHeight();\n };\n\n private _renderCollapse(className: string): React.ReactElement {\n return (\n <Collapse className={className} isOpen={this.state.isExpanded} ref={this.collapseRef}>\n {this._renderMainContent(`${className}__main-content`)}\n </Collapse>\n );\n }\n\n private _renderMainContent(className: string): React.ReactElement {\n const isMobileDevice = isMobile({ variant: VariantType.Viewport, context: this.props.context.request }) === 'xs';\n\n return (\n <div className={className}>\n {!isMobileDevice && (\n <div className={`${className}__description`}>\n <RichTextComponent text={this.props.resources.bulkPurchaseDescriptionText} />\n </div>\n )}\n {this._renderMatrix(`${className}__matrix-container`)}\n </div>\n );\n }\n\n private _renderMatrix(className: string): React.ReactElement {\n const hasDimensionsInProps = ArrayExtensions.hasElements(this.props.productDimensions);\n const channelMultipleCatalogsFeature = 'Dynamics.AX.Application.ChannelMultipleCatalogsFeature';\n const { featureState } = this.props.data;\n const isMultipleCatalogsFeatureEnabled =\n featureState?.result?.find((item: FeatureState) => item.Name === channelMultipleCatalogsFeature)?.IsEnabled || false;\n const catalogId = getCatalogId(this.props.context.request);\n validateCatalogId(catalogId);\n return (\n <ProductDimensionsMatrix\n className={className}\n context={this.props.context as ICoreContext<IDimensionsApp>}\n data={{\n dimensions: hasDimensionsInProps ? this.props.productDimensions! : this.props.data.productDimensions!.result!,\n orderTemplates: this.props.data.orderTemplates?.result,\n customerInformation: this.props.data.customerInformation?.result\n }}\n resources={this.props.resources}\n dimensionOnChange={this._dimensionDropDownChange}\n isMultipleCatalogFeatureEnabledInHq={isMultipleCatalogsFeatureEnabled}\n catalogId={catalogId}\n />\n );\n }\n\n /**\n * Callback which toggles collapse mode.\n */\n private readonly _toggleCollapse = () => {\n this.setState(state => ({\n isExpanded: !state.isExpanded\n }));\n };\n}\n\nexport default BulkPurchase;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Module } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IBulkPurchaseViewProps } from './bulk-purchase';\n\n/**\n * Bulk purchase view.\n * @param props - Bulk purchase view props.\n * @returns React node with a module.\n */\nexport const BulkPurchaseViewComponent: React.FC<IBulkPurchaseViewProps> = props => {\n return <Module {...props.container}>{props.content}</Module>;\n};\n\nexport default BulkPurchaseViewComponent;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { IHeaderData } from '../header.data';\nimport { IHeaderProps } from '../header.props.autogenerated';\n\n/**\n * The header preferred store component.\n */\n@observer\nexport class HeaderPreferredStore extends React.PureComponent<IHeaderProps<IHeaderData>> {\n private readonly modalCloseButtonRef: React.RefObject<HTMLButtonElement> = React.createRef();\n\n /**\n * Handle click on the store selector.\n * @returns : Promise void.\n */\n public handleClick = () => {\n return this._findPreferredStoreOnClick(this.props);\n };\n\n public render(): JSX.Element | undefined {\n const {\n data: {\n storeSelectorStateManager: { result: storeSelectorStateManager }\n },\n slots,\n resources\n } = this.props;\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- slots can be undefined.\n if (ArrayExtensions.hasElements(slots?.storeSelector)) {\n const storeName =\n storeSelectorStateManager?.preferredStore && storeSelectorStateManager.preferredStore.StoreName\n ? storeSelectorStateManager.preferredStore.StoreName\n : resources.headerPreferredStoreText;\n\n return (\n <div className='ms-header__preferred-store-container'>\n <button\n className='ms-header__preferred-store-btn msc-btn'\n color='secondary'\n aria-label={resources.headerPreferredStoreAriaLabel}\n onClick={this.handleClick}\n ref={this.modalCloseButtonRef}\n >\n <span className='ms-header__preferred-store-text'>{storeName}</span>\n </button>\n {slots.storeSelector}\n </div>\n );\n }\n\n return undefined;\n }\n\n private async _findPreferredStoreOnClick(props: IHeaderProps<IHeaderData>): Promise<void> {\n const {\n data: {\n storeSelectorStateManager: { result: storeSelectorStateManager }\n },\n modules\n } = props;\n if (!storeSelectorStateManager) {\n return;\n }\n let storeSelectorId: string = '';\n if (modules && Object.keys(modules).length > 0 && ArrayExtensions.hasElements(modules.storeSelector)) {\n storeSelectorId = modules.storeSelector[0].id;\n }\n await storeSelectorStateManager\n .openDialog({\n id: storeSelectorId,\n showMapViewLink: true,\n parentElementRef: this.modalCloseButtonRef,\n onLocationSelected: orgUnitLocation => {\n return Promise.resolve();\n }\n })\n .catch((error: Error) => {\n if (props.telemetry) {\n props.telemetry.error(error.message);\n props.telemetry.debug('Unable to set preferred store');\n }\n });\n }\n}\n\nexport default HeaderPreferredStore;\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 { getPayloadObject, getTelemetryAttributes, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface ILogoProps {\n image: Msdyn365.IImageData;\n gridSettings?: Msdyn365.IGridSettings;\n link?: ILinkData;\n className?: string;\n telemetryContent?: ITelemetryContent;\n requestContext: Msdyn365.IRequestContext;\n typeName?: string;\n}\n\nexport interface ILinkData {\n linkUrl: Msdyn365.ILinkData;\n ariaLabel?: string;\n openInNewTab?: boolean;\n linkText?: string;\n}\n\n/**\n *\n * Logo component.\n * @extends {React.PureComponent<ILogoConfig>}\n */\nexport class Logo extends React.PureComponent<ILogoProps> {\n private readonly attributes?: Msdyn365.IDictionary<string>;\n\n constructor(props: ILogoProps) {\n super(props);\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.Logo);\n this.attributes = getTelemetryAttributes(props.telemetryContent!, payLoad);\n }\n\n public render(): JSX.Element {\n return <div className={this.props.className}>{this._renderLogo(this.props)}</div>;\n }\n\n private _renderLogo(config: ILogoProps): JSX.Element {\n if (config.link && config.link.linkUrl.destinationUrl) {\n return (\n <a\n href={config.link.linkUrl.destinationUrl}\n aria-label={config.link.ariaLabel}\n target={config.link.openInNewTab ? '_blank' : undefined}\n rel='noopener noreferrer'\n {...this.attributes}\n >\n {this._renderImage(config)}\n </a>\n );\n }\n return this._renderImage(config);\n }\n\n private _renderImage(config: ILogoProps): JSX.Element {\n const defaultImageSettings: Msdyn365.IImageSettings = {\n viewports: {\n xs: { q: 'w=132&h=28&m=6', w: 0, h: 0 },\n lg: { q: 'w=160&h=48&m=6', w: 0, h: 0 }\n },\n lazyload: true\n };\n\n return (\n <Msdyn365.Image\n {...config.image}\n requestContext={this.props.requestContext}\n gridSettings={this.props.gridSettings!}\n imageSettings={(config && config.image && config.image.imageSettings) || defaultImageSettings}\n loadFailureBehavior='default'\n editProps={{\n key: config.image || {},\n requestContext: this.props.requestContext,\n moduleType: this.props.typeName,\n imagePropertyName: 'image'\n }}\n shouldSkipToMainImage\n />\n );\n }\n}\n\nexport default Logo;\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 {\n Button,\n getPayloadObject,\n getTelemetryAttributes,\n ITelemetryContent,\n TelemetryConstant\n} from '@msdyn365-commerce-modules/utilities';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { IHeaderResources } from '../header.props.autogenerated';\n\nexport interface INavIconProps {\n resources: IHeaderResources;\n isExpanded: boolean;\n targetId: string;\n telemetryContent?: ITelemetryContent;\n toggleNavBar(): void;\n}\n\n/**\n *\n * NavIcon component.\n * @extends {React.PureComponent<INavIconProps>}\n */\n\n@observer\nexport class NavIcon extends React.PureComponent<INavIconProps> {\n private readonly attributes?: Msdyn365.IDictionary<string>;\n\n constructor(props: INavIconProps) {\n super(props);\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.NavIcon);\n this.attributes = getTelemetryAttributes(props.telemetryContent!, payLoad);\n }\n\n public render(): JSX.Element {\n return (\n <Button\n className='ms-header__nav-icon'\n onClick={this.props.toggleNavBar}\n title={this.props.resources.mobileHamburgerAriaLabel}\n aria-label={this.props.resources.mobileHamburgerAriaLabel}\n aria-expanded={this.props.isExpanded}\n aria-controls={this.props.targetId}\n {...this.attributes}\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 { CartIconComponent, WishListIconComponent } from '@msdyn365-commerce/components';\nimport * as MsDyn365 from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { Customer } from '@msdyn365-commerce/retail-proxy';\nimport { ErrorNotification, NotificationsManager } from '@msdyn365-commerce-modules/notifications-core';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n Button,\n format,\n getPayloadObject,\n getTelemetryAttributes,\n getTelemetryObject,\n IModuleProps,\n INodeProps,\n ITelemetryContent,\n KeyCodes,\n Modal,\n ModalBody,\n ModalHeader,\n onTelemetryClick,\n Popover,\n TelemetryConstant\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { computed, reaction } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { isChannelTypeB2B } from '@msdyn365-commerce/core';\nimport { HeaderPreferredStore, Logo, NavIcon } from './components';\nimport { IHeaderData } from './header.data';\nimport { IHeaderProps, IHeaderResources, IMyAccountLinksData } from './header.props.autogenerated';\n\nexport interface IHeaderState {\n mobileMenuCollapsed: boolean;\n signinPopoverOpen: boolean;\n hasSigninerror?: boolean;\n}\n\nexport interface IHeaderViewProps extends IHeaderProps<IHeaderData>, IHeaderState {\n logo: React.ReactNode;\n wishListIconDesktop: React.ReactNode;\n wishListIconMobile: React.ReactNode;\n cartIcon: React.ReactNode;\n navIcon: React.ReactNode;\n className: string;\n menuBar: React.ReactNode[];\n search: React.ReactNode[];\n siteOptions: React.ReactNode[];\n HeaderTag: IModuleProps;\n HeaderContainer: INodeProps;\n MobileMenuContainer: INodeProps;\n MobileMenuHeader: React.ReactNode;\n MobileMenuBodyContainer: INodeProps;\n MobileMenuLinksContainer: INodeProps;\n HeaderTopBarContainer: INodeProps;\n Divider: INodeProps;\n\n AccountInfoDropdownParentContainer?: INodeProps;\n AccountInfoDropdownPopoverConentContainer?: INodeProps;\n accountInfoDropdownButton?: React.ReactNode;\n\n signOutLink?: React.ReactNode;\n signInLink?: React.ReactNode;\n switchCustomerLink?: React.ReactNode;\n isOBORequest?: boolean;\n accountLinks?: React.ReactNode[];\n preferredStore?: React.ReactNode;\n currentDistributor?: React.ReactNode;\n}\n\n/**\n *\n * Header component.\n * @extends {React.PureComponent<IHeaderProps<IHeaderData>>}\n */\n@observer\nclass Header extends React.PureComponent<IHeaderProps<IHeaderData>, IHeaderState> {\n private readonly popOverRef: React.RefObject<HTMLButtonElement>;\n\n private readonly telemetryContent: ITelemetryContent;\n\n private cart: ICartState | undefined;\n\n private isB2BSite: boolean = false;\n\n /**\n * The signed-in user name displayed in the header bar\n */\n @computed public get displayName(): Readonly<string | undefined> {\n return (\n (MsDyn365.isOboRequest(this.props.context.request) ? this.workerName : this.customerName) ||\n this.props.context.request?.user?.name\n );\n }\n\n /**\n * OBO scenario. The name of worker who shops on behalf of customer.\n */\n @computed public get workerName(): Readonly<string | undefined> {\n const worker = this.props.data.employee?.result;\n return worker?.Name;\n }\n\n @computed public get customerName(): Readonly<string | undefined> {\n const customer = this.props.data.accountInformation?.result;\n if (MsDyn365.isOboRequest(this.props.context.request)) {\n // For OBO scenario, display full customer name because multiple customers may have the same first name.\n return customer ? customer.Name : undefined;\n } else {\n return customer ? customer.FirstName || customer.Name : undefined;\n }\n }\n\n public constructor(props: IHeaderProps<IHeaderData>) {\n super(props);\n this.popOverRef = React.createRef();\n this._toggleNavbar = this._toggleNavbar.bind(this);\n this._togglePopover = this._togglePopover.bind(this);\n this._keydown = this._keydown.bind(this);\n this.state = {\n mobileMenuCollapsed: true,\n signinPopoverOpen: false,\n hasSigninerror: false\n };\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n this.isB2BSite = isChannelTypeB2B(this.props.context.request);\n }\n\n public componentDidMount(): void {\n if (MsDyn365.msdyn365Commerce.isBrowser) {\n window.addEventListener('keydown', this._keydown);\n }\n reaction(\n () => {\n this.props.data.cart.result;\n },\n () => {\n this.cart = this.props.data.cart.result;\n }\n );\n\n const {\n context: {\n request: { user }\n },\n resources: {\n signUpCustomerNotFoundTitle,\n signUpMultipleCustomerFoundTitle,\n signInCustomerNotAuthorizedTitle,\n closeNotificationLabel\n }\n } = this.props;\n\n const signinNotificationError = this._getSigninNotification(\n user,\n signUpMultipleCustomerFoundTitle,\n signUpCustomerNotFoundTitle,\n signInCustomerNotAuthorizedTitle\n );\n if (signinNotificationError !== undefined && this.state.hasSigninerror === false) {\n // For signup show simple error notification.\n NotificationsManager.instance().addNotification(new ErrorNotification(signinNotificationError, closeNotificationLabel));\n }\n }\n\n public componentWillUnmount(): void {\n if (MsDyn365.msdyn365Commerce.isBrowser) {\n window.removeEventListener('keydown', this._keydown, false);\n }\n }\n\n public render(): JSX.Element | null {\n const {\n id,\n typeName,\n data: { accountInformation, wishlists },\n context: {\n request: { user }\n },\n context,\n resources: { cartLabel, cartQtyLabel }\n } = this.props;\n const { logoLink, logoImage, shouldShowWishlistCount } = this.props.config;\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- app config is generic\n const disableTooltip = this.props.context.app.config.disableTooltip || false;\n const headerToggleClass = this.state.mobileMenuCollapsed ? '' : 'ms-header-open';\n const headerClassName = classnames('ms-header', this.props.config.className, headerToggleClass);\n const navbarKey = 'header-nav-mobile';\n const customer = accountInformation && accountInformation.result;\n const cartIconSlot = this._getSlot('cartIcon');\n const menuBarSlot = this._getSlot('menuBar');\n const searchSlot = this._getSlot('search');\n let wishlistCount = 0;\n const siteOptionsSlot = this._getSlot('siteOptions');\n const preferredStoreSlot = this._getSlot('storeSelector');\n const currentDistributorSlot = this._getSlot('distributorSelector');\n if (wishlists !== undefined) {\n if (\n !wishlists.result ||\n !ArrayExtensions.hasElements(wishlists.result) ||\n !wishlists.result[0].CommerceListLines ||\n !ArrayExtensions.hasElements(wishlists.result[0].CommerceListLines)\n ) {\n wishlistCount = 0;\n } else {\n wishlistCount = wishlists.result[0].CommerceListLines.length;\n }\n }\n const viewProps: IHeaderViewProps = {\n ...(this.props as IHeaderProps<IHeaderData>),\n ...this.state,\n logo: (\n <Logo\n {...{\n link: logoLink,\n image: logoImage,\n className: 'ms-header__logo',\n gridSettings: this.props.context.request.gridSettings,\n requestContext: this.props.context.request,\n telemetryContent: this.telemetryContent,\n typeName: this.props.typeName\n }}\n />\n ),\n wishListIconDesktop: (\n <WishListIconComponent\n className='ms-header__wishlist-desktop'\n showButtonTooltip={!disableTooltip}\n wishlistTooltipText={this.props.resources.wishlistTooltipText}\n context={context}\n id={id}\n typeName={typeName}\n telemetryContent={this.telemetryContent}\n data={{}}\n wishlistCount={wishlistCount}\n wishlistCountLabel={this.props.resources.wishlistCountLabel}\n isDispayWishlistCount={shouldShowWishlistCount}\n />\n ),\n wishListIconMobile: (\n <WishListIconComponent\n className='ms-header__wishlist-mobile'\n showButtonTooltip={!disableTooltip}\n wishlistTooltipText={this.props.resources.wishlistTooltipText}\n context={context}\n id={id}\n typeName={typeName}\n telemetryContent={this.telemetryContent}\n data={{}}\n wishlistCount={wishlistCount}\n wishlistCountLabel={this.props.resources.wishlistCountLabel}\n isDispayWishlistCount={shouldShowWishlistCount}\n />\n ),\n cartIcon: ArrayExtensions.hasElements(cartIconSlot) ? (\n cartIconSlot[0]\n ) : (\n <CartIconComponent\n cartLabel={cartLabel}\n cartQtyLabel={cartQtyLabel}\n context={context}\n id={id}\n typeName={typeName}\n telemetryContent={this.telemetryContent}\n data={{ cart: this.cart }}\n />\n ),\n navIcon: (\n <NavIcon\n {...{\n resources: this.props.resources,\n isExpanded: !this.state.mobileMenuCollapsed,\n targetId: navbarKey,\n toggleNavBar: this._toggleNavbar,\n telemetryContent: this.telemetryContent\n }}\n />\n ),\n menuBar: ArrayExtensions.hasElements(menuBarSlot) ? menuBarSlot : [],\n search: ArrayExtensions.hasElements(searchSlot) ? searchSlot : [],\n siteOptions: ArrayExtensions.hasElements(siteOptionsSlot) ? siteOptionsSlot : [],\n className: headerClassName,\n HeaderTag: {\n moduleProps: this.props,\n className: classnames(headerClassName),\n 'aria-label': this.props.resources.headerAriaLabel,\n tag: 'header'\n },\n HeaderContainer: {\n className: classnames('ms-header__container')\n },\n HeaderTopBarContainer: {\n className: classnames('ms-header__topbar')\n },\n Divider: {\n className: classnames('ms-header__divider')\n },\n MobileMenuContainer: {\n tag: Modal,\n id: navbarKey,\n className: 'ms-header__mobile-hamburger',\n isOpen: !this.state.mobileMenuCollapsed,\n wrapClassName: 'ms-header__modal',\n toggle: this._toggleNavbar\n },\n MobileMenuHeader: <ModalHeader className='ms-header__mobile-hamburger-menu-header' toggle={this._toggleNavbar} />,\n MobileMenuBodyContainer: {\n tag: ModalBody,\n className: 'ms-header__mobile-hamburger-menu-body'\n },\n MobileMenuLinksContainer: {\n className: 'ms-header__mobile-hamburger-menu-links'\n },\n AccountInfoDropdownParentContainer: {\n className: 'ms-header__account-info'\n },\n AccountInfoDropdownPopoverConentContainer: this.displayName\n ? {\n tag: Popover,\n id: 'myprofilePopover',\n className: 'ms-header__account-info-content',\n placement: 'bottom',\n isOpen: this.state.signinPopoverOpen,\n target: this.popOverRef,\n toggle: this._togglePopover\n }\n : undefined,\n signInLink: this._getSigninButton(user, this.props.resources),\n signOutLink: this._getSignOutButton(user, this.props.resources),\n isOBORequest: MsDyn365.isOboRequest(this.props.context.request),\n switchCustomerLink: this._getSwitchCustomerButton(user, this.props.resources),\n accountInfoDropdownButton: this._getAccountInfoDropdownButton(user, this.props.resources),\n accountLinks: this._getAccountLinks(customer),\n preferredStore: ArrayExtensions.hasElements(preferredStoreSlot) && <HeaderPreferredStore {...this.props} />,\n currentDistributor: this.isB2BSite && ArrayExtensions.hasElements(currentDistributorSlot) ? currentDistributorSlot : undefined\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n /**\n * Handle link text change.\n * @param linkIndex - Link Index.\n * @returns : Void.\n */\n public handleLinkTextChange = (linkIndex: number) => (event: MsDyn365.ContentEditableEvent): void => {\n if (this.props.config.myAccountLinks?.[linkIndex]) {\n this.props.config.myAccountLinks[linkIndex].linkText = event.target.value;\n }\n };\n\n /**\n * Get the slot.\n * @param slotName - Name of the slot.\n * @returns The slot.\n */\n private _getSlot(slotName: string): React.ReactNode[] | null {\n const { slots } = this.props;\n return (slots && slots[slotName] && slots[slotName].length && slots[slotName]) || null;\n }\n\n /**\n * Renders the sign in button.\n * @param user - Request context user.\n * @param resources - Resources.\n * @returns React Node.\n */\n private _getSigninButton(user: MsDyn365.IRequestContextUser | undefined, resources: IHeaderResources): React.ReactNode | undefined {\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.SignIn);\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\n return (\n !this.displayName && (\n <Button\n className='ms-header__signin-button'\n title={resources.signInLinkText}\n href={user?.signInUrl}\n aria-label={resources.signInLinkAriaText}\n onClick={onTelemetryClick(this.telemetryContent, payLoad, 'Sign in')}\n {...attributes}\n >\n <span className='ms-header__signin-button-text' aria-hidden>\n {resources.signInLinkText}\n </span>\n </Button>\n )\n );\n }\n\n /**\n * Renders the sign out button.\n * @param user - Request context user.\n * @param resources - Resources.\n * @returns React Node.\n */\n private _getSignOutButton(user: MsDyn365.IRequestContextUser | undefined, resources: IHeaderResources): React.ReactNode | undefined {\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.SignOut);\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\n return (\n this.displayName && (\n <Button\n className='ms-header__signout-button'\n title={resources.signOutLinkText}\n href={user?.signOutUrl ?? ''}\n aria-label={resources.signOutLinkAriaText}\n onClick={onTelemetryClick(this.telemetryContent, payLoad, 'Sign out')}\n {...attributes}\n >\n <span className='ms-header__signout-button-text' aria-hidden>\n {resources.signOutLinkText}\n </span>\n </Button>\n )\n );\n }\n\n /**\n * Renders the sign out button.\n * @param user - Request context user.\n * @param resources - Resources.\n * @returns React Node.\n */\n private _getSwitchCustomerButton(\n user: MsDyn365.IRequestContextUser | undefined,\n resources: IHeaderResources\n ): React.ReactNode | undefined {\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.SwitchCustomer);\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\n const isOBOAccountSelected =\n MsDyn365.isOboRequest(this.props.context.request) && this.props.context.request.cookies.getAccountSelectionCookie();\n return (\n this.displayName &&\n isOBOAccountSelected && (\n <a\n aria-label={resources.switchCustomerLinkAriaText}\n className='ms-signin-info__account-link-button'\n title={resources.switchCustomerLinkText}\n href={this.getBusinessPartnerSelectionUrl()}\n role='link'\n onClick={() => this.props.context.request.cookies.removeAccountSelectionCookie()}\n {...attributes}\n >\n <div className='ms-header__switchcustomer-button-text'>\n <div className='ms-header__shoppingas-text'>{format(resources.shoppingAsText, this.customerName)}</div>\n <div>{resources.switchCustomerLinkText}</div>\n </div>\n </a>\n )\n );\n }\n\n private getBusinessPartnerSelectionUrl(): string | undefined {\n const route = MsDyn365.getUrlSync('businessPartnerSelection', this.props.context.actionContext);\n if (!route || !MsDyn365.msdyn365Commerce.isBrowser) {\n return undefined;\n }\n\n // MsDyn365.getUrlSync persists some params in the route and remove other params.\n // Among the persisted params, we need to remove catalogid.\n const persistedParamToRemove = ['catalogid'];\n const url = new URL(route, window.location.href);\n persistedParamToRemove.forEach(param => url.searchParams.delete(param));\n return url.href;\n }\n\n private _getSigninNotification(\n user: MsDyn365.IRequestContextUser | undefined,\n signUpMultipleCustomerFoundTitle: string,\n signUpCustomerNotFoundTitle: string,\n signInCustomerNotAuthorizedTitle: string\n ): string | undefined {\n if (!user?.retailServerErrorCode) {\n return undefined;\n }\n\n const { signUpCustomerNotFound, signUpMultipleCustomerFound, signInCustomerNotAuthorized } = this.props.config;\n const notFoundError = 'Microsoft_Dynamics_Commerce_Runtime_CustomerNotFound_WhenAutoLinking';\n const multipleAccountError = 'Microsoft_Dynamics_Commerce_Runtime_MultipleCustomerAccountsFoundWithSameEmailAddress';\n const accountAuthorizationError = 'Microsoft_Dynamics_Commerce_Runtime_AuthorizationFailed';\n\n if (user?.retailServerErrorCode === notFoundError) {\n return signUpCustomerNotFound !== undefined ? signUpCustomerNotFound : signUpCustomerNotFoundTitle;\n } else if (user?.retailServerErrorCode === multipleAccountError) {\n return signUpMultipleCustomerFound !== undefined ? signUpMultipleCustomerFound : signUpMultipleCustomerFoundTitle;\n } else if (user?.retailServerErrorCode === accountAuthorizationError) {\n return signInCustomerNotAuthorized !== undefined ? signInCustomerNotAuthorized : signInCustomerNotAuthorizedTitle;\n }\n return user?.retailServerErrorMessage;\n }\n\n private _getAccountInfoDropdownButton(\n user: MsDyn365.IRequestContextUser | undefined,\n resources: IHeaderResources\n ): React.ReactNode | undefined {\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.MyProfile);\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\n return (\n this.displayName && (\n <Button\n innerRef={this.popOverRef}\n className='ms-header__profile-button'\n aria-describedby='myprofilePopover'\n onClick={this._togglePopover}\n color='link'\n aria-label={this.displayName}\n aria-expanded={this.state.signinPopoverOpen}\n {...attributes}\n >\n <div className='ms-profile-button-text'>\n <div>{this.displayName}</div>\n {MsDyn365.isOboRequest(this.props.context.request) && this.customerName && (\n <div>{format(resources.shoppingAsText, this.customerName)}</div>\n )}\n </div>\n </Button>\n )\n );\n }\n\n private _getAccountLinks(customer: Customer | undefined): React.ReactNode[] | undefined {\n const { myAccountLinks } = this.props.config;\n const payLoad = getPayloadObject('click', this.telemetryContent, '');\n if (!this.displayName || !myAccountLinks || !ArrayExtensions.hasElements(myAccountLinks)) {\n return undefined;\n }\n return myAccountLinks.map((cta: IMyAccountLinksData, index: number) => {\n payLoad.contentAction.etext = cta.linkText;\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\n const editableLink: MsDyn365.ILinksData = {\n ariaLabel: cta.ariaLabel,\n className: 'ms-signin-info__account-link-button',\n linkText: cta.linkText,\n linkUrl: cta.linkUrl.destinationUrl,\n openInNewTab: cta.openInNewTab,\n role: 'link',\n additionalProperties: attributes\n };\n\n return (\n <MsDyn365.Link\n key={index}\n link={editableLink}\n editProps={{ onTextChange: this.handleLinkTextChange(index), requestContext: this.props.context.request }}\n />\n );\n });\n }\n\n private _toggleNavbar(): void {\n this.setState({\n mobileMenuCollapsed: !this.state.mobileMenuCollapsed\n });\n }\n\n private _togglePopover(): void {\n this.setState({\n signinPopoverOpen: !this.state.signinPopoverOpen\n });\n }\n\n private _keydown(event: KeyboardEvent): void {\n if (event.keyCode === KeyCodes.Escape) {\n this.setState({ mobileMenuCollapsed: true });\n }\n }\n}\n\nexport default Header;\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 { IHeaderViewProps } from './header';\n\nconst headerView: React.FC<IHeaderViewProps> = props => {\n const {\n HeaderTag,\n HeaderContainer,\n HeaderTopBarContainer,\n MobileMenuContainer,\n MobileMenuBodyContainer,\n MobileMenuLinksContainer,\n Divider\n } = props;\n return (\n <Module {...HeaderTag}>\n <Node {...HeaderContainer}>\n <Node {...HeaderTopBarContainer}>\n {props.navIcon}\n {props.logo}\n {_renderReactFragment(props.search)}\n {props.preferredStore}\n {props.currentDistributor}\n {_renderDesktopAccountBlock(props)}\n {props.wishListIconDesktop}\n <Node {...Divider} />\n {props.cartIcon}\n {_renderReactFragment(props.siteOptions)}\n </Node>\n <Node {...MobileMenuContainer}>\n <Node {...MobileMenuBodyContainer}>\n {props.MobileMenuHeader}\n {_renderReactFragment(props.menuBar)}\n <Node {...MobileMenuLinksContainer}>\n {props.accountLinks ? props.accountLinks.map(link => link) : false}\n {props.siteOptions}\n {props.wishListIconMobile}\n {props.signInLink}\n {props.signOutLink}\n </Node>\n </Node>\n </Node>\n {_renderReactFragment(props.menuBar)}\n </Node>\n </Module>\n );\n};\n\nfunction _renderDesktopAccountBlock(props: IHeaderViewProps): JSX.Element | null {\n const {\n AccountInfoDropdownParentContainer,\n AccountInfoDropdownPopoverConentContainer,\n accountInfoDropdownButton,\n signOutLink,\n signInLink,\n accountLinks\n } = props;\n\n if (AccountInfoDropdownParentContainer) {\n if (AccountInfoDropdownPopoverConentContainer) {\n return (\n <Node {...AccountInfoDropdownParentContainer}>\n {accountInfoDropdownButton}\n <Node {...AccountInfoDropdownPopoverConentContainer}>\n {accountLinks ? accountLinks.map(link => link) : false}\n {signOutLink}\n </Node>\n </Node>\n );\n } else if (signInLink) {\n return <Node {...AccountInfoDropdownParentContainer}>{signInLink}</Node>;\n }\n }\n props.context.telemetry.error('Header content is empty, module wont render.');\n return null;\n}\n\nfunction _renderReactFragment(items: React.ReactNode[]): JSX.Element | null {\n return (\n <>\n {items && items.length > 0\n ? items.map((slot: React.ReactNode, index: number) => {\n return <React.Fragment key={index}>{slot}</React.Fragment>;\n })\n : null}\n </>\n );\n}\n\nexport default headerView;\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 validateCatalogId\n} from '@msdyn365-commerce-modules/retail-actions';\nimport {\n Button,\n getTelemetryObject,\n IComponentNodeProps,\n IModuleProps,\n INodeProps,\n ISingleSlideCarouselProps,\n ITelemetryContent,\n NodeTag,\n SingleSlideCarousel\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { IProductCollectionData } from './product-collection.data';\nimport { IProductCollectionProps, layout } from './product-collection.props.autogenerated';\n\nexport interface IProductCollectionViewProps extends IProductCollectionProps<IProductCollectionData> {\n heading?: React.ReactNode;\n ProductCollectionContainer: IModuleProps;\n SingleSlideCarouselComponentProps: INodeProps;\n GridComponentProps: INodeProps;\n products: IProductComponentViewProps[];\n isCarousel: boolean;\n productPrices?: ProductPrice[];\n seeAllButton?: React.ReactNode;\n}\n\nexport interface IProductComponentViewProps {\n ProductContainer: INodeProps;\n productComponent: React.ReactNode;\n}\nexport interface IProductComponentState {\n products: ProductSearchResult[];\n productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\n}\n\n/**\n * ProductCollection component.\n */\nclass ProductCollection extends React.PureComponent<IProductCollectionProps<IProductCollectionData>, IProductComponentState> {\n private readonly telemetryContent: ITelemetryContent;\n\n private readonly productPrices: ProductPrice[];\n\n constructor(props: IProductCollectionProps<IProductCollectionData>) {\n super(props);\n this.productPrices = [];\n this.state = {\n products: this.props.config.productCollection.products || []\n };\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n }\n\n public async componentDidMount(): Promise<void> {\n if (this.props.config.enableAffiliationBasedPricing && this.props.context.actionContext.requestContext.user.isAuthenticated) {\n await this._getActivePrice();\n }\n }\n\n public render(): JSX.Element | null {\n const { heading, className, shouldDisplaySeeAllButton } = this.props.config;\n const { resources } = this.props;\n const recommendation = this.props.config.productCollection.recommendationListId;\n\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 isCarousel = this.props.config.layout === layout.carousel;\n const headingLabel = heading ? heading.text : '';\n const headingComponent = heading && (\n <Msdyn365.Text\n className='ms-product-collection__heading'\n tag={heading.tag || 'h1'}\n text={headingLabel}\n editProps={{ onEdit: this.handleHeadingChange, requestContext: this.props.context.request }}\n />\n );\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- product check for safety.\n const updatedProducts = products?.map((item: ProductSearchResult, index: number) => {\n const getProductData = this._getProduct(item, index);\n return !ObjectExtensions.isNullOrUndefined(getProductData) ? getProductData : undefined;\n });\n\n const productCollectionViewProps = {\n ...this.props,\n heading: headingComponent,\n SingleSlideCarouselComponentProps: {\n tag: SingleSlideCarousel,\n className: '',\n flipperPrevLabel: `${headingLabel} ${resources.flipperPrevious}`,\n flipperNextLabel: `${headingLabel} ${resources.flipperNext}`,\n parentId: this.props.id,\n telemetryContent: this.telemetryContent\n } as IComponentNodeProps<ISingleSlideCarouselProps>,\n ProductCollectionContainer: {\n moduleProps: this.props,\n className: classnames('ms-product-collection', className)\n },\n GridComponentProps: {\n tag: 'ul' as NodeTag,\n className: 'ms-product-collection__items'\n },\n isCarousel,\n\n products:\n ArrayExtensions.hasElements(updatedProducts) &&\n updatedProducts.filter(item => {\n return item !== undefined;\n }),\n productPrices: this.productPrices,\n seeAllButton:\n recommendation && shouldDisplaySeeAllButton && ArrayExtensions.hasElements(updatedProducts)\n ? this._getSeeAllButton(recommendation, headingLabel)\n : undefined\n };\n return this.props.renderView(productCollectionViewProps) as React.ReactElement;\n }\n\n public handleHeadingChange = (event: Msdyn365.ContentEditableEvent) => (this.props.config.heading!.text = event.target.value);\n\n /**\n * Get products dimension availabilities.\n * @param products - Products.\n * @returns Promise.\n */\n private readonly _getProductsDimensionsAvailabilities = async (products: ProductSearchResult[]): Promise<void> => {\n const context = this.props.context as ICoreContext<IDimensionsApp>;\n const dimensionsToDisplayOnProductCard = context.app.config.dimensionsInProductCard;\n const dimensionsToDisplayAsSwatch = context.app.config.dimensionsAsSwatchType;\n const validProducts = ArrayExtensions.validValues(products);\n if (\n ArrayExtensions.hasElements(validProducts) &&\n ArrayExtensions.hasElements(dimensionsToDisplayOnProductCard) &&\n !dimensionsToDisplayOnProductCard.includes(DimensionTypes.none) &&\n ArrayExtensions.hasElements(dimensionsToDisplayAsSwatch) &&\n !dimensionsToDisplayAsSwatch.includes(DimensionTypes.none)\n ) {\n const productsDimensionAvailabilities = await getDimensionAvailabilitiesForProductSearchResultAction(\n new DimensionAvailabilitiesForProductSearchResultInput(\n validProducts,\n this.props.context as ICoreContext<IDimensionsApp>,\n DimensionSwatchDisplayTypes.productCard\n ),\n this.props.context.actionContext\n );\n\n if (ArrayExtensions.hasElements(productsDimensionAvailabilities)) {\n this.setState({ productsDimensionAvailabilities });\n }\n }\n };\n\n /**\n * Helper method to initialize products state.\n * @param productCollection - List of products.\n */\n private readonly initProductState = async (productCollection: Msdyn365.IProductList) => {\n let products = this.state.products;\n 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\n private readonly _getProduct = (product: ProductSearchResult, index: number): IProductComponentViewProps | null => {\n if (!product || !product.Name) {\n this.props.telemetry.trace('[product-collection] Product or product name is null');\n return null;\n }\n const telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n const { imageSettings, allowBackNavigation } = this.props.config;\n const resources = this.props.resources;\n const breaCrumbType = this.props.context.app.config.breadcrumbType;\n const allowBack = allowBackNavigation && (breaCrumbType === 'back' || breaCrumbType === 'categoryAndBack');\n const quickviewSlot =\n this.props.slots && this.props.slots.quickview && this.props.slots.quickview.length > 0 ? this.props.slots.quickview[0] : null;\n const productComparisonButtonSlot = ArrayExtensions.hasElements(this.props.slots.productComparisonButton)\n ? this.props.slots.productComparisonButton[0]\n : null;\n\n const reviewCount = 1;\n const reviewTotalRatings = Number(product.TotalRatings);\n const reviewCountAriaLabelValue =\n reviewTotalRatings > reviewCount ? resources.ratingCountAriaLabel : resources.ratingCountAriaLabelSingleUser;\n const isPriceMinMaxEnabled = this.props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailSearchPriceRangeFeature'\n );\n const priceResources: IPriceComponentResources = {\n priceRangeSeparator: resources.priceRangeSeparator\n };\n return {\n ProductContainer: {\n tag: 'li' as NodeTag,\n className: 'ms-product-collection__item',\n role: 'listitem',\n key: index\n },\n productComponent: (\n <ProductComponent\n context={this.props.context}\n telemetryContent={telemetryContent}\n imageSettings={imageSettings}\n freePriceText={resources.priceFree}\n originalPriceText={resources.originalPriceText}\n currentPriceText={resources.currentPriceText}\n ratingAriaLabel={resources.ratingAriaLabel}\n ratingCountAriaLabel={reviewCountAriaLabelValue}\n allowBack={allowBack}\n id={this.props.id}\n typeName={this.props.typeName}\n data={{ product }}\n quickViewButton={quickviewSlot}\n productComparisonButton={productComparisonButtonSlot}\n isPriceMinMaxEnabled={isPriceMinMaxEnabled?.IsEnabled}\n priceResources={priceResources}\n dimensionAvailabilities={this.state.productsDimensionAvailabilities?.find(\n dimensionAvailability =>\n ArrayExtensions.hasElements(dimensionAvailability) &&\n dimensionAvailability[0].masterProductId === (product.MasterProductId ?? product.RecordId)\n )}\n />\n )\n };\n };\n\n /**\n * Get the active price for products.\n */\n private readonly _getActivePrice = async (): Promise<void> => {\n const productsList = this.state.products;\n const products = await getPriceForProductSearchResult(\n new PriceForProductSearchResultInput(productsList),\n this.props.context.actionContext\n );\n if (Msdyn365.msdyn365Commerce.isBrowser) {\n await this._getProductsDimensionsAvailabilities(products);\n }\n\n this.setState({ products });\n };\n\n /**\n * Get the see all button.\n * @param recommendation - Recommendation.\n * @param headingLabel - Heading label.\n * @returns IProductComponentSeeAllViewProps - Product component see all view props.\n */\n private readonly _getSeeAllButton = (recommendation: string, headingLabel: string): React.ReactNode => {\n if (!Msdyn365.msdyn365Commerce.isBrowser) {\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 url.searchParams.set('recommendation', recommendation);\n url.searchParams.set('title', headingLabel);\n url.searchParams.set('catalogid', `${catalogId}`);\n\n return (\n <Button\n className='ms-product-collection__see-all-btn msc-cta__primary'\n title={this.props.resources.seeAllButtonText}\n href={url.href}\n >\n {this.props.resources.seeAllButtonText}\n </Button>\n );\n };\n}\n\nexport default ProductCollection;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { INodeProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IProductCollectionViewProps, IProductComponentViewProps } from './product-collection';\n\nconst ProductCollectionView: React.FC<IProductCollectionViewProps> = props => {\n const {\n heading,\n ProductCollectionContainer,\n products,\n SingleSlideCarouselComponentProps,\n GridComponentProps,\n isCarousel,\n seeAllButton\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 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 _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 { getPayloadObject, getTelemetryAttributes, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface IPromoBannerCloseButton {\n closeButtonAriaLabel?: string;\n label?: string;\n telemetryContent?: ITelemetryContent;\n onClose(): void;\n}\n\nexport const PromoBannerCloseButton: React.FC<IPromoBannerCloseButton> = ({ closeButtonAriaLabel, label, telemetryContent, onClose }) => {\n const payLoad = getPayloadObject('click', telemetryContent!, TelemetryConstant.PromoBannerClose);\n const attributes = getTelemetryAttributes(telemetryContent!, payLoad);\n return (\n <button className='ms-promo-banner__close-button' aria-label={closeButtonAriaLabel} onClick={onClose} {...attributes}>\n <span className='ms-promo-banner__close-button__label' aria-hidden>\n {label}\n </span>\n </button>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, onTelemetryClick } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ILinksData } from '../promo-banner.props.autogenerated';\n\nexport interface IPromoBannerLinks {\n links: ILinksData[];\n requestContext: Msdyn365.IRequestContext;\n telemetryContent: ITelemetryContent;\n onTextChange?(index: number): (event: Msdyn365.ContentEditableEvent) => void;\n}\n\nexport const PromoBannerLinks: React.FC<IPromoBannerLinks> = ({ links, requestContext, onTextChange, telemetryContent }) => {\n const editableLinks = _mapEditableLinks(links, telemetryContent);\n return (\n <span className='ms-promo-banner__links'>\n {editableLinks && editableLinks.length > 0 ? (\n <Msdyn365.Links links={editableLinks} editProps={{ onTextChange, requestContext }} />\n ) : null}\n </span>\n );\n};\n\nconst _mapEditableLinks = (linkdata: ILinksData[], telemetryContent: ITelemetryContent): Msdyn365.ILinksData[] | null => {\n if (!linkdata || linkdata.length === 0) {\n return null;\n }\n const editableLinks: Msdyn365.ILinksData[] = [];\n linkdata.forEach((link, index) => {\n // Construct telemetry attribute to render\n const payLoad = getPayloadObject('click', telemetryContent, '', '');\n const linkText = link.linkText ? link.linkText : '';\n payLoad.contentAction.etext = linkText;\n const attributes = getTelemetryAttributes(telemetryContent, payLoad);\n const editableLink: Msdyn365.ILinksData = {\n ariaLabel: link.ariaLabel,\n className: 'ms-promo-banner__link',\n linkText: link.linkText,\n linkUrl: link.linkUrl.destinationUrl,\n openInNewTab: link.openInNewTab,\n role: 'link',\n additionalProperties: attributes,\n onClick: onTelemetryClick(telemetryContent, payLoad, linkText)\n };\n editableLinks.push(editableLink);\n });\n\n return editableLinks;\n};\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 * as React from 'react';\n\nexport interface IPromoBannerText {\n text: string;\n requestContext: Msdyn365.IRequestContext;\n onTextChange(event: Msdyn365.ContentEditableEvent): void;\n}\n\nexport const PromoBannerText: React.FC<IPromoBannerText> = ({ text, onTextChange, requestContext }) => {\n return <Msdyn365.Text className='ms-promo-banner__text' tag='span' text={text} editProps={{ onEdit: onTextChange, requestContext }} />;\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Carousel } from '@msdyn365-commerce/components';\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { PromoBannerCloseButton, PromoBannerLinks, PromoBannerText } from './components';\nimport { IBannerMessagesData, IPromoBannerProps, IPromoBannerResources } from './promo-banner.props.autogenerated';\n\nexport interface IPromoBannerState {\n animating: boolean;\n isVisible: boolean;\n activeIndex: number;\n}\n\nexport interface IPromoBannerViewProps extends IPromoBannerProps<{}>, IPromoBannerState {\n promoBannerProps: IModuleProps;\n contentProps: INodeProps;\n bannerMessages: IBannerMessagesData[];\n promoBannerTextProps: INodeProps;\n promoBannerLinksProps: INodeProps;\n carouselProps: INodeProps;\n closeButton?: React.ReactNode;\n className: string;\n promoBannerText: string;\n resources: IPromoBannerResources;\n onDismiss(): void;\n handleText(): void;\n handleLinks(): void;\n}\n\n/**\n *\n * PromoBannerModule component.\n * @extends {React.PureComponent<IPromoBannerProps<IPromoBannerState>>}\n */\nclass PromoBanner extends React.PureComponent<IPromoBannerProps<{}>, IPromoBannerState> {\n public state: IPromoBannerState = {\n animating: false,\n isVisible: true,\n activeIndex: 0\n };\n\n private readonly telemetryContent: ITelemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n\n public render(): JSX.Element | null {\n const { bannerMessages, dismissEnabled, interval, hideFlipper, autoplay, className = '' } = this.props.config;\n const { closeButtonAriaLabel, closeButtonLabel, bannerText, bannerAriaLabel } = this.props.resources;\n const { isVisible, activeIndex } = this.state;\n\n if (!isVisible) {\n this.props.context.telemetry.error('Promo banner content is empty, module wont render.');\n return null;\n }\n\n const viewProps = {\n // Context for telemetry and raw data for C1 to do customization\n // Including computed data, state data and methods\n ...this.props,\n className: classnames('ms-promo-banner', className),\n isVisible, // State data\n onDismiss: this._onDismiss, // Methods\n handleLinks: this.handleLinkTextChange,\n handleText: this.handleTextChange,\n\n promoBannerProps: {\n className: classnames('ms-promo-banner', className),\n moduleProps: this.props,\n role: 'banner',\n 'aria-label': bannerAriaLabel\n },\n promoBannerTextProps: {\n tag: PromoBannerText\n },\n promoBannerLinksProps: {\n tag: PromoBannerLinks,\n telemetryContent: this.telemetryContent\n },\n contentProps: { className: 'ms-promo-banner__content' },\n promoBannerText: bannerText,\n bannerMessages,\n activeIndex,\n carouselProps: {\n tag: Carousel,\n className: 'ms-promo-banner__carousel',\n activeIndex,\n next: this._next,\n previous: this._previous,\n onIndicatorsClickHandler: this._goToIndex,\n hideIndicator: hideFlipper,\n interval,\n hideFlipper,\n autoplay\n },\n closeButton: dismissEnabled && (\n <PromoBannerCloseButton\n {...{\n onClose: this._onDismiss,\n label: closeButtonLabel,\n closeButtonAriaLabel,\n telemetryContent: this.telemetryContent\n }}\n />\n )\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n public handleTextChange = (event: Msdyn365.ContentEditableEvent) => {\n if (this.props.config.bannerMessages && this.props.config.bannerMessages[0]) {\n this.props.config.bannerMessages[0].text = event.target.value;\n }\n };\n\n public handleLinkTextChange = (linkIndex: number) => (event: Msdyn365.ContentEditableEvent) => {\n if (this.props.config.bannerMessages && this.props.config.bannerMessages[1]) {\n const links = this.props.config.bannerMessages[1].links;\n if (links) {\n links[linkIndex].linkText = event.target.value;\n }\n }\n };\n\n private readonly _next = (): void => {\n const nextIndex = this._isLastItem() ? 0 : this.state.activeIndex + 1;\n this._goToIndex(nextIndex);\n };\n\n private readonly _previous = (): void => {\n const nextIndex = this._isFirstItem()\n ? this.props.config.bannerMessages\n ? this.props.config.bannerMessages.length - 1\n : 0\n : this.state.activeIndex - 1;\n this._goToIndex(nextIndex);\n };\n\n private readonly _goToIndex = (index: number): void => {\n if (this.state.animating) {\n return;\n }\n this.setState({ activeIndex: index });\n };\n\n private readonly _isFirstItem = () => this.state.activeIndex === 0;\n\n private readonly _isLastItem = () =>\n this.props.config.bannerMessages && this.state.activeIndex === this.props.config.bannerMessages.length - 1;\n\n private readonly _onDismiss = (): void => {\n this.setState({ isVisible: false });\n };\n}\n\nexport default PromoBanner;\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 { IPromoBannerViewProps } from './promo-banner';\n\nconst PromoBannerView: React.FC<IPromoBannerViewProps> = props => {\n const {\n promoBannerProps,\n contentProps,\n closeButton,\n bannerMessages,\n promoBannerTextProps,\n promoBannerLinksProps,\n carouselProps,\n promoBannerText,\n handleLinks,\n handleText\n } = props;\n\n const slides =\n bannerMessages &&\n bannerMessages.map((message, index) => {\n return (\n <Node {...contentProps} key={index} aria-live='off' role='marquee'>\n <span className='sr-only'>{promoBannerText}</span>\n {message.text && <Node {...promoBannerTextProps} text={message.text} onClick={handleText} />}\n {message.links && message.links.length > 0 && (\n <Node {...promoBannerLinksProps} links={message.links} onClick={handleLinks} />\n )}\n </Node>\n );\n });\n\n return (\n <Module {...promoBannerProps}>\n <Node {...carouselProps} items={slides} />\n {closeButton}\n </Module>\n );\n};\nexport default PromoBannerView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { AddToCartComponent, IAddToCartResources, OrderDetailsProduct } from '@msdyn365-commerce/components';\nimport { getUrlSync, IComponentProps, ICoreContext } from '@msdyn365-commerce/core';\nimport { SalesLine } from '@msdyn365-commerce/retail-proxy';\nimport { QuickOrderTemplate } from '@msdyn365-commerce-modules/retail-actions';\nimport React from 'react';\n\n/**\n * The data on which the component should operate.\n */\nexport interface IAddToCartSelectedData {\n quickOrderTemplate: QuickOrderTemplate | undefined;\n}\n\n/**\n * The resources needed to render a buy selected component.\n */\nexport interface IAddToCartSelectedResources {\n quickOrderGridBuySelectedButtonText?: string;\n quickOrderGridBuySelectedButtonAriaLabel?: string;\n quickOrderGridBuySelectedAddingToCartErrorNotificationTitle?: string;\n quickOrderGridBuySelectedAddingToCartErrorNotificationCloseAriaLabel?: string;\n quickOrderGridGoToCartText?: string;\n quickOrderGridDialogCloseText?: string;\n quickOrderGridSingleItemText?: string;\n quickOrderGridMultiLineItemFormatText?: string;\n quickOrderGridMultiLinesFormatText?: string;\n quickOrderGridHeaderMessageText?: string;\n addedQuantityText?: string;\n originalPriceText?: string;\n currentPriceText?: string;\n freePriceText?: string;\n}\n\n/**\n * Configuration of a buy selected component.\n */\nexport interface IAddToCartSelectedProps extends IComponentProps<IAddToCartSelectedData> {\n className: string;\n context: ICoreContext;\n\n resources: IAddToCartSelectedResources;\n\n isIcon?: boolean;\n}\n\n/**\n * Get the dialog strings.\n * @param props - The buy selected props.\n * @returns The add to cart resources.\n */\nexport const getDialogStrings = (props: IAddToCartSelectedProps): IAddToCartResources => {\n return {\n goToCartText: props.resources.quickOrderGridGoToCartText ?? '',\n continueShoppingText: props.resources.quickOrderGridDialogCloseText ?? '',\n closeNotificationLabel: props.resources.quickOrderGridBuySelectedAddingToCartErrorNotificationCloseAriaLabel ?? '',\n headerItemOneText: props.resources.quickOrderGridSingleItemText ?? '',\n headerItemFormatText: props.resources.quickOrderGridMultiLineItemFormatText ?? '',\n headerLinesFormatText: props.resources.quickOrderGridMultiLinesFormatText ?? '',\n headerMessageText: props.resources.quickOrderGridHeaderMessageText ?? '',\n freePriceText: props.resources.freePriceText ?? '',\n originalPriceText: props.resources.originalPriceText ?? '',\n currentPriceText: props.resources.currentPriceText ?? '',\n addedQuantityText: props.resources.addedQuantityText ?? '',\n buyAgainNotificationTitle: props.resources.quickOrderGridBuySelectedAddingToCartErrorNotificationTitle ?? '',\n buyAgainNotificationCloseAriaLabel: props.resources.quickOrderGridBuySelectedAddingToCartErrorNotificationCloseAriaLabel ?? ''\n };\n};\n\n/**\n * Get the dialog strings.\n * @param quickOrder - The buy selected props.\n * @returns The add to cart resources.\n */\nexport const getOrderDetails = (quickOrder: QuickOrderTemplate): OrderDetailsProduct[] => {\n const orderDetails: OrderDetailsProduct[] = [];\n for (const quickLine of quickOrder.quickOrderTemplateLines) {\n const quantity = quickLine.productListLine.Quantity;\n const salesLine: SalesLine = {\n Quantity: quantity\n };\n const products = new OrderDetailsProduct(salesLine, quickLine.fullProduct?.ProductDetails);\n orderDetails.push(products);\n }\n return orderDetails;\n};\n\n/**\n * Renders a button which adds given products to the cart.\n * @param props - Configuration of the component.\n * @returns A react element or null if no products were given.\n */\nexport const AddToCartProductListComponent: React.FC<IAddToCartSelectedProps> = (props: IAddToCartSelectedProps): JSX.Element | null => {\n const {\n data: { quickOrderTemplate }\n } = props;\n\n if (quickOrderTemplate?.quickOrderTemplateLines[0].fullProduct?.ProductDetails === undefined) {\n return null;\n }\n const quantity = quickOrderTemplate.quickOrderTemplateLines[0].productListLine.Quantity;\n const buttonLabel = props.resources.quickOrderGridBuySelectedButtonText;\n const buttonAriaLabel = props.resources.quickOrderGridBuySelectedButtonAriaLabel;\n const dialogStrings: IAddToCartResources = getDialogStrings(props);\n const shouldSkipSiteSettings: boolean = true;\n const orderDetailProducts = getOrderDetails(quickOrderTemplate);\n return (\n <AddToCartComponent\n addToCartText={buttonLabel ?? ''}\n outOfStockText=''\n addToCartArialLabel={buttonAriaLabel}\n quantity={quantity}\n id={props.id}\n typeName={props.typeName}\n className={props.className}\n navigationUrl={getUrlSync('cart', props.context.actionContext)}\n data={{ product: quickOrderTemplate.quickOrderTemplateLines[0].fullProduct?.ProductDetails }}\n context={props.context}\n dialogStrings={dialogStrings}\n shouldSkipSiteSettings={shouldSkipSiteSettings}\n orderDetailsProducts={orderDetailProducts}\n />\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IComponentProps, ICoreContext } from '@msdyn365-commerce/core';\nimport { QuickOrderTemplate } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { AddToCartProductListComponent } from './add-to-list';\nimport { IQuickOrderGridActionsViewProps } from './utilities';\n\n/**\n * Interface for quick order grid action data.\n */\nexport interface IQuickOrderGridActionsData {\n quickOrderTemplate: QuickOrderTemplate | undefined;\n}\n\n/**\n * Interface for quick order grid action props.\n */\nexport interface IQuickOrderGridActionsProps extends IComponentProps<IQuickOrderGridActionsData> {\n context: ICoreContext;\n telemetryContent?: ITelemetryContent;\n moduleClassName: string;\n typeName: string;\n handlers: {\n removeProductList(productListId: string): void;\n };\n resources: {\n quickOrderGridDeleteButtonText: string;\n quickOrderGridBuySelectedButtonText?: string;\n quickOrderGridBuySelectedButtonAriaLabel?: string;\n quickOrderGridBuySelectedAddingToCartErrorNotificationTitle?: string;\n quickOrderGridBuySelectedAddingToCartErrorNotificationCloseAriaLabel?: string;\n quickOrderGridGoToCartText?: string;\n quickOrderGridDialogCloseText?: string;\n quickOrderGridSingleItemText?: string;\n quickOrderGridMultiLineItemFormatText?: string;\n quickOrderGridMultiLinesFormatText?: string;\n quickOrderGridHeaderMessageText?: string;\n addedQuantityText?: string;\n originalPriceText?: string;\n currentPriceText?: string;\n freePriceText?: string;\n };\n}\n\n/**\n * Remove ProductList Action.\n * @param props -Quick order grid action props.\n */\nconst removeQuickOrderList = (props: IQuickOrderGridActionsProps): void => {\n const {\n data: { quickOrderTemplate },\n handlers\n } = props;\n const { removeProductList } = handlers;\n // eslint-disable-next-line @typescript-eslint/prefer-optional-chain -- Need to check data.\n if (quickOrderTemplate && quickOrderTemplate.productList.Id) {\n removeProductList(quickOrderTemplate.productList.Id);\n }\n};\n\n/**\n * Get Addtobag Button.\n * @param props -Order template action props.\n * @returns QuickOrderGrid actions view props.\n */\nconst getQuickOrderGridAddToCartDialog = (props: IQuickOrderGridActionsProps): React.ReactNode => {\n const {\n data: { quickOrderTemplate },\n context,\n moduleClassName,\n resources,\n typeName\n } = props;\n const buttonId = 'quick-order-grid';\n return (\n <AddToCartProductListComponent\n className={`${moduleClassName}-action-bar__buy-selected msc-btn`}\n id={buttonId}\n typeName={typeName}\n data={{ quickOrderTemplate }}\n context={context}\n resources={resources}\n />\n );\n};\n\n/**\n * Remove Quick order grid action.\n * @param props -Quick order grid action props.\n * @returns Remove order template.\n */\nconst removeActionHandler = (props: IQuickOrderGridActionsProps) => () => {\n removeQuickOrderList(props);\n};\n\n/**\n * Quick order grid action view.\n * @param props -Quick Order Grid template action props.\n * @returns QuickOrderGrid actions view props.\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention -- Name needs to be this.\nexport const QuickOrderGridActionsView = (props: IQuickOrderGridActionsProps): IQuickOrderGridActionsViewProps => {\n const { moduleClassName, resources } = props;\n const { quickOrderGridDeleteButtonText } = resources;\n\n return {\n addProductListToBag: getQuickOrderGridAddToCartDialog(props),\n removeProductList: (\n <Button className={`${moduleClassName}-action-bar__delete-list-button`} onClick={removeActionHandler(props)}>\n {quickOrderGridDeleteButtonText}\n </Button>\n )\n };\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Button, Collapse, ICollapseProps } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { IQuickOrderGridDrawerProps } from './quick-order-grid-drawer-props';\n\n/**\n * Interface for drawer state.\n */\nexport interface IQuickOrderGridDrawerState {\n isOpen: boolean;\n}\n\n/**\n * Placement of glyph.\n */\nexport type GlyphPlacement = 'start' | 'end';\n\n/**\n * Quick Order Grid Drawer - This is a full width uncontrolled collapse where the button glyph changes\n * when the drawer is open and closed.\n */\nexport class QuickOrderGridDrawer extends React.Component<IQuickOrderGridDrawerProps, IQuickOrderGridDrawerState> {\n private readonly _drawerOpenGlyph: string;\n\n private readonly _drawerCloseGlyph: string;\n\n private readonly _drawerGlyphClass: string;\n\n private _isManuallyToggled: boolean;\n\n public constructor(props: IQuickOrderGridDrawerProps) {\n super(props);\n this._isManuallyToggled = false;\n this.state = { isOpen: props.collapseProps?.isOpen ?? false };\n this._drawerGlyphClass = classnames('drawer__glyph', this.props.toggleGlyphClassName ? this.props.toggleGlyphClassName : '');\n const closeGlyph = this.props.closeGlyph ? this.props.closeGlyph : '';\n if (this.props.isAnimateGlyph) {\n this._drawerOpenGlyph = classnames(this._drawerGlyphClass, this.props.openGlyph ? this.props.openGlyph : closeGlyph);\n this._drawerCloseGlyph = this._drawerOpenGlyph;\n } else {\n this._drawerOpenGlyph = classnames(this._drawerGlyphClass, this.props.openGlyph ? this.props.openGlyph : '');\n this._drawerCloseGlyph = classnames(this._drawerGlyphClass, closeGlyph);\n }\n }\n\n /**\n * Method to call on click of drawer button.\n * @param event - Product DeliveryOption List.\n */\n public toggle = (event: React.MouseEvent<HTMLElement> | React.KeyboardEvent<HTMLElement>): void => {\n event.preventDefault();\n this._isManuallyToggled = true;\n if (this.props.onToggle) {\n this.setState(previousState => ({ isOpen: !previousState.isOpen }));\n this.props.onToggle(this.state);\n } else {\n this.setState(previousState => ({ isOpen: !previousState.isOpen }));\n }\n };\n\n public shouldComponentUpdate(nextProps: IQuickOrderGridDrawerProps, nextState: IQuickOrderGridDrawerState): boolean {\n if (this.state === nextState && this.props === nextProps) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element {\n const collapseProps: ICollapseProps = { ...this.props.collapseProps };\n\n // If the drawer is manually toggled by pressing the button, then we use the internal state\n if (collapseProps.isOpen === undefined || this._isManuallyToggled) {\n collapseProps.isOpen = this.state.isOpen;\n }\n collapseProps.children = this.props.children;\n const drawerClass = classnames('drawer', this.props.className);\n const drawerButtonClassName = `${this.props.className ? this.props.className : ''}__button`;\n this._isManuallyToggled = false;\n return (\n <div className={drawerClass}>\n <Button\n {...this.props.toggleButtonProps}\n onClick={this.toggle}\n aria-expanded={collapseProps.isOpen}\n block\n disabled={this.props.isDisabled}\n className={drawerButtonClassName}\n color='secondary'\n >\n {this._generateDrawerButtonInnerMarkup(collapseProps.isOpen, drawerClass)}\n </Button>\n <Collapse {...collapseProps} />\n </div>\n );\n }\n\n private _generateDrawerButtonInnerMarkup(isCollapseState: boolean, drawerClass: string): JSX.Element {\n const drawerButtonTextClass = classnames(\n 'drawer__buttontext',\n this.props.toggleButtonClassName ? this.props.toggleButtonClassName : ''\n );\n const headingDrawerClass = `${drawerClass}-heading`;\n const descriptionDrawerClass = `${drawerClass}-description`;\n return (\n <>\n <h2 className={classnames(drawerButtonTextClass, headingDrawerClass)}>{this.props.moduleHeadingText}</h2>\n <span className={classnames(drawerButtonTextClass, descriptionDrawerClass)}>{this.props.moduleDescriptionText}</span>\n {this._generateGlyphMarkup('drawer__glyph__end', isCollapseState)}\n </>\n );\n }\n\n private _generateGlyphMarkup(location: string, isCollapseState: boolean): JSX.Element {\n let glyphClass = isCollapseState ? this._drawerOpenGlyph : this._drawerCloseGlyph;\n glyphClass = `${glyphClass} ${location}`;\n return <span className={glyphClass} />;\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Alert, Button } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IQuickOrderGridState } from './utilities';\n\n/**\n * Interface quick order grid form props.\n */\nexport interface IQuickOrderGridFormProps {\n isAddtoListDisabled: boolean | undefined;\n productTextInput: React.RefObject<HTMLInputElement>;\n quantityTextInput: React.RefObject<HTMLInputElement>;\n maxChars: number;\n maxQuantity?: number;\n moduleClassName: string;\n ariaLabelQuantity: string;\n ariaLabelProduct: string;\n ariaLabelAddtoCart: string;\n quickOrderGridState: IQuickOrderGridState;\n handleInputChange(query: string): void;\n handleQuantityChange(query: string): void;\n handleAddProductListClick(): Promise<void>;\n}\n\n/**\n * Interface quick order grid form view props.\n */\nexport interface IQuickOrderGridFormViewProps {\n product: React.ReactNode;\n quantity: React.ReactNode;\n addToListBtn: React.ReactNode;\n userMessage?: React.ReactNode;\n}\n\n/**\n * On Input Change functionality.\n * @param handleInputChange -Input change function.\n * @returns Input change value.\n */\nconst onInputChangeFunction = (handleInputChange: (query: string) => void) => (event: React.ChangeEvent<HTMLInputElement>) => {\n handleInputChange(event.target.value || '');\n};\n\n/**\n * On Quantity Change functionality.\n * @param handleQuantityChange -Quantity change function.\n * @returns Quantity change value.\n */\nconst onQuantityChangeFunction = (handleQuantityChange: (query: string) => void) => (event: React.ChangeEvent<HTMLInputElement>) => {\n handleQuantityChange(event.target.value || '');\n};\n\n/**\n * Quick order grid form component.\n * @param props -Component form props.\n * @returns Quick order gridp view props..\n */\nexport const QuickOrderGridFormComponent = (props: IQuickOrderGridFormProps): IQuickOrderGridFormViewProps => {\n const {\n moduleClassName,\n productTextInput,\n quantityTextInput,\n quickOrderGridState,\n maxChars,\n maxQuantity,\n isAddtoListDisabled,\n ariaLabelQuantity,\n ariaLabelProduct,\n ariaLabelAddtoCart,\n handleQuantityChange,\n handleInputChange,\n handleAddProductListClick\n } = props;\n\n const onInputChange = onInputChangeFunction(handleInputChange);\n\n const onQuantityInputChange = onQuantityChangeFunction(handleQuantityChange);\n\n const productNode = (\n <div className={`${moduleClassName}__content-form-main-product`}>\n <h2 className={`${moduleClassName}__content-form-main-product-lable`} aria-label={ariaLabelProduct}>\n {ariaLabelProduct}\n </h2>\n <input\n className={`${moduleClassName}__content-form-main-product-input`}\n type='text'\n aria-label={ariaLabelProduct}\n ref={productTextInput}\n onChange={onInputChange}\n />\n </div>\n );\n\n const quantityNode = (\n <div className={`${moduleClassName}__content-form-main-quantity`}>\n <h2 className={`${moduleClassName}__content-form-main-quantity-lable`} aria-label={ariaLabelQuantity}>\n {ariaLabelQuantity}\n </h2>\n <input\n className={`${moduleClassName}__content-form-main-quantity-input`}\n pattern='[0-9]*'\n ref={quantityTextInput}\n onChange={onQuantityInputChange}\n maxLength={maxChars}\n type='number'\n aria-live='polite'\n aria-label={ariaLabelQuantity}\n aria-valuemin={0}\n aria-valuemax={maxQuantity}\n aria-valuenow={quickOrderGridState.quantity}\n />\n </div>\n );\n\n const addToListNode = (\n <div className={`${moduleClassName}__content-form-main-add-to-product-list`}>\n <Button\n className={`${moduleClassName}__content-form-main-add-to-product-list-button`}\n disabled={isAddtoListDisabled}\n aria-label={ariaLabelAddtoCart}\n onClick={handleAddProductListClick}\n >\n {ariaLabelAddtoCart}\n </Button>\n </div>\n );\n\n const userMessageNode = quickOrderGridState.stateMessage ? (\n <Alert color={quickOrderGridState.stateMessage.statusCssString} isOpen={quickOrderGridState.stateMessage.isOpen}>\n <span className={quickOrderGridState.stateMessage.messageGlyph} />\n <span>{quickOrderGridState.stateMessage.messageText}</span>\n </Alert>\n ) : (\n undefined\n );\n\n return {\n product: productNode,\n addToListBtn: addToListNode,\n quantity: quantityNode,\n userMessage: userMessageNode\n };\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { QuickOrderTemplateLine } from '@msdyn365-commerce-modules/retail-actions';\nimport { observable } from 'mobx';\n\n/**\n * Represents a product for quick order grid.\n */\nexport class QuickOrderGridProduct {\n @observable\n public isSelected: boolean;\n\n public readonly productLine: QuickOrderTemplateLine;\n\n public constructor(productLine: QuickOrderTemplateLine) {\n this.productLine = productLine;\n this.isSelected = false;\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IComponent, IComponentProps, ICoreContext } from '@msdyn365-commerce/core';\nimport classnames from 'classnames';\nimport React from 'react';\n\n/**\n * Interface for quick order grid table header resources.\n */\nexport interface IQuickOrderGridTableHeaderResources {\n quickOrderGridProductNumberText: string;\n quickOrderGridProductText: string;\n quickOrderGridUnitPriceText: string;\n quickOrderGridUnitOfMeasureText: string;\n quickOrderGridQuantityText: string;\n quickOrderGridActionsText: string;\n}\n\n/**\n * Interface for quick order grid table props.\n */\nexport interface IQuickOrderGridTableHeaderProps extends IComponentProps {\n context: ICoreContext;\n className: string;\n\n isMobile: boolean;\n resources: IQuickOrderGridTableHeaderResources;\n}\n\n/**\n * Interface for quick order grid table header component.\n */\nexport interface IQuickOrderGridTableHeaderComponent extends IComponent<IQuickOrderGridTableHeaderProps> {}\n\n/**\n * Get the quick order grid header cells for desktop.\n * @param props -- The quick order grid table header props.\n * @returns The list of cells for quick order grid header component in desktop version.\n */\nconst QuickOrderGridDesktopHeaderCellsComponent: React.FC<IQuickOrderGridTableHeaderProps> = (props: IQuickOrderGridTableHeaderProps) => {\n const { resources } = props;\n const columnWithNumberClassName = `${props.className}__row__column-with-number`;\n return (\n <>\n <th>\n <span className={classnames(`${props.className}__emptyColumn`)} />\n </th>\n <th>{resources.quickOrderGridProductNumberText}</th>\n <th>{resources.quickOrderGridProductText}</th>\n <th className={columnWithNumberClassName}>{resources.quickOrderGridUnitPriceText}</th>\n <th>{resources.quickOrderGridUnitOfMeasureText}</th>\n <th className={columnWithNumberClassName}>{resources.quickOrderGridQuantityText}</th>\n <th>{resources.quickOrderGridActionsText}</th>\n </>\n );\n};\n\n/**\n * Get the quick order grid header cells for mobile.\n * @param props -- The quick order grid table header props.\n * @returns The quick order grid header component in desktop version.\n */\nconst QuickOrderGridMobileHeaderCellsComponent: React.FC<IQuickOrderGridTableHeaderProps> = (props: IQuickOrderGridTableHeaderProps) => {\n const { resources } = props;\n return (\n <>\n <th className={classnames(`${props.className}__emptyColumn`)} />\n <th>{resources.quickOrderGridProductNumberText}</th>\n <th />\n </>\n );\n};\n\n/**\n * Quick order table header component.\n * @param props - Configuration of the component.\n * @returns React node with the header.\n */\nexport const QuickOrderGridTableHeaderComponent: React.FC<IQuickOrderGridTableHeaderProps> = (props: IQuickOrderGridTableHeaderProps) => {\n const rowClassName = `${props.className}__row`;\n\n let headerCells: JSX.Element;\n if (props.isMobile) {\n headerCells = <QuickOrderGridMobileHeaderCellsComponent {...props} />;\n } else {\n headerCells = <QuickOrderGridDesktopHeaderCellsComponent {...props} />;\n }\n\n return (\n <thead className={props.className}>\n <tr className={rowClassName}>{headerCells}</tr>\n </thead>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { PriceComponent } from '@msdyn365-commerce/components';\nimport MsDyn365, { IComponentProps, ICoreContext, IImageSettings, Image } from '@msdyn365-commerce/core';\nimport { ProductListLine, ProductPrice } from '@msdyn365-commerce/retail-proxy';\nimport { getFallbackImageUrl, getProductPageUrlSync, ObjectExtensions, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, IncrementalQuantity, isMobile, VariantType } from '@msdyn365-commerce-modules/utilities';\nimport React, { useState } from 'react';\n\nimport { QuickOrderGridProduct } from '../../quick-order-grid-product';\nimport { IQuickOrderGridRowCallbacks } from '../../utilities';\n\n/**\n * Data required to render each quick order grid row.\n */\nexport interface IQuickOrderGridTableRowData {\n product: QuickOrderGridProduct;\n}\n\n/**\n * Resources for quick order grid table rows.\n */\nexport interface IQuickOrderGridTableRowResources {\n quickOrderGridQuantityMobileText: string;\n quickOrderGridProductDimensionsSeparator: string;\n quickOrderGridViewDetailsButtonText: string;\n quickOrderGridViewDetailsButtonAriaLabel: string;\n quickOrderGridRemoveItemButtonAriaLabel: string;\n quickOrderGridInputQuantityAriaLabel: string;\n quickOrderGridDecrementButtonAriaLabel: string;\n quickOrderGridIncrementButtonAriaLabel: string;\n originalPriceText: string;\n currentPriceText: string;\n freePriceText: string;\n}\n\n/**\n * Interface for quick order grid table props.\n */\nexport interface IQuickOrderGridTableRowProps extends IComponentProps<IQuickOrderGridTableRowData> {\n context: ICoreContext;\n className: string;\n productListLine: ProductListLine;\n price?: ProductPrice;\n moduleId: string;\n moduleTypeName: string;\n quantity: number;\n imageSettings?: IImageSettings;\n isMobile: boolean;\n resources: IQuickOrderGridTableRowResources;\n index: number;\n callbacks: IQuickOrderGridRowCallbacks;\n}\n\n/**\n * The default image settings for quick order grid table row.\n */\nconst defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=80&h=80&m=6', w: 0, h: 0 },\n lg: { q: 'w=147&h=147&m=6', w: 0, h: 0 }\n },\n lazyload: true,\n cropFocalRegion: true\n};\n\n/**\n * Renders product image for quick order grid row.\n * @param props - Quick order table row props.\n * @returns React element.\n */\nconst QuickOrderGridTableRowProductImageComponent: React.FC<IQuickOrderGridTableRowProps> = (props: IQuickOrderGridTableRowProps) => {\n const product = props.data.product.productLine.fullProduct?.ProductDetails;\n const fallbackImageUrl = getFallbackImageUrl(\n product?.ItemId,\n props.context.actionContext.requestContext.apiSettings,\n props.context.request.app?.config?.OmniChannelMedia\n );\n\n const containerClassName = `${props.className}__product-image-container`;\n\n return (\n <div className={containerClassName}>\n <Image\n requestContext={props.context.actionContext.requestContext}\n className={`${containerClassName}__product-image`}\n altText={product?.Name}\n src={product?.PrimaryImageUrl ?? ''}\n fallBackSrc={fallbackImageUrl}\n gridSettings={props.context.request.gridSettings!}\n imageSettings={props.imageSettings ?? defaultImageSettings}\n loadFailureBehavior='empty'\n />\n </div>\n );\n};\n\nlet setShowPreviousActions: React.Dispatch<React.SetStateAction<boolean>> | undefined;\n\n/**\n * Renders product price.\n * @param props - Props for price component.\n * @returns React element.\n */\nconst renderProductPrice = (props: IQuickOrderGridTableRowProps): JSX.Element | null => {\n const { context, moduleId, moduleTypeName, resources } = props;\n const price = props.price;\n\n if (price) {\n return (\n <PriceComponent\n id={moduleId}\n typeName={moduleTypeName}\n data={{ price }}\n className='ms-quick-order-grid-row__product-price'\n freePriceText={resources.freePriceText}\n originalPriceText={resources.originalPriceText}\n currentPriceText={resources.currentPriceText}\n context={context}\n />\n );\n }\n return null;\n};\n\n/**\n * Renders product price.\n * @param props - Props for price component.\n * @returns React element.\n */\nconst renderUnitOfMeasure = (props: IQuickOrderGridTableRowProps): JSX.Element | null => {\n const price = props.price;\n\n if (price) {\n return (\n <div className='ms-quick-order-grid-row__product-unit-of-measure'>\n {StringExtensions.isNullOrEmpty(props.productListLine.UnitOfMeasure) || price.UnitOfMeasure}\n </div>\n );\n }\n return null;\n};\n\n/**\n * On Change function.\n * @param onChangeQuantity -On change quantity function.\n * @param itemKey -String.\n * @param props -Order template line props.\n * @returns Set change quantity.\n */\nconst onChangeHandler = (\n onChangeQuantity: (\n orderTemplateLineId: string | undefined,\n quantity: number,\n props?: IQuickOrderGridTableRowProps | undefined\n ) => boolean,\n itemKey: string | undefined,\n props: IQuickOrderGridTableRowProps\n) => (newValue: number) => {\n onChangeQuantity(itemKey, newValue, props);\n return true;\n};\n\n/**\n * On Change function.\n * @param onRemoveItem -On change quantity function.\n * @param quickOrderGridProductKey -QuickOrderGridp Product.\n * @param props -Order template line props.\n * @returns Set change quantity.\n */\nconst onRemoveHandler = (\n onRemoveItem: (quickOrderGridProduct: QuickOrderGridProduct, props?: IQuickOrderGridTableRowProps | undefined) => void,\n quickOrderGridProductKey: QuickOrderGridProduct,\n props: IQuickOrderGridTableRowProps\n) => () => {\n onRemoveItem(quickOrderGridProductKey, props);\n};\n\n/**\n * Renders actions popup for the mobile view.\n * @param props - Configuration for popup.\n * @returns A react node with actions..\n */\nconst QuickOrderGridExtraActionsPopupComponent: React.FC<IQuickOrderGridTableRowProps> = (\n props: IQuickOrderGridTableRowProps\n): JSX.Element | null => {\n const {\n resources: { quickOrderGridViewDetailsButtonAriaLabel, quickOrderGridViewDetailsButtonText }\n } = props;\n const product = props.data.product.productLine.fullProduct?.ProductDetails;\n const [shouldShowActions, setShowActions] = useState(false);\n let productUrl = '';\n if (product === undefined) {\n return null;\n }\n if (!StringExtensions.isNullOrWhitespace(product.Name) && !ObjectExtensions.isNullOrUndefined(product.RecordId)) {\n productUrl = getProductPageUrlSync(product.Name!, product.RecordId, props.context.actionContext);\n }\n\n const onClickViewDetails = React.useCallback(() => {\n if (MsDyn365.isBrowser) {\n window.location.href = productUrl;\n }\n }, [productUrl]);\n\n const toggle = React.useCallback(() => {\n const shouldShowActionsNewValue = !shouldShowActions;\n if (shouldShowActionsNewValue) {\n if (setShowPreviousActions) {\n setShowPreviousActions(false);\n }\n setShowActions(shouldShowActionsNewValue);\n setShowPreviousActions = setShowActions;\n } else {\n setShowPreviousActions = undefined;\n setShowActions(shouldShowActionsNewValue);\n }\n }, [shouldShowActions, setShowActions]);\n\n if (StringExtensions.isNullOrWhitespace(productUrl)) {\n return null;\n }\n\n const className = `${props.className}__extra-actions-cell`;\n const actionsContainerClassName = `${className}__actions-container`;\n\n return (\n <div className={className}>\n <Button className={`${className}__toggle`} onClick={toggle} />\n {shouldShowActions && (\n <div className={actionsContainerClassName}>\n <Button\n className={`${actionsContainerClassName}__view-details`}\n onClick={onClickViewDetails}\n aria-label={quickOrderGridViewDetailsButtonAriaLabel}\n >\n {quickOrderGridViewDetailsButtonText}\n </Button>\n <Button\n className={`${props.className}__product-remove`}\n aria-label={props.resources.quickOrderGridRemoveItemButtonAriaLabel}\n >\n {props.resources.quickOrderGridRemoveItemButtonAriaLabel}\n </Button>\n </div>\n )}\n </div>\n );\n};\n\n/**\n * Renders quick order grid table rows for desktop view.\n * @param props - Configuration for the rows.\n * @returns A react node with a list of quick order grid rows for desktop view.\n */\nexport const QuickOrderGridDesktopTableRowCellComponent: React.FC<IQuickOrderGridTableRowProps> = (props: IQuickOrderGridTableRowProps) => {\n const product = props.data.product.productLine.fullProduct?.ProductDetails;\n const productListLine = props.data.product.productLine.productListLine;\n const { quantity } = props;\n const columnWithNumberClassName = `${props.className}__column-with-number`;\n if (product !== undefined) {\n let productUrl = '';\n if (!StringExtensions.isNullOrWhitespace(product.Name) && !ObjectExtensions.isNullOrUndefined(product.RecordId)) {\n productUrl = getProductPageUrlSync(product.Name!, product.RecordId, props.context.actionContext);\n }\n\n return (\n <>\n <td>\n <QuickOrderGridTableRowProductImageComponent {...props} />\n </td>\n <td>{product.ItemId}</td>\n <td>\n <div className={`${props.className}__product-info`}>\n <a className={`${props.className}__product-name`} href={productUrl}>\n {product.Name}\n </a>\n <span className={`${props.className}__product-dimensions`}>\n {product.Dimensions?.map(dimension => dimension.DimensionValue?.Value)\n .filter(dimensionValue => !StringExtensions.isNullOrWhitespace(dimensionValue))\n .join(props.resources.quickOrderGridProductDimensionsSeparator)}\n </span>\n </div>\n </td>\n <td className={columnWithNumberClassName}>{renderProductPrice(props)}</td>\n <td>{renderUnitOfMeasure(props)}</td>\n <td className={`${props.className}__product-quantity`}>\n <IncrementalQuantity\n id={`msc-quick-order-grid-row__quantity_${product.RecordId}-${productListLine.LineId ?? ''}`}\n max={10}\n currentCount={quantity}\n inputQuantityAriaLabel={props.resources.quickOrderGridInputQuantityAriaLabel}\n decrementButtonAriaLabel={props.resources.quickOrderGridDecrementButtonAriaLabel}\n incrementButtonAriaLabel={props.resources.quickOrderGridIncrementButtonAriaLabel}\n key={productListLine.LineId}\n isGiftCard={product.IsGiftCard}\n onChange={onChangeHandler(props.callbacks.onChangeQuantity, productListLine.LineId, props)}\n />\n </td>\n <td>\n <Button\n className={`${props.className}__product-remove`}\n aria-label={props.resources.quickOrderGridRemoveItemButtonAriaLabel}\n onClick={onRemoveHandler(props.callbacks.onRemoveItem, props.data.product, props)}\n />\n </td>\n </>\n );\n }\n\n return null;\n};\n\n/**\n * Renders rows for mobile view.\n * @param props - Configuration for the rows.\n * @returns A react node with a list of quick order grid rows for mobile view.\n */\nexport const QuickOrderGridMobileTableRowCellComponent: React.FC<IQuickOrderGridTableRowProps> = (props: IQuickOrderGridTableRowProps) => {\n const product = props.data.product.productLine.fullProduct?.ProductDetails;\n const productListLine = props.data.product.productLine.productListLine;\n const { quantity } = props;\n if (product !== undefined) {\n return (\n <>\n <td>\n <QuickOrderGridTableRowProductImageComponent {...props} />\n </td>\n <td>\n <div className={`${props.className}__product-info`}>\n <span className={`${props.className}__product-name`}>{product.RecordId}</span>\n <span className={`${props.className}__product-quantity`}>\n <IncrementalQuantity\n id={`msc-quick-order-grid-row__quantity_${product.RecordId}-${productListLine.LineId ?? ''}`}\n max={10}\n currentCount={quantity}\n inputQuantityAriaLabel={props.resources.quickOrderGridInputQuantityAriaLabel}\n decrementButtonAriaLabel={props.resources.quickOrderGridDecrementButtonAriaLabel}\n incrementButtonAriaLabel={props.resources.quickOrderGridIncrementButtonAriaLabel}\n key={productListLine.LineId}\n isGiftCard={product.IsGiftCard}\n onChange={onChangeHandler(props.callbacks.onChangeQuantity, productListLine.LineId, props)}\n />\n </span>\n </div>\n </td>\n <td>\n <QuickOrderGridExtraActionsPopupComponent {...props} />\n </td>\n </>\n );\n }\n return null;\n};\n\n/**\n * Quick order table row component.\n * @param props - Configuration of the component.\n * @returns React node for the row.\n */\nexport const QuickOrderGridTableRowComponent: React.FC<IQuickOrderGridTableRowProps> = (props: IQuickOrderGridTableRowProps) => {\n const rowClassName = `${props.className}__row`;\n const isMobileView = isMobile({ variant: VariantType.Viewport, context: props.context.request }) === 'xs';\n let headerCells: JSX.Element;\n if (isMobileView) {\n headerCells = <QuickOrderGridMobileTableRowCellComponent {...props} />;\n } else {\n headerCells = <QuickOrderGridDesktopTableRowCellComponent {...props} />;\n }\n\n return (\n <thead className={props.className}>\n <tr className={rowClassName}>{headerCells}</tr>\n </thead>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport MsDyn365, { IComponent, IComponentProps, ICoreContext, IImageSettings } from '@msdyn365-commerce/core';\nimport React from 'react';\n\nimport { QuickOrderGridProduct } from '../quick-order-grid-product';\nimport { IQuickOrderGridRowCallbacks } from '../utilities';\nimport {\n IQuickOrderGridTableHeaderResources,\n IQuickOrderGridTableRowResources,\n QuickOrderGridTableHeaderComponent,\n QuickOrderGridTableRowComponent\n} from './components';\n\n/**\n * Quick order table data interface.\n */\ninterface IQuickOrderGridTableData {\n quickOrderGridProducts: QuickOrderGridProduct[];\n}\n\n/**\n * Quick order table resources.\n */\nexport interface IQuickOrderGridTableResources extends IQuickOrderGridTableHeaderResources, IQuickOrderGridTableRowResources {}\n\n/**\n * Quick order table props.\n */\nexport interface IQuickOrderGridTableProps extends IComponentProps<IQuickOrderGridTableData> {\n context: ICoreContext;\n className: string;\n moduleId: string;\n moduleTypeName: string;\n\n resources: IQuickOrderGridTableResources;\n isMobileView: boolean;\n imageSettings?: IImageSettings;\n callBacks: IQuickOrderGridRowCallbacks;\n}\n\n/**\n * Quick order table component.\n */\nexport interface IQuickOrderGridTableComponent extends IComponent<IQuickOrderGridTableProps> {}\n\n/**\n * The quick order table.\n * @param props -- The quick order table props.\n * @returns The quick order table element.\n */\nexport const QuickOrderGridTableComponent: React.FC<IQuickOrderGridTableProps> = (props: IQuickOrderGridTableProps) => {\n const [isMobile, setIsMobile] = React.useState(props.isMobileView);\n const quickOrderGridProducts = props.data.quickOrderGridProducts;\n\n /**\n * Update the view port.\n */\n const updateViewport = () => {\n setIsMobile(props.isMobileView);\n };\n\n if (MsDyn365.isBrowser) {\n window.addEventListener('resize', updateViewport);\n }\n\n const headerClassName = `${props.className}__header`;\n const rowClassName = `${props.className}__row`;\n\n return (\n <table className={props.className}>\n <QuickOrderGridTableHeaderComponent\n context={props.context}\n typeName={props.typeName}\n id={headerClassName}\n className={headerClassName}\n isMobile={isMobile}\n resources={props.resources}\n data={{}}\n />\n {quickOrderGridProducts.map((quickOrderProduct, index) => {\n const price = quickOrderProduct.productLine.fullProduct?.ProductPrice;\n const quantity = quickOrderProduct.productLine.productListLine.Quantity!;\n return (\n <QuickOrderGridTableRowComponent\n context={props.context}\n typeName={props.typeName}\n id={`${rowClassName}-${index}`}\n key={quickOrderProduct.productLine.fullProduct?.ProductDetails.RecordId}\n className={rowClassName}\n resources={props.resources}\n isMobile={isMobile}\n price={price}\n moduleId={props.moduleId}\n moduleTypeName={props.moduleTypeName}\n quantity={quantity}\n index={index}\n imageSettings={props.imageSettings}\n productListLine={quickOrderProduct.productLine.productListLine}\n callbacks={props.callBacks}\n data={{\n product: quickOrderProduct\n }}\n />\n );\n })}\n </table>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n getProductConfigure,\n IProductDimensionCallbacks,\n IProductDimensionConfigureResources,\n IProductDimensionConfigureViewProps\n} from '@msdyn365-commerce/components';\nimport {\n ProductDimension,\n ProductDimensionType,\n ProductDimensionValue,\n ProductListsDataActions,\n ProductListType,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy';\nimport {\n addItemToProductListAction,\n AddItemToProductListInput,\n ArrayExtensions,\n createProductList,\n CreateProductListInput,\n FinitePromiseQueue,\n FinitePromiseQueueError,\n getDimensionsForSelectedVariant,\n GetDimensionsForSelectedVariantInput,\n getScanResult,\n GetScanResultInput,\n getSelectedVariant,\n IDimensionForSelectedVariant,\n IPromiseQueue,\n QuickOrderTemplate,\n QuickOrderTemplateLine,\n SelectedVariantInput,\n StringExtensions\n} from '@msdyn365-commerce-modules/retail-actions';\nimport {\n getTelemetryObject,\n Heading,\n IModuleProps,\n INodeProps,\n isMobile,\n ITelemetryContent,\n VariantType\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { debounce } from 'lodash';\nimport { computed } from 'mobx';\nimport * as React from 'react';\n\nimport { ActiveProductListInput } from './actions';\nimport {\n IQuickOrderGridActionsProps,\n IQuickOrderGridActionsViewProps,\n IQuickOrderGridRowCallbacks,\n IQuickOrderGridState,\n QuickOrderGridActionsView,\n QuickOrderGridDrawer,\n QuickOrderGridFormComponent,\n QuickOrderGridProduct,\n QuickOrderGridTableComponent\n} from './components';\nimport { IQuickOrderGridData } from './quick-order-grid.data';\nimport { IQuickOrderGridProps, IQuickOrderGridResources } from './quick-order-grid.props.autogenerated';\n\n/**\n * QuickOrder Grid View props.\n */\nexport interface IQuickOrderGridViewProps extends IQuickOrderGridProps<IQuickOrderGridData> {\n header: JSX.Element;\n actions?: INodeProps;\n isB2bCustomer?: boolean;\n isQuickOrderGridFormExpanded: boolean;\n contentProps: INodeProps;\n drawer: INodeProps;\n loading?: React.ReactNode;\n quickOrderGridForm: INodeProps;\n quickOrderGridFormProductContent: INodeProps;\n quickOrderGridFormMsgContent: INodeProps;\n quickOrderGridProps: IModuleProps;\n form: React.ReactNode;\n configure?: IProductDimensionConfigureViewProps;\n isMobileView: boolean;\n container?: JSX.Element;\n orderActions?: IQuickOrderGridActionsViewProps | null;\n bulkPurchase?: React.ReactNode;\n}\n\n/**\n * QuickOrder Grid View port.\n */\nexport type GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\n/**\n * QuickOrderGrid component.\n * @extends {React.PureComponent<IQuickOrderGridProps<IQuickOrderGridData>>}\n */\nclass QuickOrderGrid extends React.PureComponent<IQuickOrderGridProps<IQuickOrderGridData>, IQuickOrderGridState> {\n private readonly _productTextInput: React.RefObject<HTMLInputElement>;\n\n private readonly _quantityInput: React.RefObject<HTMLInputElement>;\n\n private readonly _waitTime: number = 500;\n\n private readonly _dimensionUpdateQueueMaxLength: number = 2;\n\n private readonly _errorCssClass: string = 'danger';\n\n private readonly _errorCssGlyphClass: string = 'fas fa-exclamation-triangle';\n\n private readonly _quickOrderGridFormClass: string;\n\n private readonly _quickOrderGridFormProductContent: string;\n\n private readonly _quickOrderGridFormMsgContent: string;\n\n private readonly _telemetryContent: ITelemetryContent;\n\n private readonly _dimensionUpdateQueue: IPromiseQueue<void> = new FinitePromiseQueue<void>(this._dimensionUpdateQueueMaxLength);\n\n private _dimensions: { [id: number]: string } = {};\n\n private readonly _cssClassNameConfigure: string = 'ms-quick-order_grid__content-form-main';\n\n private readonly _className: string = 'ms-quick-order-grid';\n\n // @ts-expect-error: Debouce needs to be used as type.\n private _cancellabelDebounce: debounce;\n\n private readonly _quickOrderGridCallbacks: IProductDimensionCallbacks = {\n /**\n * Get Dropdown name.\n * @param selectedDimensionId - Dimension type.\n * @param selectedDimensionValueId - Resources.\n * @returns Dropdown name.\n */\n dimensionSelectedAsync: async (selectedDimensionId: number, selectedDimensionValueId: string): Promise<void> => {\n this._dimensions[selectedDimensionId] = selectedDimensionValueId;\n return this._dimensionUpdateQueue\n .enqueue(async () => {\n return this._updateDimensions();\n })\n .catch((error: string) => {\n // Ignore discarded processes.\n if (error !== FinitePromiseQueueError.ProcessWasDiscardedFromTheQueue) {\n throw new Error(error);\n }\n });\n },\n\n /**\n * Get Dropdown name.\n * @param dimensionType - Dimension type.\n * @param resources - Resources.\n * @returns Dropdown name.\n */\n getDropdownName: (dimensionType: number, resources: IProductDimensionConfigureResources): string => {\n return this._getDropdownName(dimensionType, resources);\n },\n\n /**\n * Method to call on dimension change.\n * @param isUpdatingDimension - Flag to update dimension.\n */\n changeUpdatingDimension: (isUpdatingDimension: boolean): void => {\n this.setState({ isUpdatingDimension });\n }\n };\n\n private readonly _quickOrderGridRowCallbacks: IQuickOrderGridRowCallbacks = {\n /**\n * Method to call remove button.\n * @param line - Grid row product.\n */\n onRemoveItem: (line: QuickOrderGridProduct): void => {\n this._removeItemRowFromTable(line.productLine);\n },\n\n /**\n * Method to call on change quantity button.\n * @param productListLineId - Grid row product list line id.\n * @param quantity - Product quantity.\n * @returns - Falg to get confirmation for action.\n */\n onChangeQuantity: (productListLineId: string | undefined, quantity: number): boolean => {\n return this._changeRowQuantity(productListLineId, quantity);\n }\n };\n\n public constructor(props: IQuickOrderGridProps<IQuickOrderGridData>) {\n super(props);\n this._productTextInput = React.createRef();\n this._quantityInput = React.createRef<HTMLInputElement>();\n\n this._telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n this.state = {\n isQuickOrderGridFormExpanded: false,\n quantity: 1,\n productResponse: undefined,\n productDimensions: undefined,\n productDimensionErrorState: {\n configureErrors: {}\n },\n isMobile: this.isMobile,\n products: [],\n isUpdatingDimension: false,\n productListId: ''\n };\n\n this._quickOrderGridFormClass = 'ms-quick-order-grid__content-form';\n this._quickOrderGridFormProductContent = 'ms-quick-order-grid__content-form-main';\n this._quickOrderGridFormMsgContent = 'ms-quick-order-grid__content-form-msg';\n }\n\n @computed public get isMobile(): boolean {\n const size = isMobile({ variant: VariantType.Viewport, context: this.props.context.request });\n return size === 'xs';\n }\n\n public render(): JSX.Element | null {\n const { data } = this.props;\n if (!data.customerInformation.result) {\n return null;\n }\n const quickOrderTemplate = data.quickOrderTemplate;\n\n if (quickOrderTemplate?.result !== undefined) {\n this.setState({\n products: quickOrderTemplate.result.quickOrderTemplateLines,\n productListId: quickOrderTemplate.result.productList.Id\n });\n }\n const { className = '', maxQuantity } = this.props.config;\n const customerInfo = this.props.data.customerInformation.result;\n const {\n quickOrderGridModuleHeading,\n quickOrderGridModuleDescription,\n quickOrderGridAddtogrid,\n quickOrderGridProductQuantityInputLabel,\n quickOrderGridProductInputLabel,\n quickOrderGridProductDimensionTypeColor,\n quickOrderGridProductDimensionTypeConfiguration,\n quickOrderGridSelectDimensionFormatString,\n quickOrderGridProductDimensionTypeSize,\n quickOrderGridProductDimensionTypeStyle,\n quickOrderGridProductDimensionTypeAmount,\n quickOrderGridModulePageHeading\n } = this.props.resources;\n\n const productConfigureResources: IProductDimensionConfigureResources = {\n selectDimensionFormatString: quickOrderGridSelectDimensionFormatString,\n productDimensionTypeColor: quickOrderGridProductDimensionTypeColor,\n productDimensionTypeConfiguration: quickOrderGridProductDimensionTypeConfiguration,\n productDimensionTypeSize: quickOrderGridProductDimensionTypeSize,\n productDimensionTypeStyle: quickOrderGridProductDimensionTypeStyle,\n productDimensionTypeAmount: quickOrderGridProductDimensionTypeAmount\n };\n\n const { isQuickOrderGridFormExpanded, productDimensionErrorState, productResponse, productDimensions } = this.state;\n\n const headerClassName = `${this._className}__header`;\n\n const header = (\n <div className={headerClassName}>\n <Heading className={`${headerClassName}-heading`} text={quickOrderGridModulePageHeading} />\n </div>\n );\n\n const viewProps: IQuickOrderGridViewProps = {\n ...(this.props as IQuickOrderGridProps<IQuickOrderGridData>),\n\n quickOrderGridProps: { className: classnames('ms-quick-order-grid', className), moduleProps: this.props },\n contentProps: { className: 'ms-quick-order-grid__content' },\n isB2bCustomer: customerInfo?.IsB2b,\n header,\n actions: {\n className: `${this._className}-action-bar`,\n tag: 'div'\n },\n drawer: {\n tag: QuickOrderGridDrawer,\n className: `${this._className}__drawer`,\n collapseProps: { isOpen: this.state.isQuickOrderGridFormExpanded },\n moduleHeadingText: quickOrderGridModuleHeading,\n moduleDescriptionText: quickOrderGridModuleDescription,\n requestContext: this.props.context.request,\n telemetryContent: this._telemetryContent\n },\n bulkPurchase: this._renderBulkPurchase(),\n quickOrderGridForm: {\n className: `${this._quickOrderGridFormClass} ${isQuickOrderGridFormExpanded ? 'qo-show' : 'qo-hide'}`\n },\n quickOrderGridFormProductContent: {\n className: this._quickOrderGridFormProductContent\n },\n quickOrderGridFormMsgContent: {\n className: this._quickOrderGridFormMsgContent\n },\n form: QuickOrderGridFormComponent({\n productTextInput: this._productTextInput,\n quantityTextInput: this._quantityInput,\n isAddtoListDisabled: !productResponse,\n ariaLabelAddtoCart: quickOrderGridAddtogrid,\n ariaLabelProduct: quickOrderGridProductInputLabel,\n ariaLabelQuantity: quickOrderGridProductQuantityInputLabel,\n maxChars: 50,\n maxQuantity,\n moduleClassName: this._className,\n quickOrderGridState: this.state,\n handleInputChange: this._handleInputChange,\n handleQuantityChange: this._handleQuantityChange,\n handleAddProductListClick: this._addItemToProductListLine\n }),\n configure:\n productResponse && productDimensions\n ? getProductConfigure(\n this._cssClassNameConfigure,\n this.props.context,\n this.props.friendlyName,\n this.props.telemetry,\n quickOrderGridSelectDimensionFormatString,\n productConfigureResources,\n this._quickOrderGridCallbacks,\n productResponse,\n productDimensions,\n productDimensionErrorState\n )\n : undefined,\n isQuickOrderGridFormExpanded: this.state.isQuickOrderGridFormExpanded,\n isMobileView: this.state.isMobile,\n container: ArrayExtensions.hasElements(this.state.products) ? this._renderListContainer() : undefined,\n orderActions: this._renderQuickOrderGridActions(quickOrderTemplate?.result)\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n private _renderQuickOrderGridActions(quickOrderTemplate: QuickOrderTemplate | undefined): IQuickOrderGridActionsViewProps | null {\n const { typeName, context, resources } = this.props;\n const {\n quickOrderGridDeleteButtonText,\n quickOrderGridBuySelectedButtonText,\n quickOrderGridBuySelectedButtonAriaLabel,\n quickOrderGridBuySelectedAddingToCartErrorNotificationTitle,\n quickOrderGridBuySelectedAddingToCartErrorNotificationCloseAriaLabel,\n quickOrderGridGoToCartText,\n quickOrderGridDialogCloseText,\n quickOrderGridSingleItemText,\n quickOrderGridMultiLineItemFormatText,\n quickOrderGridMultiLinesFormatText,\n quickOrderGridHeaderMessageText,\n addedQuantityText,\n originalPriceText,\n currentPriceText,\n freePriceText\n } = resources;\n if (ArrayExtensions.hasElements(quickOrderTemplate?.quickOrderTemplateLines)) {\n const quickOrderGridActions: IQuickOrderGridActionsProps = {\n data: { quickOrderTemplate },\n moduleClassName: this._className,\n id: 'quick-order-grid',\n typeName,\n context,\n handlers: {\n removeProductList: this._removeProductList\n },\n resources: {\n quickOrderGridDeleteButtonText,\n quickOrderGridBuySelectedButtonText,\n quickOrderGridBuySelectedButtonAriaLabel,\n quickOrderGridBuySelectedAddingToCartErrorNotificationTitle,\n quickOrderGridBuySelectedAddingToCartErrorNotificationCloseAriaLabel,\n quickOrderGridGoToCartText,\n quickOrderGridDialogCloseText,\n quickOrderGridSingleItemText,\n quickOrderGridMultiLineItemFormatText,\n quickOrderGridMultiLinesFormatText,\n quickOrderGridHeaderMessageText,\n addedQuantityText,\n originalPriceText,\n currentPriceText,\n freePriceText\n }\n };\n\n return QuickOrderGridActionsView(quickOrderGridActions);\n }\n return null;\n }\n\n /**\n * Renders bulk purchase module.\n * @returns Bulk purchase module react node.\n */\n private _renderBulkPurchase(): React.ReactNode {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Temporary switch for the feature which is under development.\n if (!this.props.context.app.config.isBulkPurchaseEnabled) {\n return null;\n }\n\n if (!ArrayExtensions.hasElements(this.props.slots.bulkPurchaseSlots)) {\n return null;\n }\n\n const containerClass = `${this._className}__bulk-purchase`;\n return (\n <div className={containerClass}>\n {React.cloneElement(this.props.slots.bulkPurchaseSlots[0] as React.ReactElement, {\n productDimensions: this.state.productDimensions\n })}\n </div>\n );\n }\n\n /**\n * Render list container.\n * @returns JSX element.\n */\n private _renderListContainer(): JSX.Element {\n const containerClass = `${this._className}__table-content`;\n return <div className={containerClass}>{this._renderQuickOrderTable(this._className)}</div>;\n }\n\n /**\n * Initial the products on quick order.\n * @returns List of quick order products or undefined.\n */\n private _initQuickOrderGridProducts(): QuickOrderGridProduct[] {\n const products: QuickOrderTemplateLine[] = this.state.products;\n\n const quickOrderGridProduct: QuickOrderGridProduct[] = products.map((product: QuickOrderTemplateLine) => {\n return new QuickOrderGridProduct(product);\n });\n\n return ArrayExtensions.validValues(quickOrderGridProduct);\n }\n\n /**\n * Method to call on clear button.\n */\n private readonly _removeProductList = () => {\n const { context, data, telemetry, resources } = this.props;\n const { quickOrderTemplate } = data;\n const userToken = context.request.user.isAuthenticated && context.request.user.token;\n if (userToken && quickOrderTemplate && quickOrderTemplate.result) {\n ProductListsDataActions.deleteAsync({ callerContext: context.actionContext }, quickOrderTemplate.result.productList)\n .then(() => {\n window.location.reload();\n })\n .catch((error: string) => {\n telemetry.warning('[quick-order-grid] Unable to delete product list.');\n telemetry.error(error);\n this._updateStatusState(\n resources.quickOrderGridDeleteProductListFailedText,\n this._errorCssClass,\n this._errorCssGlyphClass,\n true\n );\n });\n } else {\n telemetry.warning('[quick-order-grid] Failed to delete product list. Product List was not found');\n }\n };\n\n /**\n * Initial the products on quick order.\n * @param className - Class name.\n * @returns JSX element.\n */\n private _renderQuickOrderTable(className: string): JSX.Element {\n const tableClassName = `${className}__table-list`;\n\n return (\n <QuickOrderGridTableComponent\n id={tableClassName}\n moduleId={this.props.id}\n moduleTypeName={this.props.typeName}\n typeName={this.props.typeName}\n key={tableClassName}\n className={tableClassName}\n data={{\n quickOrderGridProducts: this._initQuickOrderGridProducts()\n }}\n context={this.props.context}\n resources={this.props.resources}\n isMobileView={this.state.isMobile}\n callBacks={this._quickOrderGridRowCallbacks}\n />\n );\n }\n\n /**\n * Method to called on product input change.\n * @param query - Product inventory info.\n */\n private readonly _handleInputChange = (query: string): void => {\n const queryMinLength = 4;\n if (!query || query.length > queryMinLength) {\n this.setState({ quantity: 0, productDimensions: [], productResponse: undefined });\n this._updateStatusState('', '', '', false);\n }\n if (this._cancellabelDebounce) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call -- existing code.\n this._cancellabelDebounce.cancel();\n }\n\n const { telemetry, context } = this.props;\n const zeroNumber = 0;\n if (!StringExtensions.isNullOrEmpty(query)) {\n this._cancellabelDebounce = debounce(() => {\n getScanResult(\n new GetScanResultInput(\n context.actionContext.requestContext.apiSettings,\n query,\n context.actionContext.requestContext.apiSettings.channelId\n ),\n this.props.context.actionContext\n )\n .then(results => {\n this.setState({\n productResponse: results?.Product,\n productDimensions: results?.ProductDimensionFull,\n isQuickOrderGridFormExpanded: true\n });\n })\n .catch((error: Error) => {\n telemetry.exception(error);\n telemetry.debug('Unable to get scan results');\n });\n }, this._waitTime);\n\n setTimeout(() => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call -- Existing code.\n this._cancellabelDebounce();\n }, zeroNumber);\n this.setState({ isQuickOrderGridFormExpanded: true });\n } else {\n this.setState({ productResponse: undefined, isQuickOrderGridFormExpanded: true });\n }\n };\n\n /**\n * Method to called on quantity change.\n * @param value - Quantity value.\n */\n private readonly _handleQuantityChange = (value: string): void => {\n const currentValue = Number.parseInt(value, 10);\n const inputElement = this._quantityInput.current instanceof HTMLInputElement && this._quantityInput.current;\n const quantityChangeDebounceTimeout = 200;\n const minimumQuantity = 0;\n\n this.setState({ quantity: currentValue }, () => {\n debounce(() => {\n if (!Number.isNaN(this.state.quantity) && !(this.state.quantity < minimumQuantity) && inputElement) {\n inputElement.setAttribute('aria-valuenow', currentValue.toString());\n inputElement.setAttribute('value', currentValue.toString());\n }\n }, quantityChangeDebounceTimeout)();\n });\n };\n\n /**\n * Method to get dropdwon name.\n * @param dimensionType - Dimension Type.\n * @param resources - String resources.\n * @returns Dropdwon label.\n */\n private readonly _getDropdownName = (dimensionType: number, resources: IProductDimensionConfigureResources): string => {\n const isGiftCard = this.state.productResponse?.IsGiftCard;\n\n switch (dimensionType) {\n case ProductDimensionType.Color: // ProductDimensionType.Color\n return resources.productDimensionTypeColor;\n case ProductDimensionType.Configuration: // ProductDimensionType.Configuration\n return resources.productDimensionTypeConfiguration;\n case ProductDimensionType.Size: // ProductDimensionType.Size\n return resources.productDimensionTypeSize;\n case ProductDimensionType.Style: // ProductDimensionType.Style\n return isGiftCard ? resources.productDimensionTypeAmount : resources.productDimensionTypeStyle;\n default:\n return '';\n }\n };\n\n /**\n * Method to update dimension and product in UI.\n */\n private readonly _updateDimensions = async (): Promise<void> => {\n const {\n context: {\n actionContext,\n request: {\n apiSettings: { channelId }\n }\n }\n } = this.props;\n const { productDimensions, productResponse } = this.state;\n const hasProductDimensions = ArrayExtensions.hasElements(productDimensions);\n if (!productResponse || !hasProductDimensions) {\n return;\n }\n\n const dimensionsToUpdate: { [id: number]: string } = { ...this._dimensions };\n this.setState({ isUpdatingDimension: true });\n\n // eslint-disable-next-line no-console -- Testing.\n console.log(this.state.isUpdatingDimension);\n\n // Step 1: Update state to indicate which dimensions are selected\n if (this.state.productDimensionErrorState.otherError) {\n // eslint-disable-next-line react/no-access-state-in-setstate -- existing code.\n const clearOtherErrorState = { ...this.state.productDimensionErrorState };\n clearOtherErrorState.otherError = undefined;\n this.setState({ productDimensionErrorState: clearOtherErrorState });\n }\n\n // Step 2: Clear any errors indicating the dimension wasn't selected\n for (const dimensionKey of Object.keys(dimensionsToUpdate)) {\n if (this.state.productDimensionErrorState.configureErrors[dimensionKey]) {\n // eslint-disable-next-line react/no-access-state-in-setstate -- existing code.\n const errorState = { ...this.state.productDimensionErrorState };\n errorState.configureErrors[dimensionKey] = undefined;\n\n this.setState({ productDimensionErrorState: errorState });\n }\n }\n\n // Step 3, Build the actually selected dimensions, prioritizing the information in state\n // over the information in data\n const mappedDimensions = productDimensions\n ?.map(dimension => {\n return {\n DimensionTypeValue: dimension.DimensionTypeValue,\n DimensionValue:\n this._updateDimensionValue(dimension, dimensionsToUpdate[dimension.DimensionTypeValue]) ?? dimension.DimensionValue,\n ExtensionProperties: dimension.ExtensionProperties\n };\n })\n .filter(dimension => {\n return dimension.DimensionValue;\n });\n\n // Step 4. Use these dimensions hydrate the product. Wrap this in a promise\n // so that places like add to cart can await it\n // eslint-disable-next-line no-async-promise-executor -- existing code\n const selectedProduct = new Promise<SimpleProduct | null>(async resolve => {\n const newProduct = await getSelectedVariant(\n new SelectedVariantInput(\n productResponse.MasterProductId ? productResponse.MasterProductId : productResponse.RecordId,\n channelId,\n mappedDimensions,\n undefined,\n this.props.context.request\n ),\n actionContext\n );\n if (newProduct) {\n await getDimensionsForSelectedVariant(\n new GetDimensionsForSelectedVariantInput(\n newProduct.MasterProductId ? newProduct.MasterProductId : newProduct.RecordId,\n channelId,\n mappedDimensions,\n this.props.context.request\n ),\n actionContext\n );\n }\n\n resolve(newProduct);\n });\n\n const variantProduct = await selectedProduct;\n this.setState({ productResponse: variantProduct !== null ? variantProduct : undefined });\n };\n\n /**\n * Method to get updated dimension value.\n * @param productDimensionFull - Product dimension full.\n * @param newValueId - New Dimension value.\n * @returns Dimension Value.\n */\n private readonly _updateDimensionValue = (\n productDimensionFull: IDimensionForSelectedVariant,\n newValueId: string | undefined\n ): ProductDimensionValue | undefined => {\n if (newValueId && productDimensionFull.DimensionValues) {\n return productDimensionFull.DimensionValues.find(dimension => dimension.RecordId === +newValueId);\n }\n\n return undefined;\n };\n\n /**\n * Method to get dropdwon name.\n * @param dimensionTypeValue - Dimension Type.\n * @param resources - String resources.\n * @param isGiftCard - Flag to check if its a giftcard product.\n * @returns Dropdwon error label.\n */\n private readonly _getDimensionErrorString = (\n dimensionTypeValue: number,\n resources: IQuickOrderGridResources,\n isGiftCard?: boolean\n ): string => {\n const amountErrorMessage = resources.quickOrderGridproductDimensionTypeAmountErrorMessage;\n\n switch (dimensionTypeValue) {\n case ProductDimensionType.Color: // ProductDimensionType.Color\n return resources.quickOrderGridproductDimensionTypeColorErrorMessage;\n case ProductDimensionType.Configuration: // ProductDimensionType.Configuration\n return resources.quickOrderGridproductDimensionTypeConfigurationErrorMessage;\n case ProductDimensionType.Size: // ProductDimensionType.Size\n return resources.quickOrderGridproductDimensionTypeSizeErrorMessage;\n case ProductDimensionType.Style: // ProductDimensionType.Style\n return isGiftCard ? amountErrorMessage : resources.quickOrderGridproductDimensionTypeStyleErrorMessage;\n default:\n return '';\n }\n };\n\n /**\n * Initial the products on quick order.\n * @param productResponse - Simple Product.\n * @param quantity - Product Quantity.\n * @returns Flag to validate productlistline.\n */\n private readonly _validateCart = (productResponse: SimpleProduct, quantity: number): boolean => {\n // eslint-disable-next-line @typescript-eslint/prefer-optional-chain -- existing code\n const missingDimensions = productResponse.Dimensions?.filter(\n dimension => !(dimension.DimensionValue && dimension.DimensionValue.Value)\n );\n const minimumQuantity = 0;\n if (ArrayExtensions.hasElements(missingDimensions)) {\n const userMessage = this._getConfigureErrors(missingDimensions, false);\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- existing code\n if (this.state.productDimensionErrorState.configureErrors) {\n // eslint-disable-next-line react/no-access-state-in-setstate -- existing code\n const errorState = { ...this.state.productDimensionErrorState };\n errorState.configureErrors = userMessage;\n\n this.setState({ productDimensionErrorState: errorState });\n return false;\n }\n }\n\n if (quantity <= minimumQuantity) {\n const resources = this.props.resources;\n this._updateStatusState(resources.quickOrderGridWrongQuantityErrorMsg, this._errorCssClass, this._errorCssGlyphClass, true);\n return false;\n }\n return true;\n };\n\n /**\n * Initial the products on quick order.\n * @param result - Simple Product.\n * @param isGiftCard - Product Quantity.\n * @returns Flag to validate cart.\n */\n private _getConfigureErrors(\n result: ProductDimension[] | undefined,\n isGiftCard?: boolean\n ): { [configureId: string]: string | undefined } {\n if (!result) {\n return {};\n }\n const dimensions: { [configureId: string]: string | undefined } = {};\n const resources = this.props.resources;\n for (const dimension of result) {\n dimensions[dimension.DimensionTypeValue] = this._getDimensionErrorString(dimension.DimensionTypeValue, resources, isGiftCard);\n }\n return dimensions;\n }\n\n /**\n * Method to call on quantity change in row.\n * @param itemKey - Product Key.\n * @param quantity - Product quantity.\n * @returns Flag to update status.\n */\n private readonly _changeRowQuantity = (itemKey: string | undefined, quantity: number): boolean => {\n const { context, data, telemetry } = this.props;\n const { quickOrderTemplate } = data;\n if (quickOrderTemplate?.result) {\n const quickOrderTemplateLinesData = quickOrderTemplate.result.quickOrderTemplateLines;\n if (ArrayExtensions.hasElements(quickOrderTemplateLinesData)) {\n const orderLineIndex = quickOrderTemplateLinesData.findIndex(\n (lines: QuickOrderTemplateLine) => lines.productListLine.LineId === itemKey\n );\n const newProductListLine = { ...quickOrderTemplateLinesData[orderLineIndex] };\n if (quickOrderTemplateLinesData[orderLineIndex].productListLine.Quantity === quantity) {\n return true;\n }\n const previousQuantity = newProductListLine.productListLine.Quantity;\n newProductListLine.productListLine.Quantity = quantity;\n const { fullProduct, ...line } = newProductListLine;\n\n ProductListsDataActions.updateProductListLinesAsync(\n { callerContext: context.actionContext },\n quickOrderTemplate.result.productList.Id,\n [line.productListLine]\n )\n .then(list => {\n if (ArrayExtensions.hasElements(list)) {\n const newLine = list.find(lines => lines.LineId === itemKey);\n quickOrderTemplateLinesData[orderLineIndex].productListLine = newLine!;\n const updatedLines = [...quickOrderTemplateLinesData];\n updatedLines[orderLineIndex] = { fullProduct, productListLine: newLine! };\n const updatedProductList = { ...quickOrderTemplate.result, ProductListLines: updatedLines };\n context.actionContext.update(\n new ActiveProductListInput(context.actionContext.requestContext),\n updatedProductList\n );\n return true;\n }\n\n return false;\n })\n .catch((error: Error) => {\n telemetry.warning('[quick-order-grid] Unable to update product quantity.');\n telemetry.error(error.message);\n const userMessage = 'Failed to update quantity value.';\n newProductListLine.productListLine.Quantity = previousQuantity;\n this._updateStatusState(userMessage, this._errorCssClass, this._errorCssGlyphClass, true);\n return false;\n });\n }\n return false;\n }\n\n return false;\n };\n\n /**\n * Method to call on remove item from table.\n * @param line - Order Template Line.\n */\n private readonly _removeItemRowFromTable = (line: QuickOrderTemplateLine): void => {\n const { context, data, telemetry } = this.props;\n const { quickOrderTemplate } = data;\n\n if (quickOrderTemplate?.result) {\n const userToken = context.request.user.isAuthenticated && context.request.user.token;\n if (userToken) {\n ProductListsDataActions.removeProductListLinesAsync(\n { callerContext: context.actionContext },\n line.productListLine.ProductListId!,\n [line.productListLine]\n )\n .then(() => {\n window.location.reload(false);\n })\n .catch((error: Error) => {\n telemetry.warning('[quick-order-grid] Unable remove item from product list grid');\n telemetry.error(error.message);\n });\n } else {\n telemetry.warning('[quick-order-grid] Unable remove items from product list grid user token was not found');\n }\n }\n };\n\n /**\n * Method to call on add item from form.\n */\n private readonly _addItemToProductListLine = async (): Promise<void> => {\n const {\n context: { actionContext },\n resources,\n telemetry\n } = this.props;\n const {\n quickOrderGridAddedToGridSuccessMessage,\n quickOrderGridAddedToGridFailureMessage,\n quickOrderGridAddedToGridDuplicateError\n } = resources;\n const { productResponse, quantity, productListId } = this.state;\n\n this._updateStatusState('', '', '', false);\n\n if (productResponse !== undefined && this._validateCart(productResponse, quantity)) {\n if (StringExtensions.isNullOrWhitespace(productListId)) {\n await this._createProductList();\n }\n\n if (StringExtensions.isNullOrWhitespace(this.state.productListId)) {\n this._updateStatusState(quickOrderGridAddedToGridFailureMessage, this._errorCssClass, this._errorCssGlyphClass, true);\n return;\n }\n const input = new AddItemToProductListInput(\n this.state.productListId,\n productResponse.RecordId,\n quantity,\n productResponse.DefaultUnitOfMeasure ?? 'ea'\n );\n\n await addItemToProductListAction(input, actionContext)\n .then(result => {\n if (result.ProductListId) {\n this._updateStatusState(quickOrderGridAddedToGridSuccessMessage, 'success', 'fas fa-check', true);\n window.location.reload();\n this.setState({});\n }\n })\n .catch((error: Error) => {\n telemetry.debug('[quick-order-grid] Error trying to Update Grid Line from the quick order grid');\n if (error.name === 'Microsoft_Dynamics_Commerce_Runtime_DuplicateObject') {\n this._updateStatusState(\n quickOrderGridAddedToGridDuplicateError,\n this._errorCssClass,\n this._errorCssGlyphClass,\n true\n );\n } else {\n this._updateStatusState(\n quickOrderGridAddedToGridFailureMessage,\n this._errorCssClass,\n this._errorCssGlyphClass,\n true\n );\n }\n });\n }\n };\n\n /**\n * Method to create product list.\n * @returns - ProductListId.\n */\n private _createProductList = async (): Promise<string> => {\n const {\n context: { actionContext },\n telemetry,\n resources\n } = this.props;\n const { productListId } = this.state;\n const { quickOrderGridAddedToGridFailureMessage } = resources;\n\n if (StringExtensions.isNullOrWhitespace(productListId)) {\n const input = new CreateProductListInput('', ProductListType.QuickOrder);\n\n await createProductList(input, actionContext)\n .then(result => {\n if (!StringExtensions.isNullOrWhitespace(result.Id)) {\n this.setState({ productListId: result.Id });\n return result.Id;\n }\n return '';\n })\n .catch((error: Error) => {\n telemetry.debug('[quick-order-grid] Error on creating productlist from quick order grid');\n telemetry.error(error.message);\n this._updateStatusState(quickOrderGridAddedToGridFailureMessage, this._errorCssClass, this._errorCssGlyphClass, true);\n return '';\n });\n return '';\n }\n\n return productListId;\n };\n\n /**\n * Method to create product list.\n * @param messageText - Message Text.\n * @param statusCssString - Css class names.\n * @param messageGlyph - Glyph string.\n * @param isOpen - Flag to show.\n */\n private readonly _updateStatusState = (messageText: string, statusCssString: string, messageGlyph: string, isOpen: boolean): void => {\n this.setState({\n // eslint-disable-next-line react/no-unused-state -- Showing user message in Form component.\n stateMessage: {\n messageText,\n statusCssString,\n messageGlyph,\n isOpen\n }\n });\n };\n}\nexport default QuickOrderGrid;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IProductDimensionConfigureDropdownViewProps, IProductDimensionConfigureViewProps } from '@msdyn365-commerce/components';\nimport { INodeProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IQuickOrderGridFormViewProps } from './components';\nimport { IQuickOrderGridViewProps } from './quick-order-grid';\n\n/**\n * Render product dimension/configure dropdown.\n * @param dropdown -- Product dimension drop down.\n * @returns Dropdown.\n */\nconst renderConfigureDropdown = (dropdown: IProductDimensionConfigureDropdownViewProps): JSX.Element => {\n const { containerProps, labelContainerProps, heading, errors, select } = dropdown;\n\n return (\n <Node {...containerProps}>\n <Node {...labelContainerProps}>{heading}</Node>\n {errors}\n {select}\n </Node>\n );\n};\n\n/**\n * Render product dimension/configure container.\n * @param configure -- Product dimension configuration.\n * @returns Container to have dimension dropdown.\n */\nconst renderConfigure = (configure?: IProductDimensionConfigureViewProps): JSX.Element | null => {\n if (configure !== undefined) {\n const { containerProps, dropdowns } = configure;\n\n return <Node {...containerProps}>{dropdowns.map(renderConfigureDropdown)}</Node>;\n }\n return null;\n};\n\n/**\n * Render product dimension/configure container.\n * @param form -- Form props.\n * @param isMobileView -- Flag to check mobile view.\n * @param quickOrderForm - Form component container.\n * @param quickOrderProductContent - Form product component.\n * @param quickOrderMessageContent - Form user message component.\n * @param configure - Product Dimension component.\n * @returns Jsx element of quick order form component.\n */\nconst renderForm = (\n form: IQuickOrderGridFormViewProps,\n isMobileView: boolean,\n quickOrderForm: INodeProps,\n quickOrderProductContent: INodeProps,\n quickOrderMessageContent: INodeProps,\n configure?: IProductDimensionConfigureViewProps\n) => {\n return isMobileView ? (\n <Node {...quickOrderForm}>\n <Node {...quickOrderProductContent}>\n {form.product}\n {renderConfigure(configure)}\n {form.quantity}\n <Node {...quickOrderMessageContent}>{form.userMessage}</Node>\n {form.addToListBtn}\n </Node>\n </Node>\n ) : (\n <Node {...quickOrderForm}>\n <Node {...quickOrderMessageContent}>{form.userMessage}</Node>\n <Node {...quickOrderProductContent}>\n {form.product}\n {renderConfigure(configure)}\n {form.quantity}\n {form.addToListBtn}\n </Node>\n </Node>\n );\n};\n\n/**\n * Retrieves current sort criteria.\n * @param props - QuickOrder Grid view props.\n * @returns - Render View.\n */\nconst quickOrderGridView: React.FC<IQuickOrderGridViewProps> = props => {\n const {\n quickOrderGridProps,\n contentProps,\n form,\n quickOrderGridForm,\n drawer,\n configure,\n quickOrderGridFormProductContent,\n quickOrderGridFormMsgContent,\n isMobileView,\n header,\n container,\n actions,\n orderActions\n } = props;\n\n return (\n <Module {...quickOrderGridProps}>\n {header}\n {actions && (\n <Node {...actions}>\n {orderActions?.addProductListToBag}\n {orderActions?.removeProductList}\n </Node>\n )}\n <Node {...drawer}>\n <Node {...contentProps}>\n {renderForm(\n form as IQuickOrderGridFormViewProps,\n isMobileView,\n quickOrderGridForm,\n quickOrderGridFormProductContent,\n quickOrderGridFormMsgContent,\n configure\n )}\n {props.bulkPurchase}\n </Node>\n </Node>\n {container}\n </Module>\n );\n};\n\nexport default quickOrderGridView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { RatingsSummary } from '@msdyn365-commerce/commerce-entities';\nimport { format, INodeProps, Progress } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nexport interface IHistogramItemsProps {\n ratingsSummary: RatingsSummary;\n resources: IHistogramItemsResources;\n locale: string;\n onClick(stars: number): void;\n}\n\nexport interface IHistogramItemsResources {\n barItemAriaLabel: string;\n}\n\nexport interface IHistogramItemViewProps {\n starLabel: React.ReactElement;\n bar: React.ReactElement;\n percentage: React.ReactElement;\n buttonProps: INodeProps;\n}\n\n/**\n * CartLineItems component.\n */\n\nexport const HistogramItems = (props: IHistogramItemsProps): IHistogramItemViewProps[] => {\n const { ratingsSummary } = props;\n const totalRatingsCount: number = ratingsSummary.totalRatingsCount || 0;\n if (totalRatingsCount === 0) {\n return [];\n }\n return [\n renderItem(props, 5, ratingsSummary.star5Count, totalRatingsCount),\n renderItem(props, 4, ratingsSummary.star4Count, totalRatingsCount),\n renderItem(props, 3, ratingsSummary.star3Count, totalRatingsCount),\n renderItem(props, 2, ratingsSummary.star2Count, totalRatingsCount),\n renderItem(props, 1, ratingsSummary.star1Count, totalRatingsCount)\n ];\n};\n\nconst renderItem = (props: IHistogramItemsProps, stars: number, count?: number, totalCount?: number): IHistogramItemViewProps => {\n count = count || 0;\n totalCount = totalCount || 0;\n const percentage = totalCount === 0 ? 0 : count / totalCount;\n const formattedPercent = new Intl.NumberFormat(props.locale, { style: 'percent' }).format(percentage);\n const ariaLabel = format(props.resources.barItemAriaLabel, stars, formattedPercent);\n\n return {\n starLabel: (\n <span aria-hidden='true' className='ms-ratings-histogram__star'>\n {stars}\n </span>\n ),\n percentage: (\n <span aria-hidden='true' className='ms-ratings-histogram__percentage'>\n {formattedPercent}\n </span>\n ),\n bar: <Progress value={percentage * 100} max={100} ariaLabel={ariaLabel} className='ms-ratings-histogram__bar' />,\n buttonProps: {\n tag: 'button',\n className: 'ms-ratings-histogram__item',\n onClick: () => {\n props.onClick(stars);\n }\n }\n };\n};\n\nexport const AverageRatingNumber: React.FC<{ summary: RatingsSummary }> = (props: { summary: RatingsSummary }) => {\n return (\n <p className='ms-ratings-histogram__average'>\n {props.summary.averageRating}\n {` `}/ 5\n </p>\n );\n};\n\nexport const TotalReviews: React.FC<{ summary: RatingsSummary }> = (props: { summary: RatingsSummary }) => {\n return <p className='ms-ratings-histogram__total'>{props.summary.totalRatingsCount}</p>;\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { RatingComponent } from '@msdyn365-commerce/components';\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { format, IModuleProps, INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport classname from 'classnames';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { createRatingsReviewsStateInput } from '../../actions/ratings-reviews-state-data-action';\nimport { AverageRatingNumber, HistogramItems, IHistogramItemViewProps, TotalReviews } from './component/components';\nimport { IRatingsHistogramData } from './ratings-histogram.data';\nimport { IRatingsHistogramProps } from './ratings-histogram.props.autogenerated';\n\nexport interface IRatingsHistogramViewProps extends IRatingsHistogramProps<IRatingsHistogramData> {\n className: string;\n histogramItems: IHistogramItemViewProps[];\n moduleProps: IModuleProps;\n heading: React.ReactNode;\n averageRating: React.ReactNode;\n averageNumber: React.ReactNode;\n totalReviews: React.ReactNode;\n histogramProps: INodeProps;\n ratingsSummaryProps: INodeProps;\n callbacks: IRatingsHistogramCallbacks;\n}\n\nexport interface IRatingsHistogramCallbacks {\n selectFilterBy(stars: number): void;\n}\n\n/**\n * RatingsHistogram component.\n * @extends {React.Component<IRatingsHistogramProps<IRatingsHistogramData>>}\n */\n@observer\nclass RatingsHistogram extends React.PureComponent<IRatingsHistogramProps<IRatingsHistogramData>> {\n constructor(props: IRatingsHistogramProps<IRatingsHistogramData>) {\n super(props);\n this.selectFilterBy = this.selectFilterBy.bind(this);\n }\n\n public render(): JSX.Element | null {\n const { resources } = this.props;\n const { className, heading } = this.props.config;\n const {\n ratingsSummary: { result: ratingsSummary }\n } = this.props.data;\n const ratingCount = ratingsSummary && ratingsSummary.totalRatingsCount ? `${ratingsSummary.totalRatingsCount}` : '0';\n\n const completeClass = classname('ms-ratings-histogram', className);\n const viewProps: IRatingsHistogramViewProps = {\n ...this.props,\n className: completeClass,\n callbacks: {\n selectFilterBy: this.selectFilterBy\n },\n moduleProps: {\n moduleProps: this.props,\n className: completeClass\n },\n histogramItems: ratingsSummary\n ? HistogramItems({\n ratingsSummary,\n resources: { ...resources },\n locale: this.props.context.request.locale,\n onClick: this.selectFilterBy\n })\n : [],\n averageRating: ratingsSummary && (\n <RatingComponent\n avgRating={ratingsSummary.averageRating!}\n ratingCount={ratingCount}\n ariaLabel={format(this.props.resources.averageRatingAriaLabel, ratingsSummary.averageRating, '5')}\n readOnly\n context={this.props.context}\n hideCount\n id={this.props.id}\n typeName={this.props.typeName}\n data={{}}\n />\n ),\n averageNumber: ratingsSummary && <AverageRatingNumber summary={ratingsSummary} />,\n totalReviews: ratingsSummary && <TotalReviews summary={ratingsSummary} />,\n ratingsSummaryProps: { className: 'ms-ratings-histogram__summary' },\n heading: heading && (\n <Msdyn365.Text\n className='ms-ratings-histogram__heading'\n tag={heading.tag || 'h2'}\n text={heading.text}\n editProps={{ onEdit: this.handleHeadingChange, requestContext: this.props.context.request }}\n />\n ),\n histogramProps: { className: 'ms-ratings-histogram__histogram' }\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n public handleHeadingChange = (event: Msdyn365.ContentEditableEvent) => (this.props.config.heading!.text = event.target.value);\n\n public selectFilterBy(stars: number): void {\n const filterKey = `${stars}`;\n this.props.context.actionContext.update(createRatingsReviewsStateInput({ filterKey }), { filterKey });\n }\n}\n\nexport default RatingsHistogram;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IHistogramItemViewProps } from './component/components';\nimport { IRatingsHistogramViewProps } from './ratings-histogram';\n\nconst RatingsHistogramView: React.FC<IRatingsHistogramViewProps> = props => {\n const { heading, histogramItems, histogramProps, moduleProps } = props;\n\n return (\n <Module {...moduleProps}>\n {heading}\n <Node {...histogramProps}>\n {histogramItems.map(item => {\n return histogramItem(item);\n })}\n </Node>\n </Module>\n );\n};\n\nconst histogramItem = (props: IHistogramItemViewProps) => {\n return (\n <Node {...props.buttonProps}>\n {props.starLabel}\n {props.bar}\n {props.percentage}\n </Node>\n );\n};\n\nexport default RatingsHistogramView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\nimport { getPayloadObject, getTelemetryAttributes, IPayLoad } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { computed } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { ProductListInventoryFilteringOptions } from '../actions';\nimport { IChoiceSummaryProps } from './choice-summary.props';\nimport { isMatchingRefinementCriterion, isRangeType } from './utilities';\n\ninterface IRefinerMap {\n key: string;\n value: ProductRefinerValue;\n}\n\n/**\n * ChoiceSummary component.\n */\n@observer\nexport default class ChoiceSummary extends React.PureComponent<IChoiceSummaryProps> {\n private readonly closeButtonGlyph: string = 'msi-close-btn';\n\n private readonly payLoad: IPayLoad;\n\n @computed get selectedRefinersMap(): IRefinerMap[] {\n let { selectedChoices } = this.props;\n const { channelInventoryConfigurationId, refinerHierarchy } = this.props;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app configs are of generic type\n if (this.props.context?.app.config.productListInventoryDisplay === ProductListInventoryFilteringOptions.HideOOS) {\n selectedChoices = selectedChoices.filter(choice => {\n const parent = refinerHierarchy.find(\n (hierarchy: IProductRefinerHierarchy) =>\n !!hierarchy.Values.find((value: ProductRefinerValue) => isMatchingRefinementCriterion(value, choice))\n );\n return parent && parent.RecordId !== channelInventoryConfigurationId;\n });\n }\n return selectedChoices.map((selectedRefiner: ProductRefinerValue, index) => {\n return {\n key: this._getKeyForRefinerValue(selectedRefiner, index.toString()),\n value: selectedRefiner\n } as IRefinerMap;\n });\n }\n\n constructor(props: Readonly<IChoiceSummaryProps>) {\n super(props);\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, '');\n }\n\n public render(): JSX.Element {\n const { clearAllText, label, classNames, choiceAriaLabel, closeAriaLabel } = this.props;\n const items = this.selectedRefinersMap;\n this.payLoad.contentAction.etext = clearAllText;\n const clearAllAttributes = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\n return (\n <div className='msc-choice-summary'>\n {items.length > 0 && label && <span className='msc-choice-summary__label'>{label}</span>}\n <ul className={classnames(classNames, 'msc-choice-summary__list', 'list-unstyled')}>\n {items.map((item: IRefinerMap) => {\n this.payLoad.contentAction.etext = item.key;\n const attribute = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\n\n return (\n <li className='msc-choice-summary__list-item' key={item.key}>\n <a\n className='msc-choice-summary__item'\n href={this.props.urlBuilder(item.value, false)}\n aria-label={`${item.value.LeftValueBoundString} ${choiceAriaLabel}`}\n onClick={this._onClick}\n role='button'\n id={item.key}\n {...attribute}\n >\n {item.value.LeftValueBoundString && item.value.LeftValueBoundLocalizedString === ''\n ? item.value.LeftValueBoundString\n : (item.value.LeftValueBoundLocalizedString ||\n item.value.LeftValueBoundLocalizedString === undefined) &&\n item.value.RefinerRecordId === 0\n ? item.key\n : item.value.LeftValueBoundString}\n <span\n className={`${this.closeButtonGlyph} msc-choice-summary__glyph`}\n role='button'\n aria-label={closeAriaLabel}\n />\n </a>\n </li>\n );\n })}\n </ul>\n {items.length > 0 && clearAllText && (\n <a\n href={this.props.urlBuilder({}, true)}\n className='msc-choice-summary__clear-all'\n {...clearAllAttributes}\n onClick={this._onClick}\n >\n {clearAllText}\n </a>\n )}\n </div>\n );\n }\n\n private _getKeyForRefinerValue(productRefinerValue: ProductRefinerValue, index: string): string {\n const { choiceFormat, choiceRangeValueFormat, refinerHierarchy, telemetry, refinerValues } = this.props;\n const overallFormat = choiceFormat || '{1}';\n const rangeFormat = choiceRangeValueFormat;\n let refinerName = '';\n if (refinerHierarchy && refinerHierarchy.find) {\n const parent = refinerHierarchy.find(\n (hierarchy: IProductRefinerHierarchy) =>\n !!hierarchy.Values.find((value: ProductRefinerValue) => isMatchingRefinementCriterion(value, productRefinerValue))\n );\n\n if (!parent) {\n telemetry.warning('[choice-summary] could not find parent of selected refiner value');\n } else {\n refinerName = parent.KeyName || '';\n }\n }\n\n let refinerValueName: string;\n if (isRangeType(productRefinerValue.DataTypeValue)) {\n refinerValueName = rangeFormat\n .replace('{0}', this._formatPrice(productRefinerValue.LeftValueBoundString, productRefinerValue.UnitText))\n .replace('{1}', this._formatPrice(productRefinerValue.RightValueBoundString, productRefinerValue.UnitText));\n } else if (productRefinerValue.RefinerRecordId === 0) {\n const filterValue = refinerValues?.Values.find(\n refiner => refiner.LeftValueBoundString === productRefinerValue.LeftValueBoundString\n );\n refinerValueName = (filterValue ? filterValue.LeftValueBoundLocalizedString : productRefinerValue.LeftValueBoundString) || '';\n } else {\n refinerValueName = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\n }\n\n if (refinerName === 'Rating' || refinerName === 'Price') {\n return overallFormat.replace('{0}', refinerName).replace('{1}', `${refinerValueName}`);\n }\n return overallFormat.replace('{0}', refinerName).replace('{1}', `${refinerValueName}_${refinerName}_${index}`);\n }\n\n private _formatPrice(amount: string | undefined, currency: string | undefined): string {\n if (!amount || !currency) {\n this.props.telemetry.trace('[choice-summary] could not format price');\n return amount || '';\n }\n let result = amount;\n\n try {\n result = this.props.context!.cultureFormatter.formatCurrency(Number(amount), currency);\n } catch (error) {\n this.props.telemetry.warning(`Failed to format price for ${result}: ${error}`);\n }\n\n return result;\n }\n\n private readonly _onClick = (e: React.MouseEvent<HTMLAnchorElement>): void => {\n e.preventDefault();\n e.stopPropagation();\n\n const target = e.currentTarget as HTMLElement;\n const clearAll = target.getAttribute('class')!.includes('choice-summary__clear-all');\n const selectedRefiner = clearAll ? undefined : this._getSelectedRefinerChoice(target);\n\n if (this.props.onChoiceClicked) {\n this.props.onChoiceClicked({\n clearAll,\n itemClicked: target,\n choiceClicked: selectedRefiner,\n nextItemToFocus: target.nextSibling as HTMLElement\n });\n }\n };\n\n private _getSelectedRefinerChoice(itemClicked: HTMLElement): ProductRefinerValue | undefined {\n const result = this.selectedRefinersMap.find(selected => itemClicked.id === selected.key);\n return (result && result.value) || undefined;\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\ninterface IErrorMessage {\n text?: string;\n}\n\nexport const ErrorMessage: React.FC<IErrorMessage> = ({ text }) => {\n return (\n <span className='ms-search-result-container__no-results-message'>\n <h5 className='error-text'>\n {` `}\n {text}\n {` `}\n </h5>\n </span>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ICoreContext, IGridSettings, IImageData, IImageSettings, Image, IRequestContext } from '@msdyn365-commerce/core';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { getFallbackImageUrl, getProductPageUrlSync } from '@msdyn365-commerce-modules/retail-actions';\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, onTelemetryClick } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISearchResultContainerResources } from '../search-result-container.props.autogenerated';\n\n// Import { IComponent, IComponentProps, ICoreContext, IGridSettings, IImageData, IImageSettings, Image, msdyn365Commerce } from '@msdyn365-commerce/core';\n\ninterface IFeatureSearchResultItem {\n product: SimpleProduct | null;\n context: ICoreContext;\n resources: ISearchResultContainerResources;\n imageSettings?: IImageSettings;\n moduleType: string;\n moduleId: string;\n telemetryContent?: ITelemetryContent;\n recommendation?: string;\n}\n\nexport const FeatureSearchResultItem: React.FC<IFeatureSearchResultItem> = ({\n product,\n context,\n imageSettings,\n resources,\n telemetryContent,\n recommendation\n}) => {\n if (product === null) {\n return null;\n }\n\n const productName = product.Name;\n const productRecordId = product && product.RecordId ? product.RecordId : 0;\n const productUrl = getProductPageUrlSync(product.Name || '', productRecordId, context && context.actionContext, undefined);\n const fallbackImage = getFallbackImageUrl(\n product.ItemId,\n context.actionContext.requestContext.apiSettings,\n context.request.app?.config?.OmniChannelMedia\n );\n const heading =\n recommendation && recommendation === 'descriptions' ? resources.featureSimilarDescriptionTitle : resources.featureSimilarLooksTitle;\n\n // Construct telemetry attribute to render\n const payLoad = getPayloadObject('click', telemetryContent!, productName!, productRecordId.toString());\n\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\n return (\n <div className='ms-feature-search-result__item'>\n <a\n href={productUrl}\n onClick={onTelemetryClick(telemetryContent!, payLoad, product.Name!)}\n {...attribute}\n aria-label={product.Name}\n >\n <div className='msc-feature-search-result__item__image'>\n {renderProductPlacementImage(\n imageSettings,\n context.request.gridSettings,\n product.PrimaryImageUrl,\n product.Name,\n fallbackImage,\n context.actionContext.requestContext\n )}\n </div>\n </a>\n <div className='msc-feature-search-result__item__detail'>\n <p className='msc-feature-search-result__item__heading'>{heading}</p>\n {renderProductTitle(product?.Name)}\n </div>\n </div>\n );\n};\n\nfunction renderProductPlacementImage(\n imageSettings?: IImageSettings,\n gridSettings?: IGridSettings,\n imageUrl?: string,\n altText?: string,\n fallbackImage?: string,\n context?: IRequestContext\n): JSX.Element | null {\n if (!imageUrl || !gridSettings || !imageSettings) {\n return null;\n }\n const img: IImageData = {\n src: imageUrl,\n altText: altText ? altText : ''\n };\n const imageProps = {\n gridSettings,\n imageSettings,\n fallBackSrc: fallbackImage\n };\n return <Image {...img} {...imageProps} loadFailureBehavior='empty' requestContext={context} />;\n}\n\nfunction renderProductTitle(title?: string): JSX.Element | null {\n return <h1 className='msc-feature-search-result__item__product-title'>{title}</h1>;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\ninterface ILink {\n className?: string;\n text?: string;\n href?: string;\n ariaLabel?: string;\n}\n\nexport const Link: React.FC<ILink> = ({ text, className, href, ariaLabel }) => (\n <a className={className} href={href} aria-label={ariaLabel}>\n {' '}\n {text}{' '}\n </a>\n);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Button, Modal, ModalBody, ModalFooter, ModalHeader } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nexport interface ISearchResultModalViewProps {\n modal: React.ReactElement;\n modalHeader: React.ReactElement;\n modalFooter: React.ReactElement;\n modalBody: React.ReactElement;\n}\n\ninterface IModalToggleProps {\n innerRef: React.RefObject<HTMLButtonElement> | undefined;\n id: string;\n text: string;\n ariaLabel: string;\n onClick(): void;\n}\n\nexport interface ISearchResultModalResources {\n modalTitle: string;\n modalCloseButtonText: string;\n}\n\nexport interface ISearchResultModalProps {\n resources: ISearchResultModalResources;\n isOpen: boolean;\n returnRef: React.RefObject<HTMLButtonElement> | undefined;\n onModalToggle(): void;\n}\n\nexport const ModalToggle: React.FC<IModalToggleProps> = (props: IModalToggleProps) => {\n const { text, onClick, ariaLabel, innerRef, id } = props;\n return (\n <button id={id} className='msc-button' aria-label={ariaLabel} onClick={onClick} ref={innerRef}>\n {text}\n </button>\n );\n};\n\nexport const SearchResultModal = (props: ISearchResultModalProps): ISearchResultModalViewProps => {\n return {\n modal: modalNode(props),\n modalHeader: modalHeaderNode(props),\n modalFooter: modalFooterNode(props),\n modalBody: <ModalBody className='msc-review-modal-body' />\n };\n};\n\nconst modalNode = (props: ISearchResultModalProps) => {\n return (\n <Modal\n autoFocus\n applicationNode='renderPage'\n returnFocusRef={props.returnRef}\n isOpen={props.isOpen}\n toggle={props.onModalToggle}\n className='msc-search-result-modal'\n zIndex={1050}\n />\n );\n};\n\nconst modalHeaderNode = (props: ISearchResultModalProps) => {\n return <ModalHeader toggle={props.onModalToggle}>{props.resources.modalTitle}</ModalHeader>;\n};\n\nconst modalFooterNode = (props: ISearchResultModalProps) => {\n return (\n <ModalFooter>\n <Button onClick={props.onModalToggle} className='ms-sort-and-filter-modal-close'>\n {props.resources.modalCloseButtonText}\n </Button>\n </ModalFooter>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\nimport { IPriceComponentResources, ProductComponent } from '@msdyn365-commerce/components';\nimport { ICoreContext, IImageSettings } from '@msdyn365-commerce/core';\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISearchResultContainerResources } from '../search-result-container.props.autogenerated';\n\ninterface IProductSearchResultItems {\n products: ProductSearchResult[];\n context: ICoreContext;\n resources: ISearchResultContainerResources;\n imageSettings?: IImageSettings;\n moduleType: string;\n moduleId: string;\n allowBackNavigation?: boolean;\n telemetryContent: ITelemetryContent;\n quickviewSlot?: {} | null | undefined;\n productComparisonButton?: {} | null | undefined;\n channelInventoryConfigurationId?: number;\n isPriceMinMaxEnabled?: boolean;\n productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\n}\n\n/**\n * Returns the product inventory label.\n * @param channelInventoryConfigurationId - The channel configuration Id.\n * @param product - The product.\n * @returns The inventory label.\n */\nexport function getInventoryLabel(channelInventoryConfigurationId: number | undefined, product: ProductSearchResult): string | undefined {\n if (!channelInventoryConfigurationId || !ArrayExtensions.hasElements(product.AttributeValues)) {\n return undefined;\n }\n const inventoryAttribute = product.AttributeValues.find(attribute => attribute.RecordId === channelInventoryConfigurationId);\n if (inventoryAttribute) {\n return inventoryAttribute.TextValue;\n }\n return undefined;\n}\n\nexport const ProductSearchResultItems: React.FC<IProductSearchResultItems> = ({\n products,\n context,\n imageSettings,\n resources,\n moduleType,\n moduleId,\n allowBackNavigation,\n telemetryContent,\n quickviewSlot,\n productComparisonButton,\n channelInventoryConfigurationId,\n isPriceMinMaxEnabled,\n productsDimensionAvailabilities\n}) => {\n const priceResources: IPriceComponentResources = {\n priceRangeSeparator: resources.priceRangeSeparator\n };\n return (\n <ul className='list-unstyled'>\n {products.map((product: ProductSearchResult, index: number) => (\n <li className='ms-product-search-result__item' key={index}>\n <ProductComponent\n context={context}\n telemetryContent={telemetryContent}\n imageSettings={imageSettings}\n freePriceText={resources.priceFree}\n originalPriceText={resources.originalPriceText}\n currentPriceText={resources.currentPriceText}\n ratingAriaLabel={resources.ratingAriaLabel}\n allowBack={allowBackNavigation}\n id={moduleId}\n key={product.RecordId}\n typeName={moduleType}\n data={{ product }}\n quickViewButton={quickviewSlot}\n productComparisonButton={productComparisonButton}\n inventoryLabel={getInventoryLabel(channelInventoryConfigurationId, product)}\n isPriceMinMaxEnabled={isPriceMinMaxEnabled}\n priceResources={priceResources}\n swatchItemAriaLabel={resources.swatchItemAriaLabel}\n dimensionAvailabilities={productsDimensionAvailabilities?.find(\n dimensionAvailability =>\n ArrayExtensions.hasElements(dimensionAvailability) &&\n dimensionAvailability[0].masterProductId === product.MasterProductId\n )}\n />\n </li>\n ))}\n </ul>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\ninterface ISeparator {\n separator: string;\n}\n\nexport const Separator: React.FC<ISeparator> = ({ separator }) => (\n <span>\n {` `}\n {separator}\n {` `}\n </span>\n);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\ninterface ITitle {\n className: string;\n text: string;\n}\n\nexport const Title: React.FC<ITitle> = ({ text, className }) => (\n <span className={className}>\n {` `}\n {text}\n {` `}\n </span>\n);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ISliderLabel, ISliderThumbProps, Slider } from '@msdyn365-commerce-modules/utilities';\nimport debounce from 'lodash/debounce';\nimport { computed } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { IRefineItemProps, IRefineItemState } from './refine-item';\n\ntype InputType = 'Min' | 'Max';\n\nexport type RangeRefineItemType = 'slider' | 'input';\n\n/**\n * Range refine item properties.\n */\nexport interface IRangeRefineItemProps extends IRefineItemProps {\n rangeType: RangeRefineItemType;\n minValueSliderThumbAriaLabel?: string;\n maxValueSliderThumbAriaLabel?: string;\n sliderKey?: string;\n}\n\n/**\n * Range refine item state.\n */\nexport interface IRangeRefineItemState extends IRefineItemState {\n validationErrorMin: string | undefined;\n validationErrorMax: string | undefined;\n selectedMin: string | undefined;\n selectedMax: string | undefined;\n touchedMin: boolean;\n touchedMax: boolean;\n sliderId: string;\n minValue: string | undefined;\n maxValue: string | undefined;\n labels: ISliderLabel[];\n sliderThumbs: ISliderThumbProps[];\n}\n\n/**\n * RangeRefineItem component (controlled by RefineSubmenu).\n */\n@observer\nexport default class RangeRefineItem extends React.Component<IRangeRefineItemProps, IRangeRefineItemState> {\n private readonly _formattedPriceReverseLookup: Map<string, string> = new Map();\n\n private readonly minInput: React.RefObject<HTMLInputElement>;\n\n private readonly maxInput: React.RefObject<HTMLInputElement>;\n\n @computed get currencyCode(): string {\n return this.props.productRefinerValue.UnitText || '';\n }\n\n public constructor(props: IRangeRefineItemProps) {\n super(props);\n this._onRangeUpdate = this._onRangeUpdate.bind(this);\n this._onRangeUpdateEnd = this._onRangeUpdateEnd.bind(this);\n this._handleRangeTooltipText = this._handleRangeTooltipText.bind(this);\n this._changeMin = this._changeMin.bind(this);\n this._changeMax = this._changeMax.bind(this);\n this._finishChangeMin = this._finishChangeMin.bind(this);\n this._finishChangeMax = this._finishChangeMax.bind(this);\n\n this.minInput = React.createRef<HTMLInputElement>();\n this.maxInput = React.createRef<HTMLInputElement>();\n\n const { selectedRefinementCriterion } = this.props;\n const initialMin = selectedRefinementCriterion?.LeftValueBoundString ?? '0';\n const initialMax = selectedRefinementCriterion?.RightValueBoundString;\n const sliderId = `slider_${String(this.props.parentProductRefinerHierarchy.RecordId)}_${String(\n this.props.productRefinerValue.RefinerRecordId\n )}`;\n const minValue = this.props.productRefinerValue.LeftValueBoundString;\n const maxValue = this.props.productRefinerValue.RightValueBoundString;\n const minPrice = this._formatPrice(minValue);\n const maxPrice = this._formatPrice(maxValue);\n const labels: ISliderLabel[] = this.getLabels(sliderId, minPrice, maxPrice);\n const selectedMin =\n this.props.selectedRefinementCriterion?.LeftValueBoundString ?? this.props.productRefinerValue.LeftValueBoundString ?? '0';\n const selectedMax =\n this.props.selectedRefinementCriterion?.RightValueBoundString ??\n this.props.productRefinerValue.RightValueBoundString ??\n maxValue;\n const selectedMinPrice = this._formatPrice(selectedMin);\n const selectedMaxPrice = this._formatPrice(selectedMax);\n const sliderKeyString = this.props.sliderKey ? `_${String(this.props.sliderKey)}` : '';\n const sliderThumbs: ISliderThumbProps[] = this.getSliderThumbs(\n sliderId,\n sliderKeyString,\n selectedMin,\n selectedMinPrice,\n selectedMax,\n selectedMaxPrice,\n maxPrice\n );\n this.state = {\n isChecked: false,\n validationErrorMin: undefined,\n validationErrorMax: undefined,\n selectedMin: initialMin,\n selectedMax: initialMax,\n touchedMin: false,\n touchedMax: false,\n sliderId,\n minValue,\n maxValue,\n labels,\n sliderThumbs\n };\n }\n\n public shouldComponentUpdate(nextProps: IRangeRefineItemProps, nextState: IRangeRefineItemState): boolean {\n if (this.state === nextState && this.props === nextProps) {\n return false;\n }\n return true;\n }\n\n public componentDidUpdate(previousProps: IRangeRefineItemProps): void {\n if (previousProps !== this.props) {\n this.updateSliderProps();\n }\n }\n\n public render(): JSX.Element | undefined {\n const { productRefinerValue, parentProductRefinerHierarchy, refineItemCommonProps } = this.props;\n\n if (!productRefinerValue || !parentProductRefinerHierarchy) {\n refineItemCommonProps.telemetry.error(\n 'Cannot render refine value range without productRefinerValue and parentProductRefinerHierarchy'\n );\n return undefined;\n }\n\n if (this.props.rangeType === 'input') {\n return this._renderInputFields();\n }\n\n return this._renderSlider();\n }\n\n /**\n * Function to update slider props.\n */\n private updateSliderProps(): void {\n const sliderId = `slider_${String(this.props.parentProductRefinerHierarchy.RecordId)}_${String(\n this.props.productRefinerValue.RefinerRecordId\n )}`;\n const minValue = this.props.productRefinerValue.LeftValueBoundString;\n const maxValue = this.props.productRefinerValue.RightValueBoundString;\n const minPrice = this._formatPrice(minValue);\n const maxPrice = this._formatPrice(maxValue);\n const labels: ISliderLabel[] = this.getLabels(sliderId, minPrice, maxPrice);\n const selectedMin =\n this.props.selectedRefinementCriterion?.LeftValueBoundString ?? this.props.productRefinerValue.LeftValueBoundString ?? '0';\n const selectedMax =\n this.props.selectedRefinementCriterion?.RightValueBoundString ??\n this.props.productRefinerValue.RightValueBoundString ??\n maxValue;\n const selectedMinPrice = this._formatPrice(selectedMin);\n const selectedMaxPrice = this._formatPrice(selectedMax);\n const sliderKeyString = this.props.sliderKey ? `_${String(this.props.sliderKey)}` : '';\n const sliderThumbs: ISliderThumbProps[] = this.getSliderThumbs(\n sliderId,\n sliderKeyString,\n selectedMin,\n selectedMinPrice,\n selectedMax,\n selectedMaxPrice,\n maxPrice\n );\n this.setState({ sliderId, minValue, maxValue, labels, sliderThumbs });\n }\n\n /**\n * Function to create the labels for slider.\n * @param sliderId - Slider element id for the DOM.\n * @param minPrice - Slider min value.\n * @param maxPrice - Slider max value.\n * @returns Array labels.\n */\n private readonly getLabels = (sliderId: string, minPrice: string, maxPrice: string): ISliderLabel[] => {\n return [\n {\n labelId: `${sliderId}_start`,\n labelString: `${minPrice}`,\n labelPositioning: 'start'\n },\n {\n labelId: `${sliderId}_end`,\n labelString: `${maxPrice}`,\n labelPositioning: 'end'\n }\n ];\n };\n\n /**\n * Function to create the slider thumbs for slider.\n * @param sliderId - Slider element id for the DOM.\n * @param sliderKey - Unique key for slider.\n * @param selectedMin - Slider selected min value.\n * @param selectedMinPrice - Slider selected min price.\n * @param selectedMax - Slider selected max value.\n * @param selectedMaxPrice - Slider selected max price..\n * @param maxPrice - Slider max price..\n * @returns Slider Thumb Props.\n */\n private readonly getSliderThumbs = (\n sliderId: string,\n sliderKey: string,\n selectedMin: string,\n selectedMinPrice: string,\n selectedMax: string | undefined,\n selectedMaxPrice: string,\n maxPrice: string\n ): ISliderThumbProps[] => {\n const sliderThumbDefaultValue = 0;\n return [\n {\n id: `${sliderId}${sliderKey}_slider_thumb_start`,\n value: (selectedMin && Number(selectedMin)) || sliderThumbDefaultValue,\n ariaLabel: `${this.props.minValueSliderThumbAriaLabel ?? ''} ${this.currencyCode}`,\n ariaValueText: `${selectedMinPrice}`\n },\n {\n id: `${sliderId}${sliderKey}_slider_thumb_end`,\n value: Number(selectedMax) || Number(maxPrice),\n ariaLabel: `${this.props.maxValueSliderThumbAriaLabel ?? ''} ${this.currencyCode}`,\n ariaValueText: `${selectedMaxPrice}`\n }\n ];\n };\n\n private _renderInputFields(): JSX.Element | undefined {\n const { isDisabled, parentProductRefinerHierarchy, refineItemCommonProps } = this.props;\n const { selectedMin, selectedMax, touchedMin, touchedMax, validationErrorMin, validationErrorMax } = this.state;\n\n const rangeAriaLabel = (refineItemCommonProps.rangeNameFormat || '{0}').replace('{0}', parentProductRefinerHierarchy.KeyName || '');\n const formAttrs = {\n 'aria-label': rangeAriaLabel,\n 'aria-disabled': isDisabled\n };\n\n // To enable price formatting of selected fields, this is the approach:\n // initial value: min=0 formatted as price, max=undefined\n // onFocus/onChange: convert to number (unformat) and mark as touched to indicate value is being edited\n // onBlur: validate and format entered value as price\n const minInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-min ${\n validationErrorMin ? 'refine-submenu__input-range--error' : ''\n }`;\n const maxInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-max ${\n validationErrorMax ? 'refine-submenu__input-range--error' : ''\n }`;\n const minLabelClassName = 'ms-refine-submenu__input-range-label refine-submenu__input-range-label-min';\n const maxLabelClassName = 'ms-refine-submenu__input-range-label refine-submenu__input-range-label-max';\n const formattedSelectedMin = this._getFormattedSelectedValue(selectedMin, touchedMin, validationErrorMin);\n const formattedSelectedMax = this._getFormattedSelectedValue(selectedMax, touchedMax, validationErrorMax);\n return (\n <form className='ms-refine-submenu__input-range-refiner' {...formAttrs}>\n <label className={minLabelClassName}>\n {refineItemCommonProps.minLabel}\n <input\n className={minInputClassName}\n onChange={this._changeMin}\n onFocus={this._changeMin}\n onBlur={this._finishChangeMin}\n value={formattedSelectedMin}\n ref={this.minInput}\n />\n </label>\n <label className={maxLabelClassName}>\n {refineItemCommonProps.maxLabel}\n <input\n className={maxInputClassName}\n placeholder={formattedSelectedMax ? undefined : refineItemCommonProps.placeholderTextMax}\n onChange={this._changeMax}\n onFocus={this._changeMax}\n onBlur={this._finishChangeMax}\n value={formattedSelectedMax}\n ref={this.maxInput}\n />\n </label>\n {validationErrorMin && (\n <span className='ms-refine-submenu__input-range-error-text refine-submenu__input-range-min-error-text'>\n {validationErrorMin}\n </span>\n )}\n {validationErrorMax && validationErrorMin !== validationErrorMax && (\n <span className='ms-refine-submenu__input-range-error-text refine-submenu__input-range-max-error-text'>\n {validationErrorMax}\n </span>\n )}\n </form>\n );\n }\n\n private _renderSlider(): JSX.Element | undefined {\n const { isDisabled, sliderKey } = this.props;\n const ariaAttributes = {\n 'aria-disabled': isDisabled\n };\n\n return (\n <Slider\n className='ms-refine-submenu__range-refiner'\n key={this.state.sliderId}\n sliderKey={sliderKey}\n id={this.state.sliderId}\n inForm={false}\n min={(this.state.minValue && Number(this.state.minValue)) || undefined}\n max={(this.state.maxValue && Number(this.state.maxValue)) || undefined}\n step={1}\n orientation='horizontal'\n labels={this.state.labels}\n showLabels\n showTooltip\n sliderThumbs={this.state.sliderThumbs}\n onChangeEnd={this._onRangeUpdateEnd}\n onChange={debounce(this._onRangeUpdate, 500)}\n handleTooltipText={this._handleRangeTooltipText}\n {...ariaAttributes}\n />\n );\n }\n\n private _changeMin(event: React.FocusEvent<HTMLInputElement>): void {\n this._changeValue(event, 'Min');\n }\n\n private _changeMax(event: React.FocusEvent<HTMLInputElement>): void {\n this._changeValue(event, 'Max');\n }\n\n private _changeValue(event: React.FocusEvent<HTMLInputElement>, inputType: InputType): void {\n const selectedKey = `selected${inputType}`;\n const touchedKey = `touched${inputType}`;\n this.setState({\n [selectedKey]: this._getInputWithoutFormatting(event.currentTarget.value),\n [touchedKey]: true\n });\n }\n\n private _finishChangeMin(event: React.FocusEvent<HTMLInputElement>): boolean {\n const selectedMinValue = this._getInputWithoutFormatting(event.currentTarget.value);\n this.setState({\n selectedMin: selectedMinValue,\n minTouched: false\n });\n const minInput = Number(selectedMinValue);\n const {\n onToggle,\n parentProductRefinerHierarchy,\n productRefinerValue,\n refineItemCommonProps,\n selectedRefinementCriterion\n } = this.props;\n const max = (selectedRefinementCriterion && selectedRefinementCriterion.RightValueBoundString) || undefined;\n\n const maxNum = max ? Number(max) : undefined;\n\n if (isNaN(minInput)) {\n this.setState({ validationErrorMin: refineItemCommonProps.validationErrorNaN });\n this._focus('Min');\n return false;\n }\n\n if (this._validateRange(minInput, maxNum)) {\n onToggle({\n parentProductRefinerHierarchy,\n productRefinerValue,\n isSelecting: true,\n rangeStart: minInput,\n rangeEnd: maxNum\n });\n return true;\n }\n this._focus('Min');\n\n return false;\n }\n\n private _finishChangeMax(event: React.FocusEvent<HTMLInputElement>): boolean {\n const selectedMaxValue = this._getInputWithoutFormatting(event.currentTarget.value);\n this.setState({\n selectedMax: selectedMaxValue,\n maxTouched: false\n });\n const maxInput = Number(selectedMaxValue);\n const {\n onToggle,\n parentProductRefinerHierarchy,\n productRefinerValue,\n refineItemCommonProps,\n selectedRefinementCriterion\n } = this.props;\n const min = (selectedRefinementCriterion && selectedRefinementCriterion.LeftValueBoundString) || '0';\n\n const minNum = Number(min);\n\n if (isNaN(maxInput)) {\n this.setState({ validationErrorMax: refineItemCommonProps.validationErrorNaN });\n this._focus('Max');\n return false;\n }\n\n if (this._validateRange(minNum, maxInput)) {\n if (productRefinerValue) {\n onToggle({\n parentProductRefinerHierarchy,\n productRefinerValue,\n isSelecting: true,\n rangeStart: minNum,\n rangeEnd: maxInput\n });\n } else {\n this._focus('Max');\n }\n return true;\n }\n\n return false;\n }\n\n private _focus(inputType: InputType): void {\n const ref = inputType === 'Max' ? this.maxInput : this.minInput;\n\n setTimeout(() => {\n if (ref && ref.current) {\n ref.current.focus();\n }\n }, 50);\n }\n\n private _getFormattedSelectedValue(\n selected: string | undefined,\n touched: boolean,\n validationError: string | undefined\n ): string | undefined {\n if (touched || validationError || selected === undefined) {\n return selected;\n }\n return this._formatPrice(selected);\n }\n\n private _validateRange(min: number, max: number | undefined): boolean {\n const { refineItemCommonProps } = this.props;\n if (max === undefined) {\n return true;\n }\n\n if (min > max) {\n this.setState({\n validationErrorMin: refineItemCommonProps.validationErrorRange,\n validationErrorMax: refineItemCommonProps.validationErrorRange\n });\n return false;\n }\n\n return true;\n }\n\n private _formatPrice(amount: string | undefined): string {\n if (this.props.productRefinerValue.RefinerRecordId === 0) {\n const result = this.props.context.cultureFormatter.formatCurrency(Number(amount), this.currencyCode);\n return result;\n }\n return amount || '';\n }\n\n private _getInputWithoutFormatting(input: string): string {\n // First try to cast raw input to a number\n const inputAsNum = Number(input);\n if (!isNaN(inputAsNum)) {\n return input;\n }\n\n // Otherwise try a reverse lookup and fall back to the raw input if all else fails\n const reverseLookupResult = this._formattedPriceReverseLookup.get(input);\n return reverseLookupResult || input;\n }\n\n // NOTE: Fix types once Shared Components build pipeline bug fixed\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private _onRangeUpdate(sliderChangeNotification: any): void {\n // Need to filter out mousemove events as these cause errors after the menu updates and slider re-renders\n if (sliderChangeNotification.eventType !== 'mousemove') {\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\n if (productRefinerValue && sliderChangeNotification) {\n onToggle({\n parentProductRefinerHierarchy,\n productRefinerValue,\n isSelecting: true,\n rangeStart: sliderChangeNotification.firstThumbValue,\n rangeEnd: sliderChangeNotification.secondThumbValue\n });\n\n this._focusOnSliderThumb(sliderChangeNotification);\n }\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private _onRangeUpdateEnd(sliderChangeNotification: any): void {\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\n if (productRefinerValue && sliderChangeNotification) {\n onToggle({\n parentProductRefinerHierarchy,\n productRefinerValue,\n isSelecting: true,\n rangeStart: sliderChangeNotification.firstThumbValue,\n rangeEnd: sliderChangeNotification.secondThumbValue\n });\n\n this._focusOnSliderThumb(sliderChangeNotification);\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private _focusOnSliderThumb(sliderChangeNotification: any): void {\n if (sliderChangeNotification.id) {\n const element = document.getElementById(`${sliderChangeNotification.id}range`);\n if (element) {\n setTimeout(() => {\n element.focus();\n }, 0);\n }\n }\n }\n\n private _handleRangeTooltipText(tooltip: number): string {\n return this._formatPrice(`${tooltip}`);\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport { RatingComponent, SwatchComponent } from '@msdyn365-commerce/components';\nimport { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\nimport { ProductRefinerSource, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\nimport { checkIfShouldDisplayAsSwatch, DimensionTypes, IDimensionsApp, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { format, getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { IRefineItemCommonProps } from './refine-item.props.common';\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\n\n/**\n * RefineItem properties.\n */\nexport interface IRefineItemProps {\n parentProductRefinerHierarchy: IProductRefinerHierarchy;\n productRefinerValue: ProductRefinerValue;\n selectedRefinementCriterion: ProductRefinerValue | undefined;\n selectedRefinerValues?: ProductRefinerValue[];\n refineItemCommonProps: IRefineItemCommonProps;\n isDisabled: boolean;\n context: ICoreContext<IGeneric<IAny>>;\n moduleId: string;\n moduleTypeName: string;\n index?: number;\n productCountAriaLabel?: string;\n singleProductCountAriaLabel?: string;\n refineItemAriaLabel?: string;\n refineItemsAriaLabel?: string;\n isMobileView?: boolean;\n\n /**\n * The telemetry content\n */\n telemetryContent?: ITelemetryContent;\n onToggle(notfication: Readonly<IRefineItemToggleNotification>): void;\n urlBuilder(refiner: IRefineItemToggleNotification): string;\n}\n\n/**\n * Refine item state.\n */\nexport interface IRefineItemState extends React.ComponentState {\n isChecked: boolean;\n renderingError?: object;\n}\n\n/**\n * Single-select and multi-select refine item component (controlled by RefineSubmenu).\n */\nexport default class RefineItem extends React.Component<IRefineItemProps, IRefineItemState> {\n private readonly anchorType: React.RefObject<HTMLAnchorElement>;\n\n private readonly payLoad: IPayLoad;\n\n public constructor(props: IRefineItemProps) {\n super(props);\n this._onClick = this._onClick.bind(this);\n this.state = {\n isChecked: !!this.props.selectedRefinementCriterion\n };\n this.anchorType = React.createRef();\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, '');\n }\n\n public shouldComponentUpdate(nextProps: IRefineItemProps, nextState: IRefineItemState): boolean {\n if (this.state === nextState && this.props === nextProps) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element | undefined {\n const {\n isDisabled,\n refineItemCommonProps,\n parentProductRefinerHierarchy,\n productRefinerValue,\n selectedRefinementCriterion,\n productCountAriaLabel,\n singleProductCountAriaLabel,\n index,\n children,\n onToggle,\n context,\n telemetryContent,\n refineItemAriaLabel,\n refineItemsAriaLabel,\n ...attrs\n } = this.props;\n if (!productRefinerValue) {\n refineItemCommonProps.telemetry.error('[refine-item] Cannot render refineItem without productRefinerValue');\n return undefined;\n }\n if (!productRefinerValue.LeftValueBoundString) {\n refineItemCommonProps.telemetry.warning(\n `[refine-item] RefineItem without LeftValueBoundString: ${JSON.stringify(productRefinerValue)}`\n );\n }\n const isSingleSelect = parentProductRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect;\n let itemTypeClassName = isSingleSelect ? 'single-select' : 'multi-select';\n itemTypeClassName = `ms-refine-submenu-item ${itemTypeClassName}`;\n const inputType = isSingleSelect ? 'radio' : 'checkbox';\n const isChecked = !!selectedRefinementCriterion;\n itemTypeClassName = isChecked ? `${itemTypeClassName}-checked` : itemTypeClassName;\n if (parentProductRefinerHierarchy.SourceValue === ProductRefinerSource.Rating) {\n return this._renderRating(\n productRefinerValue,\n parentProductRefinerHierarchy,\n isChecked,\n context,\n index,\n telemetryContent,\n productCountAriaLabel,\n singleProductCountAriaLabel\n );\n }\n this.payLoad.contentAction.etext = productRefinerValue.LeftValueBoundLocalizedString ?? productRefinerValue.LeftValueBoundString;\n const attribute = getTelemetryAttributes(telemetryContent!, this.payLoad);\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\n const productText = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\n const productCount = productRefinerValue.Count || 0;\n let refineMenuItemAriaLabel;\n if (productCount === 1) {\n refineMenuItemAriaLabel = refineItemAriaLabel\n ? format(refineItemAriaLabel, parentProductRefinerHierarchy.KeyName, productText)\n : '';\n } else {\n refineMenuItemAriaLabel = refineItemsAriaLabel\n ? format(refineItemsAriaLabel, parentProductRefinerHierarchy.KeyName, productText, productCount)\n : '';\n }\n\n const dimensionType = (this.props.parentProductRefinerHierarchy.KeyName?.toLocaleLowerCase() ?? '') as DimensionTypes;\n const shouldDisplayAsSwatch = this._getShouldDisplayAsSwatch(dimensionType);\n\n let className = 'ms-refine-submenu-item';\n if (shouldDisplayAsSwatch) {\n className = classnames(className, `ms-refine-submenu-item__dimension__${dimensionType}`);\n }\n\n // If the swatch has no color or image specified, it should be displayed as text.\n // We don't use swatch logic to display the number of the results found together with the text.\n const hasColor = !StringExtensions.isNullOrWhitespace(productRefinerValue.SwatchColorHexCode);\n const hasImage = !StringExtensions.isNullOrWhitespace(productRefinerValue.SwatchImageUrl);\n const hasContentSwatch = hasColor || hasImage;\n\n return (\n <li className={className} id={`${parentProductRefinerHierarchy.KeyName!}_${index}`}>\n <a\n key={selectedRefinementCriterion ? 'true' : 'false'}\n ref={this.anchorType}\n href={this._getRefinerUrl()}\n tabIndex={hasColor ? -1 : 0}\n onClick={this._onClick}\n className={itemTypeClassName}\n role={inputType}\n aria-label={refineMenuItemAriaLabel}\n aria-checked={!!selectedRefinementCriterion}\n {...attribute}\n {...attrs}\n >\n {hasContentSwatch && shouldDisplayAsSwatch && this._renderSwatch(dimensionType)}\n <span className='ms-refine-submenu-item__label' aria-hidden='true'>\n {/* eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string. */}\n {productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString}\n {productRefinerValue.Count !== undefined && ` (${productRefinerValue.Count})`}\n </span>\n </a>\n </li>\n );\n }\n\n private _getShouldDisplayAsSwatch(dimensionType: DimensionTypes) {\n const shouldDisplayAsSwatch = checkIfShouldDisplayAsSwatch(dimensionType, this.props.context as ICoreContext<IDimensionsApp>);\n return shouldDisplayAsSwatch;\n }\n\n private _renderSwatch(dimensionType: DimensionTypes): JSX.Element | null {\n const productRefinerValue = this.props.productRefinerValue;\n\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\n const text = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\n const swatchItems = [\n {\n itemId: `${productRefinerValue.RefinerRecordId ?? ''}-${dimensionType}-${text}`,\n value: text,\n dimensionType,\n colorHexCode: productRefinerValue.SwatchColorHexCode,\n imageUrl: productRefinerValue.SwatchImageUrl\n }\n ];\n\n return (\n <SwatchComponent\n className='ms-refine-submenu-item__swatch'\n apiSettings={this.props.context.request.apiSettings}\n list={swatchItems}\n isSelectionEnabled={false}\n isRefineItem\n />\n );\n }\n\n private _getRefinerUrl(): string {\n const { urlBuilder, parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\n\n if (productRefinerValue) {\n return urlBuilder({\n parentProductRefinerHierarchy,\n productRefinerValue,\n isSelecting: !selectedRefinementCriterion\n });\n }\n\n return '';\n }\n\n private readonly _onClick = (e: React.MouseEvent<HTMLAnchorElement | HTMLInputElement>): void => {\n e.preventDefault();\n\n const { parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\n if (productRefinerValue) {\n this.props.onToggle({\n parentProductRefinerHierarchy,\n productRefinerValue,\n isSelecting: !selectedRefinementCriterion\n });\n\n setTimeout(() => {\n this.anchorType.current && this.anchorType.current.focus();\n }, 0);\n }\n };\n\n private _renderRating(\n productRefinerValue: ProductRefinerValue,\n parentProductRefinerHierarchy: IProductRefinerHierarchy,\n isChecked: boolean,\n context: ICoreContext,\n index?: number,\n telemetryContent?: ITelemetryContent,\n ratingUserCountAriaLabel?: string,\n ratingSingleUserCountAriaLabel?: string\n ): JSX.Element | undefined {\n if (productRefinerValue.LeftValueBoundString) {\n this.payLoad.contentAction.etext = productRefinerValue.LeftValueBoundLocalizedString;\n const attribute = getTelemetryAttributes(telemetryContent!, this.payLoad);\n const refinerRating = Number.parseInt(productRefinerValue.LeftValueBoundString, 10);\n const ratingRefiner = this.props.selectedRefinerValues?.find(\n value => value.DataTypeValue === productRefinerValue.DataTypeValue\n );\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\n const selectedRating = Number.parseInt(ratingRefiner?.LeftValueBoundString || '0', 10);\n const defaultChkProductCount = 1;\n let ratingComponentClass: string = 'ms-rating-component';\n if (refinerRating > selectedRating) {\n ratingComponentClass = `${ratingComponentClass}__up`;\n } else if (refinerRating < selectedRating) {\n ratingComponentClass = `${ratingComponentClass}__down`;\n } else {\n ratingComponentClass = `${ratingComponentClass}__current`;\n }\n const productCountAriaLabelValue =\n productRefinerValue.Count !== undefined && productRefinerValue.Count === defaultChkProductCount\n ? ratingSingleUserCountAriaLabel && format(ratingSingleUserCountAriaLabel, productRefinerValue.Count)\n : ratingUserCountAriaLabel && format(ratingUserCountAriaLabel, productRefinerValue.Count);\n return (\n <li\n className='ms-refine-submenu-item ms-refine-submenu-item__rating'\n role={!this.props.isMobileView ? 'presentation' : undefined}\n id={`${parentProductRefinerHierarchy.KeyName!}_${index!}`}\n >\n <a\n href={this._getRefinerUrl()}\n role='option'\n aria-selected={isChecked}\n aria-label={`${parentProductRefinerHierarchy.KeyName!}_${productRefinerValue.LeftValueBoundLocalizedString!}\n ${productCountAriaLabelValue!}`}\n onClick={this._onClick}\n {...attribute}\n >\n <RatingComponent\n className={ratingComponentClass}\n avgRating={refinerRating}\n ratingCount={productRefinerValue.LeftValueBoundLocalizedString ?? productRefinerValue.LeftValueBoundString}\n hideCount={false}\n readOnly\n ariaLabel=''\n context={context}\n id={this.props.moduleId}\n typeName={this.props.moduleTypeName}\n data={{}}\n />\n <span className='refine-submenu-item__rating' aria-hidden={this.props.isMobileView ? 'true' : undefined}>\n {productRefinerValue.Count !== undefined && `(${productRefinerValue.Count})`}\n </span>\n </a>\n </li>\n );\n }\n return undefined;\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\nimport { DisplayTemplate, ProductRefinerSource, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\nimport { Button, Collapse, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport RangeRefineItem, { RangeRefineItemType } from './range-refine-item';\nimport RefineItem from './refine-item';\nimport { IRefineItemCommonProps } from './refine-item.props.common';\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\nimport { findMatchingRefinementCriterion, isRangeType } from './utilities';\n\n/**\n * Properties associated with the RefineSubmenu component.\n */\nexport interface IRefineSubmenuProps {\n tempRangeTypeTODO: RangeRefineItemType;\n minValueSliderThumbAriaLabel?: string;\n maxValueSliderThumbAriaLabel?: string;\n productRefinerHierarchy: IProductRefinerHierarchy;\n selectedRefinerValues: ProductRefinerValue[];\n refineItemCommonProps: IRefineItemCommonProps;\n isDisabled: boolean;\n isExpandedOnInitialLoad: boolean;\n context: ICoreContext<IGeneric<IAny>>;\n moduleId: string;\n moduleTypeName: string;\n productCountAriaLabel?: string;\n singleProductCountAriaLabel?: string;\n refineItemAriaLabel?: string;\n refineItemsAriaLabel?: string;\n isMobile?: boolean;\n\n /**\n * The telemetry content\n */\n telemetryContent?: ITelemetryContent;\n onUpdateRefiners(notfication: Readonly<IRefineItemToggleNotification>): void;\n urlBuilder(refiner: IRefineItemToggleNotification): string;\n}\n\n/**\n * Refine submenu state.\n */\nexport interface IRefineSubmenuState extends React.ComponentState {\n expanded: boolean;\n}\n\n/**\n *\n * The RefineSubmenu component renders the submenu category and child items.\n * This computed observes the stateful category hierarchy object.\n * @extends {React.PureComponent<IRefineSubmenuProps>}\n */\nclass RefineSubmenu extends React.Component<IRefineSubmenuProps, IRefineSubmenuState> {\n constructor(props: IRefineSubmenuProps) {\n super(props);\n\n this._onToggleItem = this._onToggleItem.bind(this);\n this._onToggleSubmenu = this._onToggleSubmenu.bind(this);\n\n const isExpanded = this.props.isExpandedOnInitialLoad;\n\n // If (this.props.productRefinerHierarchy.DataTypeValue === ProductRefinerValueDataTypeValue.Range) {\n // isExpanded = true;\n // }\n\n this.state = {\n expanded: isExpanded\n };\n }\n\n public shouldComponentUpdate(nextProps: IRefineSubmenuProps, nextState: IRefineSubmenuState): boolean {\n if (this.state === nextState && this.props === nextProps) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element | null {\n const { productRefinerHierarchy, refineItemCommonProps } = this.props;\n\n if (!productRefinerHierarchy) {\n refineItemCommonProps.telemetry.error('Cannot render submenu without refiner hierarchy data');\n }\n\n if (productRefinerHierarchy.SourceValue === ProductRefinerSource.Rating && this.props.context.app.config.hideRating) {\n return null;\n }\n\n const className = classnames(\n 'ms-refine-submenu',\n 'list-group',\n productRefinerHierarchy.KeyName // Deprecated because of the localization issues. Leaving for backward compatibility reasons.\n );\n\n return (\n <div className={className}>\n <Button\n className={this.state.expanded ? 'ms-refine-submenu__toggle_expanded' : 'ms-refine-submenu__toggle_collapsed'}\n aria-label={productRefinerHierarchy.KeyName}\n onClick={this._onToggleSubmenu}\n aria-expanded={this.state.expanded}\n >\n {productRefinerHierarchy.KeyName}\n </Button>\n <Collapse isOpen={this.state.expanded} timeout={350}>\n {this._renderChildItems(productRefinerHierarchy)}\n </Collapse>\n </div>\n );\n }\n\n private _renderChildItems(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\n if (isRangeType(productRefinerHierarchy.DataTypeValue)) {\n return this._renderRange(productRefinerHierarchy);\n }\n return this._renderSingleMultiSelect(productRefinerHierarchy);\n }\n\n private _renderSingleMultiSelect(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\n const {\n isDisabled,\n refineItemCommonProps,\n selectedRefinerValues,\n context,\n productCountAriaLabel,\n singleProductCountAriaLabel,\n refineItemAriaLabel,\n refineItemsAriaLabel,\n isMobile\n } = this.props;\n const isSingleSelect =\n productRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect &&\n productRefinerHierarchy.SourceValue === ProductRefinerSource.Rating;\n const role = isSingleSelect ? { role: 'listbox' } : undefined;\n const refinerValuesList = productRefinerHierarchy.Values || [];\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\n if (!child) {\n refineItemCommonProps.telemetry.error(\n `[refine-submenu] Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\n );\n return null;\n }\n\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\n\n return (\n <RefineItem\n parentProductRefinerHierarchy={productRefinerHierarchy}\n productRefinerValue={child}\n selectedRefinementCriterion={selectedRefinementCriterion}\n selectedRefinerValues={selectedRefinerValues.filter(selectedValue =>\n refinerValuesList.find(value => value.RefinerRecordId === selectedValue.RefinerRecordId)\n )}\n refineItemCommonProps={refineItemCommonProps}\n onToggle={this._onToggleItem}\n urlBuilder={this.props.urlBuilder}\n isDisabled={isDisabled}\n key={index}\n index={index}\n context={context}\n moduleId={this.props.moduleId}\n moduleTypeName={this.props.moduleTypeName}\n telemetryContent={this.props.telemetryContent}\n productCountAriaLabel={productCountAriaLabel}\n refineItemAriaLabel={refineItemAriaLabel}\n refineItemsAriaLabel={refineItemsAriaLabel}\n singleProductCountAriaLabel={singleProductCountAriaLabel}\n isMobileView={isMobile}\n />\n );\n });\n return (\n <ul\n className={`ms-refine-submenu__list ${productRefinerHierarchy.KeyName}`}\n {...role}\n aria-label={productRefinerHierarchy.KeyName}\n >\n {listItems}\n </ul>\n );\n }\n\n private _getRangeType(productRefinerHierarchy: IProductRefinerHierarchy): 'input' | 'slider' {\n if (\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Range ||\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Slider ||\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.SliderWithBars\n ) {\n return 'slider';\n }\n return 'input';\n }\n\n private _renderRange(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\n const {\n isDisabled,\n refineItemCommonProps,\n selectedRefinerValues,\n context,\n minValueSliderThumbAriaLabel,\n maxValueSliderThumbAriaLabel\n } = this.props;\n const submenuClassNamePrefix = 'ms-refine-submenu__item list-group-item refine-submenu__item';\n const refinerValuesList = productRefinerHierarchy.Values || [];\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\n if (!child) {\n refineItemCommonProps.telemetry.error(\n `Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\n );\n return null;\n }\n\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\n\n const rangeType = this._getRangeType(productRefinerHierarchy);\n const key = selectedRefinementCriterion\n ? `${selectedRefinementCriterion.LeftValueBoundString}-${selectedRefinementCriterion.RightValueBoundString}`\n : `not-selected-${index}`;\n return (\n <li className={`${submenuClassNamePrefix}--range`} key={index}>\n <RangeRefineItem\n parentProductRefinerHierarchy={productRefinerHierarchy}\n productRefinerValue={child}\n selectedRefinementCriterion={selectedRefinementCriterion}\n refineItemCommonProps={refineItemCommonProps}\n onToggle={this._onToggleItem}\n urlBuilder={this.props.urlBuilder}\n isDisabled={isDisabled}\n rangeType={rangeType}\n key={key}\n sliderKey={key}\n context={context}\n minValueSliderThumbAriaLabel={minValueSliderThumbAriaLabel}\n maxValueSliderThumbAriaLabel={maxValueSliderThumbAriaLabel}\n moduleId={this.props.moduleId}\n moduleTypeName={this.props.moduleTypeName}\n />\n </li>\n );\n });\n return <ul className={`ms-refine-submenu__list list-unstyled ${productRefinerHierarchy.KeyName}`}>{listItems}</ul>;\n }\n\n private _onToggleItem(itemToggleNotification: IRefineItemToggleNotification): void {\n this.props.onUpdateRefiners(itemToggleNotification);\n }\n\n private _onToggleSubmenu(): void {\n this.setState(prevState => ({\n expanded: !prevState.expanded\n }));\n }\n}\n\nexport default RefineSubmenu;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ITelemetry } from '@msdyn365-commerce/core';\nimport { AttributeDataType, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\n\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\n\n/**\n * Types of product refiner values.\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\nexport enum ProductRefinerValueDataTypeValue {\n /**\n * Range slider is used for selections like price.\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Range = 1,\n\n /**\n * Range input is a different way to specify ranges and can be expressed with input boxes\n * as well as a set of discrete single-select type values.\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n RangeInput = 4,\n\n /**\n * This is a discrete list item, either multi-select or single-select.\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n List = 5,\n\n /**\n * Boolean types allows only single-select.\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Boolean = 6\n}\n\n/**\n * Types of product refiners.\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\nexport enum ProductRefinerTypeValue {\n /**\n * Refiner values are single-select.\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Single = 0,\n\n /**\n * Refiner values are multi-select.\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Multi = 1\n}\n\n/**\n * ProductRefinerSource enum type.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\nexport enum ProductRefinerSource {\n /**\n * The None member.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n None = 0,\n\n /**\n * The Attribute member.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Attribute = 1,\n\n /**\n * The Category member.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Category = 2,\n\n /**\n * The Price member.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Price = 3,\n\n /**\n * The Rating member.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Rating = 4\n}\n\n/**\n * Checks if the data type value corresponds to a slider.\n * @param dataTypeValue\n */\nexport function isRangeType(dataTypeValue: number | undefined): boolean {\n return (\n dataTypeValue === AttributeDataType.Currency ||\n dataTypeValue === AttributeDataType.Decimal ||\n dataTypeValue === AttributeDataType.Integer\n );\n}\n\n/**\n * Find the refinement criterion associated with this product refiner value.\n * @param productRefinerValue Product refiner value to match.\n * @param refinementCriteria Selected refinement criteria.\n */\nexport function findMatchingRefinementCriterion(\n productRefinerValue: ProductRefinerValue,\n refinementCriteria: ProductRefinerValue[]\n): ProductRefinerValue | undefined {\n // If the value is a range, then match only on data type value; otherwise match on item string\n return refinementCriteria.find((refinementCriterion: ProductRefinerValue) =>\n isMatchingRefinementCriterion(productRefinerValue, refinementCriterion)\n );\n}\n\n/**\n * Find the refinement criterion associated with this product refiner value.\n * @param productRefinerValue Product refiner value to match.\n * @param refinementCriteria Selected refinement criteria.\n * @param refinementCriterion\n */\nexport function isMatchingRefinementCriterion(productRefinerValue: ProductRefinerValue, refinementCriterion: ProductRefinerValue): boolean {\n // If the value is a range, then match only on data type value; otherwise match on item string\n return (\n refinementCriterion.RefinerRecordId === productRefinerValue.RefinerRecordId &&\n refinementCriterion.RefinerSourceValue === productRefinerValue.RefinerSourceValue &&\n refinementCriterion.DataTypeValue === productRefinerValue.DataTypeValue &&\n (isRangeType(refinementCriterion.DataTypeValue) ||\n refinementCriterion.LeftValueBoundString === productRefinerValue.LeftValueBoundString)\n );\n}\n\nexport function getUpdatedRefinementCriteria(\n itemToggleNotification: IRefineItemToggleNotification,\n currentRefinementCriteria: ProductRefinerValue[]\n): ProductRefinerValue[] {\n const updatedRefinementCriteria: ProductRefinerValue[] = [];\n let toggledItemFound = false;\n currentRefinementCriteria.forEach((selectedCriterion: ProductRefinerValue) => {\n if (isMatchingRefinementCriterion(itemToggleNotification.productRefinerValue, selectedCriterion)) {\n toggledItemFound = true;\n if (itemToggleNotification.isSelecting) {\n const next = {\n ...selectedCriterion,\n LeftValueBoundString:\n (itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}`) ||\n selectedCriterion.LeftValueBoundString,\n RightValueBoundString:\n (itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}`) ||\n selectedCriterion.RightValueBoundString\n };\n updatedRefinementCriteria.push(next);\n } // Else the item is being de-selected, so omit it from the refinement criteria\n } else {\n // Keep existing criterion because it is not in the item toggle notification\n updatedRefinementCriteria.push(selectedCriterion);\n }\n });\n\n if (!toggledItemFound) {\n const next = {\n ...itemToggleNotification.productRefinerValue,\n LeftValueBoundString:\n (itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}`) ||\n itemToggleNotification.productRefinerValue.LeftValueBoundString,\n RightValueBoundString:\n (itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}`) ||\n itemToggleNotification.productRefinerValue.RightValueBoundString\n };\n updatedRefinementCriteria.push(next);\n\n // If single select, then deselect any others in the parent refiner group\n if (\n (itemToggleNotification.productRefinerValue.DataTypeValue === AttributeDataType.Text ||\n itemToggleNotification.productRefinerValue.DataTypeValue === AttributeDataType.TrueFalse) &&\n itemToggleNotification.parentProductRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect\n ) {\n itemToggleNotification.parentProductRefinerHierarchy.Values.forEach((child: ProductRefinerValue) => {\n if (child.RefinerRecordId === next.RefinerRecordId && child.LeftValueBoundString === next.LeftValueBoundString) {\n // Do nothing\n } else {\n const matchingIndex = updatedRefinementCriteria.findIndex((criterion: ProductRefinerValue) =>\n isMatchingRefinementCriterion(child, criterion)\n );\n if (matchingIndex > -1) {\n updatedRefinementCriteria.splice(matchingIndex, 1);\n }\n }\n });\n }\n }\n\n return updatedRefinementCriteria;\n}\n\nexport function formatPrice(\n amount: string | undefined,\n currency: string | undefined,\n locale: string | undefined,\n telemetry: ITelemetry\n): string {\n if (!amount || !currency) {\n telemetry.trace(`[refine-menu.utilities.formatPrice] could not format price for ${amount} ${currency}`);\n return amount || '';\n }\n const priceAmount = (amount && Number(amount)) || 0;\n let result: string;\n\n try {\n result = new Intl.NumberFormat(locale, {\n style: 'currency',\n currencyDisplay: 'symbol',\n currency,\n minimumFractionDigits: 0\n }).format(priceAmount);\n } catch (error) {\n result = `${priceAmount} ${currency}`;\n telemetry.warning(`[refine-menu.utilities.formatPrice] Failed to format price for ${result}: ${error}`);\n }\n\n return result;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CategoryHierarchy as CategoryHierarchyData,\n IProductRefinerHierarchy,\n IProductsDimensionsAvailabilities\n} from '@msdyn365-commerce/commerce-entities';\nimport MsDyn365, { getCatalogId, ICoreContext } from '@msdyn365-commerce/core';\nimport {\n ChannelInventoryConfiguration,\n format,\n ProductPrice,\n ProductRefinerValue,\n SortColumn,\n StoreOperationsDataActions,\n TextValueTranslation\n} from '@msdyn365-commerce/retail-proxy';\nimport {\n ArrayExtensions,\n DimensionAvailabilitiesForProductSearchResultInput,\n DimensionTypes,\n DimensionSwatchDisplayTypes,\n getDimensionAvailabilitiesForProductSearchResultAction,\n getPriceForProductSearchResult,\n IDimensionsApp,\n PriceForProductSearchResultInput\n} from '@msdyn365-commerce-modules/retail-actions';\nimport {\n getTelemetryObject,\n ILabeledDropdownOnChangeNotification,\n ILabeledDropdownOption,\n IModuleProps,\n INodeProps,\n isMobile,\n ITelemetryContent,\n LabeledDropdown,\n UncontrolledPagination,\n VariantType\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { computed, observable, reaction, transaction } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport {\n buildListPageUrl,\n getCollectionProducts,\n getCollectionRefinersAction,\n getCurrentUrl,\n GetFullProductsByCollectionInput,\n IFullProductsSearchResultsWithCount,\n parseQueryParam,\n ProductListInventoryFilteringOptions,\n RefinersByCollectionInput,\n sortOptions\n} from './actions';\nimport { hydrateRefinersFromUrl } from './actions/url-utils';\nimport {\n ErrorMessage,\n FeatureSearchResultItem,\n getUpdatedRefinementCriteria,\n IChoiceSummaryClickNotification,\n IRefineItemCommonProps,\n IRefineItemToggleNotification,\n ISearchResultModalViewProps,\n isMatchingRefinementCriterion,\n Link,\n ModalToggle,\n ProductSearchResultItems,\n SearchResultModal,\n Separator,\n Title\n} from './components';\nimport ChoiceSummary from './components/choice-summary';\nimport RefineSubmenu from './components/refine-submenu';\nimport { ListPageState } from './list-page-state';\nimport { ISearchResultContainerData } from './search-result-container.data';\nimport { expandRefinersCount, ISearchResultContainerProps } from './search-result-container.props.autogenerated';\n\nexport interface ISearchResultContainerViewProps extends ISearchResultContainerProps<ISearchResultContainerData> {\n products?: React.ReactNode;\n className?: string;\n SearchResultContainer: IModuleProps;\n TitleViewProps: ITitleViewProps;\n categoryHierarchy: ICategoryHierarchyViewProps;\n pagination?: React.ReactNode;\n ProductsContainer: INodeProps;\n ProductSectionContainer: INodeProps;\n refineMenu: IRefineMenuViewProps;\n sortByOptions: ISortByViewProps;\n choiceSummary?: React.ReactNode;\n modalToggle: React.ReactNode;\n searchResultModal: ISearchResultModalViewProps;\n isMobile: boolean;\n CategoryNavContainer: INodeProps;\n RefineAndProductSectionContainer: INodeProps;\n errorMessage: React.ReactNode;\n FeatureSearchContainer: INodeProps;\n similarLookProduct?: React.ReactNode;\n productPrices?: ProductPrice[];\n productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\n}\n\nexport interface ITitleViewProps {\n TitleContainer: INodeProps;\n title: ISearchResultTitle;\n}\n\nexport interface IRefineMenuViewProps {\n RefineMenuContainer: INodeProps;\n RefinerSectionContainer: INodeProps;\n refiners?: React.ReactNode[];\n}\n\nexport interface ICategoryHierarchyViewProps {\n categoryHierarchyList?: React.ReactNode[];\n categoryHierarchySeparator?: React.ReactNode;\n CategoryHierarchyContainer: INodeProps;\n}\n\nexport interface ISortByViewProps {\n SortingContainer: INodeProps;\n sortByDropDown?: React.ReactNode;\n}\n\nexport type GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\n/**\n * Title component for search result container.\n */\nexport interface ISearchResultTitle {\n titlePrefix?: React.ReactNode;\n titleText?: React.ReactNode;\n titleCount?: React.ReactNode;\n}\n\nexport interface ISearchResultContainerState {\n sortingState: ISortByCollectionState;\n modalIsOpen: boolean;\n refiners: IProductRefinerHierarchy[];\n productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\n channelInventoryConfiguration?: ChannelInventoryConfiguration;\n}\n\ninterface ISortByCollectionState {\n selectedSortByOption: ILabeledDropdownOption;\n pending: boolean;\n}\n\n/**\n *\n * SearchResultContainer component.\n * @extends {React.PureComponent<ISearchResultContainerProps<ISearchResultContainerData>>}\n */\n@observer\nexport default class SearchResultContainer extends React.PureComponent<\n ISearchResultContainerProps<ISearchResultContainerData>,\n ISearchResultContainerState\n> {\n @computed get isMobile(): boolean {\n return this._viewport === 'xs' || this._viewport === 'sm';\n }\n\n private readonly sortByDropdownOptions: ILabeledDropdownOption[] = [\n { key: sortOptions.sortByOptionRelevanceDesc, value: this.props.resources.sortByOptionRelevanceDesc },\n { key: sortOptions.sortByOptionNameAsc, value: this.props.resources.sortByOptionNameAsc },\n { key: sortOptions.sortByOptionNameDesc, value: this.props.resources.sortByOptionNameDesc },\n { key: sortOptions.sortByOptionPriceAsc, value: this.props.resources.sortByOptionPriceAsc },\n { key: sortOptions.sortByOptionPriceDesc, value: this.props.resources.sortByOptionPriceDesc },\n { key: sortOptions.sortByOptionRatingDesc, value: this.props.resources.sortByOptionRatingDesc },\n { key: sortOptions.sortByOptionBestSelling, value: this.props.resources.sortByOptionBestSelling },\n { key: sortOptions.sortByOptionNewScore, value: this.props.resources.sortByOptionNewScore },\n { key: sortOptions.sortByOptionTrendingScore, value: this.props.resources.sortByOptionTrendingScore }\n ];\n\n private readonly _refineItemCommonProps: IRefineItemCommonProps;\n\n private readonly _pageType: string | undefined = this.props.context.request.urlTokens.pageType;\n\n @observable\n private _viewport: GridSize = 'lg';\n\n private readonly _modalToggleRef: React.RefObject<HTMLButtonElement>;\n\n private readonly _sortAndFilterContainerRef: React.RefObject<LabeledDropdown>;\n\n private expandrefinerCount: number | undefined = 0;\n\n private readonly telemetryContent: ITelemetryContent;\n\n private readonly productPrices: ProductPrice[];\n\n private readonly defaultPageNumber = 0;\n\n private readonly catalogId = getCatalogId(this.props.context.request);\n\n private isListPageStateUpdated: boolean = false;\n\n private _isMounted: boolean = false;\n\n public static getFriendlyName(locale: string, nameTranslations?: TextValueTranslation[]): string | undefined {\n let nameTranslation: TextValueTranslation | undefined;\n if (locale && nameTranslations && ArrayExtensions.hasElements(nameTranslations)) {\n nameTranslation = nameTranslations.find(item => item.Language!.toLowerCase() === locale.toLowerCase());\n }\n\n return nameTranslation?.Text;\n }\n\n public constructor(props: ISearchResultContainerProps<ISearchResultContainerData>, state: ISearchResultContainerState) {\n super(props);\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Check required.\n this._viewport = props.context.request?.device?.Type === 'Mobile' ? 'xs' : 'lg';\n this._modalToggleRef = React.createRef<HTMLButtonElement>();\n this._sortAndFilterContainerRef = React.createRef<LabeledDropdown>();\n this._toggleModal = this._toggleModal.bind(this);\n this._updateViewport = this._updateViewport.bind(this);\n this.productPrices = [];\n this.state = {\n sortingState: {\n pending: false,\n selectedSortByOption: this.sortByDropdownOptions[0]\n },\n modalIsOpen: false,\n refiners: [],\n channelInventoryConfiguration: undefined\n };\n const { placeholderTextMax, minLabel, maxLabel, rangeNameFormat } = this.props.resources;\n\n const locale = this.props.context.request.locale;\n const telemetry = this.props.telemetry;\n const validationErrorNaN = this.props.resources.validationErrorNotNumber;\n const validationErrorRange = this.props.resources.validationErrorNotRange;\n this._refineItemCommonProps = {\n telemetry,\n locale,\n placeholderTextMax,\n minLabel,\n maxLabel,\n rangeNameFormat,\n validationErrorNaN,\n validationErrorRange\n };\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n this._updateViewport();\n }\n public async componentDidMount(): Promise<void> {\n this._isMounted = true;\n if (MsDyn365.isBrowser && window.addEventListener) {\n window.addEventListener('resize', this._updateViewport);\n this._updateViewport();\n }\n\n const listPageState = await this.props.data.listPageState;\n const products = await this.props.data.products;\n const channelInventoryConfiguration = await StoreOperationsDataActions.getInventoryConfigurationAsync({\n callerContext: this.props.context.actionContext\n });\n if (this._isMounted) {\n this.setState({ channelInventoryConfiguration });\n }\n\n this._updateListPageState(listPageState, products);\n\n // Initialize reaction based on listPageState properties\n reaction(\n () => {\n return [\n listPageState.activeFilters?.length,\n listPageState.currentPageNumber,\n ArrayExtensions.hasElements(listPageState.sortingCritera?.Columns)\n ];\n },\n async () => {\n const newListPageState = await this.props.data.listPageState;\n const input = new GetFullProductsByCollectionInput(\n newListPageState.pageType,\n this.props.context.request.apiSettings,\n {\n Paging: {\n Top: this.props.config.itemsPerPage,\n Skip: Math.max(newListPageState.pageSize * (newListPageState.currentPageNumber ?? 0), 0)\n },\n count: true,\n Sorting: newListPageState.sortingCritera ?? {}\n },\n newListPageState.activeFilters ?? [],\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- RecordId is string. Check required.\n +(this.props.context.request.urlTokens.recordId || 0),\n\n // eslint-disable-next-line max-len -- existing code\n this.props.context.request.query?.q\n ? this.props.context.request.query.q\n : JSON.stringify({\n ProductId: this.props.context.request.query?.productId,\n Recommendation: this.props.context.request.query?.recommendation\n }),\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Required check.\n !!this.props?.config?.includeAttributes,\n this.props.config.updateRefinerPanel,\n this.props.context.request.locale,\n this.catalogId,\n channelInventoryConfiguration\n );\n\n const productResults = await getCollectionProducts(input, this.props.context.actionContext);\n newListPageState.totalProductCount = productResults.count;\n newListPageState.activeProducts = productResults.products;\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- check is required.\n if (\n this.props.config.enableAffiliationBasedPricing &&\n this.props.context.actionContext.requestContext?.user?.isAuthenticated\n ) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Call api to retrieve the availabilities data without blocking the UI.\n this._getActivePrice();\n }\n\n await this._updateVariantAvailability();\n\n if (this.props.config.updateRefinerPanel) {\n const refinerInput = new RefinersByCollectionInput(\n newListPageState.pageType,\n this.props.context.request.apiSettings,\n {\n Paging: {\n Top: this.props.config.itemsPerPage,\n Skip: Math.max(\n newListPageState.pageSize * (newListPageState.currentPageNumber ?? this.defaultPageNumber),\n this.defaultPageNumber\n )\n },\n count: true,\n Sorting: newListPageState.sortingCritera ?? {}\n },\n newListPageState.activeFilters ?? [],\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- RecordId is string. Check required.\n +(this.props.context.request.urlTokens.recordId || 0),\n this.props.context.request.query?.q\n ? this.props.context.request.query.q\n : this.props.context.request.query?.productId,\n false,\n this.props.config.updateRefinerPanel,\n undefined,\n this.catalogId,\n channelInventoryConfiguration\n );\n\n const refiners = await getCollectionRefinersAction(refinerInput, this.props.context.actionContext);\n this.setState({ refiners });\n }\n }\n );\n\n if (\n this.props.config.enableAffiliationBasedPricing &&\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Condition required.\n this.props.context.actionContext.requestContext?.user?.isAuthenticated\n ) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Call api to retrieve the availabilities data without blocking the UI.\n this._getActivePrice();\n }\n await this._updateVariantAvailability();\n }\n\n public componentWillUnmount(): void {\n this._isMounted = false;\n if (MsDyn365.isBrowser && window.removeEventListener) {\n window.removeEventListener('resize', this._updateViewport);\n }\n }\n\n public render(): JSX.Element {\n const {\n config: { imageSettings, className },\n resources,\n data: { listPageState, products: productCollection, featureProduct }\n } = this.props;\n\n if (!this.isListPageStateUpdated && listPageState.result && productCollection.result) {\n this._updateListPageState(listPageState.result, productCollection.result);\n this.isListPageStateUpdated = true;\n }\n\n const products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\n const searchProduct = listPageState.result?.featureProduct ?? featureProduct.result ?? null;\n let errorText = '';\n if (!ArrayExtensions.hasElements(products)) {\n errorText = this._pageType === 'Category' ? resources.resultCategoryNotFoundText : resources.resultSearchNotFoundText;\n }\n const productsComponent = this._getProducts();\n const featureComponent = (\n <FeatureSearchResultItem\n product={searchProduct}\n context={this.props.context}\n imageSettings={imageSettings}\n resources={resources}\n moduleType={this.props.typeName}\n moduleId={this.props.id}\n telemetryContent={this.telemetryContent}\n recommendation={this.props.context.request.query?.recommendation}\n />\n );\n\n const searchResultContainerViewProps = {\n ...this.props,\n products: productsComponent,\n TitleViewProps: this._getCollectionTitle(),\n categoryHierarchy: !this.props.config.disableHierarchy && this._getCategoryHierarchy(),\n refineMenu: this._getRefineMenu(),\n className: classnames('ms-search-result-container', className),\n SearchResultContainer: {\n moduleProps: this.props,\n className: classnames('ms-search-result-container', className)\n },\n sortByOptions: this.props.data.listPageState.result?.totalProductCount !== 0 ? this._getSortingDropDown() : null,\n pagination: this._getPagination(),\n ProductsContainer: { className: 'ms-search-result-container__Products' },\n ProductSectionContainer: { className: 'ms-search-result-container__product-section' },\n CategoryNavContainer: { className: 'ms-search-result-container__category-nav-section' },\n RefineAndProductSectionContainer: { className: 'ms-search-result-container__refine-product-section' },\n choiceSummary: this._getChoiceSummary(),\n modalToggle:\n this.props.data.listPageState.result?.totalProductCount !== 0 ? (\n <ModalToggle\n text={resources.modalTitle}\n ariaLabel={resources.modalTitle}\n innerRef={this._modalToggleRef}\n onClick={this._toggleModal}\n id='search-result-modal'\n />\n ) : null,\n searchResultModal: this._getSearchResultModal(),\n isMobile: this.isMobile,\n errorMessage: errorText && <ErrorMessage text={errorText} />,\n FeatureSearchContainer: { className: 'ms-feature-search-result' },\n similarLookProduct: searchProduct ? featureComponent : null,\n productPrices: this.productPrices,\n productsDimensionAvailabilities: this.state.productsDimensionAvailabilities\n };\n return this.props.renderView(searchResultContainerViewProps) as React.ReactElement;\n }\n\n /**\n * Get products variants dimension availabilities.\n * @returns Void.\n */\n private readonly _updateVariantAvailability = async (): Promise<void> => {\n const context = this.props.context as ICoreContext<IDimensionsApp>;\n const dimensionsToDisplayOnProductCard = context.app.config.dimensionsInProductCard;\n const dimensionsToDisplayAsSwatch = context.app.config.dimensionsAsSwatchType;\n if (\n ArrayExtensions.hasElements(dimensionsToDisplayOnProductCard) &&\n !dimensionsToDisplayOnProductCard.includes(DimensionTypes.none) &&\n ArrayExtensions.hasElements(dimensionsToDisplayAsSwatch) &&\n !dimensionsToDisplayAsSwatch.includes(DimensionTypes.none) &&\n this.props.config.includeAttributes\n ) {\n await this._getProductsDimensionsAvailabilities();\n }\n };\n\n /**\n * Update the list page state with initial data.\n * @param listPageState -- List page State.\n * @param products -- Products.\n */\n private readonly _updateListPageState = (listPageState: ListPageState, products: IFullProductsSearchResultsWithCount): void => {\n let querySorting: SortColumn[] = [];\n const defaultPageNumber: number = 10;\n\n if (this._pageType === 'Category') {\n listPageState.pageType = 'Category';\n } else {\n listPageState.pageType = 'Search';\n }\n\n if (this.props.context.request.query?.sorting) {\n querySorting = JSON.parse(decodeURIComponent(this.props.context.request.query.sorting)) as SortColumn[];\n }\n\n listPageState.currentPageNumber =\n (this.props.context.request.query &&\n +this.props.context.request.query.skip / (this.props.config.itemsPerPage ?? defaultPageNumber)) ||\n 0;\n listPageState.sortingCritera = { Columns: querySorting };\n listPageState.pageSize = this.props.config.itemsPerPage ?? defaultPageNumber;\n listPageState.activeProducts = products.products;\n listPageState.totalProductCount = products.count;\n listPageState.activeFilters = hydrateRefinersFromUrl(this.props.context.request) || [];\n if (this.props.context.request.query?.productId) {\n const featureProduct = this.props.data.featureProduct.result;\n if (featureProduct) {\n listPageState.featureProduct = featureProduct;\n }\n }\n };\n\n /**\n * Get products dimension availabilities.\n * @returns Void.\n */\n private readonly _getProductsDimensionsAvailabilities = async (): Promise<void> => {\n const productsList = this.props.data.listPageState.result?.activeProducts ?? [];\n\n const productsDimensionAvailabilities = await getDimensionAvailabilitiesForProductSearchResultAction(\n new DimensionAvailabilitiesForProductSearchResultInput(\n productsList,\n this.props.context as ICoreContext<IDimensionsApp>,\n DimensionSwatchDisplayTypes.productCard\n ),\n this.props.context.actionContext\n );\n\n if (ArrayExtensions.hasElements(productsDimensionAvailabilities)) {\n this.setState({ productsDimensionAvailabilities });\n }\n };\n\n /**\n * Get the active price for the products.\n */\n private readonly _getActivePrice = async (): Promise<void> => {\n const productsList = this.props.data.listPageState.result?.activeProducts ?? [];\n const products = await getPriceForProductSearchResult(\n new PriceForProductSearchResultInput(productsList),\n this.props.context.actionContext\n );\n\n const listPageState = await this.props.data.listPageState;\n listPageState.activeProducts = products;\n };\n\n private readonly _getSearchResultModal = (): ISearchResultModalViewProps => {\n const { resources } = this.props;\n return SearchResultModal({\n resources: {\n modalCloseButtonText: resources.modalCloseButtonText,\n modalTitle: resources.modalTitle\n },\n isOpen: this.state.modalIsOpen,\n returnRef: this._modalToggleRef,\n onModalToggle: this._toggleModal\n });\n };\n\n private readonly _getCollectionTitle = (): ITitleViewProps => {\n const { data, context, resources } = this.props;\n\n let collectionTitle: string | undefined = '';\n if (context && context.request && context.request.query && context.request.query.q) {\n collectionTitle = `\"${context.request.query.q}\"`;\n } else {\n collectionTitle =\n (data.category.result &&\n SearchResultContainer.getFriendlyName(context.request.locale, data.category.result.NameTranslations)) ||\n (data.category.result && data.category.result.Name) ||\n this.props.context.request.query?.title ||\n '';\n }\n let productCountText = '';\n let productCountNumber: number | undefined;\n if (data.listPageState && data.listPageState.result && data.listPageState.result.totalProductCount !== undefined) {\n productCountNumber = data.listPageState.result.totalProductCount;\n } else if (data.products && data.products.result) {\n productCountNumber = data.products.result.count;\n }\n\n if (productCountNumber && productCountNumber !== 0) {\n productCountText =\n productCountNumber !== 1\n ? format(this.props.resources.numberOfProducts, productCountNumber)\n : this.props.resources.oneProduct;\n } else {\n productCountText = format(this.props.resources.numberOfProducts, 0);\n }\n const pageName = context.request.telemetryPageName ? `result-count-${context.request.telemetryPageName.toLowerCase()}` : '';\n const titlePrefix = <Title className='ms-search-result__collection-title-prefix' text={resources.searchTextPrefix} />;\n const titleText = collectionTitle && <Title className='ms-search-result__collection-title-text' text={collectionTitle} />;\n const titleCount = <Title className='ms-search-result__collection-title-count' text={productCountText} />;\n\n return {\n TitleContainer: { className: `ms-search-result-container__title ${pageName}` },\n title: {\n titlePrefix,\n titleText,\n titleCount\n }\n };\n };\n\n private readonly _getCategoryHierarchy = (): ICategoryHierarchyViewProps => {\n const { data } = this.props;\n const categoryHierarchy = data.categoryHierarchy.result;\n const categoryLinks =\n categoryHierarchy &&\n categoryHierarchy.map((value: CategoryHierarchyData, index: number) => {\n return (\n <Link\n key={index}\n text={value.Name}\n ariaLabel={`${this.props.resources.categoryLinkAriaLabel} ${value.Name}`}\n href={value.Url}\n />\n );\n });\n const categoryLinkSeparator = <Separator separator='/' />;\n\n return {\n CategoryHierarchyContainer: { tag: 'nav', className: 'ms-search-result-container__category-hierarchy' },\n categoryHierarchyList: categoryLinks,\n categoryHierarchySeparator: categoryLinkSeparator\n };\n };\n\n private readonly _getSortingDropDown = (): ISortByViewProps => {\n const { resources } = this.props;\n const activeDropdown = this._getCurrentlySelectedOption() || this.state.sortingState.selectedSortByOption;\n let dropdownOptions = this._getAllSortByOptions();\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- App config settings are of \"any\" value.\n if (this.props.context.app.config.hideRating) {\n dropdownOptions = dropdownOptions.filter(dropdownOption => dropdownOption.key !== sortOptions.sortByOptionRatingDesc);\n }\n\n const dropdown = (\n <LabeledDropdown\n labelClassname='reviews-list-sort-by'\n labelText={resources.sortByDropdownLabel}\n dropdownId='categorySortByDropdown'\n dropdownClassname='reviews-list-dropdown'\n toggleColor='link'\n dropdownOptions={dropdownOptions}\n selectedOption={activeDropdown}\n onSelectOption={this._updateSortByDropdown}\n ref={this._sortAndFilterContainerRef}\n />\n );\n return {\n SortingContainer: { className: 'ms-search-result-container__Sort-by-category' },\n sortByDropDown: dropdown\n };\n };\n\n private readonly _getPagination = (): React.ReactNode => {\n const { config, context, data, resources } = this.props;\n const listPageState = data.listPageState.result;\n const fullUrl = getCurrentUrl(context.request);\n const itemsPerPage = config.itemsPerPage || 10;\n // eslint-disable-next-line max-len -- existing code\n const skipCount = listPageState?.currentPageNumber\n ? listPageState.currentPageNumber * (this.props.config.itemsPerPage || 10)\n : (this.props.context.request.query && +this.props.context.request.query.skip) || 0;\n const totalItems = listPageState?.totalProductCount || 0;\n const previousText = resources.flipperPrevious;\n const nextText = resources.flipperNext;\n\n if (totalItems <= itemsPerPage) {\n return null;\n }\n return (\n <UncontrolledPagination\n className='ms-search-result-container__pagination'\n role='navigation'\n aria-label={resources.paginationAriaLabel}\n url={fullUrl.href}\n qsp='skip'\n items={totalItems}\n itemsPerPage={itemsPerPage}\n startingItem={skipCount}\n previousText={this._renderPrev(previousText)}\n nextText={this._renderNext(nextText)}\n previousAriaLabel={previousText}\n nextAriaLabel={nextText}\n telemetryContent={this.telemetryContent}\n />\n );\n };\n\n private readonly _getRefineMenu = (): IRefineMenuViewProps => {\n const { data, context, config } = this.props;\n const tempRangeTypeTODO = context.request.query && context.request.query.inputRange ? 'input' : 'slider';\n const validRefiners =\n this.props.config.updateRefinerPanel && ArrayExtensions.hasElements(this.state.refiners)\n ? this.state.refiners.filter(refiner => {\n return ArrayExtensions.hasElements(refiner.Values) && !this._shouldHideFromRefiners(refiner);\n })\n : data.refiners.result &&\n data.refiners.result.filter(refiner => {\n return ArrayExtensions.hasElements(refiner.Values) && !this._shouldHideFromRefiners(refiner);\n });\n\n const activeRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\n\n this._getexpandRefinerCount(validRefiners && validRefiners.length, config.expandRefinersCount);\n const expandedRefiners = this.expandrefinerCount;\n const subMenus =\n validRefiners &&\n validRefiners.map((productRefinerHierarchy: IProductRefinerHierarchy, index: number) => {\n return (\n <RefineSubmenu\n productRefinerHierarchy={productRefinerHierarchy}\n selectedRefinerValues={activeRefiners}\n refineItemCommonProps={this._refineItemCommonProps}\n minValueSliderThumbAriaLabel={this.props.resources.minValueSliderThumbAriaLabel}\n maxValueSliderThumbAriaLabel={this.props.resources.maxValueSliderThumbAriaLabel}\n key={index}\n onUpdateRefiners={this._onUpdateRefiners}\n urlBuilder={this._buildRefinerUrl}\n isDisabled={false}\n isExpandedOnInitialLoad={!!(expandedRefiners && expandedRefiners > index)}\n tempRangeTypeTODO={tempRangeTypeTODO}\n context={context}\n moduleId={this.props.id}\n moduleTypeName={this.props.typeName}\n telemetryContent={this.telemetryContent}\n productCountAriaLabel={this.props.resources.productCountAriaLabel}\n refineItemAriaLabel={this.props.resources.refineItemAriaLabel}\n refineItemsAriaLabel={this.props.resources.refineItemsAriaLabel}\n singleProductCountAriaLabel={this.props.resources.singleProductCountAriaLabel}\n isMobile={this.isMobile}\n />\n );\n });\n\n return {\n RefineMenuContainer: { className: 'ms-search-result-container__refine-menu' },\n RefinerSectionContainer: { className: 'ms-search-result-container__refiner-section' },\n refiners: subMenus\n };\n };\n\n /**\n * Should hide from refiners.\n * @param refiner - The refiner.\n * @returns ShouldHideFromRefiners.\n */\n private readonly _shouldHideFromRefiners = (refiner: IProductRefinerHierarchy): boolean => {\n const { channelInventoryConfiguration } = this.state;\n const isInventorySortableAttribute =\n (this.props.data.products.result?.inventoryAwareSortableAttributeId !== 0 &&\n refiner.RecordId === this.props.data.products.result?.inventoryAwareSortableAttributeId) ||\n (channelInventoryConfiguration?.ProductAvailabilitySortableAttributeRecordId !== 0 &&\n refiner.RecordId === channelInventoryConfiguration?.ProductAvailabilitySortableAttributeRecordId);\n\n const isInventoryProductAttribute =\n (this.props.data.products.result?.channelInventoryConfigurationId !== 0 &&\n refiner.RecordId === this.props.data.products.result?.channelInventoryConfigurationId) ||\n (channelInventoryConfiguration?.InventoryProductAttributeRecordId !== 0 &&\n refiner.RecordId === channelInventoryConfiguration?.InventoryProductAttributeRecordId);\n\n // Always hide sortable attribute since it's just for sorting products in Azure search, not for customers\n return (\n isInventorySortableAttribute ||\n (this.props.context.app.config.productListInventoryDisplay === ProductListInventoryFilteringOptions.HideOOS &&\n isInventoryProductAttribute)\n );\n };\n\n private readonly _getChoiceSummary = (): React.ReactNode => {\n const { resources, data, telemetry } = this.props;\n const { channelInventoryConfiguration } = this.state;\n const selectedRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\n const refinerValueName = this.props.data.refiners.result?.find(rating => rating.KeyName === 'Rating');\n return (\n <ChoiceSummary\n classNames='ms-choice-summary-by-category'\n clearAllText={resources.clearAllText}\n label={resources.choiceSummaryLabel}\n closeAriaLabel={resources.closeAriaLabel}\n selectedChoices={selectedRefiners}\n // @ts-expect-error: NOTE Type-unsafe line below, null refinersByCategoryHierarchy case not handled\n refinerHierarchy={data.refiners.result}\n choiceFormat={resources.choiceFormat}\n choiceRangeValueFormat={resources.choiceRangeValueFormat}\n telemetry={telemetry}\n onChoiceClicked={this._onChoiceClicked}\n urlBuilder={this._buildRefinerUrlForChoiceSummary}\n choiceAriaLabel={resources.choiceAriaLabel}\n telemetryContent={this.telemetryContent}\n context={this.props.context}\n channelInventoryConfigurationId={channelInventoryConfiguration?.InventoryProductAttributeRecordId}\n refinerValues={refinerValueName}\n />\n );\n };\n\n /**\n * Get Active products.\n * @returns - JSX Elements.\n */\n private readonly _getProducts = (): JSX.Element => {\n const {\n config: { imageSettings, allowBackNavigation: shouldAllowBackNavigation }\n } = this.props;\n const { resources } = this.props;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- Reading config value.\n const breadCrumbType: string = this.props.context.app.config.breadcrumbType;\n const shouldAllowBack = shouldAllowBackNavigation && (breadCrumbType === 'back' || breadCrumbType === 'categoryAndBack');\n\n const products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\n const quickviewSlot = this.props.slots?.quickview?.[0];\n const productComparisonButton = ArrayExtensions.hasElements(this.props.slots.productComparisonButton)\n ? this.props.slots.productComparisonButton[0]\n : null;\n\n const isPriceMinMaxFeatureState = this.props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailSearchPriceRangeFeature'\n );\n return (\n <ProductSearchResultItems\n products={products}\n context={this.props.context}\n imageSettings={imageSettings}\n resources={resources}\n moduleType={this.props.typeName}\n moduleId={this.props.id}\n allowBackNavigation={shouldAllowBack}\n telemetryContent={this.telemetryContent}\n quickviewSlot={quickviewSlot}\n productComparisonButton={productComparisonButton}\n channelInventoryConfigurationId={this.props.data.products.result?.channelInventoryConfigurationId}\n isPriceMinMaxEnabled={isPriceMinMaxFeatureState?.IsEnabled}\n productsDimensionAvailabilities={this.state.productsDimensionAvailabilities}\n />\n );\n };\n\n private readonly _updateSortByDropdown = (notification: ILabeledDropdownOnChangeNotification): void => {\n const {\n context: { request: requestContext, actionContext }\n } = this.props;\n\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\n // eslint-disable-next-line max-len -- existing code\n const error = `[sort-by-category] cannot sort without context: ${!requestContext ? 'requestContext ' : ''} ${\n !actionContext ? 'actionContext ' : ''\n } could not be found`;\n this.props.telemetry.warning(error);\n return;\n }\n\n window.history.pushState(\n {},\n '',\n buildListPageUrl(\n getCurrentUrl(this.props.context.request),\n undefined,\n [this._getSortColumnFromSelectedOption(notification.selectedOption)],\n undefined\n )\n );\n transaction(() => {\n this.props.data.listPageState.result!.currentPageNumber = 0;\n this.props.data.listPageState.result!.sortingCritera = {\n Columns: [this._getSortColumnFromSelectedOption(notification.selectedOption)]\n };\n });\n };\n\n private readonly _getSortColumnFromSelectedOption = (option: ILabeledDropdownOption): SortColumn => {\n const { data } = this.props;\n\n if (!data.searchConfiguration.result) {\n return {};\n }\n\n const mappedConfiguration = data.searchConfiguration.result.find(searchConfiguration => {\n return searchConfiguration.key === option.key;\n });\n\n if (mappedConfiguration) {\n return mappedConfiguration.sortColumn;\n }\n\n return {};\n };\n\n /**\n * Retrieves current sort criteria.\n * @returns Sort criteria column which is currently active or undefined if it's not specified.\n */\n private readonly _getSortCriteriaColumn = (): SortColumn | undefined => {\n const sortCriteria = this.props.data.listPageState.result?.sortingCritera;\n if (ArrayExtensions.hasElements(sortCriteria?.Columns)) {\n return sortCriteria!.Columns[0];\n }\n\n const queryColumns = parseQueryParam<SortColumn[]>('sorting', this.props.context.request);\n if (ArrayExtensions.hasElements(queryColumns)) {\n return queryColumns[0];\n }\n\n return undefined;\n };\n\n /**\n * Retrieves dropdown options.\n * @returns All dropdown options.\n */\n private readonly _getAllSortByOptions = (): ILabeledDropdownOption[] => {\n const searchConfiguration = this.props.data.searchConfiguration.result;\n\n if (!searchConfiguration) {\n return [];\n }\n\n const mappedSearchConfiguration = this.sortByDropdownOptions.filter(mappedSearchConfig =>\n searchConfiguration.find(item => mappedSearchConfig.key === item.key)\n );\n\n return ArrayExtensions.validValues(mappedSearchConfiguration);\n };\n\n /**\n * Retrieves current selected dropdown option based on the sort criteria.\n * @returns Current dropdown option.\n */\n private readonly _getCurrentlySelectedOption = (): ILabeledDropdownOption | undefined => {\n const activeSortColumn = this._getSortCriteriaColumn();\n\n const searchConfiguration = this.props.data.searchConfiguration.result;\n\n if (!activeSortColumn || !searchConfiguration) {\n return undefined;\n }\n\n const activeMappedConfig = searchConfiguration.find(\n mappedSearchConfig =>\n mappedSearchConfig.sortColumn.ColumnName === activeSortColumn.ColumnName &&\n mappedSearchConfig.sortColumn.IsDescending === activeSortColumn.IsDescending\n );\n if (!activeMappedConfig) {\n return undefined;\n }\n\n return this.sortByDropdownOptions.find(dropdownOption => dropdownOption.key === activeMappedConfig.key);\n };\n\n private readonly _onUpdateRefiners = (itemToggleNotification: IRefineItemToggleNotification): void => {\n const {\n context: { request: requestContext, actionContext }\n } = this.props;\n\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\n const error = `Refine menu cannot refine search criteria: \n ${!requestContext ? 'requestContext ' : ''} ${!actionContext ? 'actionContext ' : ''} could not be found`;\n this.props.telemetry.warning(error);\n return;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Server side the list PageState will not be called.\n const updatedRefinementCriteria = getUpdatedRefinementCriteria(\n itemToggleNotification,\n this.props.data.listPageState.result?.activeFilters || []\n );\n\n window.history.pushState({}, '', buildListPageUrl(getCurrentUrl(this.props.context.request), updatedRefinementCriteria));\n transaction(() => {\n this.props.data.listPageState.result!.currentPageNumber = 0;\n this.props.data.listPageState.result!.activeFilters = updatedRefinementCriteria;\n });\n };\n\n private readonly _buildRefinerUrl = (itemToggleNotification: IRefineItemToggleNotification): string => {\n if (this.props.data.listPageState.result) {\n const newRefinementCriteria = getUpdatedRefinementCriteria(\n itemToggleNotification,\n this.props.data.listPageState.result.activeFilters || []\n );\n\n return buildListPageUrl(getCurrentUrl(this.props.context.request), newRefinementCriteria);\n }\n this.props.telemetry.warning('[buildRefinerQueryString]List Page State Not available, unable to build refiner URL');\n return '';\n };\n\n private readonly _onChoiceClicked = (notification: IChoiceSummaryClickNotification): void => {\n const { data, telemetry } = this.props;\n\n if (!data.listPageState.result) {\n telemetry.warning('[choice-summary-by-category._onChoiceClicked]ListPageState unavailable, unable to update refiners.');\n return;\n }\n\n let currentRefinementCriteria = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\n\n if (!notification.clearAll) {\n const selectedChoice = notification.choiceClicked;\n if (!selectedChoice) {\n telemetry.warning('[choice-summary-by-category._onChoiceClicked] Choice could not be determined');\n return;\n }\n currentRefinementCriteria = currentRefinementCriteria.filter(\n (selectedCriterion: ProductRefinerValue) => !isMatchingRefinementCriterion(selectedChoice, selectedCriterion)\n );\n } else {\n currentRefinementCriteria = [];\n\n // Set focus to sort and filter\n const dropdownElementId = this._sortAndFilterContainerRef.current && this._sortAndFilterContainerRef.current.props.dropdownId;\n const dropdownElement = dropdownElementId && document.getElementById(dropdownElementId);\n setTimeout(() => {\n dropdownElement && dropdownElement.focus();\n }, 50);\n }\n\n const fullUrl = getCurrentUrl(this.props.context.request);\n window.history.pushState({}, '', buildListPageUrl(fullUrl, currentRefinementCriteria));\n data.listPageState.result.currentPageNumber = 0;\n data.listPageState.result.activeFilters = currentRefinementCriteria;\n };\n\n private readonly _buildRefinerUrlForChoiceSummary = (selectedRefiner: ProductRefinerValue, isClearAll: boolean): string => {\n const { data, telemetry } = this.props;\n const fullUrl = getCurrentUrl(this.props.context.request);\n\n if (!data.listPageState.result) {\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl]ListPageState unavailable, unable to create refiner URL.');\n return fullUrl.href;\n }\n\n let currentRefinementCriteria = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\n\n if (!isClearAll) {\n if (!selectedRefiner) {\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl] URL for Choice could not be determined');\n return fullUrl.href;\n }\n currentRefinementCriteria = currentRefinementCriteria.filter(\n (selectedCriterion: ProductRefinerValue) => !isMatchingRefinementCriterion(selectedRefiner, selectedCriterion)\n );\n } else {\n currentRefinementCriteria = [];\n }\n\n return buildListPageUrl(fullUrl, currentRefinementCriteria);\n };\n\n private _getViewport(): GridSize {\n if (MsDyn365.isBrowser) {\n return isMobile({ variant: VariantType.Browser, context: this.props.context.request });\n }\n return isMobile({ variant: VariantType.Viewport, context: this.props.context.request });\n }\n\n private _toggleModal(): void {\n this.setState({\n modalIsOpen: !this.state.modalIsOpen\n });\n }\n\n private _updateViewport(): void {\n this._viewport = this._getViewport();\n\n if (this.state.modalIsOpen && !this.isMobile) {\n this._toggleModal();\n }\n }\n\n private readonly _getexpandRefinerCount = (validRefiners?: number, refinerCount?: expandRefinersCount): void => {\n switch (refinerCount) {\n case expandRefinersCount.all:\n this.expandrefinerCount = validRefiners;\n break;\n case expandRefinersCount.one:\n this.expandrefinerCount = 1;\n break;\n case expandRefinersCount.two:\n this.expandrefinerCount = 2;\n break;\n case expandRefinersCount.three:\n this.expandrefinerCount = 3;\n break;\n case expandRefinersCount.four:\n this.expandrefinerCount = 4;\n break;\n default:\n this.expandrefinerCount = 0;\n }\n };\n\n /**\n * Renders a Pagination previous text.\n * @param paginationPreviousText - Pagination previous text from resources.\n * @returns Previous text and flipper icon.\n */\n private readonly _renderPrev = (paginationPreviousText: string) => {\n return (\n <div className='msc-pagination__prev'>\n <span className='ms-search-result__pagination-left' aria-hidden='true' />\n <span className='prev-text'>{paginationPreviousText}</span>\n </div>\n );\n };\n\n /**\n * Renders a Pagination next text.\n * @param paginationNextText - Pagination next text from resources.\n * @returns Next text and flipper icon.\n */\n private readonly _renderNext = (paginationNextText: string) => {\n return (\n <div className='msc-pagination__next'>\n <span className='next-text'>{paginationNextText}</span>\n <span className='ms-search-result__pagination-right' aria-hidden='true' />\n </div>\n );\n };\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISearchResultModalViewProps } from './components';\nimport {\n ICategoryHierarchyViewProps,\n IRefineMenuViewProps,\n ISearchResultContainerViewProps,\n ISortByViewProps,\n ITitleViewProps\n} from './search-result-container';\n\nconst SearchResultContainerView: React.FC<ISearchResultContainerViewProps> = props => {\n const {\n SearchResultContainer,\n products,\n pagination,\n ProductsContainer,\n ProductSectionContainer,\n choiceSummary,\n isMobile,\n modalToggle,\n searchResultModal,\n TitleViewProps,\n refineMenu,\n categoryHierarchy,\n sortByOptions,\n CategoryNavContainer,\n RefineAndProductSectionContainer,\n errorMessage,\n FeatureSearchContainer,\n similarLookProduct\n } = props;\n const isRecoSearchPage = props.context.actionContext.requestContext.query?.recommendation;\n if (isMobile) {\n return (\n <Module {...SearchResultContainer}>\n {renderCategoryHierarchy(categoryHierarchy)}\n {renderTitle(TitleViewProps)}\n {choiceSummary}\n {modalToggle}\n {createSearchResultModal(searchResultModal, refineMenu, sortByOptions, isRecoSearchPage)}\n <Node {...FeatureSearchContainer}>{similarLookProduct}</Node>\n <Node {...ProductsContainer}>\n {errorMessage}\n {products}\n </Node>\n {pagination}\n </Module>\n );\n }\n return (\n <Module {...SearchResultContainer}>\n <Node {...CategoryNavContainer}>\n {categoryHierarchy && renderCategoryHierarchy(categoryHierarchy)}\n {TitleViewProps && renderTitleCount(TitleViewProps)}\n </Node>\n <Node {...RefineAndProductSectionContainer}>\n {refineMenu && renderRefiner(refineMenu)}\n <Node {...ProductSectionContainer}>\n {TitleViewProps && renderTitle(TitleViewProps)}\n {choiceSummary}\n {sortByOptions && !isRecoSearchPage && renderSort(sortByOptions)}\n <Node {...FeatureSearchContainer}>{similarLookProduct}</Node>\n <Node {...ProductsContainer}>\n {errorMessage}\n {products}\n </Node>\n {pagination}\n </Node>\n </Node>\n </Module>\n );\n};\n\nconst createSearchResultModal = (\n modalProps: ISearchResultModalViewProps,\n refineMenu: IRefineMenuViewProps,\n sortByDropDown: ISortByViewProps,\n isRecoSearchPage?: string\n): JSX.Element => {\n return React.cloneElement(\n modalProps.modal,\n {},\n modalProps.modalHeader,\n createModalBody(modalProps, refineMenu, sortByDropDown, isRecoSearchPage),\n modalProps.modalFooter\n );\n};\n\nconst createModalBody = (\n props: ISearchResultModalViewProps,\n refineMenu: IRefineMenuViewProps,\n sortByDropDown: ISortByViewProps,\n isRecoSearchPage?: string\n): JSX.Element | null => {\n if (sortByDropDown) {\n return React.cloneElement(props.modalBody, {}, renderSort(sortByDropDown, isRecoSearchPage), renderRefiner(refineMenu));\n }\n return null;\n};\n\nconst renderRefiner = (props: IRefineMenuViewProps): JSX.Element | null => {\n const { refiners, RefineMenuContainer, RefinerSectionContainer } = props;\n if (refiners) {\n return (\n <Node {...RefinerSectionContainer}>\n <Node {...RefineMenuContainer}>\n {refiners.map((submenu, index) => (\n <React.Fragment key={index}>{submenu}</React.Fragment>\n ))}\n </Node>\n </Node>\n );\n }\n return null;\n};\n\nconst renderSort = (props: ISortByViewProps, isRecoSearchPage?: string): JSX.Element | null => {\n const { SortingContainer, sortByDropDown } = props;\n if (sortByDropDown && !isRecoSearchPage) {\n return <Node {...SortingContainer}>{sortByDropDown}</Node>;\n }\n return null;\n};\n\nconst renderCategoryHierarchy = (props: ICategoryHierarchyViewProps): JSX.Element | null => {\n const { CategoryHierarchyContainer, categoryHierarchyList, categoryHierarchySeparator } = props;\n if (categoryHierarchyList) {\n return (\n <Node {...CategoryHierarchyContainer}>\n {categoryHierarchyList.map((category, index) => (\n <React.Fragment key={index}>\n {category}\n {categoryHierarchyList && categoryHierarchyList[index + 1] && categoryHierarchySeparator}\n </React.Fragment>\n ))}\n </Node>\n );\n }\n\n return null;\n};\n\nconst renderTitle = (props: ITitleViewProps): JSX.Element | null => {\n const { title, TitleContainer } = props;\n if (title) {\n return (\n <Node {...TitleContainer}>\n <h2>\n {title.titlePrefix}\n {title.titleText}\n </h2>\n </Node>\n );\n }\n return null;\n};\n\nconst renderTitleCount = (props: ITitleViewProps): JSX.Element | null => {\n const { title, TitleContainer } = props;\n if (title) {\n return (\n <Node {...TitleContainer}>\n <h5>{title.titleCount}</h5>\n </Node>\n );\n }\n return null;\n};\n\nexport default SearchResultContainerView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { observable } from 'mobx';\n\n/**\n * State information related to what is needed to succesfully perform a autosuggest.\n */\nexport class SearchState {\n @observable public searchText?: string;\n\n @observable public defaultBasicSearchUrl?: string;\n\n @observable public searchQueryStringParameter?: string;\n}\n"],"names":["showStrikethroughPricing","props","originalPrice","getOriginalPrice","data","price","CustomerContextualPrice","Math","max","BasePrice","TradeAgreementPrice","AdjustedPrice","renderCurrentPrice","initialPrice","formatCurrency","React","className","itemProp","undefined","freePriceText","returnPrice","Intl","NumberFormat","context","cultureFormatter","locale","style","currency","currencyCode","currencyDisplay","format","_unused","renderCurrentPriceWithOriginalPrice","originalPriceText","currentPriceText","savingsText","msdyn365Commerce","createComponent","component","__assign","classnames","PromoBannerCloseButton","_ref","closeButtonAriaLabel","label","telemetryContent","onClose","payLoad","getPayloadObject","TelemetryConstant","PromoBannerClose","attributes","getTelemetryAttributes","Object","assign","onClick","PromoBannerLinks","links","requestContext","onTextChange","editableLinks","_mapEditableLinks","length","Msdyn365","editProps","linkdata","forEach","link","index","linkText","contentAction","etext","editableLink","ariaLabel","linkUrl","destinationUrl","openInNewTab","role","additionalProperties","onTelemetryClick","push","PromoBannerText","text","tag","onEdit","PromoBanner","constructor","state","animating","isVisible","activeIndex","getTelemetryObject","this","request","telemetryPageName","friendlyName","telemetry","handleTextChange","event","config","bannerMessages","target","value","handleLinkClick","handleLinkTextChange","linkIndex","_next","nextIndex","_isLastItem","_goToIndex","_previous","_isFirstItem","setState","_onDismiss","render","dismissEnabled","interval","hideFlipper","autoplay","closeButtonLabel","resources","error","viewProps","_objectSpread","onDismiss","handleLinks","handleText","promoBannerProps","moduleProps","PromoBannerTextProps","PromoBannerLinksProps","contentProps","CarouselProps","Carousel","next","previous","onIndicatorsClickHandler","hideIndicator","closeButton","renderView","slides","map","message","_message$links","Node","key","href","Module","items","expandRefinersCount","expandedMenusOnLoad","Link","ProductSearchResultItems","products","imageSettings","moduleType","moduleId","allowBackNavigation","product","ProductComponent","priceFree","ratingAriaLabel","allowBack","id","typeName","FeatureSearchResultItem","productName","Name","productRecordId","RecordId","productUrl","getProductPageUrlSync","actionContext","fallbackImage","getFallbackImageUrl","ItemId","apiSettings","toString","attribute","gridSettings","imageUrl","altText","img","src","imageProps","fallBackSrc","Image","loadFailureBehavior","renderProductPlacementImage","PrimaryImageUrl","featureSimilarLooksTitle","title","Title","Separator","separator","ProductRefinerValueDataTypeValue","ProductRefinerTypeValue","ProductRefinerSource","isRangeType","dataTypeValue","AttributeDataType","Currency","Decimal","Integer","findMatchingRefinementCriterion","productRefinerValue","refinementCriteria","find","refinementCriterion","isMatchingRefinementCriterion","RefinerRecordId","RefinerSourceValue","DataTypeValue","LeftValueBoundString","getUpdatedRefinementCriteria","itemToggleNotification","currentRefinementCriteria","updatedRefinementCriteria","toggledItemFound","selectedCriterion","isSelecting","rangeStart","RightValueBoundString","rangeEnd","Text","TrueFalse","parentProductRefinerHierarchy","RefinerTypeValue","RefinerType","SingleSelect","Values","child","matchingIndex","findIndex","criterion","splice","RangeRefineItem","super","_formattedPriceReverseLookup","Map","_onRangeUpdate","bind","_onRangeUpdateEnd","_handleRangeTooltipText","_changeMin","_changeMax","_finishChangeMin","_finishChangeMax","minInput","maxInput","selectedRefinementCriterion","initialMin","initialMax","isChecked","validationErrorMin","validationErrorMax","selectedMin","selectedMax","touchedMin","touchedMax","UnitText","refineItemCommonProps","rangeType","_renderInputFields","_renderSlider","isDisabled","formAttrs","rangeNameFormat","replace","KeyName","minInputClassName","maxInputClassName","formattedSelectedMin","_getFormattedSelectedValue","formattedSelectedMax","minLabel","onChange","onFocus","onBlur","ref","maxLabel","placeholder","placeholderTextMax","min","sliderId","ariaAttributes","minPrice","_formatPrice","maxPrice","selectedMinPrice","selectedMaxPrice","Slider","inForm","Number","step","orientation","labels","labelId","labelString","labelPositioning","showLabels","showTooltip","sliderThumbs","minValueSliderThumbAriaLabel","ariaValueText","maxValueSliderThumbAriaLabel","onChangeEnd","debounce","handleTooltipText","_changeValue","inputType","selectedKey","touchedKey","_getInputWithoutFormatting","currentTarget","selectedMinValue","minTouched","onToggle","maxNum","isNaN","validationErrorNaN","_focus","_validateRange","selectedMaxValue","maxTouched","minNum","setTimeout","current","focus","selected","touched","validationError","validationErrorRange","amount","result","trace","priceAmount","minimumFractionDigits","e","warning","formatPrice","has","set","input","inputAsNum","get","sliderChangeNotification","eventType","firstThumbValue","secondThumbValue","_focusOnSliderThumb","element","document","getElementById","tooltip","__decorate","computed","observer","RefineItem","_onClick","preventDefault","anchorType","_this$props","children","attrs","_objectWithoutProperties","_excluded","JSON","stringify","isSingleSelect","itemTypeClassName","SourceValue","Rating","LeftValueBoundLocalizedString","_getRefinerUrl","tabIndex","Count","_this$props$selectedR","_productRefinerValue$","refinerRating","parseInt","ratingRefiner","selectedRefinerValues","selectedRating","ratingComponentClass","RatingComponent","avgRating","ratingCount","hideCount","readOnly","moduleTypeName","urlBuilder","ChoiceSummary","closeButtonGlyph","stopPropagation","clearAll","getAttribute","indexOf","selectedRefiner","_getSelectedRefinerChoice","onChoiceClicked","itemClicked","choiceClicked","nextItemToFocus","nextSibling","selectedRefinersMap","selectedChoices","_getKeyForRefinerValue","clearAllText","classNames","choiceAriaLabel","clearAllAttributes","item","listItemProps","choiceFormat","choiceRangeValueFormat","refinerHierarchy","overallFormat","rangeFormat","refinerValueName","refinerName","parent","hierarchy","_get","innerText","trim","ModalToggle","innerRef","modalNode","Modal","autoFocus","applicationNode","returnFocusRef","returnRef","isOpen","toggle","onModalToggle","zIndex","modalHeaderNode","ModalHeader","modalTitle","modalFooterNode","ModalFooter","Button","modalCloseButtonText","RefineSubmenu","_onToggleItem","_onToggleSubmenu","isExpanded","isExpandedOnInitialLoad","expanded","productRefinerHierarchy","app","hideRating","Collapse","timeout","_renderChildItems","_renderRange","_renderSingleMultiSelect","refinerValuesList","listItems","filter","selectedValue","_getRangeType","DisplayTemplateValue","DisplayTemplate","Range","SliderWithBars","onUpdateRefiners","prevState","ErrorMessage","SearchResultContainer","SearchResultContainer_1","_this$props$context$r2","sortByDropdownOptions","sortOptions","sortByOptionRelevanceDesc","sortByOptionNameAsc","sortByOptionNameDesc","sortByOptionPriceAsc","sortByOptionPriceDesc","sortByOptionRatingDesc","_pageType","urlTokens","pageType","expandrefinerCount","_getActivePrice","async","listPageState","activeProducts","productRecIds","ArrayExtensions","hasElements","prod","projectDomain","ChannelId","channelId","CatalogId","catalogId","affliations","customerInput","GetCustomerInput","customer","getCustomer","CustomerAffiliations","affliation","aff","AffiliationId","RetailAffiliationId","CustomerId","AccountNumber","getActivePricesAsync","callerContext","queryResultSettings","Date","then","activePricesResponse","productPrices","activePrice","ProductId","_activePrice$Customer","Price","catch","exception","debug","Error","_getSearchResultModal","modal","modalHeader","modalFooter","modalBody","ModalBody","SearchResultModal","modalIsOpen","_modalToggleRef","_toggleModal","_getCollectionTitle","collectionTitle","query","q","category","getFriendlyName","NameTranslations","productCountNumber","productCountText","totalProductCount","count","numberOfProducts","oneProduct","TitleContainer","titlePrefix","searchTextPrefix","titleText","titleCount","_getCategoryHierarchy","categoryHierarchy","CategoryHierarchyContainer","categoryHierarchyList","categoryLinkAriaLabel","Url","categoryHierarchySeparator","_getSortingDropDown","activeDropdown","_getCurrentlySelectedOption","sortingState","selectedSortByOption","SortingContainer","sortByDropDown","LabeledDropdown","labelClassname","labelText","sortByDropdownLabel","dropdownId","dropdownClassname","toggleColor","dropdownOptions","selectedOption","onSelectOption","_updateSortByDropdown","_sortAndFilterContainerRef","_getPagination","fullUrl","getCurrentUrl","itemsPerPage","skipCount","currentPageNumber","skip","totalItems","previousText","flipperPrevious","nextText","flipperNext","UncontrolledPagination","paginationAriaLabel","url","qsp","startingItem","previousAriaLabel","nextAriaLabel","_getRefineMenu","tempRangeTypeTODO","inputRange","validRefiners","refiners","refiner","activeRefiners","activeFilters","_getexpandRefinerCount","expandedRefiners","RefineMenuContainer","RefinerSectionContainer","_refineItemCommonProps","_onUpdateRefiners","_buildRefinerUrl","_getChoiceSummary","selectedRefiners","choiceSummaryLabel","_onChoiceClicked","_buildRefinerUrlForChoiceSummary","notification","window","history","pushState","buildListPageUrl","_getSortColumnFromSelectedOption","transaction","sortingCritera","Columns","option","searchConfiguration","mappedConfiguration","sortColumn","sortCriteria","activeSortColumn","parseQueryParam","activeMappedConfig","mappedSearchConfig","ColumnName","IsDescending","dropdownOption","newRefinementCriteria","dropdownElementId","dropdownElement","selectedChoice","isClearAll","refinerCount","all","one","two","three","four","_viewport","device","Type","_updateViewport","pending","validationErrorNotNumber","validationErrorNotRange","querySorting","sorting","parse","decodeURIComponent","pageSize","reaction","_this$props$context$r","GetFullProductsByCollectionInput","Paging","Top","Skip","Sorting","itemId","productId","includeAttributes","getCollectionProducts","productResults","ex","featureProduct","listPageStateFeature","isMobile","static","nameTranslations","nameTranslation","Language","toLowerCase","componentDidMount","_this$props$context$a","MsDyn365","isBrowser","addEventListener","enableAffiliationBasedPricing","user","isAuthenticated","componentWillUnmount","removeEventListener","searchProduct","errorText","breaCrumbType","breadcrumbType","resultCategoryNotFoundText","resultSearchNotFoundText","productsComponent","featureComponent","searchResultContainerViewProps","TitleViewProps","disableHierarchy","refineMenu","sortByOptions","pagination","ProductsContainer","ProductSectionContainer","CategoryNavContainer","RefineAndProductSectionContainer","choiceSummary","modalToggle","searchResultModal","errorMessage","FeatureSearchContainer","similarLookProduct","toggleModal","_getViewport","innerWidth","xs","w","sm","md","lg","observable","slice","keyId","Single","refinersToBeUpdated","refinersLists","split","_refinerName","RangeInput","sortingCriteraValues","sort","a","b","localeCompare","compressedRefinerKeys","sortingColumns","searchParams","compressedRefiners","compressedRefiner","refinerKey","compressRefiners","delete","URL","location","requestUrl","CittaRefiners","_onClearRefiners","_getSortingRefiner","sortByValues","_sortingCritera$Colum","sortingC","sortBy","DataValueType","RowNumber","_updateDropDown","dropdownOpen","type","_renderRefiners","refinersHeader","orderedRefiners","refinerCat","hiddenRefinersList","refinersToBeHidden","sortRefiner","submenu","CittaPicture","handleMoveHover","showHoverImg","handleMoveOut","_this$state","image1","image2","img1","img2","onMouseOver","onMouseOut","imageOrientation","onlineTags","salesLineTag","productImage1","productImage2","stockAvailabilities","ExtensionProperties","property","Key","Value","StringValue","_property$Value","_property$Value2","name","IntegerValue","AttributeValues","TextValue","tagsToIgnore","includes","salesLineTagKey","generateImageUrl","setTelemetryAttribute","pid","pname","mname","productImageSettings","_getLandscapeImageSettings","_renderLabel","AverageRating","toLocaleLowerCase","backgroundColor","_renderProductPlacementImage","_renderPrice","_renderSalesLineTag","_renderDescription","Description","_renderRating","TotalRatings","_renderAvailabilities","sA","match","join","rating","ratingLabel","roundedRating","toFixed","description","totalRatings","numRatings","basePrice","adjustedPrice","PriceComponent","cmsImageSettings","viewports","h","xl","disableLazyLoad","lazyload","getImageOrientation","createSearchResultModal","modalProps","createModalBody","renderRefineMenu","renderCategoryHierarchy","renderTitle","display","_props$context","liClass","platform","enableDefaultOrderQuantityLimits","renderProducts","SuggestionType","AutoSuggestInput","searchText","top","suggestionType","hitPrefix","hitSuffix","getCacheKey","getCacheObjectType","dataCacheType","searchQuery","topResultsCount","_getAutoSuggest","autosuggest","ctx","searchCriteria","ProductSearchCriteria","SearchCondition","Context","HitPrefix","HitSuffix","searchSuggestions","getSearchSuggestionsAsync","ImageUrl","AllSearchResults","createObservableDataAction","action","autoSuggestPromises","Promise","inputData","KeywordSuggestionsComponent","suggestions","reactNodes","_assembleNode","RegExp","Id","_generateLink","_getHighlightedText","suggestion","searchPageURL","searchQsp","formattedLink","route","formattedText","dangerouslySetInnerHTML","getRichTextHtml","ProductSuggestionsComponent","autoSuggestProps","productSuggestionHeading","_renderTitle","productAutoSuggestionHeading","Value3","DecimalValue","LiProduct","_getLiWrapper","AProduct","_getAWrapper","recid","CategorySuggestionsComponent","categorySuggestionHeading","categoryAutoSuggestionHeading","splitValue","pop","_getCategoryLink","searchRefiners","urlPath","categoryRefiners","encodedRefiner","encodeURIComponent","FormComponent","searchPlaceholder","hideSearchLabel","isSearchFormExpanded","searchTextInput","handleInputChange","maxChars","disableSubmitSearch","handleCancelSearchChange","handleSearchClick","ariaLabelCancel","ariaLabelSearch","ariaLabelSubmit","onInputChange","inputNode","maxLength","submitBtnNode","searchBtnNode","cancelBtn","submitBtn","searchBtn","LabelComponent","searchLabelClass","searchLabelArialLabel","searchtext","searchCollapsedLabel","Search","waitTime","_focusOutTarget","closest","_clearAutoSuggestState","_keyup","keyCode","KeyCodes","Escape","body","classList","formReference","contains","autoSuggestResultDiv","searchState","defaultBasicSearchUrl","searchQueryStringParameter","update","createSearchStateInput","_handleSearchClick","console","log","updatedIsSearchFormExpanded","headerElem","querySelector","add","documentElement","scrollTop","remove","_handleInputChange","cancellabelDebounce","cancel","_debounce","getSearchSuggestionsAction","_getSuggestionType","inputSuggestionType","results","_getSearchRefiners","autoSuggestAriaLabel","_setAutoSuggestResultCount","suggestionTypes","distinctSuggestionTypes","suggestionTypeItem","charAt","toUpperCase","_handleSubmit","searchURL","_appendQueryParams","getUrlSync","_handleCancelSearchChange","isInitialState","autoSuggestResultScreenReaderDiv","ariaLiveRegion","suggestResultString","autoSuggestFoundMessage","emptyResultString","noAutoSuggestionMessage","setAttribute","searchKeywordSuggestClass","searchProductSuggestClass","searchCategorySuggestClass","inSearchMode","searchInputMaxLength","suggestionTypeCriterion","searchFormClass","searchBtnClass","componentDidUpdate","params","isEditor","cancelBtnAriaLabel","searchBtnAriaLabel","submitBtnAriaLabel","searchplaceholderText","keywordSuggestions","i","Keyword","None","productSuggestions","Product","categorySuggestions","Category","AutoSuggestAriaLabel","AutoSuggestAriaLabelText","AutoSuggest","KeywordSuggest","ProductSuggest","CategorySuggest","SearchForm","SearchBtn","BtnWrapper","FormWrapper","autoComplete","onSubmit","UlKeyword","UlProduct","UlCategory","searchLabel","searchLabelText","form","autosuggestKeyword","autosuggestProduct","autosuggestCategory","callbacks","getProductSearchRefinersAsync","_renderButton","_renderForm","_renderKeywordSuggestions","_renderProductSuggestions","_renderCategorySuggestions","PickUpAtStoreComponent","PickUpAtStore","EmailDeliveryComponent","_ref2","EmailDelivery","LineItemComponent","_ref3","LineItem","pickUpAtStore","emailDelivery","LineItemGroupComponent","_ref4","LineItemDeliveryGroup","LineItemList","heading","lineItems","lineItem","LineId","LineItemsComponent","_ref5","LineItems","Header","editLink","itemsForPickup","itemsForShip","itemsForEmail","_renderOrderSummarylines","isB2B","orderSummary","lines","subtotal","_props$data$checkout$10","checkout","checkoutCart","cart","CartLines","Quantity","OrderSubTotal","subTotalLabel","_renderSubTotal","totalDiscounts","_props$data$checkout$6","chargeLines","ChargeLines","chargeAmountInclTax","_props$orderSummary","chargeLine","IsShipping","chargeAmountInclTaxLocal","GrossAmount","shipping","shippingLabel","_renderShippingInclTaxes","_props$data$checkout$","_props$data$checkout$2","_props$data$checkout$3","_props$data$checkout$4","_props$data$checkout$5","ChargeAmount","shippingCharges","ShippingChargeAmount","otherChargesAmountFromLines","totalChargeAmountFromLines","chargesOverriden","displayOtherChargesAmount","shippingChargesFromLines","freightChargeCode","CalculatedAmount","ChargeCode","_renderOtherCharges","hideTaxLine","tax","_props$data$checkout$11","OrderTotal","TotalAmount","totalAmountLabel","_renderTotalOrder","loyalty","giftCard","orderTotal","_props$data$checkout$7","DiscountAmount","totalSavingsLabel","_renderTotalSavings","_props$data$checkout$8","_props$data$checkout$9","shippingAmount","DeliveryModeChargeAmount","AmountDue","freeShippingAmount","ceil","_renderFreeShippingMessage","_getCheckoutSummaryText","paragraph","_props$context2","canShow","checkoutProps","headerProps","hasSalesOrder","bodyProps","mainProps","mainControlProps","sideProps","sideControlFirstProps","sideControlSecondProps","termsAndConditionsProps","orderConfirmation","loading","alert","guidedForm","placeOrderButton","termsAndConditions","keepShoppingButton","isBusy","decodeURI","search","urlParams","URLSearchParams","orderToken","PromoCode","_onInputChange","promoCodeInputValue","canApply","_applyPromotion","cartState","appliedPromo","addPromoCode","promoCode","status","substatus","duplicatePromoCodeErrorText","invalidPromoCodeErrorText","failedToAddPromoCodeErrorText","promoPlaceholderText","promoCodeApplyButtonText","disabled","_removePromotion","code","removePromoCodes","promoCodes","failedToRemovePromoCodeErrorText","_calculateDiscount","discountAmount","line","DiscountLines","discountLine","DiscountCode","DiscountCost","_renderAppliedPromoCode","Coupons","appliedPromoCodeHeadingText","coupon","removePromoAriaLabelFormat","removePromoText","Code","isCollapseOpen","promoCodeHeadingText","renderLabel","arguments","renderPrice","renderRating","_renderCarousel","carouselContainer","PropDetails","_renderProduct","_renderGrid","gridContainer","orientationClass","_property$Name","ProductCollectionContainer","SingleSlideCarouselComponentProps","GridComponentProps","isCarousel","productCollection","BulkPurchase","collapseRef","_dimensionDropDownChange","_this$collapseRef$cur","reEvaluateHeight","_toggleCollapse","_this$props$data$prod","hasDimensionsInProps","productDimensions","hasDimensionsInData","container","content","_renderCollapseContent","_renderCollapseButton","_renderCollapse","bulkPurchaseHeaderTitle","_renderMainContent","isMobileDevice","variant","VariantType","Viewport","RichTextComponent","bulkPurchaseDescriptionText","_renderMatrix","_featureState$result","_this$props$data$orde","_this$props$data$cust","featureState","isMultipleCatalogsFeatureEnabled","IsEnabled","getCatalogId","validateCatalogId","ProductDimensionsMatrix","dimensions","orderTemplates","customerInformation","dimensionOnChange","isMultipleCatalogFeatureEnabledInHq","BulkPurchaseViewComponent","HeaderPreferredStore","modalCloseButtonRef","handleClick","_findPreferredStoreOnClick","storeSelectorStateManager","slots","storeSelector","storeName","preferredStore","StoreName","headerPreferredStoreText","color","headerPreferredStoreAriaLabel","modules","storeSelectorId","keys","openDialog","showMapViewLink","parentElementRef","onLocationSelected","orgUnitLocation","resolve","Logo","_renderLogo","rel","_renderImage","image","imagePropertyName","shouldSkipToMainImage","NavIcon","toggleNavBar","mobileHamburgerAriaLabel","targetId","isB2BSite","_this$props$config$my","myAccountLinks","popOverRef","_toggleNavbar","_togglePopover","_keydown","mobileMenuCollapsed","signinPopoverOpen","hasSigninerror","isChannelTypeB2B","displayName","workerName","customerName","_this$props$data$empl","worker","employee","_this$props$data$acco","accountInformation","FirstName","signUpCustomerNotFoundTitle","signUpMultipleCustomerFoundTitle","signInCustomerNotAuthorizedTitle","closeNotificationLabel","signinNotificationError","_getSigninNotification","NotificationsManager","instance","addNotification","ErrorNotification","wishlists","cartLabel","cartQtyLabel","logoLink","logoImage","shouldShowWishlistCount","disableTooltip","headerToggleClass","headerClassName","navbarKey","cartIconSlot","_getSlot","menuBarSlot","searchSlot","wishlistCount","siteOptionsSlot","preferredStoreSlot","currentDistributorSlot","CommerceListLines","logo","wishListIconDesktop","WishListIconComponent","showButtonTooltip","wishlistTooltipText","wishlistCountLabel","isDispayWishlistCount","wishListIconMobile","cartIcon","CartIconComponent","navIcon","menuBar","siteOptions","HeaderTag","headerAriaLabel","HeaderContainer","HeaderTopBarContainer","Divider","MobileMenuContainer","wrapClassName","MobileMenuHeader","MobileMenuBodyContainer","MobileMenuLinksContainer","AccountInfoDropdownParentContainer","AccountInfoDropdownPopoverConentContainer","Popover","placement","signInLink","_getSigninButton","signOutLink","_getSignOutButton","isOBORequest","switchCustomerLink","_getSwitchCustomerButton","accountInfoDropdownButton","_getAccountInfoDropdownButton","accountLinks","_getAccountLinks","currentDistributor","slotName","SignIn","signInLinkText","signInUrl","signInLinkAriaText","_user$signOutUrl","SignOut","signOutLinkText","signOutUrl","signOutLinkAriaText","SwitchCustomer","isOBOAccountSelected","cookies","getAccountSelectionCookie","switchCustomerLinkAriaText","switchCustomerLinkText","getBusinessPartnerSelectionUrl","removeAccountSelectionCookie","shoppingAsText","param","retailServerErrorCode","signUpCustomerNotFound","signUpMultipleCustomerFound","signInCustomerNotAuthorized","retailServerErrorMessage","MyProfile","cta","_renderReactFragment","slot","_renderDesktopAccountBlock","ProductCollection","handleHeadingChange","_getProductsDimensionsAvailabilities","dimensionsToDisplayOnProductCard","dimensionsInProductCard","dimensionsToDisplayAsSwatch","dimensionsAsSwatchType","validProducts","validValues","DimensionTypes","none","productsDimensionAvailabilities","getDimensionAvailabilitiesForProductSearchResultAction","DimensionAvailabilitiesForProductSearchResultInput","DimensionSwatchDisplayTypes","productCard","initProductState","productCollectionProducts","equals","_getProduct","_this$props$data$feat","_this$state$productsD","quickviewSlot","quickview","productComparisonButtonSlot","productComparisonButton","reviewCountAriaLabelValue","ratingCountAriaLabel","ratingCountAriaLabelSingleUser","isPriceMinMaxEnabled","priceResources","priceRangeSeparator","ProductContainer","productComponent","quickViewButton","dimensionAvailabilities","dimensionAvailability","_product$MasterProduc","masterProductId","MasterProductId","productsList","getPriceForProductSearchResult","PriceForProductSearchResultInput","_getSeeAllButton","recommendation","headingLabel","searchPageLink","seeAllButtonText","shouldDisplaySeeAllButton","recommendationListId","layout","headingComponent","updatedProducts","getProductData","ObjectExtensions","isNullOrUndefined","productCollectionViewProps","SingleSlideCarousel","flipperPrevLabel","flipperNextLabel","parentId","seeAllButton","bannerText","bannerAriaLabel","promoBannerTextProps","promoBannerLinksProps","promoBannerText","carouselProps","AddToCartProductListComponent","_quickOrderTemplate$q","_quickOrderTemplate$q2","quickOrderTemplate","quickOrderTemplateLines","fullProduct","ProductDetails","quantity","productListLine","buttonLabel","quickOrderGridBuySelectedButtonText","buttonAriaLabel","quickOrderGridBuySelectedButtonAriaLabel","dialogStrings","_props$resources$quic","_props$resources$quic2","_props$resources$quic3","_props$resources$quic4","_props$resources$quic5","_props$resources$quic6","_props$resources$quic7","_props$resources$free","_props$resources$orig","_props$resources$curr","_props$resources$adde","_props$resources$quic8","_props$resources$quic9","goToCartText","quickOrderGridGoToCartText","continueShoppingText","quickOrderGridDialogCloseText","quickOrderGridBuySelectedAddingToCartErrorNotificationCloseAriaLabel","headerItemOneText","quickOrderGridSingleItemText","headerItemFormatText","quickOrderGridMultiLineItemFormatText","headerLinesFormatText","quickOrderGridMultiLinesFormatText","headerMessageText","quickOrderGridHeaderMessageText","addedQuantityText","buyAgainNotificationTitle","quickOrderGridBuySelectedAddingToCartErrorNotificationTitle","buyAgainNotificationCloseAriaLabel","getDialogStrings","orderDetailProducts","quickOrder","orderDetails","quickLine","_quickLine$fullProduc","salesLine","OrderDetailsProduct","getOrderDetails","AddToCartComponent","addToCartText","outOfStockText","addToCartArialLabel","navigationUrl","shouldSkipSiteSettings","orderDetailsProducts","getQuickOrderGridAddToCartDialog","moduleClassName","removeActionHandler","handlers","removeProductList","productList","removeQuickOrderList","QuickOrderGridDrawer","_props$collapseProps$","_props$collapseProps","_isManuallyToggled","previousState","collapseProps","_drawerGlyphClass","toggleGlyphClassName","closeGlyph","isAnimateGlyph","_drawerOpenGlyph","openGlyph","_drawerCloseGlyph","shouldComponentUpdate","nextProps","nextState","drawerClass","drawerButtonClassName","toggleButtonProps","block","_generateDrawerButtonInnerMarkup","isCollapseState","drawerButtonTextClass","toggleButtonClassName","headingDrawerClass","descriptionDrawerClass","moduleHeadingText","moduleDescriptionText","_generateGlyphMarkup","glyphClass","QuickOrderGridFormComponent","productTextInput","quantityTextInput","quickOrderGridState","maxQuantity","isAddtoListDisabled","ariaLabelQuantity","ariaLabelProduct","ariaLabelAddtoCart","handleQuantityChange","handleAddProductListClick","onInputChangeFunction","onQuantityInputChange","onQuantityChangeFunction","productNode","quantityNode","pattern","addToListBtn","userMessage","stateMessage","Alert","statusCssString","messageGlyph","messageText","QuickOrderGridProduct","productLine","isSelected","QuickOrderGridDesktopHeaderCellsComponent","columnWithNumberClassName","quickOrderGridProductNumberText","quickOrderGridProductText","quickOrderGridUnitPriceText","quickOrderGridUnitOfMeasureText","quickOrderGridQuantityText","quickOrderGridActionsText","QuickOrderGridMobileHeaderCellsComponent","QuickOrderGridTableHeaderComponent","rowClassName","headerCells","defaultImageSettings","cropFocalRegion","QuickOrderGridTableRowProductImageComponent","_props$data$product$p","_props$context$reques","_product$PrimaryImage","_props$imageSettings","fallbackImageUrl","OmniChannelMedia","containerClassName","setShowPreviousActions","onChangeHandler","onChangeQuantity","itemKey","newValue","onRemoveHandler","onRemoveItem","quickOrderGridProductKey","QuickOrderGridExtraActionsPopupComponent","_props$data$product$p2","quickOrderGridViewDetailsButtonAriaLabel","quickOrderGridViewDetailsButtonText","shouldShowActions","setShowActions","useState","StringExtensions","isNullOrWhitespace","onClickViewDetails","shouldShowActionsNewValue","actionsContainerClassName","quickOrderGridRemoveItemButtonAriaLabel","QuickOrderGridDesktopTableRowCellComponent","_props$data$product$p3","_product$Dimensions","_productListLine$Line","Dimensions","dimension","_dimension$DimensionV","DimensionValue","dimensionValue","quickOrderGridProductDimensionsSeparator","renderProductPrice","isNullOrEmpty","UnitOfMeasure","renderUnitOfMeasure","IncrementalQuantity","currentCount","inputQuantityAriaLabel","quickOrderGridInputQuantityAriaLabel","decrementButtonAriaLabel","quickOrderGridDecrementButtonAriaLabel","incrementButtonAriaLabel","quickOrderGridIncrementButtonAriaLabel","isGiftCard","IsGiftCard","QuickOrderGridMobileTableRowCellComponent","_props$data$product$p4","_productListLine$Line2","QuickOrderGridTableRowComponent","QuickOrderGridTableComponent","setIsMobile","isMobileView","quickOrderGridProducts","updateViewport","quickOrderProduct","_quickOrderProduct$pr","_quickOrderProduct$pr2","ProductPrice","callBacks","QuickOrderGrid","_waitTime","_dimensionUpdateQueueMaxLength","_errorCssClass","_errorCssGlyphClass","_dimensionUpdateQueue","FinitePromiseQueue","_dimensions","_cssClassNameConfigure","_className","_quickOrderGridCallbacks","dimensionSelectedAsync","selectedDimensionId","selectedDimensionValueId","enqueue","_updateDimensions","FinitePromiseQueueError","ProcessWasDiscardedFromTheQueue","getDropdownName","dimensionType","_getDropdownName","changeUpdatingDimension","isUpdatingDimension","_quickOrderGridRowCallbacks","_removeItemRowFromTable","productListLineId","_changeRowQuantity","_removeProductList","token","ProductListsDataActions","reload","_updateStatusState","quickOrderGridDeleteProductListFailedText","productResponse","_cancellabelDebounce","isQuickOrderGridFormExpanded","getScanResult","GetScanResultInput","ProductDimensionFull","_handleQuantityChange","currentValue","inputElement","_quantityInput","HTMLInputElement","_this$state$productRe","ProductDimensionType","Color","productDimensionTypeColor","Configuration","productDimensionTypeConfiguration","Size","productDimensionTypeSize","Style","productDimensionTypeAmount","productDimensionTypeStyle","hasProductDimensions","dimensionsToUpdate","productDimensionErrorState","otherError","clearOtherErrorState","dimensionKey","configureErrors","errorState","mappedDimensions","_this$_updateDimensio","DimensionTypeValue","_updateDimensionValue","selectedProduct","newProduct","getSelectedVariant","SelectedVariantInput","getDimensionsForSelectedVariant","GetDimensionsForSelectedVariantInput","variantProduct","productDimensionFull","newValueId","DimensionValues","_getDimensionErrorString","dimensionTypeValue","amountErrorMessage","quickOrderGridproductDimensionTypeAmountErrorMessage","quickOrderGridproductDimensionTypeColorErrorMessage","quickOrderGridproductDimensionTypeConfigurationErrorMessage","quickOrderGridproductDimensionTypeSizeErrorMessage","quickOrderGridproductDimensionTypeStyleErrorMessage","_validateCart","_productResponse$Dime","missingDimensions","_getConfigureErrors","quickOrderGridWrongQuantityErrorMsg","quickOrderTemplateLinesData","orderLineIndex","newProductListLine","previousQuantity","list","newLine","updatedLines","updatedProductList","ProductListLines","ActiveProductListInput","ProductListId","_addItemToProductListLine","quickOrderGridAddedToGridSuccessMessage","quickOrderGridAddedToGridFailureMessage","quickOrderGridAddedToGridDuplicateError","productListId","_productResponse$Defa","_createProductList","AddItemToProductListInput","DefaultUnitOfMeasure","addItemToProductListAction","CreateProductListInput","ProductListType","QuickOrder","createProductList","_productTextInput","_telemetryContent","_quickOrderGridFormClass","_quickOrderGridFormProductContent","_quickOrderGridFormMsgContent","customerInfo","quickOrderGridModuleHeading","quickOrderGridModuleDescription","quickOrderGridAddtogrid","quickOrderGridProductQuantityInputLabel","quickOrderGridProductInputLabel","quickOrderGridProductDimensionTypeColor","quickOrderGridProductDimensionTypeConfiguration","quickOrderGridSelectDimensionFormatString","quickOrderGridProductDimensionTypeSize","quickOrderGridProductDimensionTypeStyle","quickOrderGridProductDimensionTypeAmount","quickOrderGridModulePageHeading","productConfigureResources","selectDimensionFormatString","header","Heading","quickOrderGridProps","isB2bCustomer","IsB2b","actions","drawer","bulkPurchase","_renderBulkPurchase","quickOrderGridForm","quickOrderGridFormProductContent","quickOrderGridFormMsgContent","configure","getProductConfigure","_renderListContainer","orderActions","_renderQuickOrderGridActions","quickOrderGridDeleteButtonText","addProductListToBag","QuickOrderGridActionsView","isBulkPurchaseEnabled","bulkPurchaseSlots","containerClass","_renderQuickOrderTable","_initQuickOrderGridProducts","quickOrderGridProduct","tableClassName","renderConfigureDropdown","dropdown","containerProps","labelContainerProps","errors","select","renderConfigure","dropdowns","renderForm","quickOrderForm","quickOrderProductContent","quickOrderMessageContent","HistogramItems","ratingsSummary","totalRatingsCount","renderItem","star5Count","star4Count","star3Count","star2Count","star1Count","stars","totalCount","percentage","formattedPercent","barItemAriaLabel","starLabel","bar","Progress","buttonProps","AverageRatingNumber","summary","averageRating","TotalReviews","RatingsHistogram","selectFilterBy","completeClass","classname","histogramItems","averageRatingAriaLabel","averageNumber","totalReviews","ratingsSummaryProps","histogramProps","filterKey","createRatingsReviewsStateInput","histogramItem","_this$props$context","channelInventoryConfigurationId","productListInventoryDisplay","ProductListInventoryFilteringOptions","HideOOS","choice","closeAriaLabel","refinerValues","filterValue","_context$request$app","featureSimilarDescriptionTitle","getInventoryLabel","inventoryAttribute","inventoryLabel","swatchItemAriaLabel","_selectedRefinementCr","_this$props$selectedR2","_this$props$selectedR3","_this$props$selectedR4","getLabels","getSliderThumbs","sliderKey","_this$props$minValueS","_this$props$maxValueS","String","minValue","maxValue","sliderKeyString","previousProps","updateSliderProps","_this$props$selectedR5","_this$props$selectedR6","_this$props$selectedR7","_this$props$selectedR8","_this$props$parentPro","_this$props$parentPro2","productCountAriaLabel","singleProductCountAriaLabel","refineItemAriaLabel","refineItemsAriaLabel","productText","productCount","refineMenuItemAriaLabel","shouldDisplayAsSwatch","_getShouldDisplayAsSwatch","hasColor","SwatchColorHexCode","hasImage","SwatchImageUrl","hasContentSwatch","_renderSwatch","checkIfShouldDisplayAsSwatch","_productRefinerValue$2","swatchItems","colorHexCode","SwatchComponent","isSelectionEnabled","isRefineItem","ratingUserCountAriaLabel","ratingSingleUserCountAriaLabel","_productRefinerValue$3","defaultChkProductCount","productCountAriaLabelValue","sortByOptionBestSelling","sortByOptionNewScore","sortByOptionTrendingScore","defaultPageNumber","isListPageStateUpdated","_isMounted","_updateVariantAvailability","_updateListPageState","_this$props$config$it","_this$props$config$it2","hydrateRefinersFromUrl","_this$props$data$list","_this$props$data$list2","_this$props$data$list3","_this$props$data$list4","_this$props$context$r3","_getAllSortByOptions","_renderPrev","_renderNext","updateRefinerPanel","_shouldHideFromRefiners","_this$props$data$prod2","_this$props$data$prod3","_this$props$data$prod4","channelInventoryConfiguration","isInventorySortableAttribute","inventoryAwareSortableAttributeId","ProductAvailabilitySortableAttributeRecordId","isInventoryProductAttribute","InventoryProductAttributeRecordId","_this$props$data$refi","_getProducts","_this$props$slots","_this$props$data$prod5","shouldAllowBackNavigation","breadCrumbType","shouldAllowBack","isPriceMinMaxFeatureState","_getSortCriteriaColumn","_this$props$data$list5","queryColumns","mappedSearchConfiguration","_this$props$data$list6","paginationPreviousText","paginationNextText","_nameTranslation","_this$props$context$a2","StoreOperationsDataActions","_listPageState$active","_listPageState$sortin","_newListPageState$cur","_newListPageState$sor","_newListPageState$act","_this$props$context$r4","_this$props$context$r5","_this$props$context$r6","newListPageState","recordId","Recommendation","_newListPageState$cur2","_newListPageState$sor2","_newListPageState$act2","_this$props$context$r7","_this$props$context$r8","refinerInput","RefinersByCollectionInput","getCollectionRefinersAction","_listPageState$result","_listPageState$result2","_this$props$context$r9","_this$props$data$list7","_this$props$data$list8","Browser","isRecoSearchPage","renderSort","renderRefiner","renderTitleCount","_props$context$action","SearchState"],"sourceRoot":""}