{"version":3,"file":"static/js/d74a8f02f7d5e3ba6690.bundle.js","mappings":"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","sources":["webpack://Msdyn365.Commerce.Online/./src/themes/cirrus/views/search-result-container.view.tsx?587d","webpack://Msdyn365.Commerce.Online/./lib/search-result-container/module-registration.js?8625","webpack://Msdyn365.Commerce.Online/./src/modules/fabrikam/views/search-result-container.view.tsx?89df","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/actions/base-collection-action.ts?ec13","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/actions/get-full-products-by-collection.ts?f1fe","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/actions/get-mapped-search-configuration.ts?6cc4","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/actions/get-product-refiner-hierarchy.ts?3937","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/actions/get-refiners-for-collection.ts?56d8","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/actions/get-inventory-refiners.ts?eaa4","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/actions/url-utils.ts?1541","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/list-page-state.ts?b0a4","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/utilities.ts?8569","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/choice-summary.tsx?3f71","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/error-message.tsx?6302","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/feature-search-result-item.tsx?71fa","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/link.tsx?52c2","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/modal.tsx?d78e","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/product-search-result-items.tsx?5174","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/range-refine-item.tsx?6288","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/refine-item.tsx?a594","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/refine-submenu.tsx?1292","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/separator.tsx?4ea6","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/title.tsx?c269","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/search-result-container.tsx?7500","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/search-result-container.view.tsx?b779","webpack://Msdyn365.Commerce.Online/./src/modules/adventureworks/views/search-result-container.view.tsx?6e86","webpack://Msdyn365.Commerce.Online/external var \"React\"?0d3b","webpack://Msdyn365.Commerce.Online/external var \"ReactDOM\"?853b"],"sourcesContent":["/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { IPriceComponentResources } from '@msdyn365-commerce/components';\r\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n ICategoryHierarchyViewProps,\r\n IRefineMenuViewProps,\r\n ISearchResultContainerViewProps,\r\n ISearchResultModalViewProps,\r\n ISortByViewProps,\r\n ITitleViewProps\r\n} from '@msdyn365-commerce-modules/search-result-container';\r\nimport { Button, getTelemetryObject, Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport React, { useState } from 'react';\r\n\r\nimport { ISearchResultContainerProps } from '../definition-extensions/search-result-container.ext.props.autogenerated';\r\nimport { ProductComponent } from './components/product.component';\r\n\r\n/**\r\n * DescriptionInterval.\r\n */\r\nenum DescriptionInterval {\r\n productDescriptionInterval = 14,\r\n productDescriptionIntervalRemainder0 = 0,\r\n productDescriptionIntervalRemainder9 = 9\r\n}\r\n\r\n/**\r\n * Render Clear button for mobile viewport.\r\n * @param props - The view props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderProductCards = (props: ISearchResultContainerViewProps & ISearchResultContainerProps<{}>): JSX.Element | null => {\r\n return (\r\n \r\n {props.errorMessage}\r\n {props.products}\r\n \r\n );\r\n\r\n};\r\n\r\n/**\r\n * Returns the product inventory label.\r\n * @param channelInventoryConfigurationId - The channel configuration Id.\r\n * @param product - The product.\r\n * @returns The inventory label.\r\n */\r\nfunction getInventoryLabel(channelInventoryConfigurationId: number | undefined, product: ProductSearchResult): string | undefined {\r\n if (!channelInventoryConfigurationId || !ArrayExtensions.hasElements(product.AttributeValues)) {\r\n return undefined;\r\n }\r\n const inventoryAttribute = product.AttributeValues.find(attribute => attribute.RecordId === channelInventoryConfigurationId);\r\n if (inventoryAttribute) {\r\n return inventoryAttribute.TextValue;\r\n }\r\n return undefined;\r\n}\r\n\r\n/**\r\n * Render Clear button for mobile viewport.\r\n * @param props - The view props.\r\n * @param product - The product item data.\r\n * @param index - The index of each product item.\r\n * @param isEnabledProductDescription - The flag for showing Product desription tile.\r\n * @returns The JSX Element.\r\n */\r\nconst renderProductCardsDescription = (\r\n props: ISearchResultContainerViewProps & ISearchResultContainerProps<{}>,\r\n product: ProductSearchResult,\r\n index: number,\r\n isEnabledProductDescription?: boolean): JSX.Element | null => {\r\n const { config, context, resources } = props;\r\n const telemetryContent = getTelemetryObject(props.context.request.telemetryPageName!, props.friendlyName, props.telemetry);\r\n const breadCrumbType = props.context.app.config.breadcrumbType;\r\n const isAllowBack = props.config.allowBackNavigation && (breadCrumbType === 'back' || breadCrumbType === 'categoryAndBack');\r\n const classname = isEnabledProductDescription ? 'ms-product-search-result__item product__description' : 'ms-product-search-result__item';\r\n const quickviewslot = ArrayExtensions.hasElements(props.slots.quickview) ? props.slots.quickview[0] : undefined;\r\n const channelInventoryConfigurationId = props.data.products.result?.channelInventoryConfigurationId;\r\n const isPriceMinMaxFeatureState = props.data.featureState.result?.find(\r\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailSearchPriceRangeFeature');\r\n const priceResources: IPriceComponentResources = {\r\n priceRangeSeparator: resources.priceRangeSeparator\r\n };\r\n return (\r\n
  • \r\n \r\n
  • \r\n );\r\n};\r\n\r\n/**\r\n * Render Clear button for mobile viewport.\r\n * @param props - The view props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderProducts = (props: ISearchResultContainerViewProps & ISearchResultContainerProps<{}>): JSX.Element | null => {\r\n const products = props.data.listPageState.result?.activeProducts;\r\n if (!products || !ArrayExtensions.hasElements(products)) {\r\n return null;\r\n }\r\n const productDescriptionInterval: number = DescriptionInterval.productDescriptionInterval;\r\n const productDescriptionIntervalRemainder0: number = DescriptionInterval.productDescriptionIntervalRemainder0;\r\n const productDescriptionIntervalRemainder9: number = DescriptionInterval.productDescriptionIntervalRemainder9;\r\n return (\r\n \r\n {props.errorMessage}\r\n \r\n \r\n );\r\n};\r\n\r\n/**\r\n * Render Title Count.\r\n * @param props - The title view props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderTitleCount = (props: ITitleViewProps): JSX.Element | null => {\r\n const { title, TitleContainer } = props;\r\n return (\r\n \r\n {title.titleCount}\r\n \r\n );\r\n};\r\n\r\n/**\r\n * Render Category Hierarchy.\r\n * @param props - The category hierarchy view props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderCategoryHierarchy = (props: ICategoryHierarchyViewProps): JSX.Element | null => {\r\n const { CategoryHierarchyContainer, categoryHierarchyList, categoryHierarchySeparator } = props;\r\n if (categoryHierarchyList) {\r\n return (\r\n \r\n {categoryHierarchyList.map((category, index) => (\r\n \r\n {category}\r\n {categoryHierarchyList[index + 1] && categoryHierarchySeparator}\r\n \r\n ))}\r\n \r\n );\r\n }\r\n\r\n return null;\r\n};\r\n\r\n/**\r\n * Render the category page items.\r\n * @param props - The view props.\r\n * @returns The search Result container module view.\r\n */\r\nconst SearchResultContainerView: React.FC> = props => {\r\n const { SearchResultContainer, pagination, ProductSectionContainer, choiceSummary, isMobile, modalToggle, searchResultModal, TitleViewProps,\r\n refineMenu, categoryHierarchy, sortByOptions, CategoryNavContainer, RefineAndProductSectionContainer, FeatureSearchContainer,\r\n similarLookProduct, errorMessage, resources } = props;\r\n const [isExpanded, setIsExpanded] = useState(false);\r\n const toggle = () => {\r\n setIsExpanded(!isExpanded);\r\n };\r\n const isRecoSearchPage = props.context.actionContext.requestContext.query?.recommendation;\r\n if (isMobile) {\r\n return (\r\n \r\n {similarLookProduct ? null : \r\n {renderCategoryHierarchy(categoryHierarchy)}\r\n {renderTitle(TitleViewProps)}\r\n {renderTitleCount(TitleViewProps)}\r\n }\r\n {choiceSummary}\r\n \r\n {modalToggle}\r\n \r\n {createSearchResultModal(searchResultModal, refineMenu, sortByOptions, isRecoSearchPage)}\r\n \r\n {similarLookProduct}\r\n \r\n {errorMessage}\r\n {props.config.enableProdutDescription ? renderProducts(props) : renderProductCards(props)}\r\n {pagination}\r\n \r\n );\r\n }\r\n return (\r\n \r\n {similarLookProduct ? null : \r\n {categoryHierarchy && renderCategoryHierarchy(categoryHierarchy)}\r\n {TitleViewProps && renderTitle(TitleViewProps)}\r\n {TitleViewProps && renderTitleCount(TitleViewProps)}\r\n }\r\n \r\n {similarLookProduct}\r\n \r\n \r\n \r\n \r\n { \r\n \r\n {resources.filterText}\r\n \r\n
    \r\n {choiceSummary}\r\n
    \r\n
    \r\n {sortByOptions && !isRecoSearchPage && renderSort(sortByOptions)}\r\n
    \r\n
    }\r\n {refineMenu && isExpanded && renderRefiner(refineMenu)}\r\n {refineMenu && isExpanded &&\r\n
    \r\n \r\n
    }\r\n
    \r\n\r\n \r\n {errorMessage}\r\n {props.config.enableProdutDescription ? renderProducts(props) : renderProductCards(props)}\r\n {pagination}\r\n \r\n
    \r\n
    \r\n );\r\n};\r\n\r\n/**\r\n * Render Search result Modal.\r\n * @param modalProps - The Search Result Modal view props.\r\n * @param refineMenu - The Refine Menu view props.\r\n * @param sortByDropDown - The Sort by view props.\r\n * @param isRecoSearchPage - The recomandation search page flag.\r\n * @returns The JSX Element.\r\n */\r\nconst createSearchResultModal = (modalProps: ISearchResultModalViewProps, refineMenu: IRefineMenuViewProps, sortByDropDown: ISortByViewProps,\r\n isRecoSearchPage?: string): JSX.Element => {\r\n return React.cloneElement(modalProps.modal, {}, modalProps.modalHeader, createModalBody(modalProps, refineMenu, sortByDropDown,\r\n isRecoSearchPage), modalProps.modalFooter);\r\n};\r\n\r\n/**\r\n * Render Refiner Mobile.\r\n * @param props - The Refine Menu view props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderRefinerMobile = (props: IRefineMenuViewProps): JSX.Element | null => {\r\n const { refiners, RefineMenuContainer, RefinerSectionContainer } = props;\r\n if (refiners) {\r\n return (\r\n \r\n \r\n {refiners.map((submenu, index) => (\r\n \r\n {submenu}\r\n \r\n ))}\r\n \r\n \r\n );\r\n }\r\n return null;\r\n};\r\n\r\n/**\r\n * Render Search result Body.\r\n * @param props - The Search Result Modal view props.\r\n * @param refineMenu - The Refine Menu view props.\r\n * @param sortByDropDown - The Sort by view props.\r\n * @param isRecoSearchPage - The recomandation search page flag.\r\n * @returns The JSX Element.\r\n */\r\nconst createModalBody = (props: ISearchResultModalViewProps, refineMenu: IRefineMenuViewProps,\r\n sortByDropDown: ISortByViewProps, isRecoSearchPage?: string): JSX.Element | null => {\r\n if (sortByDropDown) {\r\n return React.cloneElement(props.modalBody, {}, renderSort(sortByDropDown, isRecoSearchPage), renderRefinerMobile(refineMenu));\r\n }\r\n return null;\r\n};\r\n\r\n/**\r\n * Render Refiner.\r\n * @param props - The Refine Menu view props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderRefiner = (props: IRefineMenuViewProps): JSX.Element | null => {\r\n const { refiners, RefineMenuContainer, RefinerSectionContainer } = props;\r\n if (refiners) {\r\n return (\r\n \r\n \r\n {refiners.map((submenu, index) => (\r\n \r\n {submenu}\r\n \r\n ))}\r\n \r\n \r\n );\r\n }\r\n return null;\r\n};\r\n\r\n/**\r\n * Render sort by drop down.\r\n * @param props - The sort by view props.\r\n * @param isRecoSearchPage - The recomandation search page flag.\r\n * @returns The JSX Element.\r\n */\r\nconst renderSort = (props: ISortByViewProps, isRecoSearchPage?: string): JSX.Element | null => {\r\n const { SortingContainer, sortByDropDown } = props;\r\n if (sortByDropDown && !isRecoSearchPage) {\r\n return (\r\n \r\n {sortByDropDown}\r\n \r\n );\r\n }\r\n return null;\r\n};\r\n\r\n/**\r\n * Render Title.\r\n * @param props - The title view props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderTitle = (props: ITitleViewProps): JSX.Element | null => {\r\n const { title, TitleContainer } = props;\r\n if (title) {\r\n return (\r\n \r\n \r\n {title.titlePrefix}\r\n {title.titleText}\r\n \r\n \r\n );\r\n }\r\n return null;\r\n};\r\n\r\nexport default SearchResultContainerView;\r\n","const binding = { modules: {}, dataActions: {} };\n\n const registerActionId = (actionPath) => {\n if (binding.dataActions[actionPath] &&\n binding.dataActions[actionPath].default &&\n binding.dataActions[actionPath].default.prototype &&\n binding.dataActions[actionPath].default.prototype.id) {\n binding.dataActions[binding.dataActions[actionPath].default.prototype.id] = binding.dataActions[actionPath];\n } else {\n Object.keys(binding.dataActions[actionPath] || {}).forEach(exportName => {\n if (binding.dataActions[actionPath][exportName] &&\n binding.dataActions[actionPath][exportName].prototype &&\n binding.dataActions[actionPath][exportName].prototype.Action) {\n binding.dataActions[binding.dataActions[actionPath][exportName].prototype.id] = binding.dataActions[actionPath][exportName];\n }\n })\n }\n };\n\n const registerSanitizedActionPath = (sanitizedActionPath, dataAction) => {\n if (process.env.NODE_ENV === 'development') {\n if (!dataAction.default) {\n throw new Error('Data action path does not have a default export');\n }\n if (!(dataAction.default.prototype.id && binding.dataActions[dataAction.default.prototype.id]) || !binding.dataActions[sanitizedActionPath]) {\n binding.dataActions[sanitizedActionPath] = dataAction;\n }\n } else {\n binding.dataActions[sanitizedActionPath] = dataAction;\n if (!binding.dataActions[sanitizedActionPath].default) {\n throw new Error('Data action path ' + sanitizedActionPath + ' does not have a default export');\n }\n binding.dataActions[sanitizedActionPath].default.prototype.RegistrationId = sanitizedActionPath;\n if (binding.dataActions[sanitizedActionPath].default.prototype.id) {\n binding.dataActions[binding.dataActions[sanitizedActionPath].default.prototype.id] = sanitizedActionPath;\n }\n }\n };\n \n\n (binding.modules['search-result-container'] = {\n c: () => require('@msdyn365-commerce-modules/search-result-container/dist/lib/modules/search-result-container/search-result-container'),\n $type: 'containerModule',\n da: [{name:'category', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-current-category', runOn: 0},{name:'categoryHierarchy', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-current-category-hierarchy', runOn: 0},{name:'featureProduct', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-selected-variant', runOn: 0},{name:'featureState', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-feature-state', runOn: 0},{name:'listPageState', path:'@msdyn365-commerce-modules/search-result-container/dist/lib/modules/search-result-container/list-page-state', runOn: 0},{name:'products', path:'@msdyn365-commerce-modules/search-result-container/dist/lib/modules/search-result-container/actions/get-full-products-by-collection', runOn: 0},{name:'refiners', path:'@msdyn365-commerce-modules/search-result-container/dist/lib/modules/search-result-container/actions/get-refiners-for-collection', runOn: 0},{name:'searchConfiguration', path:'@msdyn365-commerce-modules/search-result-container/dist/lib/modules/search-result-container/actions/get-mapped-search-configuration', runOn: 0}],\n \n iNM: true,\n ns: '@msdyn365-commerce-modules',\n n: 'search-result-container',\n p: 'search-result-container',\n \n pdp: '',\n \n \n md: 'node_modules/@msdyn365-commerce-modules/search-result-container/dist/lib/modules/search-result-container'\n });\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-current-category';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-current-category');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-current-category-hierarchy';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-current-category-hierarchy');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-feature-state';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-feature-state');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-selected-variant';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-selected-variant');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/search-result-container/dist/lib/modules/search-result-container/actions/get-full-products-by-collection';\n let dataAction = require('@msdyn365-commerce-modules/search-result-container/dist/lib/modules/search-result-container/actions/get-full-products-by-collection');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/search-result-container/dist/lib/modules/search-result-container/actions/get-mapped-search-configuration';\n let dataAction = require('@msdyn365-commerce-modules/search-result-container/dist/lib/modules/search-result-container/actions/get-mapped-search-configuration');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/search-result-container/dist/lib/modules/search-result-container/actions/get-refiners-for-collection';\n let dataAction = require('@msdyn365-commerce-modules/search-result-container/dist/lib/modules/search-result-container/actions/get-refiners-for-collection');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/search-result-container/dist/lib/modules/search-result-container/list-page-state';\n let dataAction = require('@msdyn365-commerce-modules/search-result-container/dist/lib/modules/search-result-container/list-page-state');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n \n window.__bindings__ = window.__bindings__ || {};\n window.__bindings__.modules = {\n ...window.__bindings__.modules || {},\n ...binding.modules\n };\n \n window.__bindings__.dataActions = {\n ...window.__bindings__.dataActions || {},\n ...binding.dataActions\n };\n export const viewDictionary = {};\n viewDictionary['__local__|__local__|themes|cirrus|views|search-result-container'] = {\n c: () => require('partner/themes/cirrus/views/search-result-container.view.tsx'),\n cn: '__local__-__local__-search-result-container'\n };\nviewDictionary['@msdyn365-commerce-modules|fabrikam-design-kit|modules|fabrikam|views|search-result-container'] = {\n c: () => require('@msdyn365-commerce-modules/fabrikam-design-kit/dist/lib/modules/fabrikam/views/search-result-container.view.js'),\n cn: '@msdyn365-commerce-modules-fabrikam-design-kit-search-result-container'\n };\nviewDictionary['@msdyn365-commerce-modules|search-result-container|modules|search-result-container|search-result-container'] = {\n c: () => require('@msdyn365-commerce-modules/search-result-container/dist/lib/modules/search-result-container/search-result-container.view.js'),\n cn: '@msdyn365-commerce-modules-search-result-container-search-result-container'\n };\nviewDictionary['@msdyn365-commerce-theme|adventureworks-theme-kit|modules|adventureworks|views|search-result-container'] = {\n c: () => require('@msdyn365-commerce-theme/adventureworks-theme-kit/dist/lib/modules/adventureworks/views/search-result-container.view.js'),\n cn: '@msdyn365-commerce-theme-adventureworks-theme-kit-search-result-container'\n };\nwindow.__bindings__ = window.__bindings__ || {};\nwindow.__bindings__.viewDictionary = {\n ...window.__bindings__.viewDictionary || {},\n ...viewDictionary\n };","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n ICategoryHierarchyViewProps,\n IRefineMenuViewProps,\n ISearchResultContainerViewProps,\n ISearchResultModalViewProps,\n ISortByViewProps,\n ITitleViewProps\n} from '@msdyn365-commerce-modules/search-result-container';\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nconst SearchResultContainerView: React.FC = 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 \n {categoryHierarchy && renderCategoryHierarchy(categoryHierarchy)}\n {renderTitle(TitleViewProps)}\n {choiceSummary}\n {modalToggle}\n {createSearchResultModal(searchResultModal, refineMenu, sortByOptions, isRecoSearchPage)}\n {similarLookProduct}\n \n {errorMessage}\n {products}\n \n {pagination}\n \n );\n }\n return (\n \n {categoryHierarchy && {renderCategoryHierarchy(categoryHierarchy)}}\n \n {refineMenu && renderRefiner(refineMenu)}\n \n {similarLookProduct}\n
    \n {TitleViewProps && renderTitle(TitleViewProps)}\n {choiceSummary}\n
    \n
    \n {sortByOptions && !isRecoSearchPage && renderSort(sortByOptions)}\n
    \n \n {errorMessage}\n {products}\n \n {pagination}\n
    \n
    \n
    \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 \n \n {refiners.map((submenu, index) => (\n {submenu}\n ))}\n \n \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 {sortByDropDown};\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 \n {categoryHierarchyList.map((category, index) => (\n \n {category}\n {categoryHierarchyList && categoryHierarchyList[index + 1] && categoryHierarchySeparator}\n \n ))}\n \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 \n

    \n {title.titlePrefix}\n {title.titleText}({title.titleCount})\n

    \n
    \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 { CacheType, getCatalogId, IActionInput, IAny, ICommerceApiSettings, ICreateActionContext, IGeneric } from '@msdyn365-commerce/core';\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport {\n convertToString,\n ChannelInventoryConfiguration,\n IQueryResultSettings,\n ProductRefinerValue,\n SortColumn\n} from '@msdyn365-commerce/retail-proxy';\nimport { generateCacheKey, QueryResultSettingsProxy } from '@msdyn365-commerce-modules/retail-actions';\nimport { toJS } from 'mobx';\n\nimport { hydrateRefinersFromUrl } from './url-utils';\n\n/**\n * Export listPageType.\n */\nexport type listPageType = 'Category' | 'Search' | 'Unknown';\n\n/**\n * Get include attributes from config.\n * @param inputData - ICreateActionContext.\n * @returns Boolean.\n */\nfunction getIncludeAttributes(inputData: ICreateActionContext, IGeneric>): boolean {\n if (process.env.NODE_ENV === 'development' && process.env.ENABLE_CLOUD_SEARCH?.toLowerCase() !== 'true') {\n return false;\n }\n\n if (inputData && inputData.config && inputData.config.includeAttributes !== undefined && inputData.config.includeAttributes === true) {\n return true;\n }\n return false;\n}\n\n/**\n * Get updateRefinerPanel from config.\n * @param inputData - ICreateActionContext.\n * @returns Boolean.\n */\nfunction getUpdateRefinerPanel(inputData: ICreateActionContext, IGeneric>): boolean {\n return !!inputData.config?.updateRefinerPanel;\n}\n\n/**\n * BaseCollection Action Input.\n */\nexport class BaseCollectionInput implements IActionInput {\n public pageType: listPageType;\n\n public category: number | undefined;\n\n public searchText: string | undefined;\n\n public refiners: ProductRefinerValue[];\n\n public queryResultSettings: IQueryResultSettings;\n\n public apiSettings: ICommerceApiSettings;\n\n public includeAttributes: boolean | undefined;\n\n public locale?: string;\n\n public isUpdateRefinerPanel?: boolean;\n\n public catalogId?: number;\n\n public channelInventoryConfiguration?: ChannelInventoryConfiguration;\n\n public inventoryRefiner?: IProductRefinerHierarchy;\n\n public constructor(\n pageType: listPageType,\n apiSettings: ICommerceApiSettings,\n queryResultSettings: IQueryResultSettings,\n refiners: ProductRefinerValue[],\n category: number | undefined,\n searchText: string | undefined,\n includeAttributes: boolean | undefined,\n isUpdateRefinerPanel?: boolean | undefined,\n locale?: string,\n catalogId?: number,\n channelInventoryConfiguration?: ChannelInventoryConfiguration,\n inventoryRefiner?: IProductRefinerHierarchy\n ) {\n this.pageType = pageType;\n this.apiSettings = apiSettings;\n this.category = category;\n this.searchText = searchText;\n this.queryResultSettings = queryResultSettings;\n this.refiners = refiners;\n this.includeAttributes = includeAttributes;\n this.isUpdateRefinerPanel = isUpdateRefinerPanel;\n this.locale = locale;\n this.catalogId = catalogId ?? 0;\n this.channelInventoryConfiguration = channelInventoryConfiguration;\n this.inventoryRefiner = inventoryRefiner;\n }\n\n public getCacheKey = () => {\n const queryResultSettings = {\n ...this.queryResultSettings.Paging,\n ...toJS(this.queryResultSettings.Sorting)\n };\n\n const cacheKey = generateCacheKey(\n this.apiSettings,\n { key: 'PageType', value: this.pageType },\n { key: 'Category', value: this.category },\n { key: 'SearchText', value: this.searchText },\n { key: 'CatalogId', value: this.catalogId },\n {\n key: 'Refiners',\n value: this.refiners.map(\n refiner =>\n `RefinerRecordId:${refiner.RefinerRecordId}-LeftValueBoundString:${refiner.LeftValueBoundString ||\n ''}-RightValueBoundString:${refiner.RightValueBoundString || ''}`\n )\n },\n { key: 'QueryResultSettings', value: convertToString(queryResultSettings) },\n { key: 'Locale', value: this.locale }\n );\n return cacheKey;\n };\n\n public getCacheObjectType = () => 'CollectionActionResult';\n\n public dataCacheType = (): CacheType => 'request';\n}\n\n// TODO: Create a data model here or import one to capture the response of the action\nexport interface IGetFullProductsByCollectionData {\n text: string;\n}\n\nexport type CollectionClassConstructor = new (\n pageType: listPageType,\n apiSettings: ICommerceApiSettings,\n queryResultSettings: IQueryResultSettings,\n refiners: ProductRefinerValue[],\n category: number | undefined,\n searchText: string | undefined,\n includeAttributes: boolean | undefined,\n isUpdateRefinerPanel?: boolean | undefined,\n locale?: string,\n catalogId?: number,\n channelInventoryConfiguration?: ChannelInventoryConfiguration,\n inventoryRefiner?: IProductRefinerHierarchy\n) => BaseCollectionInput;\n\n/**\n * TODO: Use this function to create the input required to make the action call.\n * @param args\n * @param inputClassConstuctor\n */\nexport const createBaseCollectionInput = (\n args: ICreateActionContext,\n inputClassConstuctor: CollectionClassConstructor\n): BaseCollectionInput => {\n const pageType =\n args.requestContext.urlTokens.pageType === 'Category' || (args.requestContext.query && args.requestContext.query.categoryId)\n ? 'Category'\n : 'Search';\n\n const queryResultSettings = QueryResultSettingsProxy.fromInputData(args).QueryResultSettings;\n const queryRefiners = hydrateRefinersFromUrl(args.requestContext);\n const includeAttributes = getIncludeAttributes(args);\n const isUpdateRefinerPanel = getUpdateRefinerPanel(args);\n const catalogId = getCatalogId(args.requestContext);\n\n if (args.requestContext.query && args.requestContext.query.sorting) {\n queryResultSettings.Sorting = { Columns: JSON.parse(decodeURIComponent(args.requestContext.query.sorting)) };\n }\n\n if (pageType === 'Category') {\n return new inputClassConstuctor(\n pageType,\n args.requestContext.apiSettings,\n queryResultSettings,\n queryRefiners,\n +(args.requestContext.urlTokens.itemId || (args.requestContext.query && args.requestContext.query.categoryId) || 0),\n undefined,\n includeAttributes,\n isUpdateRefinerPanel,\n args.requestContext.locale,\n catalogId\n );\n } else if (pageType === 'Search' && args.requestContext.query && args.requestContext.query.q) {\n return new inputClassConstuctor(\n pageType,\n args.requestContext.apiSettings,\n queryResultSettings,\n queryRefiners,\n undefined,\n args.requestContext.query.q,\n includeAttributes,\n isUpdateRefinerPanel,\n args.requestContext.locale,\n catalogId\n );\n } else if (pageType === 'Search' && args.requestContext.query && args.requestContext.query.recommendation) {\n let searchText = '';\n if (args.requestContext.query.productId) {\n searchText = JSON.stringify({\n ProductId: args.requestContext.query.productId,\n Recommendation: args.requestContext.query.recommendation\n });\n } else {\n searchText = JSON.stringify({ Recommendation: args.requestContext.query.recommendation });\n }\n return new inputClassConstuctor(\n pageType,\n args.requestContext.apiSettings,\n queryResultSettings,\n queryRefiners,\n undefined,\n searchText,\n includeAttributes,\n isUpdateRefinerPanel,\n args.requestContext.locale,\n catalogId\n );\n } else if (pageType === 'Search' && args.requestContext.query && args.requestContext.query.discountIds) {\n const searchText = JSON.stringify({ DiscountIds: args.requestContext.query.discountIds });\n return new inputClassConstuctor(\n pageType,\n args.requestContext.apiSettings,\n queryResultSettings,\n queryRefiners,\n undefined,\n searchText,\n includeAttributes,\n isUpdateRefinerPanel,\n args.requestContext.locale,\n catalogId\n );\n }\n\n throw new Error('[getFullProductsForCollection]Unable to create input');\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n ICreateActionContext\n} from '@msdyn365-commerce/core';\nimport { AsyncResult, ChannelInventoryConfiguration, ProductSearchCriteria, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\nimport { getProductPromotionsAsync, searchByCriteriaAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\nimport { getInventoryConfigurationAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/StoreOperationsDataActions.g';\nimport { ArrayExtensions, generateProductImageUrl, InventoryLevels } from '@msdyn365-commerce-modules/retail-actions';\n\nimport { BaseCollectionInput, createBaseCollectionInput } from './base-collection-action';\nimport { getInventorySortableRefinerValue } from '.';\n\n/**\n * GetFullProductsByCollection Action Input.\n */\nexport class GetFullProductsByCollectionInput extends BaseCollectionInput implements IActionInput {\n /**\n * The cache object type.\n * @returns The cache object type.\n */\n public getCacheObjectType = (): string => 'FullProductSearchResult';\n\n /**\n * The data cache type.\n * @returns The data cache type.\n */\n public dataCacheType = (): CacheType => {\n if (\n this.pageType !== 'Category' ||\n (this.refiners && this.refiners.length > 0) ||\n (this.queryResultSettings &&\n this.queryResultSettings.Sorting &&\n this.queryResultSettings.Sorting.Columns &&\n this.queryResultSettings.Sorting.Columns.length > 0)\n ) {\n return 'request';\n }\n return 'application';\n };\n}\n\n/**\n * This setting defines inventory filtering options.\n */\nexport enum ProductListInventoryFilteringOptions {\n /**\n * Filter out all products out of stock.\n */\n HideOOS = 'hideOOS',\n\n /**\n * Sort products by availability, OOS goes last.\n */\n SortOOS = 'sortOOS',\n\n /**\n * No filtering selected.\n */\n Default = 'default'\n}\n\n/**\n * The full product search result with count interface.\n */\nexport interface IFullProductsSearchResultsWithCount {\n products: ProductSearchResult[];\n count: number;\n channelInventoryConfigurationId?: number;\n inventoryAwareSortableAttributeId?: number;\n}\n\n/**\n * CreateInput function which creates and actionInput used to fetch products for a list page.\n * @param args - The API arguments.\n * @returns IActionInput - The action input.\n */\nconst createInput = (args: ICreateActionContext<{ itemsPerPage: number; includedAttributes: boolean | undefined }>): IActionInput => {\n const input = createBaseCollectionInput(args, GetFullProductsByCollectionInput);\n\n // Set Top\n if (input.queryResultSettings.Paging && args.config) {\n input.queryResultSettings.Paging.Top = args.config.itemsPerPage || 1;\n }\n\n // Set Skip\n if (input.queryResultSettings.Paging && args.requestContext.query && args.requestContext.query.skip) {\n input.queryResultSettings.Paging.Skip = +args.requestContext.query.skip;\n }\n\n input.queryResultSettings.count = true;\n\n return input;\n};\n\n/**\n * Returns list of products based on inventory information.\n * @param productSearchResults - The products.\n * @param context - The context.\n * @param metadataCount - The metadata count.\n * @param channelInventoryConfiguration - The channel inventory configuration.\n * @returns List of product based on the inventory information.\n */\nexport async function returnProducts(\n productSearchResults: ProductSearchResult[],\n context: IActionContext,\n metadataCount: number | undefined,\n channelInventoryConfiguration?: ChannelInventoryConfiguration\n): Promise {\n const defaultProductCount: number = 0;\n\n const productSearchResultsWithImages = productSearchResults.map(productSearchResult => {\n const newImageUrl = generateProductImageUrl(productSearchResult, context.requestContext.apiSettings);\n\n if (newImageUrl) {\n productSearchResult.PrimaryImageUrl = newImageUrl;\n }\n\n return productSearchResult;\n });\n\n // If inventory level is threshold or inventory check is disabled then return the list of products without the inventory configuration\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- read config file.\n if (\n context.requestContext.app.config.inventoryLevel === InventoryLevels.threshold ||\n context.requestContext.app.config.enableStockCheck === false\n ) {\n return {\n products: productSearchResultsWithImages,\n count: metadataCount ?? defaultProductCount\n };\n }\n\n const mappedProducts = productSearchResultsWithImages.map(productSearchResult => {\n if (ArrayExtensions.hasElements(productSearchResult.AttributeValues)) {\n for (const element of productSearchResult.AttributeValues) {\n if (\n channelInventoryConfiguration &&\n element.RecordId !== undefined &&\n element.RecordId === channelInventoryConfiguration.InventoryProductAttributeRecordId &&\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- read config file.\n context.requestContext.app.config.inventoryRanges !== 'all' &&\n element.TextValue !== channelInventoryConfiguration.InventoryOutOfStockAttributeValueText\n ) {\n // If same RecordId then it means that is the Inventory attribute\n // Based on the inventory range (and filtering options), the inventory label will be displayed\n // If Inventory range is 'All' then in stock and out of stock labels are shown, else only OOS\n // if the text value is different that the channelInventoryConfiguration.InventoryOutOfStockAttributeValueText then is in stock\n element.TextValue = '';\n }\n }\n }\n\n return productSearchResult;\n });\n\n return {\n products: mappedProducts,\n count: metadataCount ?? defaultProductCount,\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- check config.\n channelInventoryConfigurationId: channelInventoryConfiguration\n ? channelInventoryConfiguration.InventoryProductAttributeRecordId\n : undefined,\n inventoryAwareSortableAttributeId: channelInventoryConfiguration\n ? channelInventoryConfiguration.ProductAvailabilitySortableAttributeRecordId\n : undefined\n };\n}\n\n/**\n * Action function to fetch products for a list page.\n * @param input - The input.\n * @param context - The context.\n * @returns IFullProductsSearchResultsWithCount - The full product search result with count.\n */\n// eslint-disable-next-line complexity -- ignore the complexity.\nasync function action(input: GetFullProductsByCollectionInput, context: IActionContext): Promise {\n let promise: AsyncResult;\n let channelInventoryConfigurationPromise: AsyncResult;\n let searchProductId;\n const searchCriteriaInput: ProductSearchCriteria = {};\n searchCriteriaInput.Context = { ChannelId: context.requestContext.apiSettings.channelId, CatalogId: input.catalogId };\n // Decouple searchCriteriaInput.Refinement from input.refiners to avoid input.refiners being modified below\n searchCriteriaInput.Refinement = [...input.refiners];\n if (process.env.NODE_ENV === 'development' && process.env.ENABLE_CLOUD_SEARCH?.toLowerCase() !== 'true') {\n searchCriteriaInput.IncludeAttributes = false;\n } else {\n searchCriteriaInput.IncludeAttributes = input.includeAttributes;\n }\n searchCriteriaInput.SkipVariantExpansion = true;\n const defaultNumber: number = 0;\n\n if (input.channelInventoryConfiguration) {\n channelInventoryConfigurationPromise = AsyncResult.resolve(input.channelInventoryConfiguration);\n } else {\n channelInventoryConfigurationPromise = getInventoryConfigurationAsync({ callerContext: context });\n }\n const channelInventoryConfiguration = await channelInventoryConfigurationPromise;\n\n // Replace InventoryProductAttribute with boolean refiner.\n // Because the value of InventoryProductAttribute is different from language to language since it's string type.\n // The cached old inventory refiner value may be hit when customer switch language which will lead to \"no products found\" issue.\n const inventoryRefiner = searchCriteriaInput.Refinement.find(\n refiner => refiner.RefinerRecordId === channelInventoryConfiguration?.InventoryProductAttributeRecordId\n );\n if (inventoryRefiner) {\n searchCriteriaInput.Refinement = searchCriteriaInput.Refinement.filter(\n refiner => refiner.RefinerRecordId !== channelInventoryConfiguration?.InventoryProductAttributeRecordId\n );\n\n const isInStockRefiner =\n inventoryRefiner.LeftValueBoundString !== channelInventoryConfiguration?.InventoryOutOfStockAttributeValueText &&\n inventoryRefiner.RightValueBoundString !== channelInventoryConfiguration?.InventoryOutOfStockAttributeValueText;\n const inventoryRefinerValue = getInventorySortableRefinerValue(channelInventoryConfiguration, isInStockRefiner);\n\n const isInventoryRefinerValueExist = searchCriteriaInput.Refinement.some(\n refiner => refiner.RefinerRecordId === inventoryRefinerValue?.RefinerRecordId\n );\n if (!isInventoryRefinerValueExist && inventoryRefinerValue) {\n searchCriteriaInput.Refinement.push(inventoryRefinerValue);\n }\n }\n\n if (context.requestContext.app.config?.productListInventoryDisplay === ProductListInventoryFilteringOptions.HideOOS) {\n const isInStock = true;\n const inventoryInStockRefinerValue = getInventorySortableRefinerValue(channelInventoryConfiguration, isInStock);\n\n const isInventoryInStockRefinerValueExist = searchCriteriaInput.Refinement.some(\n refiner => refiner.RefinerRecordId === inventoryInStockRefinerValue?.RefinerRecordId\n );\n if (!isInventoryInStockRefinerValueExist && inventoryInStockRefinerValue) {\n searchCriteriaInput.Refinement.push(inventoryInStockRefinerValue);\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app configs are of generic type\n if (\n context.requestContext.app.config?.productListInventoryDisplay === ProductListInventoryFilteringOptions.SortOOS &&\n channelInventoryConfiguration.ProductAvailabilitySortableAttributeRecordId\n ) {\n input.queryResultSettings.Sorting = input.queryResultSettings.Sorting ?? {};\n input.queryResultSettings.Sorting.Columns = input.queryResultSettings.Sorting.Columns ?? [];\n const sortColumnName = `Attr_${channelInventoryConfiguration.ProductAvailabilitySortableAttributeRecordId}`;\n const isSortAttributeExist = input.queryResultSettings.Sorting.Columns.some(column => column.ColumnName === sortColumnName);\n if (!isSortAttributeExist) {\n input.queryResultSettings.Sorting.Columns.push({\n ColumnName: sortColumnName,\n IsDescending: true\n });\n }\n }\n\n if (input.pageType === 'Category' || context.requestContext.query?.categoryId) {\n if (input.category) {\n searchCriteriaInput.CategoryIds = [input.category || defaultNumber];\n promise = searchByCriteriaAsync(\n {\n callerContext: context,\n queryResultSettings: input.queryResultSettings\n },\n searchCriteriaInput\n );\n } else {\n throw new Error('[GetFullProductsForCollection]Category Page Detected, but no global categoryId found');\n }\n } else if (input.searchText && context.requestContext.query?.q) {\n searchCriteriaInput.SearchCondition = input.searchText;\n promise = searchByCriteriaAsync(\n {\n callerContext: context,\n queryResultSettings: input.queryResultSettings\n },\n searchCriteriaInput\n );\n } else if (input.searchText && context.requestContext.query && context.requestContext.query.recommendation) {\n const searchObject = JSON.parse(input.searchText);\n if (context.requestContext.query.productId) {\n searchProductId = Number(searchObject.ProductId);\n }\n if (Number.isNaN(searchProductId)) {\n throw new Error('Failed to cast search product id into a number.');\n } else if (\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Existing code\n !searchObject.Recommendation\n ) {\n throw new Error('Failed to retrieve the Recommendation.');\n } else {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- Existing code\n searchCriteriaInput.RecommendationListId = searchObject.Recommendation;\n if (searchProductId) {\n searchCriteriaInput.Ids = [searchProductId || defaultNumber];\n }\n promise = searchByCriteriaAsync(\n {\n callerContext: context,\n queryResultSettings: input.queryResultSettings\n },\n searchCriteriaInput\n );\n }\n } else if (input.searchText && context.requestContext.query?.discountIds) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment -- This is parsing of the input search text.\n const searchObject = JSON.parse(input.searchText);\n const discountIds = context.requestContext.query?.discountIds.split(',');\n\n searchCriteriaInput.RecommendationListId = searchObject.Recommendation;\n\n const productPromotions = await getProductPromotionsAsync(\n {\n callerContext: context,\n queryResultSettings: input.queryResultSettings\n },\n discountIds ?? [],\n {\n HeaderContext: {},\n LineContexts: [\n {\n CatalogId: input.catalogId\n }\n ]\n },\n new Date()\n );\n\n const productIds = productPromotions.map(p => p.ProductId ?? 0);\n searchCriteriaInput.Ids = productIds;\n\n promise = searchByCriteriaAsync(\n {\n callerContext: context,\n queryResultSettings: input.queryResultSettings\n },\n searchCriteriaInput\n );\n } else {\n throw new Error('[GetFullProductsForCollection]Search Page Detected, but no q= or productId= query parameter found');\n }\n\n const productSearchResults = await promise;\n return returnProducts(productSearchResults, context, promise.metadata.count, channelInventoryConfiguration);\n}\n\nexport const actionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/search-result-container/get-full-products-by-collection',\n action: action as IAction,\n input: createInput\n});\n\nexport default actionDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n IAny,\n ICommerceApiSettings,\n ICreateActionContext,\n IGeneric\n} from '@msdyn365-commerce/core';\nimport { SortColumn } from '@msdyn365-commerce/retail-proxy';\nimport { getSearchConfigurationAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/StoreOperationsDataActions.g';\nimport { buildCacheKey } from '@msdyn365-commerce-modules/retail-actions';\n\n// TODO: import from commerce entities when available\n// eslint-disable-next-line @typescript-eslint/naming-convention -- Name change will require many modifications\ninterface SearchConfiguration {\n ProductSortColumns?: SortColumn[];\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention -- Name change will require many modifications\nexport interface MappedSearchConfiguration {\n key: string;\n sortColumn: SortColumn;\n}\n\nexport const sortOptions = {\n sortByOptionRelevanceDesc: 'Ranking-Desc',\n sortByOptionRatingAsc: 'AverageRating-Asc',\n sortByOptionRatingDesc: 'AverageRating-Desc',\n sortByOptionNameAsc: 'Name-Asc',\n sortByOptionNameDesc: 'Name-Desc',\n sortByOptionPriceAsc: 'Price-Asc',\n sortByOptionPriceDesc: 'Price-Desc',\n sortByOptionBestSelling: 'BestSelling',\n sortByOptionNewScore: 'NewScore',\n sortByOptionTrendingScore: 'TrendingScore'\n};\n\n/**\n * ActionInput class for the get-mapped-search-configuration Data Action.\n */\nexport class MappedSearchInput implements IActionInput {\n private readonly apiSettings: ICommerceApiSettings;\n\n constructor(apiSettings: ICommerceApiSettings) {\n this.apiSettings = apiSettings;\n }\n\n public getCacheKey = () => buildCacheKey('MappedSearchInput', this.apiSettings);\n\n public getCacheObjectType = () => 'MappedSearchInput';\n\n public dataCacheType = (): CacheType => 'request';\n}\n\n/**\n * Get a mapped search configuration that is easy to use for sorting.\n * @param input\n * @param ctx\n */\nexport async function getMappedSearchConfiguration(input: MappedSearchInput, ctx: IActionContext): Promise {\n return getSearchConfigurationAsync({ callerContext: ctx }).then((searchConfiguration: SearchConfiguration) => {\n return (searchConfiguration.ProductSortColumns || [])\n .map((sortColumn: SortColumn) => {\n let key = '';\n if (sortColumn.ColumnName) {\n switch (sortColumn.ColumnName.toUpperCase()) {\n case 'NAME':\n key = sortColumn.IsDescending ? sortOptions.sortByOptionNameDesc : sortOptions.sortByOptionNameAsc;\n break;\n case 'PRICE':\n key = sortColumn.IsDescending ? sortOptions.sortByOptionPriceDesc : sortOptions.sortByOptionPriceAsc;\n break;\n case 'AVERAGERATING':\n key = sortColumn.IsDescending ? sortOptions.sortByOptionRatingDesc : sortOptions.sortByOptionRatingAsc;\n break;\n case 'RANKING':\n key = sortOptions.sortByOptionRelevanceDesc;\n break;\n case 'BESTSELLINGSCORE':\n key = sortOptions.sortByOptionBestSelling;\n break;\n case 'NEWSCORE':\n key = sortOptions.sortByOptionNewScore;\n break;\n case 'TRENDINGSCORE':\n key = sortOptions.sortByOptionTrendingScore;\n break;\n default:\n }\n } else {\n ctx.telemetry.warning('[get-mapped-search-configuration] unknown search option');\n }\n if (key) {\n return {\n key,\n sortColumn\n };\n }\n return undefined;\n })\n .filter(Boolean);\n });\n}\n\nexport const createInput = (inputData: ICreateActionContext>): IActionInput => {\n return new MappedSearchInput(inputData.requestContext.apiSettings);\n};\n\nexport const getMappedSearchConfigurationDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/search-result-container/get-mapped-search-configuration',\n action: >getMappedSearchConfiguration,\n input: createInput\n});\n\nexport default getMappedSearchConfigurationDataAction;\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 { IActionContext } from '@msdyn365-commerce/core';\nimport { IQueryResultSettings, ProductRefiner, ProductSearchCriteria } from '@msdyn365-commerce/retail-proxy';\nimport { getProductSearchRefinersAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\n\n/**\n * Uses Bulk refiner API to get refiners and child refiner values.\n * @param searchCriteria Product search criteria.\n * @param maxItems Max items.\n * @param queryResultSettings\n * @param ctx Action context.\n */\nexport async function getProductRefinerHierarchy(\n searchCriteria: ProductSearchCriteria,\n queryResultSettings: IQueryResultSettings,\n ctx: IActionContext\n): Promise {\n return getProductSearchRefinersAsync({ callerContext: ctx, queryResultSettings }, searchCriteria).then(\n (productRefiners: ProductRefiner[]) => {\n if (!productRefiners) {\n ctx.trace('[getRefinersByCriteriaAction] returned no refiners');\n return [];\n }\n\n const result = (productRefiners || []).map((productRefiner: ProductRefiner) => productRefiner);\n\n if (result.length === 0) {\n ctx.trace('[getRefinersByCriteriaAction] returned no IProductRefinerHierarchy objects');\n return [];\n }\n\n return result;\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 { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport { createObservableDataAction, IAction, IActionContext, IActionInput, ICreateActionContext } from '@msdyn365-commerce/core';\nimport { AsyncResult, ChannelInventoryConfiguration, ProductRefinerValue, ProductSearchCriteria } from '@msdyn365-commerce/retail-proxy';\nimport { getInventoryConfigurationAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/StoreOperationsDataActions.g';\n\nimport { BaseCollectionInput, createBaseCollectionInput } from './base-collection-action';\nimport { getProductRefinerHierarchy } from './get-product-refiner-hierarchy';\nimport { getInventorySortableRefinerValue, ProductListInventoryFilteringOptions } from '.';\n\n/**\n * Default Category/Product Id Values.\n */\nenum DefaultValues {\n defaultCategoryIdValue = 0,\n defaultProductIdValue = 0\n}\n\n/**\n * Refiners-by-Collection Input action.\n */\nexport class RefinersByCollectionInput extends BaseCollectionInput implements IActionInput {\n public getCacheObjectType = () => 'ProductRefiner';\n\n public dataCacheType = () => {\n if (\n this.pageType !== 'Category' ||\n (this.refiners && this.refiners.length > 0) ||\n (this.queryResultSettings &&\n this.queryResultSettings.Sorting &&\n this.queryResultSettings.Sorting.Columns &&\n this.queryResultSettings.Sorting.Columns.length > 0)\n ) {\n return 'request';\n }\n return 'application';\n };\n}\n\n/**\n * Create input method which creates an ActionInput for fetching list page refiners.\n * @param args\n */\nconst createInput = (args: ICreateActionContext): IActionInput => {\n return createBaseCollectionInput(args, RefinersByCollectionInput);\n};\n\n/**\n * Action method which fetches refiners for the given list page.\n * @param input\n * @param context\n */\nasync function action(input: RefinersByCollectionInput, context: IActionContext): Promise {\n let searchProductId;\n // Decouple refiners from input.refiners to avoid input.refiners being modified below\n let refiners: ProductRefinerValue[] = [...input.refiners] || [];\n\n let channelInventoryConfigurationPromise: AsyncResult;\n if (input.channelInventoryConfiguration) {\n channelInventoryConfigurationPromise = AsyncResult.resolve(input.channelInventoryConfiguration);\n } else {\n channelInventoryConfigurationPromise = getInventoryConfigurationAsync({ callerContext: context });\n }\n const channelInventoryConfiguration = await channelInventoryConfigurationPromise;\n\n // Replace InventoryProductAttribute with boolean refiner.\n // Because the value of InventoryProductAttribute is different from language to language since it's string type.\n // The cached old inventory refiner value may be hit when customer switch language which will lead to \"no products found\" issue.\n const inventoryRefiner = refiners.find(\n refiner => refiner.RefinerRecordId === channelInventoryConfiguration?.InventoryProductAttributeRecordId\n );\n if (inventoryRefiner) {\n refiners = refiners.filter(refiner => refiner.RefinerRecordId !== channelInventoryConfiguration?.InventoryProductAttributeRecordId);\n\n const isInStockRefiner =\n inventoryRefiner.LeftValueBoundString !== channelInventoryConfiguration?.InventoryOutOfStockAttributeValueText &&\n inventoryRefiner.RightValueBoundString !== channelInventoryConfiguration?.InventoryOutOfStockAttributeValueText;\n const inventoryRefinerValue = getInventorySortableRefinerValue(channelInventoryConfiguration, isInStockRefiner);\n\n const isInventoryRefinerValueExist = refiners.some(refiner => refiner.RefinerRecordId === inventoryRefinerValue?.RefinerRecordId);\n if (!isInventoryRefinerValueExist && inventoryRefinerValue) {\n refiners.push(inventoryRefinerValue);\n }\n }\n\n if (context.requestContext.app.config?.productListInventoryDisplay === ProductListInventoryFilteringOptions.HideOOS) {\n const isInStock = true;\n const inventoryInStockRefinerValue = getInventorySortableRefinerValue(channelInventoryConfiguration, isInStock);\n\n const isInventoryInStockRefinerValueExist = refiners.some(\n refiner => refiner.RefinerRecordId === inventoryInStockRefinerValue?.RefinerRecordId\n );\n if (!isInventoryInStockRefinerValueExist && inventoryInStockRefinerValue) {\n refiners.push(inventoryInStockRefinerValue);\n }\n }\n\n if (input.pageType === 'Category') {\n if (input.category) {\n return getProductRefinerHierarchy(\n {\n CategoryIds: [input.category || DefaultValues.defaultCategoryIdValue],\n Context: {\n ChannelId: input.apiSettings.channelId,\n CatalogId: input.catalogId\n },\n Refinement: input.isUpdateRefinerPanel ? refiners : []\n },\n input.queryResultSettings,\n context\n );\n }\n throw new Error('[GetRefinersForCollection]Category Page Detected, but no global categoryId found');\n } else {\n if (input.searchText && context.requestContext.query && context.requestContext.query.q) {\n return getProductRefinerHierarchy(\n {\n SearchCondition: input.searchText,\n Context: {\n ChannelId: input.apiSettings.channelId,\n CatalogId: input.catalogId\n },\n Refinement: input.isUpdateRefinerPanel ? refiners : []\n },\n input.queryResultSettings,\n context\n );\n }\n if (input.searchText && context.requestContext.query && context.requestContext.query.recommendation) {\n const searchObject = JSON.parse(input.searchText);\n if (context.requestContext.query.productId) {\n searchProductId = Number(searchObject.ProductId);\n }\n if (Number.isNaN(searchProductId)) {\n throw new Error('Failed to cast search product id into a number.');\n } else if (!searchObject.Recommendation) {\n throw new Error('Failed to retrieve the Recommendation.');\n } else {\n const searchCriteriaInput: ProductSearchCriteria = {};\n searchCriteriaInput.Context = {\n ChannelId: input.apiSettings.channelId,\n CatalogId: input.catalogId\n };\n searchCriteriaInput.Refinement = input.isUpdateRefinerPanel ? refiners : [];\n searchCriteriaInput.RecommendationListId = searchObject.Recommendation;\n if (searchProductId) {\n searchCriteriaInput.Ids = [searchProductId || DefaultValues.defaultProductIdValue];\n }\n return getProductRefinerHierarchy(searchCriteriaInput, input.queryResultSettings, context);\n }\n } else {\n throw new Error('[GetFullProductsForCollection]Search Page Detected, but no q= or productId= query parameter found');\n }\n }\n}\n\nexport const actionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/search-result-container/get-refiners-for-collection',\n action: >action,\n input: createInput\n});\n\nexport default actionDataAction;\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 { CacheType, createObservableDataAction, IAction, IActionContext, IActionInput } from '@msdyn365-commerce/core';\nimport { buildCacheKey } from '@msdyn365-commerce-modules/retail-actions';\n\nimport {\n AttributeDataType,\n ChannelInventoryConfiguration,\n ProductRefinerSource,\n ProductRefinerValue\n} from '@msdyn365-commerce/retail-proxy';\nimport { BaseCollectionInput } from './base-collection-action';\nimport { getProductRefinerHierarchy } from './get-product-refiner-hierarchy';\n\n/**\n * Returns inventory in stock sortable refiner value.\n * @param channelInventoryConfiguration - The channelInventoryConfiguration.\n * @param isInStock - The flag indicating whether is getting in-stock refiner or out-of-stock refiner.\n * @returns Refiners.\n */\nexport const getInventorySortableRefinerValue = (\n channelInventoryConfiguration: ChannelInventoryConfiguration,\n isInStock: boolean\n): ProductRefinerValue | undefined => {\n if (channelInventoryConfiguration && channelInventoryConfiguration.ProductAvailabilitySortableAttributeRecordId) {\n return {\n RefinerRecordId: channelInventoryConfiguration.ProductAvailabilitySortableAttributeRecordId,\n DataTypeValue: AttributeDataType.TrueFalse,\n LeftValueBoundString: isInStock ? 'true' : 'false',\n RightValueBoundString: isInStock ? 'true' : 'false',\n UnitText: '',\n RowNumber: 0,\n Count: 0,\n ExtensionProperties: [],\n RefinerSourceValue: ProductRefinerSource.Attribute\n };\n }\n return undefined;\n};\n\n/**\n * InventoryInStockRefinerValue Input action.\n * @remark The get-inventory-refiners data action is obsoleted. Please use getInventorySortableRefinerValue instead.\n */\nexport class InventoryInStockRefinerValueInput extends BaseCollectionInput implements IActionInput {\n public inventoryProductAttributeRecordId: number;\n\n public constructor(input: BaseCollectionInput, inventoryProductAttributeRecordId: number = 0) {\n super(\n input.pageType,\n input.apiSettings,\n {\n count: true\n },\n\n // Parameter - refiners\n [],\n\n // Parameter - category\n undefined,\n\n // Parameter - searchText\n '',\n\n // Parameter - includeAttributes\n false,\n\n // Parameter - isUpdateRefinerPanel\n false,\n\n // Parameter - locale\n undefined,\n input.catalogId,\n input.channelInventoryConfiguration,\n input.inventoryRefiner\n );\n\n this.inventoryProductAttributeRecordId =\n inventoryProductAttributeRecordId || input.channelInventoryConfiguration?.InventoryProductAttributeRecordId || 0;\n }\n\n /**\n * GetCacheKey.\n * @returns - Returns string.\n */\n public getCacheKey = (): string => buildCacheKey('RefinerList', this.apiSettings);\n\n /**\n * GetCacheObjectType.\n * @returns - Returns string.\n */\n public getCacheObjectType = (): string => 'RefinerList';\n\n /**\n * DataCacheType.\n * @returns - CacheType string.\n */\n public dataCacheType = (): CacheType => 'application';\n}\n\n/**\n * Action method returns inventory in stock refiners.\n * @param input - InventoryInStockRefinerValueInput.\n * @param context - IActionContext.\n * @returns - Promise.\n * @remark The get-inventory-refiners data action is obsoleted. Please use getInventorySortableRefinerValue instead.\n */\nasync function action(input: InventoryInStockRefinerValueInput, context: IActionContext): Promise {\n const refiners = await getProductRefinerHierarchy(\n {\n Context: {\n ChannelId: input.apiSettings.channelId,\n CatalogId: input.catalogId\n }\n },\n input.queryResultSettings,\n context\n );\n\n // InventoryProductAttributeRecordId may be 0, and recId of default refiner Category/Price/Rating is always 0 by design. In this case, we should not return refiner\n // Why recId of default refiner Category/Price/Rating is 0: see GetChannelProductRefiners.sql\n return (\n (input.channelInventoryConfiguration?.InventoryProductAttributeRecordId !== 0 &&\n refiners.find(refiner => refiner.RecordId === input.channelInventoryConfiguration?.InventoryProductAttributeRecordId)) ||\n // keep legacy logic to avoid break existing customers usage from this file\n (input.inventoryProductAttributeRecordId !== 0 &&\n refiners.find(refiner => refiner.RecordId === input.inventoryProductAttributeRecordId)) ||\n null\n );\n}\n\n/**\n * Action.\n * @param id - Id.\n * @param action - Action.\n * @returns - Results.\n * @remark The get-inventory-refiners data action is obsoleted. Please use getInventorySortableRefinerValue instead.\n */\nexport const actionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/search-result-container/get-inventory-refiners',\n action: action as IAction\n});\n\nexport default actionDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport MsDyn365, { IRequestContext } from '@msdyn365-commerce/core';\nimport { ProductRefinerValue, SortColumn } from '@msdyn365-commerce/retail-proxy';\n\n/**\n * Refiner Compression:\n * Refiners contains a non-trivial amount of data that is required to successfully make\n * a refiner-based API call. To allow for deep-linking of refiners in the URL, refiner data\n * must be compressed so that URL max length is not exceeded. Refiners will be compressed into\n * the following array style index-based format:\n * [DataTypeValue, LeftValueBoundString, RefinerRecordId, RefinerSourceValue, RightValueBoundString, UnitText].\n */\nconst compressedRefinerKeys = [\n 'DataTypeValue',\n 'LeftValueBoundString',\n 'RefinerRecordId',\n 'RefinerSourceValue',\n 'RightValueBoundString',\n 'UnitText'\n];\n\n/**\n * Hydrates compressed refiner data from URL.\n * @param fullUrl The full URL of the page.\n * @param requestContext\n */\nexport const hydrateRefinersFromUrl = (requestContext: IRequestContext): ProductRefinerValue[] => {\n const compressedRefinerArray = parseQueryParam<(string | number)[][]>('refiners', requestContext);\n if (!compressedRefinerArray || compressedRefinerArray.length === 0) {\n return [];\n }\n\n return compressedRefinerArray\n .map(compressedRefiner => {\n try {\n const parsedRefiner: ProductRefinerValue = {};\n compressedRefinerKeys.forEach((refinerKey, index) => {\n parsedRefiner[refinerKey] = compressedRefiner[index];\n });\n return parsedRefiner;\n } catch {\n return undefined;\n }\n })\n .filter(Boolean);\n};\n\n/**\n * Compressed a list of refiners for use in URLs.\n * @param refiners The uncompressed refiners.\n */\nexport const compressRefiners = (refiners: ProductRefinerValue[]) => {\n const compressedRefiners: (string | number)[][] = [];\n\n refiners.forEach(refiner => {\n const compressedRefiner: (string | number)[] = [];\n compressedRefinerKeys.forEach(refinerKey => {\n compressedRefiner.push(refiner[refinerKey]);\n });\n compressedRefiners.push(compressedRefiner);\n });\n\n return compressedRefiners;\n};\n\n/**\n * Method which creates a URL contiaining serialized active refiners.\n * @param fullUrl The Current URL of the page.\n * @param refiners The refiners which should be added to the URL.\n * @param sortingColumns\n * @param skipCount\n */\nexport const buildListPageUrl = (fullUrl: URL, refiners?: ProductRefinerValue[], sortingColumns?: SortColumn[], skipCount?: number) => {\n // Refiner Change flow\n if (refiners !== undefined) {\n if (refiners.length === 0) {\n fullUrl.searchParams.delete('refiners');\n } else {\n const sortedRefiners = refiners.sort((first, second) =>\n first.RefinerRecordId && second.RefinerRecordId && first.RefinerRecordId > second.RefinerRecordId ? 1 : -1\n );\n fullUrl.searchParams.set('refiners', JSON.stringify(compressRefiners(sortedRefiners)));\n }\n\n // Adding or removing a refiner means we want to always load page 1\n fullUrl.searchParams.delete('skip');\n return fullUrl.href;\n }\n\n if (sortingColumns !== undefined) {\n if (sortingColumns.length === 0) {\n fullUrl.searchParams.delete('sorting');\n } else {\n fullUrl.searchParams.set('sorting', JSON.stringify(sortingColumns));\n }\n\n // Changing the sort means always load page 1\n fullUrl.searchParams.delete('skip');\n return fullUrl.href;\n }\n\n if (skipCount) {\n fullUrl.searchParams.set('skip', skipCount.toString());\n }\n\n return fullUrl.href;\n};\n\n/**\n * Parses a query param from the query object of the request context.\n * @param key The query parameter key.\n * @param requestContext The request context.\n */\nexport const parseQueryParam = (key: string, requestContext: IRequestContext): T | null => {\n if (requestContext.query && requestContext.query[key]) {\n return JSON.parse(decodeURIComponent(requestContext.query[key]));\n }\n return null;\n};\n\n/**\n * Gets the current URL of the page from the request context.\n * @param requestContext The request context.\n */\nexport const getCurrentUrl = (requestContext: IRequestContext): URL => {\n if (MsDyn365.isBrowser) {\n return new URL(window.location.href);\n }\n\n // NOTE: Typing on requestURL is incorrect\n if (requestContext.url.requestUrl.href) {\n return new URL(requestContext.url.requestUrl.href);\n }\n return new URL((requestContext.url.requestUrl));\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 {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n IAny,\n ICreateActionContext,\n IGeneric\n} from '@msdyn365-commerce/core';\nimport { ProductPrice, ProductRefinerValue, ProductSearchResult, SimpleProduct, SortingInfo } from '@msdyn365-commerce/retail-proxy';\nimport { observable } from 'mobx';\n\nimport { listPageType } from './actions';\n\n/**\n * ListPageState class.\n */\nexport class ListPageState {\n @observable public activeFilters: ProductRefinerValue[] | null = null;\n\n @observable public activeProducts: ProductSearchResult[] = [];\n\n @observable public sortingCritera: SortingInfo | null = null;\n\n @observable public currentPageNumber: number | null = null;\n\n @observable public refiners: IProductRefinerHierarchy[] | null = null;\n\n @observable public totalProductCount: number | undefined;\n\n @observable public pageSize: number = 10;\n\n @observable public pageType: listPageType = 'Unknown';\n\n @observable public featureProduct: SimpleProduct | null = null;\n\n @observable public productPrices: ProductPrice[] | undefined = [];\n}\n\n/**\n * ListPageStateInput - action input.\n */\nexport class ListPageStateInput implements IActionInput {\n public getCacheKey = () => 'ListPageState';\n\n public getCacheObjectType = () => 'ListPageState';\n\n public dataCacheType = (): CacheType => 'request';\n}\n\nexport async function listPageStateAction(input: ListPageStateInput, ctx: IActionContext): Promise {\n return new ListPageState();\n}\n\n/**\n * Create new input for create action.\n * @param inputData\n */\nexport const createListPageInput = (inputData: ICreateActionContext>): IActionInput => {\n return new ListPageStateInput();\n};\n\n/**\n * ListPageState - create action.\n */\nexport default createObservableDataAction({\n action: >listPageStateAction,\n input: createListPageInput\n});\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 { 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 {\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) {\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
    \n {items.length > 0 && label && {label}}\n
      \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
    • \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 \n \n
    • \n );\n })}\n
    \n {items.length > 0 && clearAllText && (\n \n {clearAllText}\n \n )}\n
    \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): 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 = ({ text }) => {\n return (\n \n
    \n {` `}\n {text}\n {` `}\n
    \n
    \n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { 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 = ({\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
    \n \n
    \n {renderProductPlacementImage(\n imageSettings,\n context.request.gridSettings,\n product.PrimaryImageUrl,\n product.Name,\n fallbackImage,\n context.actionContext.requestContext\n )}\n
    \n \n
    \n

    {heading}

    \n {renderProductTitle(product?.Name)}\n
    \n
    \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 ;\n}\n\nfunction renderProductTitle(title?: string): JSX.Element | null {\n return

    {title}

    ;\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 = ({ text, className, href, ariaLabel }) => (\n \n {' '}\n {text}{' '}\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, 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 | 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 | undefined;\n onModalToggle(): void;\n}\n\nexport const ModalToggle: React.FC = (props: IModalToggleProps) => {\n const { text, onClick, ariaLabel, innerRef, id } = props;\n return (\n \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: \n };\n};\n\nconst modalNode = (props: ISearchResultModalProps) => {\n return (\n \n );\n};\n\nconst modalHeaderNode = (props: ISearchResultModalProps) => {\n return {props.resources.modalTitle};\n};\n\nconst modalFooterNode = (props: ISearchResultModalProps) => {\n return (\n \n \n \n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\nimport { IPriceComponentResources, ProductComponent } from '@msdyn365-commerce/components';\nimport { 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 = ({\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
      \n {products.map((product: ProductSearchResult, index: number) => (\n
    • \n \n ArrayExtensions.hasElements(dimensionAvailability) &&\n dimensionAvailability[0].masterProductId === product.MasterProductId\n )}\n />\n
    • \n ))}\n
    \n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { 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 {\n private readonly _formattedPriceReverseLookup: Map = new Map();\n\n private readonly minInput: React.RefObject;\n\n private readonly maxInput: React.RefObject;\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();\n this.maxInput = React.createRef();\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
    \n \n \n {validationErrorMin && (\n \n {validationErrorMin}\n \n )}\n {validationErrorMax && validationErrorMin !== validationErrorMax && (\n \n {validationErrorMax}\n \n )}\n
    \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 \n );\n }\n\n private _changeMin(event: React.FocusEvent): void {\n this._changeValue(event, 'Min');\n }\n\n private _changeMax(event: React.FocusEvent): void {\n this._changeValue(event, 'Max');\n }\n\n private _changeValue(event: React.FocusEvent, 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): 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): 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>;\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): 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 {\n private readonly anchorType: React.RefObject;\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
  • \n \n {hasContentSwatch && shouldDisplayAsSwatch && this._renderSwatch(dimensionType)}\n \n \n
  • \n );\n }\n\n private _getShouldDisplayAsSwatch(dimensionType: DimensionTypes) {\n const shouldDisplayAsSwatch = checkIfShouldDisplayAsSwatch(dimensionType, this.props.context as ICoreContext);\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 \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): 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 \n \n \n \n {productRefinerValue.Count !== undefined && `(${productRefinerValue.Count})`}\n \n \n \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>;\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): 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}\n */\nclass RefineSubmenu extends React.Component {\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
    \n \n {productRefinerHierarchy.KeyName}\n \n \n {this._renderChildItems(productRefinerHierarchy)}\n \n
    \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 \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 \n {listItems}\n \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
  • \n \n
  • \n );\n });\n return
      {listItems}
    ;\n }\n\n private _onToggleItem(itemToggleNotification: IRefineItemToggleNotification): void {\n this.props.onUpdateRefiners(itemToggleNotification);\n }\n\n private _onToggleSubmenu(): void {\n this.setState(prevState => ({\n expanded: !prevState.expanded\n }));\n }\n}\n\nexport default RefineSubmenu;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\ninterface ISeparator {\n separator: string;\n}\n\nexport const Separator: React.FC = ({ separator }) => (\n \n {` `}\n {separator}\n {` `}\n \n);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\ninterface ITitle {\n className: string;\n text: string;\n}\n\nexport const Title: React.FC = ({ text, className }) => (\n \n {` `}\n {text}\n {` `}\n \n);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n 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 {\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>}\n */\n@observer\nexport default class SearchResultContainer extends React.PureComponent<\n ISearchResultContainerProps,\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;\n\n private readonly _sortAndFilterContainerRef: React.RefObject;\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, 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();\n this._sortAndFilterContainerRef = React.createRef();\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 {\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 \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 \n ) : null,\n searchResultModal: this._getSearchResultModal(),\n isMobile: this.isMobile,\n errorMessage: 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 => {\n const context = this.props.context as ICoreContext;\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 => {\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,\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 => {\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 = ;\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 { IPriceComponentResources } from '@msdyn365-commerce/components';\nimport MsDyn365 from '@msdyn365-commerce/core';\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n ICategoryHierarchyViewProps,\n IRefineMenuViewProps,\n ISearchResultContainerViewProps,\n ISearchResultModalViewProps,\n ISortByViewProps,\n ITitleViewProps\n} from '@msdyn365-commerce-modules/search-result-container';\nimport { Button, getTelemetryObject, Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport React, { MouseEventHandler, useEffect, useState } from 'react';\n\nimport { IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\nimport {\n ISearchResultContainerProps,\n ISearchResultContainerResources\n} from '../definition-extensions/search-result-container.ext.props.autogenerated';\nimport { ProductComponent } from './components/product.component';\n\n/**\n * DescriptionInterval.\n */\nenum DescriptionInterval {\n productDescriptionInterval = 14,\n productDescriptionIntervalRemainder0 = 0,\n productDescriptionIntervalRemainder9 = 9\n}\n\n/**\n * Render Clear button for mobile viewport.\n * @param props - The view props.\n * @returns The JSX Element.\n */\nconst renderProductCards = (props: ISearchResultContainerViewProps & ISearchResultContainerProps<{}>): JSX.Element | null => {\n return <Node {...props.ProductsContainer}>{props.products}</Node>;\n};\n\n/**\n * Returns the product inventory label.\n * @param channelInventoryConfigurationId - The channel configuration Id.\n * @param product - The product.\n * @returns The inventory label.\n */\nfunction getInventoryLabel(channelInventoryConfigurationId: number | undefined, product: ProductSearchResult): string | undefined {\n if (!channelInventoryConfigurationId || !ArrayExtensions.hasElements(product.AttributeValues)) {\n return undefined;\n }\n const inventoryAttribute = product.AttributeValues.find(attribute => attribute.RecordId === channelInventoryConfigurationId);\n if (inventoryAttribute) {\n return inventoryAttribute.TextValue;\n }\n return undefined;\n}\n\n/**\n * Render Clear button for mobile viewport.\n * @param props - The view props.\n * @param product - The product item data.\n * @param index - The index of each product item.\n * @param isEnabledProductDescription - The flag for showing Product desription tile.\n * @returns The JSX Element.\n */\nconst renderProductCardsDescription = (\n props: ISearchResultContainerViewProps & ISearchResultContainerProps<{}>,\n product: ProductSearchResult,\n index: number,\n isEnabledProductDescription?: boolean\n): JSX.Element | null => {\n const { config, context, resources, productsDimensionAvailabilities } = props;\n const telemetryContent = getTelemetryObject(props.context.request.telemetryPageName!, props.friendlyName, props.telemetry);\n const breadCrumbType = props.context.app.config.breadcrumbType;\n const isAllowBack = props.config.allowBackNavigation && (breadCrumbType === 'back' || breadCrumbType === 'categoryAndBack');\n const classname = isEnabledProductDescription\n ? 'ms-product-search-result__item product__description'\n : 'ms-product-search-result__item';\n const quickviewslot = ArrayExtensions.hasElements(props.slots.quickview) ? props.slots.quickview[0] : undefined;\n const channelInventoryConfigurationId = props.data.products.result?.channelInventoryConfigurationId;\n const isPriceMinMaxFeatureState = props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailSearchPriceRangeFeature'\n );\n const priceResources: IPriceComponentResources = {\n priceRangeSeparator: resources.priceRangeSeparator\n };\n\n const productComparisonButton = ArrayExtensions.hasElements(props.slots.productComparisonButton)\n ? props.slots.productComparisonButton[0]\n : null;\n\n return (\n <li className={classname} key={index}>\n <ProductComponent\n context={context}\n telemetryContent={telemetryContent}\n imageSettings={config.imageSettings}\n freePriceText={resources.priceFree}\n originalPriceText={resources.originalPriceText}\n currentPriceText={resources.currentPriceText}\n ratingAriaLabel={resources.ratingAriaLabel}\n allowBack={isAllowBack}\n id={props.id}\n key={product.RecordId}\n typeName={props.typeName}\n data={{ product }}\n quickViewButton={quickviewslot}\n productComparisonButton={productComparisonButton}\n isEnabledProductDescription={isEnabledProductDescription}\n inventoryLabel={getInventoryLabel(channelInventoryConfigurationId, product)}\n isPriceMinMaxEnabled={isPriceMinMaxFeatureState?.IsEnabled}\n priceResources={priceResources}\n swatchItemAriaLabel={resources.swatchItemAriaLabel}\n dimensionAvailabilities={productsDimensionAvailabilities?.find(\n (dimensionAvailability: IProductsDimensionsAvailabilities[]) =>\n ArrayExtensions.hasElements(dimensionAvailability) &&\n dimensionAvailability[0].masterProductId === product.MasterProductId\n )}\n />\n </li>\n );\n};\n\n/**\n * Render Clear button for mobile viewport.\n * @param props - The view props.\n * @returns The JSX Element.\n */\nconst renderProducts = (props: ISearchResultContainerViewProps & ISearchResultContainerProps<{}>): JSX.Element | null => {\n const products = props.data.listPageState.result?.activeProducts;\n if (!products || !ArrayExtensions.hasElements(products)) {\n return null;\n }\n const productDescriptionInterval: number = DescriptionInterval.productDescriptionInterval;\n const productDescriptionIntervalRemainder0: number = DescriptionInterval.productDescriptionIntervalRemainder0;\n const productDescriptionIntervalRemainder9: number = DescriptionInterval.productDescriptionIntervalRemainder9;\n return (\n <Node {...props.ProductsContainer}>\n {props.errorMessage}\n <ul className='list-unstyled'>\n {products.map((product: ProductSearchResult, index: number) =>\n index % productDescriptionInterval === productDescriptionIntervalRemainder0 ||\n index % productDescriptionInterval === productDescriptionIntervalRemainder9\n ? renderProductCardsDescription(props, product, index, true)\n : renderProductCardsDescription(props, product, index, false)\n )}\n </ul>\n </Node>\n );\n};\n\n/**\n * Render Title Count.\n * @param props - The title view props.\n * @returns The JSX Element.\n */\nconst renderTitleCount = (props: ITitleViewProps): JSX.Element | null => {\n const { title, TitleContainer } = props;\n if (title) {\n return <Node {...TitleContainer}>{title.titleCount}</Node>;\n }\n return null;\n};\n\n/**\n * Render Category Hierarchy.\n * @param props - The category hierarchy view props.\n * @returns The JSX Element.\n */\nconst renderCategoryHierarchy = (props: ICategoryHierarchyViewProps): JSX.Element | null => {\n const { CategoryHierarchyContainer, categoryHierarchyList, categoryHierarchySeparator } = props;\n if (categoryHierarchyList) {\n return (\n <Node {...CategoryHierarchyContainer}>\n {categoryHierarchyList.map((category, index) => (\n <React.Fragment key={index}>\n {category}\n {categoryHierarchyList[index + 1] && categoryHierarchySeparator}\n </React.Fragment>\n ))}\n </Node>\n );\n }\n\n return null;\n};\n\n/**\n * Function to make filter sticky.\n * @param isMobile - The boolean prop.\n * @param isStickyHeader - The boolean prop.\n */\nexport const configureStickyFilter = (isMobile: boolean, isStickyHeader: boolean): void => {\n // Get heights of cookie and promotion banners\n const defaultValue = 0;\n const defaultOffset = 28;\n const headerContainer: HTMLElement | null = document.querySelector('.ms-header');\n\n const headerHeight: number | undefined = headerContainer?.offsetHeight;\n const containerHeight: number = headerHeight ?? defaultOffset;\n const bannerHeights = isStickyHeader ? defaultValue : containerHeight;\n const headerElement = document.querySelector('header .lock-opaque');\n const defaultContainer = document.querySelector('header .default-container');\n const refinerElement = isMobile ? document.querySelector('.msc-sort-filter-wrapper') : document.querySelector('.ms-refiner-heading');\n if (refinerElement && headerElement && defaultContainer) {\n if (MsDyn365.isBrowser && document.documentElement.scrollTop > bannerHeights) {\n refinerElement.classList.add('lock-Filter');\n refinerElement.setAttribute('style', `top: ${defaultContainer.clientHeight}px`);\n } else {\n refinerElement.classList.remove('lock-Filter');\n }\n } else if (refinerElement) {\n if (MsDyn365.isBrowser && document.documentElement.scrollTop > bannerHeights) {\n refinerElement.classList.add('lock-top');\n } else {\n refinerElement.classList.remove('lock-top');\n refinerElement.classList.remove('lock-Filter');\n refinerElement.removeAttribute('style');\n }\n }\n};\n\n/**\n * Function to setup filter sticky.\n * @param isMobile - The boolean prop.\n * @param isStickyHeader - The boolean prop.\n */\nfunction stickyFilterSetup(isMobile: boolean, isStickyHeader: boolean): void {\n window.addEventListener('scroll', () => {\n configureStickyFilter(isMobile, isStickyHeader);\n });\n configureStickyFilter(isMobile, isStickyHeader);\n}\n\n/**\n * Function to make filter sticky.\n * @param refinerRefernce - Ref prop for filter.\n * @param toggle - Toggle function for filter menu.\n */\nfunction useOutsideClick(refinerRefernce: React.RefObject<HTMLElement>, toggle: (event: Event) => void) {\n React.useEffect(() => {\n /**\n * Function to make filter sticky.\n * @param event - Event prop for filter.\n */\n function handleClickOutside(event: Event) {\n const element = document.querySelector('.ms-refine-filter__toggle_collapsed');\n if (refinerRefernce.current && !refinerRefernce.current.contains(event.target as Node) && !element) {\n toggle(event);\n }\n }\n if (MsDyn365.isBrowser) {\n document.addEventListener('click', handleClickOutside);\n }\n return () => {\n if (MsDyn365.isBrowser) {\n document.removeEventListener('click', handleClickOutside);\n }\n };\n }, [refinerRefernce, toggle]);\n}\n\n/**\n * Render the category page items.\n * @param props - The view props.\n * @returns The search Result container module view.\n */\nconst SearchResultContainerView: React.FC<ISearchResultContainerViewProps & ISearchResultContainerProps<{}>> = props => {\n const {\n SearchResultContainer,\n pagination,\n ProductSectionContainer,\n choiceSummary,\n isMobile,\n modalToggle,\n searchResultModal,\n TitleViewProps,\n refineMenu,\n categoryHierarchy,\n sortByOptions,\n CategoryNavContainer,\n RefineAndProductSectionContainer,\n FeatureSearchContainer,\n similarLookProduct,\n errorMessage,\n resources\n } = props;\n useEffect(() => {\n if (props.config.useStickyFilter && MsDyn365.isBrowser) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app context is generic\n stickyFilterSetup(props.isMobile, props.context.app.config.enableStickyHeader as boolean);\n }\n }, [props]);\n const [isExpanded, setIsExpanded] = useState<boolean>(false);\n const toggle = () => {\n setIsExpanded(!isExpanded);\n };\n const wrapperRefiner = React.useRef(null);\n useOutsideClick(wrapperRefiner, toggle);\n const isRecoSearchPage = props.context.actionContext.requestContext.query?.recommendation;\n if (isMobile) {\n return (\n <Module {...SearchResultContainer}>\n {similarLookProduct ? null : (\n <Node {...CategoryNavContainer}>\n {renderCategoryHierarchy(categoryHierarchy)}\n {renderTitle(TitleViewProps)}\n {renderTitleCount(TitleViewProps)}\n </Node>\n )}\n {choiceSummary}\n <Node className='msc-sort-filter-wrapper'>{modalToggle}</Node>\n {createSearchResultModal(searchResultModal, refineMenu, sortByOptions, isRecoSearchPage)}\n <Node {...FeatureSearchContainer}>{similarLookProduct}</Node>\n {errorMessage}\n {props.config.enableProdutDescription ? renderProducts(props) : renderProductCards(props)}\n {pagination}\n </Module>\n );\n }\n return (\n <Module {...SearchResultContainer}>\n {similarLookProduct ? null : (\n <Node {...CategoryNavContainer}>\n {categoryHierarchy && renderCategoryHierarchy(categoryHierarchy)}\n {TitleViewProps && renderTitle(TitleViewProps)}\n {TitleViewProps && renderTitleCount(TitleViewProps)}\n </Node>\n )}\n <Node {...FeatureSearchContainer}>{similarLookProduct}</Node>\n <Node {...RefineAndProductSectionContainer}>\n <Node ref={wrapperRefiner} className='ms-refiner-heading'>\n <Node className='ms-refiner-heading_title'>\n <Button\n className={isExpanded ? 'ms-refine-filter__toggle_expanded' : 'ms-refine-filter__toggle_collapsed'}\n aria-label='Filter'\n onClick={toggle}\n aria-expanded={isExpanded}\n tabIndex={0}\n >\n {resources.filterText}\n </Button>\n <div className='ms-search-result-wrapper-title-choice-summary'>{choiceSummary}</div>\n <div className='ms-search-result-wrapper-sort-by-category'>\n {sortByOptions && !isRecoSearchPage && renderSort(sortByOptions)}\n </div>\n </Node>\n {refineMenu && isExpanded && renderRefiner(refineMenu)}\n <Node className='ms-refine__footer'>\n {refineMenu && isExpanded && renderRefinerFooter(refineMenu, toggle, resources)}\n </Node>\n </Node>\n\n <Node {...ProductSectionContainer}>\n {errorMessage}\n {props.config.enableProdutDescription ? renderProducts(props) : renderProductCards(props)}\n {pagination}\n </Node>\n </Node>\n </Module>\n );\n};\n\n/**\n * Render Search result Modal.\n * @param modalProps - The Search Result Modal view props.\n * @param refineMenu - The Refine Menu view props.\n * @param sortByDropDown - The Sort by view props.\n * @param isRecoSearchPage - The recomandation search page flag.\n * @returns The JSX Element.\n */\nconst createSearchResultModal = (\n modalProps: ISearchResultModalViewProps,\n refineMenu: IRefineMenuViewProps,\n sortByDropDown: ISortByViewProps,\n isRecoSearchPage?: string\n): JSX.Element => {\n return React.cloneElement(\n modalProps.modal,\n {},\n modalProps.modalHeader,\n createModalBody(modalProps, refineMenu, sortByDropDown, isRecoSearchPage),\n modalProps.modalFooter\n );\n};\n\n/**\n * Render Refiner Mobile.\n * @param props - The Refine Menu view props.\n * @returns The JSX Element.\n */\nconst renderRefinerMobile = (props: IRefineMenuViewProps): JSX.Element | null => {\n const { refiners, RefineMenuContainer, RefinerSectionContainer } = props;\n if (refiners) {\n return (\n <Node {...RefinerSectionContainer}>\n <Node {...RefineMenuContainer}>\n {refiners.map((submenu, index) => (\n <React.Fragment key={index}>{submenu}</React.Fragment>\n ))}\n </Node>\n </Node>\n );\n }\n return null;\n};\n\n/**\n * Render Search result Body.\n * @param props - The Search Result Modal view props.\n * @param refineMenu - The Refine Menu view props.\n * @param sortByDropDown - The Sort by view props.\n * @param isRecoSearchPage - The recomandation search page flag.\n * @returns The JSX Element.\n */\nconst createModalBody = (\n props: ISearchResultModalViewProps,\n refineMenu: IRefineMenuViewProps,\n sortByDropDown: ISortByViewProps,\n isRecoSearchPage?: string\n): JSX.Element | null => {\n if (sortByDropDown) {\n return React.cloneElement(props.modalBody, {}, renderSort(sortByDropDown, isRecoSearchPage), renderRefinerMobile(refineMenu));\n }\n return null;\n};\n\n/**\n * Render Refiner.\n * @param props - The Refine Menu view props.\n * @returns The JSX Element.\n */\nconst renderRefiner = (props: IRefineMenuViewProps): JSX.Element | null => {\n const { refiners, RefineMenuContainer, RefinerSectionContainer } = props;\n if (refiners) {\n return (\n <Node {...RefinerSectionContainer}>\n <Node {...RefineMenuContainer}>\n {refiners.map((submenu, index) => (\n <React.Fragment key={index}>{submenu}</React.Fragment>\n ))}\n </Node>\n </Node>\n );\n }\n return null;\n};\n\n/**\n * Render Refiner Footer.\n * @param props - The Refine Menu view props.\n * @param handler - The Refine menu toggle function.\n * @param resources - Resources to get the done text and aria label.\n * @returns The JSX Element.\n */\nconst renderRefinerFooter = (\n props: IRefineMenuViewProps,\n handler: MouseEventHandler,\n resources: ISearchResultContainerResources\n): JSX.Element | null => {\n const { refiners } = props;\n if (refiners) {\n return (\n <Node className='ms-refine__footer__done'>\n <Node tag='button' className='ms-refine-filter-done' aria-label={resources.doneAriaLabel} tabIndex={0} onClick={handler}>\n {resources.doneText}\n </Node>\n </Node>\n );\n }\n return null;\n};\n\n/**\n * Render sort by drop down.\n * @param props - The sort by view props.\n * @param isRecoSearchPage - The recomandation search page flag.\n * @returns The JSX Element.\n */\nconst renderSort = (props: ISortByViewProps, isRecoSearchPage?: string): JSX.Element | null => {\n const { SortingContainer, sortByDropDown } = props;\n if (sortByDropDown && !isRecoSearchPage) {\n return <Node {...SortingContainer}>{sortByDropDown}</Node>;\n }\n return null;\n};\n\n/**\n * Render Title.\n * @param props - The title view props.\n * @returns The JSX Element.\n */\nconst renderTitle = (props: ITitleViewProps): JSX.Element | null => {\n const { title, TitleContainer } = props;\n if (title) {\n return (\n <Node {...TitleContainer}>\n <Node tag='h1' className=''>\n {title.titlePrefix}\n {title.titleText}\n </Node>\n </Node>\n );\n }\n return null;\n};\n\nexport default SearchResultContainerView;\n","module.exports = React;","module.exports = ReactDOM;"],"names":["DescriptionInterval","renderProductCards","props","React","Node","Object","assign","ProductsContainer","errorMessage","products","getInventoryLabel","channelInventoryConfigurationId","product","ArrayExtensions","hasElements","AttributeValues","inventoryAttribute","find","attribute","RecordId","TextValue","renderProductCardsDescription","index","isEnabledProductDescription","_props$data$products$","_props$data$featureSt","config","context","resources","telemetryContent","getTelemetryObject","request","telemetryPageName","friendlyName","telemetry","breadCrumbType","app","breadcrumbType","isAllowBack","allowBackNavigation","classname","quickviewslot","slots","quickview","undefined","data","result","isPriceMinMaxFeatureState","featureState","Name","priceResources","priceRangeSeparator","className","key","ProductComponent","imageSettings","freePriceText","priceFree","originalPriceText","currentPriceText","ratingAriaLabel","allowBack","id","typeName","quickViewButton","inventoryLabel","isPriceMinMaxEnabled","IsEnabled","renderProducts","_props$data$listPageS","listPageState","activeProducts","productDescriptionInterval","productDescriptionIntervalRemainder0","productDescriptionIntervalRemainder9","map","renderTitleCount","title","TitleContainer","titleCount","renderCategoryHierarchy","CategoryHierarchyContainer","categoryHierarchyList","categoryHierarchySeparator","category","createSearchResultModal","modalProps","refineMenu","sortByDropDown","isRecoSearchPage","modal","modalHeader","createModalBody","modalFooter","modalBody","renderSort","refiners","RefineMenuContainer","RefinerSectionContainer","submenu","renderRefinerMobile","renderRefiner","SortingContainer","renderTitle","tag","titlePrefix","titleText","_props$context$action","SearchResultContainer","pagination","ProductSectionContainer","choiceSummary","isMobile","modalToggle","searchResultModal","TitleViewProps","categoryHierarchy","sortByOptions","CategoryNavContainer","RefineAndProductSectionContainer","FeatureSearchContainer","similarLookProduct","isExpanded","setIsExpanded","useState","toggle","actionContext","requestContext","query","recommendation","Module","enableProdutDescription","Button","onClick","tabIndex","filterText","binding","modules","dataActions","registerSanitizedActionPath","sanitizedActionPath","dataAction","default","Error","prototype","RegistrationId","c","require","$type","da","name","path","runOn","iNM","ns","n","p","pdp","md","window","__bindings__","_objectSpread","viewDictionary","cn","BaseCollectionInput","constructor","pageType","apiSettings","queryResultSettings","searchText","includeAttributes","isUpdateRefinerPanel","locale","catalogId","channelInventoryConfiguration","inventoryRefiner","getCacheKey","this","Paging","toJS","Sorting","generateCacheKey","value","refiner","RefinerRecordId","LeftValueBoundString","RightValueBoundString","convertToString","getCacheObjectType","dataCacheType","createBaseCollectionInput","args","inputClassConstuctor","urlTokens","categoryId","QueryResultSettingsProxy","fromInputData","QueryResultSettings","queryRefiners","hydrateRefinersFromUrl","inputData","_inputData$config","updateRefinerPanel","getUpdateRefinerPanel","getCatalogId","sorting","Columns","JSON","parse","decodeURIComponent","itemId","q","productId","stringify","ProductId","Recommendation","discountIds","DiscountIds","ProductListInventoryFilteringOptions","GetFullProductsByCollectionInput","length","async","returnProducts","productSearchResults","metadataCount","productSearchResultsWithImages","productSearchResult","newImageUrl","generateProductImageUrl","PrimaryImageUrl","inventoryLevel","InventoryLevels","threshold","enableStockCheck","count","element","InventoryProductAttributeRecordId","inventoryRanges","InventoryOutOfStockAttributeValueText","inventoryAwareSortableAttributeId","ProductAvailabilitySortableAttributeRecordId","actionDataAction","createObservableDataAction","action","input","_context$requestConte","_context$requestConte2","_context$requestConte3","_context$requestConte4","_context$requestConte5","promise","channelInventoryConfigurationPromise","searchProductId","searchCriteriaInput","Context","ChannelId","channelId","CatalogId","Refinement","IncludeAttributes","SkipVariantExpansion","AsyncResult","resolve","getInventoryConfigurationAsync","callerContext","filter","isInStockRefiner","inventoryRefinerValue","getInventorySortableRefinerValue","some","push","productListInventoryDisplay","HideOOS","isInStock","inventoryInStockRefinerValue","SortOOS","_input$queryResultSet","_input$queryResultSet2","sortColumnName","column","ColumnName","IsDescending","CategoryIds","searchByCriteriaAsync","SearchCondition","searchObject","Number","isNaN","RecommendationListId","Ids","_context$requestConte6","split","productIds","getProductPromotionsAsync","HeaderContext","LineContexts","Date","_p$ProductId","metadata","Top","itemsPerPage","skip","Skip","sortOptions","sortByOptionRelevanceDesc","sortByOptionRatingAsc","sortByOptionRatingDesc","sortByOptionNameAsc","sortByOptionNameDesc","sortByOptionPriceAsc","sortByOptionPriceDesc","sortByOptionBestSelling","sortByOptionNewScore","sortByOptionTrendingScore","MappedSearchInput","buildCacheKey","getMappedSearchConfiguration","ctx","getSearchConfigurationAsync","then","searchConfiguration","ProductSortColumns","sortColumn","toUpperCase","warning","Boolean","createInput","getMappedSearchConfigurationDataAction","getProductRefinerHierarchy","searchCriteria","getProductSearchRefinersAsync","productRefiners","trace","productRefiner","DefaultValues","RefinersByCollectionInput","defaultCategoryIdValue","defaultProductIdValue","DataTypeValue","AttributeDataType","TrueFalse","UnitText","RowNumber","Count","ExtensionProperties","RefinerSourceValue","ProductRefinerSource","Attribute","_input$channelInvento2","_input$channelInvento3","inventoryProductAttributeRecordId","compressedRefinerKeys","compressedRefinerArray","parseQueryParam","compressedRefiner","parsedRefiner","forEach","refinerKey","_unused","buildListPageUrl","fullUrl","sortingColumns","skipCount","searchParams","delete","sortedRefiners","sort","first","second","set","compressedRefiners","compressRefiners","href","toString","getCurrentUrl","MsDyn365","isBrowser","URL","location","url","requestUrl","ListPageState","activeFilters","sortingCritera","currentPageNumber","pageSize","featureProduct","productPrices","__decorate","observable","ListPageStateInput","listPageStateAction","createListPageInput","ProductRefinerValueDataTypeValue","ProductRefinerTypeValue","isRangeType","dataTypeValue","Currency","Decimal","Integer","findMatchingRefinementCriterion","productRefinerValue","refinementCriteria","refinementCriterion","isMatchingRefinementCriterion","getUpdatedRefinementCriteria","itemToggleNotification","currentRefinementCriteria","updatedRefinementCriteria","toggledItemFound","selectedCriterion","isSelecting","next","rangeStart","rangeEnd","Text","parentProductRefinerHierarchy","RefinerTypeValue","RefinerType","SingleSelect","Values","child","matchingIndex","findIndex","criterion","splice","ChoiceSummary","super","closeButtonGlyph","_onClick","e","preventDefault","stopPropagation","target","currentTarget","clearAll","getAttribute","includes","selectedRefiner","_getSelectedRefinerChoice","onChoiceClicked","itemClicked","choiceClicked","nextItemToFocus","nextSibling","payLoad","getPayloadObject","_this$props$context","selectedChoices","refinerHierarchy","choice","parent","hierarchy","_getKeyForRefinerValue","render","clearAllText","label","classNames","choiceAriaLabel","closeAriaLabel","items","selectedRefinersMap","contentAction","etext","clearAllAttributes","getTelemetryAttributes","classnames","item","urlBuilder","role","LeftValueBoundLocalizedString","choiceFormat","choiceRangeValueFormat","refinerValues","overallFormat","rangeFormat","refinerValueName","refinerName","KeyName","replace","_formatPrice","filterValue","amount","currency","cultureFormatter","formatCurrency","error","selected","computed","observer","ErrorMessage","_ref","text","FeatureSearchResultItem","_context$request$app","productName","productRecordId","productUrl","getProductPageUrlSync","fallbackImage","getFallbackImageUrl","ItemId","OmniChannelMedia","heading","featureSimilarDescriptionTitle","featureSimilarLooksTitle","onTelemetryClick","gridSettings","imageUrl","altText","img","src","imageProps","fallBackSrc","Image","loadFailureBehavior","renderProductPlacementImage","Link","ariaLabel","ModalToggle","innerRef","ref","modalNode","Modal","autoFocus","applicationNode","returnFocusRef","returnRef","isOpen","onModalToggle","zIndex","modalHeaderNode","ModalHeader","modalTitle","modalFooterNode","ModalFooter","modalCloseButtonText","ProductSearchResultItems","moduleType","moduleId","quickviewSlot","productComparisonButton","productsDimensionAvailabilities","swatchItemAriaLabel","dimensionAvailabilities","dimensionAvailability","masterProductId","MasterProductId","RangeRefineItem","_selectedRefinementCr","_this$props$selectedR","_this$props$selectedR2","_ref2","_this$props$selectedR3","_this$props$selectedR4","_formattedPriceReverseLookup","Map","getLabels","sliderId","minPrice","maxPrice","labelId","labelString","labelPositioning","getSliderThumbs","sliderKey","selectedMin","selectedMinPrice","selectedMax","selectedMaxPrice","_this$props$minValueS","_this$props$maxValueS","minValueSliderThumbAriaLabel","currencyCode","ariaValueText","maxValueSliderThumbAriaLabel","_onRangeUpdate","bind","_onRangeUpdateEnd","_handleRangeTooltipText","_changeMin","_changeMax","_finishChangeMin","_finishChangeMax","minInput","maxInput","selectedRefinementCriterion","initialMin","initialMax","String","minValue","maxValue","labels","sliderKeyString","sliderThumbs","state","isChecked","validationErrorMin","validationErrorMax","touchedMin","touchedMax","shouldComponentUpdate","nextProps","nextState","componentDidUpdate","previousProps","updateSliderProps","refineItemCommonProps","rangeType","_renderInputFields","_renderSlider","_ref3","_this$props$selectedR5","_this$props$selectedR6","_ref4","_this$props$selectedR7","_this$props$selectedR8","setState","isDisabled","formAttrs","rangeNameFormat","minInputClassName","maxInputClassName","formattedSelectedMin","_getFormattedSelectedValue","formattedSelectedMax","minLabel","onChange","onFocus","onBlur","maxLabel","placeholder","placeholderTextMax","ariaAttributes","Slider","inForm","min","max","step","orientation","showLabels","showTooltip","onChangeEnd","debounce","handleTooltipText","event","_changeValue","inputType","selectedKey","touchedKey","_getInputWithoutFormatting","selectedMinValue","minTouched","onToggle","maxNum","validationErrorNaN","_focus","_validateRange","selectedMaxValue","maxTouched","minNum","setTimeout","current","focus","touched","validationError","validationErrorRange","inputAsNum","get","sliderChangeNotification","eventType","firstThumbValue","secondThumbValue","_focusOnSliderThumb","document","getElementById","tooltip","RefineItem","anchorType","_productRefinerValue$","_this$props$parentPro","_this$props$parentPro2","_this$props","productCountAriaLabel","singleProductCountAriaLabel","children","refineItemAriaLabel","refineItemsAriaLabel","attrs","_objectWithoutProperties","_excluded","isSingleSelect","itemTypeClassName","SourceValue","Rating","_renderRating","productText","productCount","refineMenuItemAriaLabel","format","dimensionType","toLocaleLowerCase","shouldDisplayAsSwatch","_getShouldDisplayAsSwatch","hasColor","StringExtensions","isNullOrWhitespace","SwatchColorHexCode","hasImage","SwatchImageUrl","hasContentSwatch","_getRefinerUrl","_renderSwatch","checkIfShouldDisplayAsSwatch","_productRefinerValue$2","swatchItems","colorHexCode","SwatchComponent","list","isSelectionEnabled","isRefineItem","ratingUserCountAriaLabel","ratingSingleUserCountAriaLabel","_productRefinerValue$3","refinerRating","parseInt","ratingRefiner","selectedRefinerValues","selectedRating","defaultChkProductCount","ratingComponentClass","productCountAriaLabelValue","isMobileView","RatingComponent","avgRating","ratingCount","hideCount","readOnly","moduleTypeName","RefineSubmenu","_onToggleItem","_onToggleSubmenu","isExpandedOnInitialLoad","expanded","productRefinerHierarchy","hideRating","Collapse","timeout","_renderChildItems","_renderRange","_renderSingleMultiSelect","refinerValuesList","listItems","selectedValue","_getRangeType","DisplayTemplateValue","DisplayTemplate","Range","SliderWithBars","onUpdateRefiners","prevState","Separator","separator","Title","SearchResultContainer_1","_props$context$reques","sortByDropdownOptions","_pageType","_viewport","expandrefinerCount","defaultPageNumber","isListPageStateUpdated","_isMounted","_updateVariantAvailability","dimensionsToDisplayOnProductCard","dimensionsInProductCard","dimensionsToDisplayAsSwatch","dimensionsAsSwatchType","DimensionTypes","none","_getProductsDimensionsAvailabilities","_updateListPageState","_this$props$context$r","_this$props$config$it","_this$props$config$it2","_this$props$context$r2","querySorting","totalProductCount","_this$props$data$list","_this$props$data$list2","productsList","getDimensionAvailabilitiesForProductSearchResultAction","DimensionAvailabilitiesForProductSearchResultInput","DimensionSwatchDisplayTypes","productCard","_getActivePrice","_this$props$data$list3","_this$props$data$list4","getPriceForProductSearchResult","PriceForProductSearchResultInput","_getSearchResultModal","ModalBody","SearchResultModal","modalIsOpen","_modalToggleRef","_toggleModal","_getCollectionTitle","collectionTitle","_this$props$context$r3","getFriendlyName","NameTranslations","productCountNumber","productCountText","numberOfProducts","oneProduct","toLowerCase","searchTextPrefix","_getCategoryHierarchy","categoryLinkAriaLabel","Url","_getSortingDropDown","activeDropdown","_getCurrentlySelectedOption","sortingState","selectedSortByOption","dropdownOptions","_getAllSortByOptions","dropdownOption","LabeledDropdown","labelClassname","labelText","sortByDropdownLabel","dropdownId","dropdownClassname","toggleColor","selectedOption","onSelectOption","_updateSortByDropdown","_sortAndFilterContainerRef","_getPagination","totalItems","previousText","flipperPrevious","nextText","flipperNext","UncontrolledPagination","paginationAriaLabel","qsp","startingItem","_renderPrev","_renderNext","previousAriaLabel","nextAriaLabel","_getRefineMenu","tempRangeTypeTODO","inputRange","validRefiners","_shouldHideFromRefiners","activeRefiners","_getexpandRefinerCount","expandRefinersCount","expandedRefiners","_refineItemCommonProps","_onUpdateRefiners","_buildRefinerUrl","_this$props$data$prod","_this$props$data$prod2","_this$props$data$prod3","_this$props$data$prod4","isInventorySortableAttribute","isInventoryProductAttribute","_getChoiceSummary","_this$props$data$refi","selectedRefiners","rating","choiceSummaryLabel","_onChoiceClicked","_buildRefinerUrlForChoiceSummary","_getProducts","_this$props$slots","_this$props$data$feat","_this$props$data$prod5","shouldAllowBackNavigation","shouldAllowBack","notification","history","pushState","_getSortColumnFromSelectedOption","transaction","option","mappedConfiguration","_getSortCriteriaColumn","_this$props$data$list5","sortCriteria","queryColumns","mappedSearchConfiguration","mappedSearchConfig","validValues","activeSortColumn","activeMappedConfig","_this$props$data$list6","newRefinementCriteria","dropdownElementId","dropdownElement","selectedChoice","isClearAll","refinerCount","paginationPreviousText","paginationNextText","device","Type","_updateViewport","pending","validationErrorNotNumber","validationErrorNotRange","nameTranslations","_nameTranslation","nameTranslation","Language","_this$props$context$a2","addEventListener","StoreOperationsDataActions","reaction","_listPageState$active","_listPageState$sortin","_newListPageState$cur","_newListPageState$sor","_newListPageState$act","_this$props$context$r4","_this$props$context$r5","_this$props$context$r6","_this$props$context$a","newListPageState","Math","recordId","productResults","getCollectionProducts","enableAffiliationBasedPricing","user","isAuthenticated","_newListPageState$cur2","_newListPageState$sor2","_newListPageState$act2","_this$props$context$r7","_this$props$context$r8","refinerInput","getCollectionRefinersAction","componentWillUnmount","removeEventListener","_listPageState$result","_listPageState$result2","_this$props$context$r9","_this$props$data$list7","_this$props$data$list8","productCollection","searchProduct","errorText","resultCategoryNotFoundText","resultSearchNotFoundText","productsComponent","featureComponent","searchResultContainerViewProps","disableHierarchy","moduleProps","renderView","_getViewport","variant","VariantType","Browser","Viewport","configureStickyFilter","isStickyHeader","headerContainer","querySelector","headerHeight","offsetHeight","bannerHeights","headerElement","defaultContainer","refinerElement","documentElement","scrollTop","classList","add","setAttribute","clientHeight","remove","removeAttribute","renderRefinerFooter","handler","doneAriaLabel","doneText","useEffect","useStickyFilter","stickyFilterSetup","enableStickyHeader","wrapperRefiner","refinerRefernce","handleClickOutside","contains","useOutsideClick","module","exports","ReactDOM"],"sourceRoot":""}