{"version":3,"file":"static/js/6f2af7e6264b62a9783f.bundle.js","mappings":"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","sources":["webpack://jansen-adventureworks/./src/actions/get-product-availabilities-for-selected-variant-copy.action.ts?e41c","webpack://jansen-adventureworks/./src/themes/jansen-adventureworks/definition-extensions/search-result-container.ext.props.autogenerated.ts?8422","webpack://jansen-adventureworks/./src/themes/jansen-adventureworks/views/search-result-container.view.tsx?e8cc","webpack://jansen-adventureworks/./lib/search-result-container/module-registration.js?8625","webpack://jansen-adventureworks/./src/modules/search-result-container/actions/base-collection-action.ts?ec13","webpack://jansen-adventureworks/./src/modules/search-result-container/actions/get-full-products-by-collection.ts?f1fe","webpack://jansen-adventureworks/./src/modules/search-result-container/actions/get-mapped-search-configuration.ts?6cc4","webpack://jansen-adventureworks/./src/modules/search-result-container/actions/get-product-refiner-hierarchy.ts?3937","webpack://jansen-adventureworks/./src/modules/search-result-container/actions/get-refiners-for-collection.ts?56d8","webpack://jansen-adventureworks/./src/modules/search-result-container/actions/get-inventory-refiners.ts?eaa4","webpack://jansen-adventureworks/./src/modules/search-result-container/actions/url-utils.ts?1541","webpack://jansen-adventureworks/./src/modules/search-result-container/list-page-state.ts?b0a4","webpack://jansen-adventureworks/./src/modules/search-result-container/components/utilities.ts?8569","webpack://jansen-adventureworks/./src/modules/search-result-container/components/choice-summary.tsx?3f71","webpack://jansen-adventureworks/./src/modules/search-result-container/components/error-message.tsx?6302","webpack://jansen-adventureworks/./src/modules/search-result-container/components/feature-search-result-item.tsx?71fa","webpack://jansen-adventureworks/./src/modules/search-result-container/components/link.tsx?52c2","webpack://jansen-adventureworks/./src/modules/search-result-container/components/modal.tsx?d78e","webpack://jansen-adventureworks/./src/modules/search-result-container/components/product-search-result-items.tsx?5174","webpack://jansen-adventureworks/./src/modules/search-result-container/components/range-refine-item.tsx?6288","webpack://jansen-adventureworks/./src/modules/search-result-container/components/refine-item.tsx?a594","webpack://jansen-adventureworks/./src/modules/search-result-container/components/range-refine-item-input.tsx?09aa","webpack://jansen-adventureworks/./src/modules/search-result-container/components/refine-submenu.tsx?1292","webpack://jansen-adventureworks/./src/modules/search-result-container/components/separator.tsx?4ea6","webpack://jansen-adventureworks/./src/modules/search-result-container/components/title.tsx?c269","webpack://jansen-adventureworks/./src/modules/search-result-container/search-result-container.tsx?7500","webpack://jansen-adventureworks/./src/modules/search-result-container/search-result-container.view.tsx?b779","webpack://jansen-adventureworks/./src/modules/adventureworks/views/search-result-container.view.tsx?6e86","webpack://jansen-adventureworks/external var \"React\"?0d3b","webpack://jansen-adventureworks/external var \"ReactDOM\"?853b"],"sourcesContent":["/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\nimport {\r\n ArrayExtensions,\r\n createInventoryAvailabilitySearchCriteria,\r\n DeliveryMode,\r\n getSelectedProductIdFromActionInput,\r\n getSelectedVariant,\r\n IProductInventoryInformation,\r\n mapAggregatedProductInventoryInformation,\r\n SelectedVariantInput\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n CacheType,\r\n createObservableDataAction,\r\n IAction,\r\n IActionContext,\r\n IActionInput,\r\n IAny,\r\n ICreateActionContext,\r\n IGeneric\r\n} from '@msdyn365-commerce/core';\r\nimport {\r\n ProductAvailableQuantity,\r\n ProductsDataActions,\r\n ProductType,\r\n ProductWarehouseInventoryAvailability,\r\n ReleasedProductType,\r\n SimpleProduct\r\n} from '@msdyn365-commerce/retail-proxy';\r\n\r\nexport enum Availability {\r\n outOfStock = 'Out of stock',\r\n available = 'Available',\r\n outOfStockClass = 'out-of-stock',\r\n availableClass = 'available',\r\n loading = 'loading',\r\n loadingClass = 'loading'\r\n}\r\n\r\n/**\r\n * Input class for the getProductAvailabilitiesForSelectedVariant Data Action.\r\n */\r\nexport class ProductAvailabilitiesForSelectedVariantInput implements IActionInput {\r\n public productId: number;\r\n\r\n public channelId: number;\r\n\r\n public selectedProduct: SimpleProduct | undefined;\r\n\r\n public constructor(productId: number | string, channelId: number, selectedProduct?: SimpleProduct) {\r\n this.productId = typeof productId === 'string' ? +productId : productId;\r\n this.channelId = channelId;\r\n this.selectedProduct = selectedProduct;\r\n }\r\n\r\n /**\r\n * GetCacheKey.\r\n * @returns - Returns string.\r\n */\r\n public getCacheKey = (): string => 'ProductAvailabilitiesForSelectedVariant';\r\n\r\n /**\r\n * GetCacheObjectType.\r\n * @returns - Cache Object Type string.\r\n */\r\n public getCacheObjectType = (): string => 'ProductAvailabilities';\r\n\r\n /**\r\n * DataCacheType.\r\n * @returns - CacheType string.\r\n */\r\n public dataCacheType = (): CacheType => 'none';\r\n}\r\n\r\n/**\r\n * CreateInput method for the getProductAvailabilitiesForSelectedVariant data action.\r\n * @param inputData - The input data passed to the createInput method.\r\n * @returns - ProductAvailabilitiesForSelectedVariant or error.\r\n */\r\nexport const createProductAvailabilitiesForSelectedVariantInput = (\r\n inputData: ICreateActionContext>\r\n): ProductAvailabilitiesForSelectedVariantInput => {\r\n const productId = getSelectedProductIdFromActionInput(inputData);\r\n\r\n if (productId) {\r\n return new ProductAvailabilitiesForSelectedVariantInput(+productId, +inputData.requestContext.apiSettings.channelId);\r\n }\r\n throw new Error('Unable to create ProductAvailabilitiesForSelectedVariantInput, no productId found on module config or query');\r\n};\r\n\r\n/**\r\n * The action method for the getProductAvailabilitiesForSelectedVariant data action.\r\n * @param input - ProductAvailabilitiesForSelectedVariant.\r\n * @param ctx - Action Context.\r\n * @returns - Product inventory information.\r\n */\r\nexport async function getProductAvailabilitiesForSelectedVariantAction(\r\n input: ProductAvailabilitiesForSelectedVariantInput,\r\n ctx: IActionContext\r\n): Promise {\r\n const productInventoryInformation: IProductInventoryInformation[] = [];\r\n try {\r\n let productResult: SimpleProduct | null = input.selectedProduct ?? null;\r\n\r\n if (!productResult) {\r\n const selectedVariantInput = new SelectedVariantInput(\r\n input.productId,\r\n input.channelId,\r\n undefined,\r\n undefined,\r\n ctx.requestContext\r\n );\r\n\r\n productResult = await getSelectedVariant(selectedVariantInput, ctx);\r\n }\r\n\r\n // Don't get availability if it is service item && enableStockCheck is disbaled.\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Reading config.\r\n if (\r\n ctx.requestContext.app.config.enableStockCheck &&\r\n productResult &&\r\n productResult.ItemTypeValue !== ReleasedProductType.Service &&\r\n productResult.ProductTypeValue !== ProductType.Master\r\n ) {\r\n const shippingSearchCriteria = createInventoryAvailabilitySearchCriteria(\r\n ctx,\r\n [productResult.RecordId],\r\n true,\r\n undefined,\r\n undefined,\r\n DeliveryMode.shipping\r\n );\r\n const pickupSearchCriteria = createInventoryAvailabilitySearchCriteria(\r\n ctx,\r\n [input.productId],\r\n false,\r\n true,\r\n undefined,\r\n DeliveryMode.pickup\r\n );\r\n const shippingAvailability = await ProductsDataActions.getEstimatedAvailabilityAsync(\r\n { callerContext: ctx },\r\n shippingSearchCriteria\r\n );\r\n if (shippingAvailability.ProductWarehouseInventoryAvailabilities) {\r\n const shippingInventory = mapAggregatedProductInventoryInformation(ctx, shippingAvailability);\r\n if (ArrayExtensions.hasElements(shippingInventory)) {\r\n shippingInventory[0].deliveryType = DeliveryMode.shipping;\r\n productInventoryInformation.push(shippingInventory[0]);\r\n }\r\n }\r\n const pickupAvailability = await ProductsDataActions.getEstimatedAvailabilityAsync(\r\n { callerContext: ctx },\r\n pickupSearchCriteria\r\n );\r\n if (pickupAvailability.ProductWarehouseInventoryAvailabilities) {\r\n const pickupInventory = mapAggregatedProductInventoryInformation(ctx, pickupAvailability);\r\n if (ArrayExtensions.hasElements(pickupInventory)) {\r\n pickupInventory[0].deliveryType = DeliveryMode.pickup;\r\n productInventoryInformation.push(pickupInventory[0]);\r\n }\r\n }\r\n return productInventoryInformation;\r\n } else if (\r\n productResult &&\r\n productResult.ItemTypeValue !== ReleasedProductType.Service &&\r\n productResult.ProductTypeValue !== ProductType.Master\r\n ) {\r\n const shippingSearchCriteria = createInventoryAvailabilitySearchCriteria(\r\n ctx,\r\n [productResult.RecordId],\r\n true,\r\n undefined,\r\n undefined,\r\n DeliveryMode.shipping\r\n );\r\n const shippingAvailability = await ProductsDataActions.getEstimatedAvailabilityAsync(\r\n { callerContext: ctx },\r\n shippingSearchCriteria\r\n );\r\n if (\r\n shippingAvailability.ProductWarehouseInventoryAvailabilities &&\r\n shippingAvailability.AggregatedProductInventoryAvailabilities\r\n ) {\r\n return shippingAvailability.AggregatedProductInventoryAvailabilities[0];\r\n }\r\n }\r\n return undefined;\r\n } catch (error) {\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument -- cann't assign type to the error variable.\r\n // ctx.telemetry.exception(error);\r\n ctx.telemetry.debug('[getPriceForSelectedVariantAction]Error executing action');\r\n return undefined;\r\n }\r\n}\r\n\r\n/**\r\n * The function that maps a ProductWareHouse object into a ProductAvailabilityQuantity.\r\n * @param productsWarehouseInventory - Product warehouse inventory.\r\n * @returns Product Available quantity.\r\n */\r\nexport function mergeProductWarehouseToProductAvailabities(\r\n productsWarehouseInventory: ProductWarehouseInventoryAvailability[]\r\n): ProductAvailableQuantity[] {\r\n const productAvailable: ProductAvailableQuantity[] = [];\r\n if (ArrayExtensions.hasElements(productsWarehouseInventory)) {\r\n for (const product of productsWarehouseInventory) {\r\n if (product.TotalAvailable !== undefined && product.ProductId !== undefined) {\r\n productAvailable.push({ ProductId: product.ProductId, AvailableQuantity: product.TotalAvailable });\r\n }\r\n }\r\n }\r\n return productAvailable;\r\n}\r\n\r\n/**\r\n * The complete getProductAvailabilitiesForSelectedVariant data action\r\n * Get the currently selected variant via the getSelectedVariant data action, and\r\n * then gets the availabilities for the variant via the getProductAvailabilities RetailServer API.\r\n */\r\nexport const getProductAvailabilitiesForSelectedVariantActionDataAction = createObservableDataAction({\r\n id: '@msdyn365-commerce-modules/retail-actions/get-product-availabilities-for-selected-variant',\r\n action: >getProductAvailabilitiesForSelectedVariantAction,\r\n input: createProductAvailabilitiesForSelectedVariantInput\r\n});\r\n\r\nexport default getProductAvailabilitiesForSelectedVariantActionDataAction;\r\n","/**\r\n * Copyright (c) Microsoft Corporation\r\n * All rights reserved. See License.txt in the project root for license information.\r\n * ISearchResultContainer containerModule Interface Properties\r\n * THIS FILE IS AUTO-GENERATED - MANUAL MODIFICATIONS WILL BE LOST\r\n */\r\n\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport * as React from 'react';\r\n\r\nexport const enum expandRefinersCount {\r\n all = 'all',\r\n one = 'one',\r\n two = 'two',\r\n three = 'three',\r\n four = 'four'\r\n}\r\n\r\nexport const enum layout {\r\n list = 'list',\r\n imagelist = 'imagelist'\r\n}\r\n\r\nexport interface ISearchResultContainerConfig extends Msdyn365.IModuleConfig {\r\n itemsPerPage?: number;\r\n allowBackNavigation?: boolean;\r\n imageSettings?: Msdyn365.IImageSettings;\r\n expandRefinersCount?: expandRefinersCount;\r\n disableHierarchy?: boolean;\r\n includeAttributes?: boolean;\r\n enableAffiliationBasedPricing?: boolean;\r\n updateRefinerPanel?: boolean;\r\n className?: string;\r\n clientRender?: boolean;\r\n enableProdutDescription?: boolean;\r\n useStickyFilter?: boolean;\r\n layout?: layout;\r\n}\r\n\r\nexport interface ISearchResultContainerResources {\r\n noResultsForRefinersText: string;\r\n resultCategoryNotFoundText: string;\r\n resultSearchNotFoundText: string;\r\n paginationAriaLabel: string;\r\n priceFree: string;\r\n priceRangeSeparator: string;\r\n originalPriceText: string;\r\n currentPriceText: string;\r\n ratingAriaLabel: string;\r\n flipperNext: string;\r\n flipperPrevious: string;\r\n searchTextPrefix: string;\r\n numberOfProducts: string;\r\n oneProduct: string;\r\n categoryLinkAriaLabel: string;\r\n sortByDropdownLabel: string;\r\n sortByOptionNameAsc: string;\r\n sortByOptionNameDesc: string;\r\n sortByOptionPriceAsc: string;\r\n sortByOptionPriceDesc: string;\r\n sortByOptionRatingDesc: string;\r\n sortByOptionBestSelling: string;\r\n sortByOptionNewScore: string;\r\n sortByOptionTrendingScore: string;\r\n sortByOptionRelevanceDesc: string;\r\n placeholderTextMax: string;\r\n minLabel: string;\r\n maxLabel: string;\r\n rangeNameFormat: string;\r\n validationErrorNotNumber: string;\r\n validationErrorNotRange: string;\r\n clearAllText: string;\r\n choiceSummaryLabel: string;\r\n choiceFormat: string;\r\n choiceRangeValueFormat: string;\r\n choiceAriaLabel: string;\r\n closeAriaLabel: string;\r\n modalTitle: string;\r\n modalCloseButtonText: string;\r\n minValueSliderThumbAriaLabel: string;\r\n maxValueSliderThumbAriaLabel: string;\r\n featureSimilarLooksTitle: string;\r\n featureSimilarDescriptionTitle: string;\r\n productCountAriaLabel: string;\r\n singleProductCountAriaLabel: string;\r\n swatchItemAriaLabel: string;\r\n refineItemsAriaLabel: string;\r\n refineItemAriaLabel: string;\r\n filterText: string;\r\n doneText: string;\r\n doneAriaLabel: string;\r\n addToCartText: string;\r\n moreInformationText: string;\r\n errorMessageForQtyValidation: string;\r\n availabilityIndicatorOutOfStock: string;\r\n availabilityIndicatorAvailable: string;\r\n}\r\n\r\nexport interface ISearchResultContainerProps extends Msdyn365.IModule {\r\n resources: ISearchResultContainerResources;\r\n config: ISearchResultContainerConfig;\r\n slots: {\r\n quickview: React.ReactNode[];\r\n productComparisonButton: React.ReactNode[];\r\n };\r\n}\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\nimport MsDyn365 from '@msdyn365-commerce/core';\r\nimport { AsyncResult, ProductSearchResult, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n ArrayExtensions,\r\n getProductAvailabilitiesForSelectedVariant,\r\n getSimpleProductsAction,\r\n ProductInput\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n ICategoryHierarchyViewProps,\r\n IRefineMenuViewProps,\r\n ISearchResultContainerViewProps,\r\n ISearchResultModalViewProps,\r\n ISortByViewProps,\r\n ITitleViewProps\r\n} from '@msdyn365-commerce-modules/search-result-container';\r\nimport { ProductAvailabilitiesForSelectedVariantInput } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { Button, Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport React, { MouseEventHandler, useEffect, useState } from 'react';\r\nimport { AddToCartComponent } from '@msdyn365-commerce/components';\r\nimport ProductPopover from './components/product-popover.component';\r\nimport {\r\n ISearchResultContainerProps,\r\n ISearchResultContainerResources,\r\n layout\r\n} from '../definition-extensions/search-result-container.ext.props.autogenerated';\r\nimport IncrementalQuantity from './components/IncrementalQuantity';\r\nimport { Toaster, toast } from 'sonner';\r\nimport { getProductPageUrlSync } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { Availability } from '../../../actions/get-product-availabilities-for-selected-variant-copy.action';\r\n\r\nconst _showToast = (heading: string, description: string) => {\r\n toast.error(\r\n
\r\n
\r\n

{heading}

\r\n
\r\n
\r\n {description}\r\n
\r\n
\r\n );\r\n};\r\n\r\ninterface errorMessage {\r\n LocalizedMessageParameters: string;\r\n}\r\n\r\n/**\r\n * Render products in a table view.\r\n * @param props - The view props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderProductsAsTable = (props: ISearchResultContainerViewProps & ISearchResultContainerProps<{}>): JSX.Element | null => {\r\n const products = props.data.listPageState.result?.activeProducts;\r\n const { context, typeName, id, resources } = props;\r\n const [quantities, setQuantities] = useState(new Array(products?.length).fill(1));\r\n const [availabilities, setAvailabilities] = useState(Array(products?.length).fill(Availability.loading));\r\n const [FullProducts, setFullProducts] = useState([]);\r\n\r\n if (!products || !ArrayExtensions.hasElements(products)) {\r\n return null;\r\n }\r\n\r\n const handleQuantityChange = (index: number, value: number) => {\r\n setQuantities(prevQuantities => {\r\n const newQuantities = [...prevQuantities];\r\n newQuantities[index] = value < 1 ? 1 : value; // Ensure quantity is at least 1\r\n return newQuantities;\r\n });\r\n };\r\n\r\n let isList = props.config.layout === layout.list;\r\n let isImageList = props.config.layout === layout.imagelist;\r\n\r\n const _getProducts = (products: ProductSearchResult[] = []): Promise => {\r\n const productInputs = products\r\n .filter(product => product.RecordId)\r\n .map(product => new ProductInput(product.RecordId!, props.context.request.apiSettings));\r\n return getSimpleProductsAction(productInputs, props.context.actionContext);\r\n };\r\n\r\n useEffect(() => {\r\n const fetchProducts = async () => {\r\n const simpleProducts = await _getProducts(products);\r\n setFullProducts(simpleProducts);\r\n simpleProducts.map((simpleProduct: SimpleProduct, i) => {\r\n const minQuantity = simpleProduct.Behavior?.MinimumQuantity ?? 0;\r\n const multipleOfQuantity = simpleProduct.Behavior?.MultipleOfQuantity ?? 0;\r\n const quantityToSet = minQuantity > 0 ? minQuantity : multipleOfQuantity > 0 ? multipleOfQuantity : 1;\r\n\r\n handleQuantityChange(i, quantityToSet);\r\n });\r\n };\r\n const fetchAvailabilities = async () => {\r\n for (let index = 0; index < products.length; index++) {\r\n const product = products[index];\r\n if (product) {\r\n const availability = await newAvailableQuantity(product, context);\r\n setAvailabilities(prevAvailabilities => {\r\n const updatedAvailabilities = [...prevAvailabilities];\r\n updatedAvailabilities[index] =\r\n availability?.TotalAvailableInventoryLevelLabel === Availability.available\r\n ? Availability.available\r\n : Availability.outOfStock;\r\n return updatedAvailabilities;\r\n });\r\n }\r\n }\r\n };\r\n\r\n fetchProducts();\r\n fetchAvailabilities();\r\n }, [products, context]);\r\n\r\n return (\r\n <>\r\n \r\n \r\n {props.errorMessage}\r\n
\r\n \r\n \r\n {products.map((product: ProductSearchResult, index: number) => {\r\n const productUrl = product\r\n ? getProductPageUrlSync(product.Name ?? '', product.RecordId, context.actionContext, undefined)\r\n : '';\r\n const simpleProduct: SimpleProduct = {\r\n RecordId: product.RecordId,\r\n Price: product.Price,\r\n ProductTypeValue: 0,\r\n BasePrice: product.BasePrice || 0,\r\n AdjustedPrice: product.Price\r\n };\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n })}\r\n \r\n
\r\n \r\n \r\n {FullProducts.length > 0 && (\r\n {\r\n handleQuantityChange(index, value);\r\n return true;\r\n }}\r\n productBehavior={\r\n FullProducts.find(productResult => product.RecordId === productResult.RecordId)\r\n ?.Behavior\r\n }\r\n />\r\n )}\r\n \r\n {availabilities[index] === Availability.loading ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n \r\n {\r\n let obj = error.cartActionResult?.validationResults?.find(\r\n x =>\r\n x.ErrorResourceId ===\r\n 'Microsoft_Dynamics_Commerce_Runtime_ItemQuantityViolatesMultiplicityOfConfiguredNumber'\r\n );\r\n let object: errorMessage = obj as errorMessage;\r\n\r\n if (\r\n object &&\r\n object.LocalizedMessageParameters &&\r\n object.LocalizedMessageParameters.length > 0\r\n ) {\r\n let param = object.LocalizedMessageParameters[0];\r\n _showToast(\r\n product.Name!,\r\n props.resources.errorMessageForQtyValidation.replace('{param}', param)\r\n );\r\n }\r\n }}\r\n >\r\n
\r\n
\r\n
\r\n \r\n );\r\n};\r\n\r\nconst newAvailableQuantity = async (product: any, context: any): Promise | null> => {\r\n try {\r\n const availability = await getProductAvailabilitiesForSelectedVariant(\r\n new ProductAvailabilitiesForSelectedVariantInput(\r\n Number(product.RecordId),\r\n Number(context.actionContext.requestContext.channel.ChannelNaturalId)\r\n ),\r\n context.actionContext\r\n );\r\n return availability;\r\n } catch (error) {\r\n return null;\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 return {renderProductsAsTable(props)};\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 if (title) {\r\n return {title.titleCount};\r\n }\r\n return null;\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 * Function to make filter sticky.\r\n * @param isMobile - The boolean prop.\r\n * @param isStickyHeader - The boolean prop.\r\n */\r\nexport const configureStickyFilter = (isMobile: boolean, isStickyHeader: boolean): void => {\r\n // Get heights of cookie and promotion banners\r\n const defaultValue = 0;\r\n const defaultOffset = 28;\r\n const headerContainer: HTMLElement | null = document.querySelector('.ms-header');\r\n\r\n const headerHeight: number | undefined = headerContainer?.offsetHeight;\r\n const containerHeight: number = headerHeight ?? defaultOffset;\r\n const bannerHeights = isStickyHeader ? defaultValue : containerHeight;\r\n const headerElement = document.querySelector('header .lock-opaque');\r\n const defaultContainer = document.querySelector('header .default-container');\r\n const refinerElement = isMobile ? document.querySelector('.msc-sort-filter-wrapper') : document.querySelector('.ms-refiner-heading');\r\n if (refinerElement && headerElement && defaultContainer) {\r\n if (MsDyn365.isBrowser && document.documentElement.scrollTop > bannerHeights) {\r\n refinerElement.classList.add('lock-Filter');\r\n refinerElement.setAttribute('style', `top: ${defaultContainer.clientHeight}px`);\r\n } else {\r\n refinerElement.classList.remove('lock-Filter');\r\n }\r\n } else if (refinerElement) {\r\n if (MsDyn365.isBrowser && document.documentElement.scrollTop > bannerHeights) {\r\n refinerElement.classList.add('lock-top');\r\n } else {\r\n refinerElement.classList.remove('lock-top');\r\n refinerElement.classList.remove('lock-Filter');\r\n refinerElement.removeAttribute('style');\r\n }\r\n }\r\n};\r\n\r\n/**\r\n * Function to setup filter sticky.\r\n * @param isMobile - The boolean prop.\r\n * @param isStickyHeader - The boolean prop.\r\n */\r\nfunction stickyFilterSetup(isMobile: boolean, isStickyHeader: boolean): void {\r\n window.addEventListener('scroll', () => {\r\n configureStickyFilter(isMobile, isStickyHeader);\r\n });\r\n configureStickyFilter(isMobile, isStickyHeader);\r\n}\r\n\r\n/**\r\n * Function to make filter sticky.\r\n * @param refinerRefernce - Ref prop for filter.\r\n * @param toggle - Toggle function for filter menu.\r\n */\r\nfunction useOutsideClick(refinerRefernce: React.RefObject, toggle: (event: Event) => void) {\r\n React.useEffect(() => {\r\n /**\r\n * Function to make filter sticky.\r\n * @param event - Event prop for filter.\r\n */\r\n function handleClickOutside(event: Event) {\r\n const element = document.querySelector('.ms-refine-filter__toggle_collapsed');\r\n if (refinerRefernce.current && !refinerRefernce.current.contains(event.target as Node) && !element) {\r\n toggle(event);\r\n }\r\n }\r\n if (MsDyn365.isBrowser) {\r\n document.addEventListener('click', handleClickOutside);\r\n }\r\n return () => {\r\n if (MsDyn365.isBrowser) {\r\n document.removeEventListener('click', handleClickOutside);\r\n }\r\n };\r\n }, [refinerRefernce, toggle]);\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 {\r\n SearchResultContainer,\r\n pagination,\r\n ProductSectionContainer,\r\n choiceSummary,\r\n isMobile,\r\n modalToggle,\r\n searchResultModal,\r\n TitleViewProps,\r\n refineMenu,\r\n categoryHierarchy,\r\n sortByOptions,\r\n CategoryNavContainer,\r\n RefineAndProductSectionContainer,\r\n FeatureSearchContainer,\r\n similarLookProduct,\r\n errorMessage,\r\n resources\r\n } = props;\r\n useEffect(() => {\r\n if (props.config.useStickyFilter && MsDyn365.isBrowser) {\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app context is generic\r\n stickyFilterSetup(props.isMobile, props.context.app.config.enableStickyHeader as boolean);\r\n }\r\n }, [props]);\r\n const [isExpanded, setIsExpanded] = useState(false);\r\n const toggle = () => {\r\n setIsExpanded(!isExpanded);\r\n };\r\n const wrapperRefiner = React.useRef(null);\r\n useOutsideClick(wrapperRefiner, toggle);\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 \r\n {renderCategoryHierarchy(categoryHierarchy)}\r\n {renderTitle(TitleViewProps)}\r\n {renderTitleCount(TitleViewProps)}\r\n \r\n )}\r\n {choiceSummary}\r\n {modalToggle}\r\n {createSearchResultModal(searchResultModal, refineMenu, sortByOptions, isRecoSearchPage)}\r\n {similarLookProduct}\r\n {errorMessage}\r\n {props.config.enableProdutDescription ? renderProducts(props) : renderProductsAsTable(props)}\r\n\r\n {pagination}\r\n \r\n );\r\n }\r\n return (\r\n \r\n {similarLookProduct ? null : (\r\n \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 {resources.filterText}\r\n \r\n
{choiceSummary}
\r\n
\r\n {sortByOptions && !isRecoSearchPage && renderSort(sortByOptions)}\r\n
\r\n
\r\n {refineMenu && isExpanded && renderRefiner(refineMenu)}\r\n \r\n {refineMenu && isExpanded && renderRefinerFooter(refineMenu, toggle, resources)}\r\n \r\n
\r\n\r\n \r\n {errorMessage}\r\n {props.config.enableProdutDescription ? renderProducts(props) : renderProductsAsTable(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 = (\r\n modalProps: ISearchResultModalViewProps,\r\n refineMenu: IRefineMenuViewProps,\r\n sortByDropDown: ISortByViewProps,\r\n isRecoSearchPage?: string\r\n): JSX.Element => {\r\n return React.cloneElement(\r\n modalProps.modal,\r\n {},\r\n modalProps.modalHeader,\r\n createModalBody(modalProps, refineMenu, sortByDropDown, isRecoSearchPage),\r\n modalProps.modalFooter\r\n );\r\n};\r\n\r\n/**\r\n * Render Refiner Mobile.\r\n * @param props - The Refine Menu view props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderRefinerMobile = (props: IRefineMenuViewProps): JSX.Element | null => {\r\n const { refiners, RefineMenuContainer, RefinerSectionContainer } = props;\r\n if (refiners) {\r\n return (\r\n \r\n \r\n {refiners.map((submenu, index) => (\r\n {submenu}\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 = (\r\n props: ISearchResultModalViewProps,\r\n refineMenu: IRefineMenuViewProps,\r\n sortByDropDown: ISortByViewProps,\r\n isRecoSearchPage?: string\r\n): JSX.Element | null => {\r\n if (sortByDropDown) {\r\n return React.cloneElement(props.modalBody, {}, renderSort(sortByDropDown, isRecoSearchPage), renderRefinerMobile(refineMenu));\r\n }\r\n return null;\r\n};\r\n\r\n/**\r\n * Render Refiner.\r\n * @param props - The Refine Menu view props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderRefiner = (props: IRefineMenuViewProps): JSX.Element | null => {\r\n const { refiners, RefineMenuContainer, RefinerSectionContainer } = props;\r\n if (refiners) {\r\n return (\r\n \r\n \r\n {refiners.map((submenu, index) => (\r\n {submenu}\r\n ))}\r\n \r\n \r\n );\r\n }\r\n return null;\r\n};\r\n\r\n/**\r\n * Render Refiner Footer.\r\n * @param props - The Refine Menu view props.\r\n * @param handler - The Refine menu toggle function.\r\n * @param resources - Resources to get the done text and aria label.\r\n * @returns The JSX Element.\r\n */\r\nconst renderRefinerFooter = (\r\n props: IRefineMenuViewProps,\r\n handler: MouseEventHandler,\r\n resources: ISearchResultContainerResources\r\n): JSX.Element | null => {\r\n const { refiners } = props;\r\n if (refiners) {\r\n return (\r\n \r\n \r\n {resources.doneText}\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 {sortByDropDown};\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|jansen-adventureworks|views|search-result-container'] = {\n c: () => require('partner/themes/jansen-adventureworks/views/search-result-container.view.tsx'),\n cn: '__local__-__local__-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 { 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 GetCustomerInput,\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, getCustomer, 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 const accountInformation = await getCustomer(new GetCustomerInput(context.requestContext.apiSettings), context);\n const discountIds = context.requestContext.query?.discountIds.split(',');\n\n const productPromotions = await getProductPromotionsAsync(\n {\n callerContext: context,\n queryResultSettings: input.queryResultSettings\n },\n discountIds ?? [],\n {\n HeaderContext: {\n ChannelId: context.requestContext.apiSettings.channelId,\n CustomerAccountNumber: accountInformation?.AccountNumber\n },\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 searchCriteriaInput.CustomerAccountNumber = accountInformation.AccountNumber;\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 // Added RowNumber to identify if custom range integer or API values option is selected\n 'RowNumber'\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, DisplayTemplate, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\n\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport { DimensionTypes } from '@msdyn365-commerce-modules/retail-actions';\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\n\n/**\n * Types of product refiner values.\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\nexport enum ProductRefinerValueDataTypeValue {\n /**\n * Range slider is used for selections like price.\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Range = 1,\n\n /**\n * Range input is a different way to specify ranges and can be expressed with input boxes\n * as well as a set of discrete single-select type values.\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n RangeInput = 4,\n\n /**\n * This is a discrete list item, either multi-select or single-select.\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n List = 5,\n\n /**\n * Boolean types allows only single-select.\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Boolean = 6\n}\n\n/**\n * Types of product refiners.\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\nexport enum ProductRefinerTypeValue {\n /**\n * Refiner values are single-select.\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Single = 0,\n\n /**\n * Refiner values are multi-select.\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Multi = 1\n}\n\n/**\n * ProductRefinerSource enum type.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\nexport enum ProductRefinerSource {\n /**\n * The None member.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n None = 0,\n\n /**\n * The Attribute member.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Attribute = 1,\n\n /**\n * The Category member.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Category = 2,\n\n /**\n * The Price member.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Price = 3,\n\n /**\n * The Rating member.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Rating = 4\n}\n\nexport interface IRefineItemData {\n sourceValue?: number;\n swatchImageUrl?: string;\n swatchColorHexCode?: string;\n refinerItemId: number;\n dataTypeValue?: number;\n name: string;\n label: string;\n count?: number;\n isChecked: boolean;\n refineItemUrl?: string;\n minValue?: string;\n maxValue?: string;\n dimensionType?: DimensionTypes;\n rowNumber?: number;\n unitText?: string;\n updatedSliderMaxValue?: string;\n updatedSliderMinValue?: string;\n}\n/**\n * Checks if the data type value corresponds to a slider.\n * @param dataTypeValue\n */\nexport function isRangeType(dataTypeValue: number | undefined): boolean {\n return dataTypeValue === AttributeDataType.Currency || dataTypeValue === AttributeDataType.Decimal;\n}\n\n/**\n * Checks if the data type value corresponds to a range type integer.\n * @param dataTypeValue\n */\nexport function isRangeTypeForInteger(dataTypeValue: number | undefined): boolean {\n return (\n dataTypeValue === AttributeDataType.Currency ||\n dataTypeValue === AttributeDataType.Decimal ||\n dataTypeValue === AttributeDataType.Integer\n );\n}\n\n/**\n * Checks if the data type value corresponds to a custom input box Range.\n * @param dataTypeValue\n */\nexport function isCustomRangeTypeIntegerSelected(\n selectedRefinementCriterion: ProductRefinerValue,\n parentProductRefinerHierarchy: IProductRefinerHierarchy\n): boolean {\n return (\n selectedRefinementCriterion?.RowNumber !== undefined &&\n selectedRefinementCriterion?.RowNumber !== null &&\n selectedRefinementCriterion?.DataTypeValue === AttributeDataType.Integer &&\n parentProductRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Range\n );\n}\n\n/**\n * Checks if the selectedRefinementCriterion is siingle type with API va;ues or custom type.\n * If custom type then RowNumber is null\n * @param dataTypeValue\n */\nexport function isSingleSelectRangeTypeIntegerSelected(\n selectedRefinementCriterion: ProductRefinerValue,\n productRefinerValue: ProductRefinerValue\n): boolean {\n return (\n productRefinerValue.LeftValueBoundString === selectedRefinementCriterion?.LeftValueBoundString &&\n productRefinerValue.RightValueBoundString === selectedRefinementCriterion?.RightValueBoundString &&\n selectedRefinementCriterion?.RowNumber !== undefined &&\n selectedRefinementCriterion?.RowNumber !== null &&\n selectedRefinementCriterion !== undefined\n );\n}\n\n/**\n * Find the refinement criterion associated with this product refiner value.\n * @param productRefinerValue Product refiner value to match.\n * @param refinementCriteria Selected refinement criteria.\n */\nexport function findMatchingRefinementCriterion(\n productRefinerValue: ProductRefinerValue,\n refinementCriteria: ProductRefinerValue[]\n): ProductRefinerValue | undefined {\n // If the value is a range, then match only on data type value; otherwise match on item string\n return refinementCriteria.find((refinementCriterion: ProductRefinerValue) =>\n isMatchingRefinementCriterion(productRefinerValue, refinementCriterion)\n );\n}\n\n/**\n * Find the refinement criterion associated with this product refiner value.\n * @param productRefinerValue Product refiner value to match.\n * @param refinementCriteria Selected refinement criteria.\n * @param refinementCriterion\n */\nexport function isMatchingRefinementCriterion(\n productRefinerValue: ProductRefinerValue,\n refinementCriterion: ProductRefinerValue,\n parent?: IProductRefinerHierarchy\n): boolean {\n // If the value is a range, then match only on data type value; otherwise match on item string\n // Distinguish by displaytype also\n return (\n refinementCriterion.RefinerRecordId === productRefinerValue.RefinerRecordId &&\n refinementCriterion.RefinerSourceValue === productRefinerValue.RefinerSourceValue &&\n refinementCriterion.DataTypeValue === productRefinerValue.DataTypeValue &&\n ((parent?.DisplayTemplateValue === DisplayTemplate.Range\n ? isRangeType(refinementCriterion.DataTypeValue)\n : isRangeTypeForInteger(refinementCriterion.DataTypeValue)) ||\n refinementCriterion.LeftValueBoundString === productRefinerValue.LeftValueBoundString)\n );\n}\n\nexport function getIntegerRangeName(productRefinerValue: ProductRefinerValue): string {\n let rangeValue = '';\n\n if (productRefinerValue.LeftValueBoundString === '' && productRefinerValue.RightValueBoundString !== '') {\n rangeValue = `< ${productRefinerValue.RightValueBoundLocalizedString || productRefinerValue.RightValueBoundString}`;\n } else if (productRefinerValue.RightValueBoundString === '' && productRefinerValue.LeftValueBoundString !== '') {\n rangeValue = `> ${productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString}`;\n } else if (productRefinerValue.RightValueBoundString !== '' && productRefinerValue.LeftValueBoundString !== '') {\n rangeValue = `${productRefinerValue.LeftValueBoundLocalizedString ||\n productRefinerValue.LeftValueBoundString} - ${productRefinerValue.RightValueBoundString ||\n productRefinerValue.RightValueBoundString}`;\n }\n return rangeValue;\n}\n\n/**\n * Get input without formatting.\n * @param input - Input string.\n * @returns - Returns number.\n */\nexport function getInputWithoutFormatting(input: string): string {\n // First try to cast raw input to a number\n const inputAsNumber = Number(input);\n if (!Number.isNaN(inputAsNumber)) {\n return input;\n }\n\n // Otherwise try a reverse lookup and fall back to the raw input if all else fails\n // const reverseLookupResult = formattedPriceReverseLookup.get(input);\n // return reverseLookupResult || input;\n return input;\n}\n\nexport function getUpdatedRefinementCriteria(\n itemToggleNotification: IRefineItemToggleNotification,\n currentRefinementCriteria: ProductRefinerValue[]\n): ProductRefinerValue[] {\n const updatedRefinementCriteria: ProductRefinerValue[] = [];\n let toggledItemFound = false;\n\n // Keeping only itemToggled value for integer-range type in currentRefinementCriteria\n if (\n itemToggleNotification.parentProductRefinerHierarchy.DataTypeValue === AttributeDataType.Integer &&\n itemToggleNotification.parentProductRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Range\n ) {\n currentRefinementCriteria = currentRefinementCriteria.filter(r => {\n return r.RefinerRecordId !== itemToggleNotification.productRefinerValue.RefinerRecordId;\n });\n }\n\n currentRefinementCriteria.forEach((selectedCriterion: ProductRefinerValue) => {\n if (\n isMatchingRefinementCriterion(\n itemToggleNotification.productRefinerValue,\n selectedCriterion,\n itemToggleNotification.parentProductRefinerHierarchy\n )\n ) {\n toggledItemFound = true;\n if (itemToggleNotification.isSelecting) {\n const next = {\n ...selectedCriterion,\n LeftValueBoundString:\n (itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}`) ||\n selectedCriterion.LeftValueBoundString,\n RightValueBoundString:\n (itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}`) ||\n selectedCriterion.RightValueBoundString\n };\n updatedRefinementCriteria.push(next);\n } // Else the item is being de-selected, so omit it from the refinement criteria\n } else {\n // Keep existing criterion because it is not in the item toggle notification\n updatedRefinementCriteria.push(selectedCriterion);\n }\n });\n\n if (!toggledItemFound) {\n const next = {\n ...itemToggleNotification.productRefinerValue,\n LeftValueBoundString:\n (itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}`) ||\n itemToggleNotification.productRefinerValue.LeftValueBoundString,\n RightValueBoundString:\n (itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}`) ||\n itemToggleNotification.productRefinerValue.RightValueBoundString\n };\n updatedRefinementCriteria.push(next);\n\n // If single select, then deselect any others in the parent refiner group\n if (\n (itemToggleNotification.productRefinerValue.DataTypeValue === AttributeDataType.Text ||\n itemToggleNotification.productRefinerValue.DataTypeValue === AttributeDataType.TrueFalse) &&\n itemToggleNotification.parentProductRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect\n ) {\n itemToggleNotification.parentProductRefinerHierarchy.Values.forEach((child: ProductRefinerValue) => {\n if (child.RefinerRecordId === next.RefinerRecordId && child.LeftValueBoundString === next.LeftValueBoundString) {\n // Do nothing\n } else {\n const matchingIndex = updatedRefinementCriteria.findIndex((criterion: ProductRefinerValue) =>\n isMatchingRefinementCriterion(child, criterion, itemToggleNotification.parentProductRefinerHierarchy)\n );\n if (matchingIndex > -1) {\n updatedRefinementCriteria.splice(matchingIndex, 1);\n }\n }\n });\n }\n }\n\n return updatedRefinementCriteria;\n}\n\nexport function formatPrice(\n amount: string | undefined,\n currency: string | undefined,\n locale: string | undefined,\n telemetry: ITelemetry\n): string {\n if (!amount || !currency) {\n telemetry.trace(`[refine-menu.utilities.formatPrice] could not format price for ${amount} ${currency}`);\n return amount || '';\n }\n const priceAmount = (amount && Number(amount)) || 0;\n let result: string;\n\n try {\n result = new Intl.NumberFormat(locale, {\n style: 'currency',\n currencyDisplay: 'symbol',\n currency,\n minimumFractionDigits: 0\n }).format(priceAmount);\n } catch (error) {\n result = `${priceAmount} ${currency}`;\n telemetry.warning(`[refine-menu.utilities.formatPrice] Failed to format price for ${result}: ${error}`);\n }\n\n return result;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport { AttributeDataType, DisplayTemplate, ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\nimport { getPayloadObject, getTelemetryAttributes, IPayLoad } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { computed } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { ProductListInventoryFilteringOptions } from '../actions';\nimport { IChoiceSummaryProps } from './choice-summary.props';\nimport { getIntegerRangeName, isMatchingRefinementCriterion, isRangeType } from './utilities';\n\ninterface IRefinerMap {\n key: string;\n value: ProductRefinerValue;\n rangeDisplayType?: number | undefined;\n}\n\n/**\n * ChoiceSummary component.\n */\n@observer\nexport default class ChoiceSummary extends React.PureComponent {\n private readonly closeButtonGlyph: string = 'msi-close-btn';\n\n private readonly payLoad: IPayLoad;\n\n @computed get selectedRefinersMap(): IRefinerMap[] {\n let { selectedChoices } = this.props;\n const { channelInventoryConfigurationId, refinerHierarchy } = this.props;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app configs are of generic type\n if (this.props.context?.app.config.productListInventoryDisplay === ProductListInventoryFilteringOptions.HideOOS) {\n selectedChoices = selectedChoices.filter(choice => {\n const parent = refinerHierarchy.find(\n (hierarchy: IProductRefinerHierarchy) =>\n !!hierarchy.Values.find((value: ProductRefinerValue) => isMatchingRefinementCriterion(value, choice))\n );\n return parent && parent.RecordId !== channelInventoryConfigurationId;\n });\n }\n return selectedChoices.map((selectedRefiner: ProductRefinerValue, index) => {\n const rangeParentDisplay = refinerHierarchy.filter(p => p.RecordId === selectedRefiner.RefinerRecordId);\n return {\n key: this._getKeyForRefinerValue(selectedRefiner, index.toString()),\n value: selectedRefiner,\n // parameter to store Display Template type\n rangeDisplayType: rangeParentDisplay[0]?.DisplayTemplateValue || undefined\n } as IRefinerMap;\n });\n }\n\n constructor(props: Readonly) {\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 // Get range value for Range display and integer type only (not for Integer with TextBox(4) display)\n const rangeInteger =\n item.value.DataTypeValue === AttributeDataType.Integer &&\n item.rangeDisplayType &&\n item.rangeDisplayType === DisplayTemplate.Range &&\n item.value.RefinerRecordId !== 0;\n const newIntRange = rangeInteger\n ? item.key\n : item.value.LeftValueBoundString && item.value.LeftValueBoundLocalizedString === ''\n ? item.value.LeftValueBoundString\n : (item.value.LeftValueBoundLocalizedString || item.value.LeftValueBoundLocalizedString === undefined) &&\n item.value.RefinerRecordId === 0\n ? item.key\n : item.value.LeftValueBoundString;\n return (\n
  • \n \n {newIntRange}\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 let parent: IProductRefinerHierarchy | undefined;\n if (refinerHierarchy && refinerHierarchy.find) {\n parent = refinerHierarchy.find(\n (hierarchy: IProductRefinerHierarchy) =>\n !!hierarchy.Values.find((value: ProductRefinerValue) => isMatchingRefinementCriterion(value, productRefinerValue))\n );\n\n if (!parent) {\n telemetry.warning('[choice-summary] could not find parent of selected refiner value');\n } else {\n refinerName = parent.KeyName || '';\n }\n }\n\n let refinerValueName: string;\n if (isRangeType(productRefinerValue.DataTypeValue)) {\n refinerValueName = rangeFormat\n .replace('{0}', this._formatPrice(productRefinerValue.LeftValueBoundString, productRefinerValue.UnitText))\n .replace('{1}', this._formatPrice(productRefinerValue.RightValueBoundString, productRefinerValue.UnitText));\n } else if (productRefinerValue.RefinerRecordId === 0) {\n const filterValue = refinerValues?.Values.find(\n refiner => refiner.LeftValueBoundString === productRefinerValue.LeftValueBoundString\n );\n refinerValueName = (filterValue ? filterValue.LeftValueBoundLocalizedString : productRefinerValue.LeftValueBoundString) || '';\n } else {\n refinerValueName = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\n }\n\n if (refinerName === 'Rating' || refinerName === 'Price') {\n return overallFormat.replace('{0}', refinerName).replace('{1}', `${refinerValueName}`);\n }\n // Adding integer range format\n if (\n productRefinerValue.DataTypeValue === AttributeDataType.Integer &&\n parent?.DisplayTemplateValue === DisplayTemplate.Range &&\n productRefinerValue.RefinerRecordId !== 0\n ) {\n refinerValueName = getIntegerRangeName(productRefinerValue);\n return refinerValueName;\n }\n return overallFormat.replace('{0}', refinerName).replace('{1}', `${refinerValueName}_${refinerName}_${index}`);\n }\n\n private _formatPrice(amount: string | undefined, currency: string | undefined): string {\n if (!amount || !currency) {\n this.props.telemetry.trace('[choice-summary] could not format price');\n return amount || '';\n }\n let result = amount;\n\n try {\n result = this.props.context!.cultureFormatter.formatCurrency(Number(amount), currency);\n } catch (error) {\n this.props.telemetry.warning(`Failed to format price for ${result}: ${error}`);\n }\n\n return result;\n }\n\n private readonly _onClick = (e: React.MouseEvent): 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 {\n AttributeDataType,\n DisplayTemplate,\n ProductRefinerSource,\n ProductRefinerValue,\n RefinerType\n} from '@msdyn365-commerce/retail-proxy';\nimport { checkIfShouldDisplayAsSwatch, DimensionTypes, IDimensionsApp, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { format, getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { IRefineItemCommonProps } from './refine-item.props.common';\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\nimport { getIntegerRangeName, isSingleSelectRangeTypeIntegerSelected } from './utilities';\n\n/**\n * RefineItem properties.\n */\nexport interface IRefineItemProps {\n parentProductRefinerHierarchy: IProductRefinerHierarchy;\n productRefinerValue: ProductRefinerValue;\n selectedRefinementCriterion: ProductRefinerValue | undefined;\n selectedRefinerValues?: ProductRefinerValue[];\n refineItemCommonProps: IRefineItemCommonProps;\n isDisabled: boolean;\n context: ICoreContext>;\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 if (\n parentProductRefinerHierarchy.DataTypeValue === AttributeDataType.Integer &&\n parentProductRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Range\n ) {\n const rangeValue = getIntegerRangeName(productRefinerValue);\n return (\n
  • \n \n \n \n
  • \n );\n } else {\n return (\n
  • \n \n {hasContentSwatch && shouldDisplayAsSwatch && this._renderSwatch(dimensionType)}\n \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 { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { isUndefined } from 'lodash';\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\nimport { Button } from '@msdyn365-commerce-modules/utilities';\nimport { IRefineItemState } from './refine-item';\nimport { isCustomRangeTypeIntegerSelected } from './utilities';\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport { IRefineItemCommonProps } from './refine-item.props.common';\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\n\nexport type RangeRefineItemInputType = 'slider' | 'input';\n\n/**\n * Range refine item properties.\n */\nexport interface IRangeRefineItemInputProps {\n parentProductRefinerHierarchy: IProductRefinerHierarchy;\n selectedRefinementCriterion: ProductRefinerValue | undefined;\n refineItemCommonProps: IRefineItemCommonProps;\n isDisabled: boolean;\n rangeType: RangeRefineItemInputType;\n\n /**\n * The telemetry content\n */\n onToggle(notfication: Readonly): void;\n}\n\n/**\n * Range refine item state.\n */\nexport interface IRangeRefineItemInputState extends IRefineItemState {\n validationErrorMin: string | undefined;\n validationErrorMax: string | undefined;\n selectedMin: string | undefined;\n selectedMax: string | undefined;\n invalidData: boolean | undefined;\n}\n\n/**\n * RangeRefineItem component (controlled by RefineSubmenu).\n */\n@observer\nexport default class RangeRefineItemInput extends React.Component {\n private readonly _formattedPriceReverseLookup: Map = new Map();\n\n private readonly minInput: React.RefObject;\n\n private readonly maxInput: React.RefObject;\n\n public constructor(props: IRangeRefineItemInputProps) {\n super(props);\n this._changeMinInputRange = this._changeMinInputRange.bind(this);\n this._changeMaxInputRange = this._changeMaxInputRange.bind(this);\n this._applyCustom = this._applyCustom.bind(this);\n\n this.minInput = React.createRef();\n this.maxInput = React.createRef();\n let initialMin = '';\n let initialMax = '';\n const { selectedRefinementCriterion, parentProductRefinerHierarchy } = this.props;\n if (selectedRefinementCriterion) {\n initialMin = isCustomRangeTypeIntegerSelected(selectedRefinementCriterion, parentProductRefinerHierarchy)\n ? ''\n : selectedRefinementCriterion?.LeftValueBoundString || '';\n initialMax = isCustomRangeTypeIntegerSelected(selectedRefinementCriterion, parentProductRefinerHierarchy)\n ? ''\n : selectedRefinementCriterion?.RightValueBoundString || '';\n }\n\n this.state = {\n validationErrorMin: undefined,\n validationErrorMax: undefined,\n selectedMin: initialMin,\n selectedMax: initialMax,\n invalidData: !(initialMin && initialMax),\n isChecked: false\n };\n }\n\n public shouldComponentUpdate(nextProps: IRangeRefineItemInputProps, nextState: IRangeRefineItemInputState): boolean {\n if (this.state === nextState && this.props === nextProps) {\n return false;\n }\n nextState.invalidData = !(nextState.selectedMin && nextState.selectedMax);\n return true;\n }\n\n public componentDidUpdate(previousProps: IRangeRefineItemInputProps): void {\n if (previousProps !== this.props) {\n this.updateInputRangerProps();\n }\n }\n\n public render(): JSX.Element | undefined {\n if (this.props.rangeType === 'input') {\n return this._renderInputFields();\n }\n return undefined;\n }\n\n // /**\n // * Function to update slider props.\n // */\n private updateInputRangerProps(): void {\n const selectedMin = !isUndefined(this.props.selectedRefinementCriterion?.RowNumber)\n ? ''\n : this.props.selectedRefinementCriterion?.LeftValueBoundString;\n const selectedMax = !isUndefined(this.props.selectedRefinementCriterion?.RowNumber)\n ? ''\n : this.props.selectedRefinementCriterion?.RightValueBoundString;\n this.setState({ selectedMin, selectedMax });\n }\n\n private _renderInputFields(): JSX.Element | undefined {\n const { isDisabled, parentProductRefinerHierarchy, refineItemCommonProps } = this.props;\n const { validationErrorMin, validationErrorMax } = this.state;\n\n const rangeAriaLabel = (refineItemCommonProps.rangeNameFormat || '{0}').replace('{0}', parentProductRefinerHierarchy.KeyName || '');\n const formAttrs = {\n 'aria-label': rangeAriaLabel,\n 'aria-disabled': isDisabled\n };\n\n const minInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-min ${\n validationErrorMin ? 'refine-submenu__input-range--error' : ''\n }`;\n const maxInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-max ${\n validationErrorMax ? 'refine-submenu__input-range--error' : ''\n }`;\n return (\n
  • \n
    \n
    \n \n {' - '}\n \n {validationErrorMin && (\n \n {validationErrorMin}\n \n )}\n {validationErrorMax && validationErrorMin !== validationErrorMax && (\n \n {validationErrorMax}\n \n )}\n
    \n
    \n \n
    \n
    \n
  • \n );\n }\n\n private _applyCustom(event: React.MouseEvent): void {\n const selectedMinValue = this._getInputWithoutFormatting(this.state.selectedMin || '');\n this.setState({\n selectedMin: selectedMinValue,\n minTouched: false\n });\n const minInput = Number(selectedMinValue);\n const { onToggle, parentProductRefinerHierarchy } = this.props;\n const max = this.state.selectedMax;\n\n const maxNum = max ? Number(max) : undefined;\n const productRefinerValue: ProductRefinerValue = {\n RefinerRecordId: parentProductRefinerHierarchy.Values[0].RefinerRecordId,\n LeftValueBoundString: this.state.selectedMin,\n RightValueBoundString: this.state.selectedMax,\n DataTypeValue: parentProductRefinerHierarchy.DataTypeValue,\n RefinerSourceValue: parentProductRefinerHierarchy.Values[0].RefinerSourceValue\n };\n\n if (this._validateRange(minInput, maxNum)) {\n onToggle({\n parentProductRefinerHierarchy,\n productRefinerValue,\n isSelecting: true\n });\n }\n }\n\n private _changeMinInputRange(event: React.ChangeEvent): void {\n this.setState({\n selectedMin: event.target.value.trim()\n });\n }\n\n private _changeMaxInputRange(event: React.ChangeEvent): void {\n this.setState({\n selectedMax: event.target.value.trim()\n });\n }\n\n private _validateRange(min: number, max: number | undefined): boolean {\n const { refineItemCommonProps } = this.props;\n if (max === undefined) {\n return true;\n }\n\n if (min > max) {\n this.setState({\n validationErrorMin: refineItemCommonProps.validationErrorRange,\n validationErrorMax: refineItemCommonProps.validationErrorRange\n });\n return false;\n }\n\n return true;\n }\n\n private _getInputWithoutFormatting(input: string): string {\n // First try to cast raw input to a number\n const inputAsNum = Number(input);\n if (!isNaN(inputAsNum)) {\n return input;\n }\n\n // Otherwise try a reverse lookup and fall back to the raw input if all else fails\n const reverseLookupResult = this._formattedPriceReverseLookup.get(input);\n return reverseLookupResult || input;\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\nimport {\n AttributeDataType,\n DisplayTemplate,\n ProductRefinerSource,\n ProductRefinerValue,\n RefinerType\n} from '@msdyn365-commerce/retail-proxy';\nimport { Button, Collapse, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport RangeRefineItem, { RangeRefineItemType } from './range-refine-item';\nimport RefineItem from './refine-item';\nimport { IRefineItemCommonProps } from './refine-item.props.common';\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\nimport { findMatchingRefinementCriterion, isRangeTypeForInteger } from './utilities';\nimport RangeRefineItemInput from './range-refine-item-input';\n\n/**\n * Properties associated with the RefineSubmenu component.\n */\nexport interface IRefineSubmenuProps {\n tempRangeTypeTODO: RangeRefineItemType;\n minValueSliderThumbAriaLabel?: string;\n maxValueSliderThumbAriaLabel?: string;\n productRefinerHierarchy: IProductRefinerHierarchy;\n selectedRefinerValues: ProductRefinerValue[];\n refineItemCommonProps: IRefineItemCommonProps;\n isDisabled: boolean;\n isExpandedOnInitialLoad: boolean;\n context: ICoreContext>;\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 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 (\n productRefinerHierarchy.DataTypeValue === AttributeDataType.Integer &&\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Range\n ) {\n return this._renderSingleMultiSelect(productRefinerHierarchy);\n }\n // Check if is of integer range type\n if (isRangeTypeForInteger(productRefinerHierarchy.DataTypeValue)) {\n return this._renderRange(productRefinerHierarchy);\n }\n return this._renderSingleMultiSelect(productRefinerHierarchy);\n }\n\n private _renderSingleMultiSelect(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\n const {\n isDisabled,\n refineItemCommonProps,\n selectedRefinerValues,\n context,\n productCountAriaLabel,\n singleProductCountAriaLabel,\n refineItemAriaLabel,\n refineItemsAriaLabel,\n isMobile\n } = this.props;\n const isSingleSelect =\n productRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect &&\n productRefinerHierarchy.SourceValue === ProductRefinerSource.Rating;\n const role = isSingleSelect ? { role: 'listbox' } : undefined;\n let selectedRefinementCriterion: ProductRefinerValue | undefined = {};\n const refinerValuesList = productRefinerHierarchy.Values || [];\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\n if (!child) {\n refineItemCommonProps.telemetry.error(\n `[refine-submenu] Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\n );\n return null;\n }\n\n selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\n return (\n \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 {productRefinerHierarchy.DataTypeValue === AttributeDataType.Integer &&\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Range && (\n \n )}\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 ObjectExtensions\n} from '@msdyn365-commerce-modules/retail-actions';\nimport {\n getTelemetryObject,\n ILabeledDropdownOnChangeNotification,\n ILabeledDropdownOption,\n IModuleProps,\n INodeProps,\n isMobile,\n ITelemetryContent,\n LabeledDropdown,\n UncontrolledPagination,\n VariantType\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { action, computed, observable, reaction, transaction } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport {\n buildListPageUrl,\n getCollectionProducts,\n getCollectionRefinersAction,\n getCurrentUrl,\n GetFullProductsByCollectionInput,\n IFullProductsSearchResultsWithCount,\n parseQueryParam,\n ProductListInventoryFilteringOptions,\n RefinersByCollectionInput,\n sortOptions\n} from './actions';\nimport { hydrateRefinersFromUrl } from './actions/url-utils';\nimport {\n ErrorMessage,\n FeatureSearchResultItem,\n getUpdatedRefinementCriteria,\n IChoiceSummaryClickNotification,\n IRefineItemCommonProps,\n IRefineItemToggleNotification,\n ISearchResultModalViewProps,\n isMatchingRefinementCriterion,\n Link,\n ModalToggle,\n ProductSearchResultItems,\n SearchResultModal,\n Separator,\n Title\n} from './components';\nimport ChoiceSummary from './components/choice-summary';\nimport RefineSubmenu from './components/refine-submenu';\nimport { ListPageState } from './list-page-state';\nimport { ISearchResultContainerData } from './search-result-container.data';\nimport { expandRefinersCount, ISearchResultContainerProps } from './search-result-container.props.autogenerated';\n\nexport interface ISearchResultContainerViewProps extends ISearchResultContainerProps {\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 @action\n private readonly _updateListPageState = (listPageState: ListPageState, products: IFullProductsSearchResultsWithCount): void => {\n let querySorting: SortColumn[] = [];\n const defaultPageNumber: number = 10;\n\n if (this._pageType === 'Category') {\n listPageState.pageType = 'Category';\n } else {\n listPageState.pageType = 'Search';\n }\n\n if (this.props.context.request.query?.sorting) {\n querySorting = JSON.parse(decodeURIComponent(this.props.context.request.query.sorting)) as SortColumn[];\n }\n\n listPageState.currentPageNumber =\n (this.props.context.request.query?.skip &&\n +this.props.context.request.query.skip / (this.props.config.itemsPerPage ?? defaultPageNumber)) ||\n 0;\n listPageState.sortingCritera = { Columns: querySorting };\n listPageState.pageSize = this.props.config.itemsPerPage ?? defaultPageNumber;\n listPageState.activeProducts = products.products;\n listPageState.totalProductCount = products.count;\n listPageState.activeFilters = hydrateRefinersFromUrl(this.props.context.request) || [];\n if (this.props.context.request.query?.productId) {\n const featureProduct = this.props.data.featureProduct.result;\n if (featureProduct) {\n listPageState.featureProduct = featureProduct;\n }\n }\n };\n\n /**\n * Get products dimension availabilities.\n * @returns Void.\n */\n private readonly _getProductsDimensionsAvailabilities = async (): Promise => {\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 = !ObjectExtensions.isNullOrUndefined(listPageState?.currentPageNumber)\n ? listPageState!.currentPageNumber * (this.props.config.itemsPerPage || 10)\n : (this.props.context.request.query && +this.props.context.request.query.skip) || 0;\n const totalItems = listPageState?.totalProductCount || 0;\n const previousText = resources.flipperPrevious;\n const nextText = resources.flipperNext;\n\n if (totalItems <= itemsPerPage) {\n return null;\n }\n return (\n <UncontrolledPagination\n className='ms-search-result-container__pagination'\n role='navigation'\n aria-label={resources.paginationAriaLabel}\n url={fullUrl.href}\n qsp='skip'\n items={totalItems}\n itemsPerPage={itemsPerPage}\n startingItem={skipCount}\n previousText={this._renderPrev(previousText)}\n nextText={this._renderNext(nextText)}\n previousAriaLabel={previousText}\n nextAriaLabel={nextText}\n telemetryContent={this.telemetryContent}\n />\n );\n };\n\n private readonly _getRefineMenu = (): IRefineMenuViewProps => {\n const { data, context, config } = this.props;\n const tempRangeTypeTODO = context.request.query && context.request.query.inputRange ? 'input' : 'slider';\n const validRefiners =\n this.props.config.updateRefinerPanel && ArrayExtensions.hasElements(this.state.refiners)\n ? this.state.refiners.filter(refiner => {\n return ArrayExtensions.hasElements(refiner.Values) && !this._shouldHideFromRefiners(refiner);\n })\n : data.refiners.result &&\n data.refiners.result.filter(refiner => {\n return ArrayExtensions.hasElements(refiner.Values) && !this._shouldHideFromRefiners(refiner);\n });\n\n const activeRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\n\n this._getexpandRefinerCount(validRefiners && validRefiners.length, config.expandRefinersCount);\n const expandedRefiners = this.expandrefinerCount;\n const subMenus =\n validRefiners &&\n validRefiners.map((productRefinerHierarchy: IProductRefinerHierarchy, index: number) => {\n return (\n <RefineSubmenu\n productRefinerHierarchy={productRefinerHierarchy}\n selectedRefinerValues={activeRefiners}\n refineItemCommonProps={this._refineItemCommonProps}\n minValueSliderThumbAriaLabel={this.props.resources.minValueSliderThumbAriaLabel}\n maxValueSliderThumbAriaLabel={this.props.resources.maxValueSliderThumbAriaLabel}\n key={index}\n onUpdateRefiners={this._onUpdateRefiners}\n urlBuilder={this._buildRefinerUrl}\n isDisabled={false}\n isExpandedOnInitialLoad={!!(expandedRefiners && expandedRefiners > index)}\n tempRangeTypeTODO={tempRangeTypeTODO}\n context={context}\n moduleId={this.props.id}\n moduleTypeName={this.props.typeName}\n telemetryContent={this.telemetryContent}\n productCountAriaLabel={this.props.resources.productCountAriaLabel}\n refineItemAriaLabel={this.props.resources.refineItemAriaLabel}\n refineItemsAriaLabel={this.props.resources.refineItemsAriaLabel}\n singleProductCountAriaLabel={this.props.resources.singleProductCountAriaLabel}\n isMobile={this.isMobile}\n />\n );\n });\n\n return {\n RefineMenuContainer: { className: 'ms-search-result-container__refine-menu' },\n RefinerSectionContainer: { className: 'ms-search-result-container__refiner-section' },\n refiners: subMenus\n };\n };\n\n /**\n * Should hide from refiners.\n * @param refiner - The refiner.\n * @returns ShouldHideFromRefiners.\n */\n private readonly _shouldHideFromRefiners = (refiner: IProductRefinerHierarchy): boolean => {\n const { channelInventoryConfiguration } = this.state;\n const isInventorySortableAttribute =\n (this.props.data.products.result?.inventoryAwareSortableAttributeId !== 0 &&\n refiner.RecordId === this.props.data.products.result?.inventoryAwareSortableAttributeId) ||\n (channelInventoryConfiguration?.ProductAvailabilitySortableAttributeRecordId !== 0 &&\n refiner.RecordId === channelInventoryConfiguration?.ProductAvailabilitySortableAttributeRecordId);\n\n const isInventoryProductAttribute =\n (this.props.data.products.result?.channelInventoryConfigurationId !== 0 &&\n refiner.RecordId === this.props.data.products.result?.channelInventoryConfigurationId) ||\n (channelInventoryConfiguration?.InventoryProductAttributeRecordId !== 0 &&\n refiner.RecordId === channelInventoryConfiguration?.InventoryProductAttributeRecordId);\n\n // Always hide sortable attribute since it's just for sorting products in Azure search, not for customers\n return (\n isInventorySortableAttribute ||\n (this.props.context.app.config.productListInventoryDisplay === ProductListInventoryFilteringOptions.HideOOS &&\n isInventoryProductAttribute)\n );\n };\n\n private readonly _getChoiceSummary = (): React.ReactNode => {\n const { resources, data, telemetry } = this.props;\n const { channelInventoryConfiguration } = this.state;\n const selectedRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\n const refinerValueName = this.props.data.refiners.result?.find(rating => rating.KeyName === 'Rating');\n return (\n <ChoiceSummary\n classNames='ms-choice-summary-by-category'\n clearAllText={resources.clearAllText}\n label={resources.choiceSummaryLabel}\n closeAriaLabel={resources.closeAriaLabel}\n selectedChoices={selectedRefiners}\n // @ts-expect-error: NOTE Type-unsafe line below, null refinersByCategoryHierarchy case not handled\n refinerHierarchy={data.refiners.result}\n choiceFormat={resources.choiceFormat}\n choiceRangeValueFormat={resources.choiceRangeValueFormat}\n telemetry={telemetry}\n onChoiceClicked={this._onChoiceClicked}\n urlBuilder={this._buildRefinerUrlForChoiceSummary}\n choiceAriaLabel={resources.choiceAriaLabel}\n telemetryContent={this.telemetryContent}\n context={this.props.context}\n channelInventoryConfigurationId={channelInventoryConfiguration?.InventoryProductAttributeRecordId}\n refinerValues={refinerValueName}\n />\n );\n };\n\n /**\n * Get Active products.\n * @returns - JSX Elements.\n */\n private readonly _getProducts = (): JSX.Element => {\n const {\n config: { imageSettings, allowBackNavigation: shouldAllowBackNavigation }\n } = this.props;\n const { resources } = this.props;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- Reading config value.\n const breadCrumbType: string = this.props.context.app.config.breadcrumbType;\n const shouldAllowBack = shouldAllowBackNavigation && (breadCrumbType === 'back' || breadCrumbType === 'categoryAndBack');\n\n const products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\n const quickviewSlot = this.props.slots?.quickview?.[0];\n const productComparisonButton = ArrayExtensions.hasElements(this.props.slots.productComparisonButton)\n ? this.props.slots.productComparisonButton[0]\n : null;\n\n const isPriceMinMaxFeatureState = this.props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailSearchPriceRangeFeature'\n );\n return (\n <ProductSearchResultItems\n products={products}\n context={this.props.context}\n imageSettings={imageSettings}\n resources={resources}\n moduleType={this.props.typeName}\n moduleId={this.props.id}\n allowBackNavigation={shouldAllowBack}\n telemetryContent={this.telemetryContent}\n quickviewSlot={quickviewSlot}\n productComparisonButton={productComparisonButton}\n channelInventoryConfigurationId={this.props.data.products.result?.channelInventoryConfigurationId}\n isPriceMinMaxEnabled={isPriceMinMaxFeatureState?.IsEnabled}\n productsDimensionAvailabilities={this.state.productsDimensionAvailabilities}\n />\n );\n };\n\n private readonly _updateSortByDropdown = (notification: ILabeledDropdownOnChangeNotification): void => {\n const {\n context: { request: requestContext, actionContext }\n } = this.props;\n\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\n // eslint-disable-next-line max-len -- existing code\n const error = `[sort-by-category] cannot sort without context: ${!requestContext ? 'requestContext ' : ''} ${\n !actionContext ? 'actionContext ' : ''\n } could not be found`;\n this.props.telemetry.warning(error);\n return;\n }\n\n window.history.pushState(\n {},\n '',\n buildListPageUrl(\n getCurrentUrl(this.props.context.request),\n undefined,\n [this._getSortColumnFromSelectedOption(notification.selectedOption)],\n undefined\n )\n );\n transaction(() => {\n this.props.data.listPageState.result!.currentPageNumber = 0;\n this.props.data.listPageState.result!.sortingCritera = {\n Columns: [this._getSortColumnFromSelectedOption(notification.selectedOption)]\n };\n });\n };\n\n private readonly _getSortColumnFromSelectedOption = (option: ILabeledDropdownOption): SortColumn => {\n const { data } = this.props;\n\n if (!data.searchConfiguration.result) {\n return {};\n }\n\n const mappedConfiguration = data.searchConfiguration.result.find(searchConfiguration => {\n return searchConfiguration.key === option.key;\n });\n\n if (mappedConfiguration) {\n return mappedConfiguration.sortColumn;\n }\n\n return {};\n };\n\n /**\n * Retrieves current sort criteria.\n * @returns Sort criteria column which is currently active or undefined if it's not specified.\n */\n private readonly _getSortCriteriaColumn = (): SortColumn | undefined => {\n const sortCriteria = this.props.data.listPageState.result?.sortingCritera;\n if (ArrayExtensions.hasElements(sortCriteria?.Columns)) {\n return sortCriteria!.Columns[0];\n }\n\n const queryColumns = parseQueryParam<SortColumn[]>('sorting', this.props.context.request);\n if (ArrayExtensions.hasElements(queryColumns)) {\n return queryColumns[0];\n }\n\n return undefined;\n };\n\n /**\n * Retrieves dropdown options.\n * @returns All dropdown options.\n */\n private readonly _getAllSortByOptions = (): ILabeledDropdownOption[] => {\n const searchConfiguration = this.props.data.searchConfiguration.result;\n\n if (!searchConfiguration) {\n return [];\n }\n\n const mappedSearchConfiguration = this.sortByDropdownOptions.filter(mappedSearchConfig =>\n searchConfiguration.find(item => mappedSearchConfig.key === item.key)\n );\n\n return ArrayExtensions.validValues(mappedSearchConfiguration);\n };\n\n /**\n * Retrieves current selected dropdown option based on the sort criteria.\n * @returns Current dropdown option.\n */\n private readonly _getCurrentlySelectedOption = (): ILabeledDropdownOption | undefined => {\n const activeSortColumn = this._getSortCriteriaColumn();\n\n const searchConfiguration = this.props.data.searchConfiguration.result;\n\n if (!activeSortColumn || !searchConfiguration) {\n return undefined;\n }\n\n const activeMappedConfig = searchConfiguration.find(\n mappedSearchConfig =>\n mappedSearchConfig.sortColumn.ColumnName === activeSortColumn.ColumnName &&\n mappedSearchConfig.sortColumn.IsDescending === activeSortColumn.IsDescending\n );\n if (!activeMappedConfig) {\n return undefined;\n }\n\n return this.sortByDropdownOptions.find(dropdownOption => dropdownOption.key === activeMappedConfig.key);\n };\n\n private readonly _onUpdateRefiners = (itemToggleNotification: IRefineItemToggleNotification): void => {\n const {\n context: { request: requestContext, actionContext }\n } = this.props;\n\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\n const error = `Refine menu cannot refine search criteria: \n ${!requestContext ? 'requestContext ' : ''} ${!actionContext ? 'actionContext ' : ''} could not be found`;\n this.props.telemetry.warning(error);\n return;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Server side the list PageState will not be called.\n const updatedRefinementCriteria = getUpdatedRefinementCriteria(\n itemToggleNotification,\n this.props.data.listPageState.result?.activeFilters || []\n );\n\n window.history.pushState({}, '', buildListPageUrl(getCurrentUrl(this.props.context.request), updatedRefinementCriteria));\n transaction(() => {\n this.props.data.listPageState.result!.currentPageNumber = 0;\n this.props.data.listPageState.result!.activeFilters = updatedRefinementCriteria;\n });\n };\n\n private readonly _buildRefinerUrl = (itemToggleNotification: IRefineItemToggleNotification): string => {\n if (this.props.data.listPageState.result) {\n const newRefinementCriteria = getUpdatedRefinementCriteria(\n itemToggleNotification,\n this.props.data.listPageState.result.activeFilters || []\n );\n\n return buildListPageUrl(getCurrentUrl(this.props.context.request), newRefinementCriteria);\n }\n this.props.telemetry.warning('[buildRefinerQueryString]List Page State Not available, unable to build refiner URL');\n return '';\n };\n\n private readonly _onChoiceClicked = (notification: IChoiceSummaryClickNotification): void => {\n const { data, telemetry } = this.props;\n\n if (!data.listPageState.result) {\n telemetry.warning('[choice-summary-by-category._onChoiceClicked]ListPageState unavailable, unable to update refiners.');\n return;\n }\n\n let currentRefinementCriteria = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\n\n if (!notification.clearAll) {\n const selectedChoice = notification.choiceClicked;\n if (!selectedChoice) {\n telemetry.warning('[choice-summary-by-category._onChoiceClicked] Choice could not be determined');\n return;\n }\n currentRefinementCriteria = currentRefinementCriteria.filter(\n (selectedCriterion: ProductRefinerValue) => !isMatchingRefinementCriterion(selectedChoice, selectedCriterion)\n );\n } else {\n currentRefinementCriteria = [];\n\n // Set focus to sort and filter\n const dropdownElementId = this._sortAndFilterContainerRef.current && this._sortAndFilterContainerRef.current.props.dropdownId;\n const dropdownElement = dropdownElementId && document.getElementById(dropdownElementId);\n setTimeout(() => {\n dropdownElement && dropdownElement.focus();\n }, 50);\n }\n\n const fullUrl = getCurrentUrl(this.props.context.request);\n window.history.pushState({}, '', buildListPageUrl(fullUrl, currentRefinementCriteria));\n data.listPageState.result.currentPageNumber = 0;\n data.listPageState.result.activeFilters = currentRefinementCriteria;\n };\n\n private readonly _buildRefinerUrlForChoiceSummary = (selectedRefiner: ProductRefinerValue, isClearAll: boolean): string => {\n const { data, telemetry } = this.props;\n const fullUrl = getCurrentUrl(this.props.context.request);\n\n if (!data.listPageState.result) {\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl]ListPageState unavailable, unable to create refiner URL.');\n return fullUrl.href;\n }\n\n let currentRefinementCriteria = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\n\n if (!isClearAll) {\n if (!selectedRefiner) {\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl] URL for Choice could not be determined');\n return fullUrl.href;\n }\n currentRefinementCriteria = currentRefinementCriteria.filter(\n (selectedCriterion: ProductRefinerValue) => !isMatchingRefinementCriterion(selectedRefiner, selectedCriterion)\n );\n } else {\n currentRefinementCriteria = [];\n }\n\n return buildListPageUrl(fullUrl, currentRefinementCriteria);\n };\n\n private _getViewport(): GridSize {\n if (MsDyn365.isBrowser) {\n return isMobile({ variant: VariantType.Browser, context: this.props.context.request });\n }\n return isMobile({ variant: VariantType.Viewport, context: this.props.context.request });\n }\n\n private _toggleModal(): void {\n this.setState({\n modalIsOpen: !this.state.modalIsOpen\n });\n }\n\n private _updateViewport(): void {\n this._viewport = this._getViewport();\n\n if (this.state.modalIsOpen && !this.isMobile) {\n this._toggleModal();\n }\n }\n\n private readonly _getexpandRefinerCount = (validRefiners?: number, refinerCount?: expandRefinersCount): void => {\n switch (refinerCount) {\n case expandRefinersCount.all:\n this.expandrefinerCount = validRefiners;\n break;\n case expandRefinersCount.one:\n this.expandrefinerCount = 1;\n break;\n case expandRefinersCount.two:\n this.expandrefinerCount = 2;\n break;\n case expandRefinersCount.three:\n this.expandrefinerCount = 3;\n break;\n case expandRefinersCount.four:\n this.expandrefinerCount = 4;\n break;\n default:\n this.expandrefinerCount = 0;\n }\n };\n\n /**\n * Renders a Pagination previous text.\n * @param paginationPreviousText - Pagination previous text from resources.\n * @returns Previous text and flipper icon.\n */\n private readonly _renderPrev = (paginationPreviousText: string) => {\n return (\n <div className='msc-pagination__prev'>\n <span className='ms-search-result__pagination-left' aria-hidden='true' />\n <span className='prev-text'>{paginationPreviousText}</span>\n </div>\n );\n };\n\n /**\n * Renders a Pagination next text.\n * @param paginationNextText - Pagination next text from resources.\n * @returns Next text and flipper icon.\n */\n private readonly _renderNext = (paginationNextText: string) => {\n return (\n <div className='msc-pagination__next'>\n <span className='next-text'>{paginationNextText}</span>\n <span className='ms-search-result__pagination-right' aria-hidden='true' />\n </div>\n );\n };\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISearchResultModalViewProps } from './components';\nimport {\n ICategoryHierarchyViewProps,\n IRefineMenuViewProps,\n ISearchResultContainerViewProps,\n ISortByViewProps,\n ITitleViewProps\n} from './search-result-container';\n\nconst SearchResultContainerView: React.FC<ISearchResultContainerViewProps> = props => {\n const {\n SearchResultContainer,\n products,\n pagination,\n ProductsContainer,\n ProductSectionContainer,\n choiceSummary,\n isMobile,\n modalToggle,\n searchResultModal,\n TitleViewProps,\n refineMenu,\n categoryHierarchy,\n sortByOptions,\n CategoryNavContainer,\n RefineAndProductSectionContainer,\n errorMessage,\n FeatureSearchContainer,\n similarLookProduct\n } = props;\n const isRecoSearchPage = props.context.actionContext.requestContext.query?.recommendation;\n if (isMobile) {\n return (\n <Module {...SearchResultContainer}>\n {renderCategoryHierarchy(categoryHierarchy)}\n {renderTitle(TitleViewProps)}\n {choiceSummary}\n {modalToggle}\n {createSearchResultModal(searchResultModal, refineMenu, sortByOptions, isRecoSearchPage)}\n <Node {...FeatureSearchContainer}>{similarLookProduct}</Node>\n <Node {...ProductsContainer}>\n {errorMessage}\n {products}\n </Node>\n {pagination}\n </Module>\n );\n }\n return (\n <Module {...SearchResultContainer}>\n <Node {...CategoryNavContainer}>\n {categoryHierarchy && renderCategoryHierarchy(categoryHierarchy)}\n {TitleViewProps && renderTitleCount(TitleViewProps)}\n </Node>\n <Node {...RefineAndProductSectionContainer}>\n {refineMenu && renderRefiner(refineMenu)}\n <Node {...ProductSectionContainer}>\n {TitleViewProps && renderTitle(TitleViewProps)}\n {choiceSummary}\n {sortByOptions && !isRecoSearchPage && renderSort(sortByOptions)}\n <Node {...FeatureSearchContainer}>{similarLookProduct}</Node>\n <Node {...ProductsContainer}>\n {errorMessage}\n {products}\n </Node>\n {pagination}\n </Node>\n </Node>\n </Module>\n );\n};\n\nconst createSearchResultModal = (\n modalProps: ISearchResultModalViewProps,\n refineMenu: IRefineMenuViewProps,\n sortByDropDown: ISortByViewProps,\n isRecoSearchPage?: string\n): JSX.Element => {\n return React.cloneElement(\n modalProps.modal,\n {},\n modalProps.modalHeader,\n createModalBody(modalProps, refineMenu, sortByDropDown, isRecoSearchPage),\n modalProps.modalFooter\n );\n};\n\nconst createModalBody = (\n props: ISearchResultModalViewProps,\n refineMenu: IRefineMenuViewProps,\n sortByDropDown: ISortByViewProps,\n isRecoSearchPage?: string\n): JSX.Element | null => {\n if (sortByDropDown) {\n return React.cloneElement(props.modalBody, {}, renderSort(sortByDropDown, isRecoSearchPage), renderRefiner(refineMenu));\n }\n return null;\n};\n\nconst renderRefiner = (props: IRefineMenuViewProps): JSX.Element | null => {\n const { refiners, RefineMenuContainer, RefinerSectionContainer } = props;\n if (refiners) {\n return (\n <Node {...RefinerSectionContainer}>\n <Node {...RefineMenuContainer}>\n {refiners.map((submenu, index) => (\n <React.Fragment key={index}>{submenu}</React.Fragment>\n ))}\n </Node>\n </Node>\n );\n }\n return null;\n};\n\nconst renderSort = (props: ISortByViewProps, isRecoSearchPage?: string): JSX.Element | null => {\n const { SortingContainer, sortByDropDown } = props;\n if (sortByDropDown && !isRecoSearchPage) {\n return <Node {...SortingContainer}>{sortByDropDown}</Node>;\n }\n return null;\n};\n\nconst renderCategoryHierarchy = (props: ICategoryHierarchyViewProps): JSX.Element | null => {\n const { CategoryHierarchyContainer, categoryHierarchyList, categoryHierarchySeparator } = props;\n if (categoryHierarchyList) {\n return (\n <Node {...CategoryHierarchyContainer}>\n {categoryHierarchyList.map((category, index) => (\n <React.Fragment key={index}>\n {category}\n {categoryHierarchyList && categoryHierarchyList[index + 1] && categoryHierarchySeparator}\n </React.Fragment>\n ))}\n </Node>\n );\n }\n\n return null;\n};\n\nconst renderTitle = (props: ITitleViewProps): JSX.Element | null => {\n const { title, TitleContainer } = props;\n if (title) {\n return (\n <Node {...TitleContainer}>\n <h2>\n {title.titlePrefix}\n {title.titleText}\n </h2>\n </Node>\n );\n }\n return null;\n};\n\nconst renderTitleCount = (props: ITitleViewProps): JSX.Element | null => {\n const { title, TitleContainer } = props;\n if (title) {\n return (\n <Node {...TitleContainer}>\n <h5>{title.titleCount}</h5>\n </Node>\n );\n }\n return null;\n};\n\nexport default SearchResultContainerView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { 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":["Availability","ProductAvailabilitiesForSelectedVariantInput","constructor","productId","channelId","selectedProduct","getCacheKey","getCacheObjectType","dataCacheType","this","createProductAvailabilitiesForSelectedVariantInput","inputData","getSelectedProductIdFromActionInput","requestContext","apiSettings","Error","async","getProductAvailabilitiesForSelectedVariantAction","input","ctx","productInventoryInformation","_input$selectedProduc","productResult","selectedVariantInput","SelectedVariantInput","undefined","getSelectedVariant","app","config","enableStockCheck","ItemTypeValue","ReleasedProductType","Service","ProductTypeValue","ProductType","Master","shippingSearchCriteria","createInventoryAvailabilitySearchCriteria","RecordId","DeliveryMode","shipping","pickupSearchCriteria","pickup","shippingAvailability","ProductsDataActions","callerContext","ProductWarehouseInventoryAvailabilities","shippingInventory","mapAggregatedProductInventoryInformation","ArrayExtensions","hasElements","deliveryType","push","pickupAvailability","pickupInventory","AggregatedProductInventoryAvailabilities","error","telemetry","debug","mergeProductWarehouseToProductAvailabities","productsWarehouseInventory","productAvailable","product","TotalAvailable","ProductId","AvailableQuantity","getProductAvailabilitiesForSelectedVariantActionDataAction","createObservableDataAction","id","action","expandRefinersCount","layout","renderProductsAsTable","props","_props$data$listPageS","products","data","listPageState","result","activeProducts","context","typeName","resources","quantities","setQuantities","useState","Array","length","fill","availabilities","setAvailabilities","loading","FullProducts","setFullProducts","handleQuantityChange","index","value","prevQuantities","newQuantities","isList","list","isImageList","imagelist","useEffect","simpleProducts","productInputs","arguments","filter","map","ProductInput","request","getSimpleProductsAction","actionContext","_getProducts","simpleProduct","i","_simpleProduct$Behavi","_simpleProduct$Behavi2","_simpleProduct$Behavi3","_simpleProduct$Behavi4","minQuantity","Behavior","MinimumQuantity","multipleOfQuantity","MultipleOfQuantity","fetchProducts","availability","newAvailableQuantity","prevAvailabilities","updatedAvailabilities","TotalAvailableInventoryLevelLabel","available","outOfStock","fetchAvailabilities","React","Toaster","richColors","position","toastOptions","classNames","Node","Object","assign","ProductsContainer","errorMessage","className","_product$Name","_FullProducts$find","productUrl","getProductPageUrlSync","Name","Price","BasePrice","AdjustedPrice","key","ProductPopover","IncrementalQuantity","min","max","currentCount","onChange","productBehavior","find","availableClass","outOfStockClass","title","availabilityIndicatorAvailable","availabilityIndicatorOutOfStock","Button","href","moreInformationText","AddToCartComponent","quantity","addToCartText","disabled","onError","_error$cartActionResu","object","cartActionResult","validationResults","x","ErrorResourceId","LocalizedMessageParameters","param","heading","description","errorMessageForQtyValidation","replace","toast","role","_showToast","getProductAvailabilitiesForSelectedVariant","Number","channel","ChannelNaturalId","renderProducts","_props$data$listPageS2","renderTitleCount","TitleContainer","titleCount","renderCategoryHierarchy","CategoryHierarchyContainer","categoryHierarchyList","categoryHierarchySeparator","category","configureStickyFilter","isMobile","isStickyHeader","headerContainer","document","querySelector","headerHeight","offsetHeight","bannerHeights","headerElement","defaultContainer","refinerElement","MsDyn365","isBrowser","documentElement","scrollTop","classList","add","setAttribute","clientHeight","remove","removeAttribute","createSearchResultModal","modalProps","refineMenu","sortByDropDown","isRecoSearchPage","modal","modalHeader","createModalBody","modalFooter","modalBody","renderSort","refiners","RefineMenuContainer","RefinerSectionContainer","submenu","renderRefinerMobile","renderRefiner","renderRefinerFooter","handler","tag","doneAriaLabel","tabIndex","onClick","doneText","SortingContainer","renderTitle","titlePrefix","titleText","_props$context$action","SearchResultContainer","pagination","ProductSectionContainer","choiceSummary","modalToggle","searchResultModal","TitleViewProps","categoryHierarchy","sortByOptions","CategoryNavContainer","RefineAndProductSectionContainer","FeatureSearchContainer","similarLookProduct","useStickyFilter","window","addEventListener","stickyFilterSetup","enableStickyHeader","isExpanded","setIsExpanded","toggle","wrapperRefiner","refinerRefernce","handleClickOutside","event","element","current","contains","target","removeEventListener","useOutsideClick","query","recommendation","Module","enableProdutDescription","ref","filterText","binding","modules","dataActions","registerSanitizedActionPath","sanitizedActionPath","dataAction","default","prototype","RegistrationId","c","require","$type","da","name","path","runOn","iNM","ns","n","p","pdp","md","__bindings__","_objectSpread","viewDictionary","cn","BaseCollectionInput","pageType","queryResultSettings","searchText","includeAttributes","isUpdateRefinerPanel","locale","catalogId","channelInventoryConfiguration","inventoryRefiner","Paging","toJS","Sorting","generateCacheKey","refiner","RefinerRecordId","LeftValueBoundString","RightValueBoundString","convertToString","createBaseCollectionInput","args","inputClassConstuctor","urlTokens","categoryId","QueryResultSettingsProxy","fromInputData","QueryResultSettings","queryRefiners","hydrateRefinersFromUrl","_inputData$config","updateRefinerPanel","getUpdateRefinerPanel","getCatalogId","sorting","Columns","JSON","parse","decodeURIComponent","itemId","q","stringify","Recommendation","discountIds","DiscountIds","ProductListInventoryFilteringOptions","GetFullProductsByCollectionInput","returnProducts","productSearchResults","metadataCount","productSearchResultsWithImages","productSearchResult","newImageUrl","generateProductImageUrl","PrimaryImageUrl","inventoryLevel","InventoryLevels","threshold","count","AttributeValues","InventoryProductAttributeRecordId","inventoryRanges","TextValue","InventoryOutOfStockAttributeValueText","channelInventoryConfigurationId","inventoryAwareSortableAttributeId","ProductAvailabilitySortableAttributeRecordId","actionDataAction","_context$requestConte","_context$requestConte2","_context$requestConte3","_context$requestConte4","_context$requestConte5","promise","channelInventoryConfigurationPromise","searchProductId","searchCriteriaInput","Context","ChannelId","CatalogId","Refinement","IncludeAttributes","SkipVariantExpansion","AsyncResult","resolve","getInventoryConfigurationAsync","isInStockRefiner","inventoryRefinerValue","getInventorySortableRefinerValue","some","productListInventoryDisplay","HideOOS","isInStock","inventoryInStockRefinerValue","SortOOS","_input$queryResultSet","_input$queryResultSet2","sortColumnName","column","ColumnName","IsDescending","CategoryIds","searchByCriteriaAsync","SearchCondition","searchObject","isNaN","RecommendationListId","Ids","_context$requestConte6","accountInformation","getCustomer","GetCustomerInput","split","productIds","getProductPromotionsAsync","HeaderContext","CustomerAccountNumber","AccountNumber","LineContexts","Date","_p$ProductId","metadata","Top","itemsPerPage","skip","Skip","sortOptions","sortByOptionRelevanceDesc","sortByOptionRatingAsc","sortByOptionRatingDesc","sortByOptionNameAsc","sortByOptionNameDesc","sortByOptionPriceAsc","sortByOptionPriceDesc","sortByOptionBestSelling","sortByOptionNewScore","sortByOptionTrendingScore","MappedSearchInput","buildCacheKey","getMappedSearchConfiguration","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","toString","getCurrentUrl","URL","location","url","requestUrl","ListPageState","activeFilters","sortingCritera","currentPageNumber","pageSize","featureProduct","productPrices","__decorate","observable","ListPageStateInput","listPageStateAction","createListPageInput","ProductRefinerValueDataTypeValue","ProductRefinerTypeValue","isRangeType","dataTypeValue","Currency","Decimal","isRangeTypeForInteger","Integer","isCustomRangeTypeIntegerSelected","selectedRefinementCriterion","parentProductRefinerHierarchy","DisplayTemplateValue","DisplayTemplate","Range","isSingleSelectRangeTypeIntegerSelected","productRefinerValue","findMatchingRefinementCriterion","refinementCriteria","refinementCriterion","isMatchingRefinementCriterion","parent","getIntegerRangeName","rangeValue","RightValueBoundLocalizedString","LeftValueBoundLocalizedString","getUpdatedRefinementCriteria","itemToggleNotification","currentRefinementCriteria","updatedRefinementCriteria","toggledItemFound","r","selectedCriterion","isSelecting","next","rangeStart","rangeEnd","Text","RefinerTypeValue","RefinerType","SingleSelect","Values","child","matchingIndex","findIndex","criterion","splice","ChoiceSummary","super","closeButtonGlyph","_onClick","e","preventDefault","stopPropagation","currentTarget","clearAll","getAttribute","includes","selectedRefiner","_getSelectedRefinerChoice","onChoiceClicked","itemClicked","choiceClicked","nextItemToFocus","nextSibling","payLoad","getPayloadObject","telemetryContent","_this$props$context","selectedChoices","refinerHierarchy","choice","hierarchy","_rangeParentDisplay$","rangeParentDisplay","_getKeyForRefinerValue","rangeDisplayType","render","clearAllText","label","choiceAriaLabel","closeAriaLabel","items","selectedRefinersMap","contentAction","etext","clearAllAttributes","getTelemetryAttributes","classnames","item","attribute","newIntRange","urlBuilder","_parent","choiceFormat","choiceRangeValueFormat","refinerValues","overallFormat","rangeFormat","refinerValueName","refinerName","KeyName","_formatPrice","filterValue","amount","currency","cultureFormatter","formatCurrency","selected","computed","observer","ErrorMessage","_ref","text","FeatureSearchResultItem","_context$request$app","imageSettings","productName","productRecordId","fallbackImage","getFallbackImageUrl","ItemId","OmniChannelMedia","featureSimilarDescriptionTitle","featureSimilarLooksTitle","onTelemetryClick","gridSettings","imageUrl","altText","img","src","imageProps","fallBackSrc","Image","loadFailureBehavior","renderProductPlacementImage","Link","ariaLabel","ModalToggle","innerRef","modalNode","Modal","autoFocus","applicationNode","returnFocusRef","returnRef","isOpen","onModalToggle","zIndex","modalHeaderNode","ModalHeader","modalTitle","modalFooterNode","ModalFooter","modalCloseButtonText","getInventoryLabel","inventoryAttribute","ProductSearchResultItems","moduleType","moduleId","allowBackNavigation","quickviewSlot","productComparisonButton","isPriceMinMaxEnabled","productsDimensionAvailabilities","priceResources","priceRangeSeparator","ProductComponent","freePriceText","priceFree","originalPriceText","currentPriceText","ratingAriaLabel","allowBack","quickViewButton","inventoryLabel","swatchItemAriaLabel","dimensionAvailabilities","dimensionAvailability","masterProductId","MasterProductId","RangeRefineItem","_selectedRefinementCr","_this$props$selectedR","_this$props$selectedR2","_ref2","_this$props$selectedR3","_this$props$selectedR4","_formattedPriceReverseLookup","Map","getLabels","sliderId","minPrice","maxPrice","labelId","labelString","labelPositioning","getSliderThumbs","sliderKey","selectedMin","selectedMinPrice","selectedMax","selectedMaxPrice","_this$props$minValueS","_this$props$maxValueS","minValueSliderThumbAriaLabel","currencyCode","ariaValueText","maxValueSliderThumbAriaLabel","_onRangeUpdate","bind","_onRangeUpdateEnd","_handleRangeTooltipText","_changeMin","_changeMax","_finishChangeMin","_finishChangeMax","minInput","maxInput","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","onFocus","onBlur","maxLabel","placeholder","placeholderTextMax","ariaAttributes","Slider","inForm","step","orientation","showLabels","showTooltip","onChangeEnd","debounce","handleTooltipText","_changeValue","inputType","selectedKey","touchedKey","_getInputWithoutFormatting","selectedMinValue","minTouched","onToggle","maxNum","validationErrorNaN","_focus","_validateRange","selectedMaxValue","maxTouched","minNum","setTimeout","focus","touched","validationError","validationErrorRange","inputAsNum","get","sliderChangeNotification","eventType","firstThumbValue","secondThumbValue","_focusOnSliderThumb","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","isSelectionEnabled","isRefineItem","ratingUserCountAriaLabel","ratingSingleUserCountAriaLabel","_productRefinerValue$3","refinerRating","parseInt","ratingRefiner","selectedRefinerValues","selectedRating","defaultChkProductCount","ratingComponentClass","productCountAriaLabelValue","isMobileView","RatingComponent","avgRating","ratingCount","hideCount","readOnly","moduleTypeName","RangeRefineItemInput","_changeMinInputRange","_changeMaxInputRange","_applyCustom","invalidData","updateInputRangerProps","_isUndefined","trim","RefineSubmenu","_onToggleItem","_onToggleSubmenu","isExpandedOnInitialLoad","expanded","productRefinerHierarchy","hideRating","Collapse","timeout","_renderChildItems","_renderSingleMultiSelect","_renderRange","refinerValuesList","listItems","selectedValue","_getRangeType","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$context$r2","_this$props$config$it","_this$props$config$it2","_this$props$context$r3","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$r4","getFriendlyName","NameTranslations","productCountNumber","productCountText","numberOfProducts","oneProduct","telemetryPageName","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","ObjectExtensions","isNullOrUndefined","totalItems","previousText","flipperPrevious","nextText","flipperNext","UncontrolledPagination","paginationAriaLabel","qsp","startingItem","_renderPrev","_renderNext","previousAriaLabel","nextAriaLabel","_getRefineMenu","tempRangeTypeTODO","inputRange","validRefiners","_shouldHideFromRefiners","activeRefiners","_getexpandRefinerCount","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","_this$props$slots","_this$props$data$feat","_this$props$data$prod5","shouldAllowBackNavigation","breadCrumbType","breadcrumbType","shouldAllowBack","slots","quickview","isPriceMinMaxFeatureState","featureState","IsEnabled","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","getTelemetryObject","friendlyName","nameTranslations","_nameTranslation","nameTranslation","Language","_this$props$context$a2","StoreOperationsDataActions","reaction","_listPageState$active","_listPageState$sortin","_newListPageState$cur","_newListPageState$sor","_newListPageState$act","_this$props$context$r5","_this$props$context$r6","_this$props$context$r7","_this$props$context$a","newListPageState","Math","recordId","productResults","getCollectionProducts","enableAffiliationBasedPricing","user","isAuthenticated","_newListPageState$cur2","_newListPageState$sor2","_newListPageState$act2","_this$props$context$r8","_this$props$context$r9","refinerInput","getCollectionRefinersAction","componentWillUnmount","_listPageState$result","_listPageState$result2","_this$props$context$r10","_this$props$data$list7","_this$props$data$list8","productCollection","searchProduct","errorText","resultCategoryNotFoundText","resultSearchNotFoundText","productsComponent","featureComponent","searchResultContainerViewProps","disableHierarchy","moduleProps","renderView","_getViewport","variant","VariantType","Browser","Viewport","DescriptionInterval","renderProductCards","renderProductCardsDescription","isEnabledProductDescription","_props$data$products$","_props$data$featureSt","isAllowBack","classname","quickviewslot","productDescriptionInterval","productDescriptionIntervalRemainder0","productDescriptionIntervalRemainder9","module","exports","ReactDOM"],"sourceRoot":""}