{"version":3,"file":"static/js/8859c0a41278946a000c.bundle.js","mappings":"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","sources":["webpack://msdyn365.commerce.online/./src/common/components/swatch/swatch-item.tsx?8d3d","webpack://msdyn365.commerce.online/./src/common/components/swatch/swatch.tsx?fefb","webpack://msdyn365.commerce.online/./src/modules/c-buybox/components/c-price.component.tsx?6491","webpack://msdyn365.commerce.online/./src/modules/c-search-result-container/actions/base-collection-action.ts?51a1","webpack://msdyn365.commerce.online/./src/modules/c-search-result-container/actions/c-get-dimension-availabilities-for-product-search-result.action.ts?9bd1","webpack://msdyn365.commerce.online/./src/modules/c-search-result-container/actions/get-full-products-by-collection.ts?dfa8","webpack://msdyn365.commerce.online/./src/modules/c-search-result-container/actions/get-mapped-search-configuration.ts?1350","webpack://msdyn365.commerce.online/./src/modules/c-search-result-container/actions/get-refiners-for-collection.ts?1e27","webpack://msdyn365.commerce.online/./src/modules/c-search-result-container/actions/get-product-refiner-hierarchy.ts?eef9","webpack://msdyn365.commerce.online/./src/modules/c-search-result-container/actions/url-utils.ts?8a64","webpack://msdyn365.commerce.online/./src/modules/c-search-result-container/components/utilities.ts?a452","webpack://msdyn365.commerce.online/./src/modules/c-search-result-container/components/choice-summary.tsx?c07a","webpack://msdyn365.commerce.online/./src/modules/c-search-result-container/components/error-message.tsx?bd3e","webpack://msdyn365.commerce.online/./src/modules/c-search-result-container/components/feature-search-result-item.tsx?74ab","webpack://msdyn365.commerce.online/./src/modules/c-search-result-container/components/link.tsx?0a87","webpack://msdyn365.commerce.online/./src/modules/c-search-result-container/components/modal.tsx?a35d","webpack://msdyn365.commerce.online/./src/modules/c-search-result-container/components/product-search-result-items.tsx?1c86","webpack://msdyn365.commerce.online/./src/modules/c-search-result-container/components/range-refine-item.tsx?8dd0","webpack://msdyn365.commerce.online/./src/modules/c-search-result-container/components/refine-item.tsx?0512","webpack://msdyn365.commerce.online/./src/modules/c-search-result-container/components/refine-submenu.tsx?7132","webpack://msdyn365.commerce.online/./src/modules/c-search-result-container/components/separator.tsx?4b10","webpack://msdyn365.commerce.online/./src/modules/c-search-result-container/components/title.tsx?be8a","webpack://msdyn365.commerce.online/./src/modules/c-search-result-container/c-search-result-container.props.autogenerated.ts?96f4","webpack://msdyn365.commerce.online/./src/modules/c-search-result-container/c-search-result-container.tsx?57a5","webpack://msdyn365.commerce.online/./src/modules/c-search-result-container/c-search-result-container.view.tsx?d4d4","webpack://msdyn365.commerce.online/./src/modules/c-search-result-container/list-page-state.ts?6032","webpack://msdyn365.commerce.online/./lib/c-search-result-container/module-registration.js?4313","webpack://msdyn365.commerce.online/external var \"React\"?0d3b","webpack://msdyn365.commerce.online/external var \"ReactDOM\"?853b"],"sourcesContent":["/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { ICommerceApiSettings, ICoreContext, IGeneric, IAny } from '@msdyn365-commerce/core-internal';\r\nimport { DimensionTypes, generateSwatchImageUrl, StringExtensions, IDimensionValueForSelectedVariant } from '@msdyn365-commerce-modules/retail-actions';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\nimport { IBuyboxCommonResources } from '../../../modules/c-buybox/components/c-buyboxInterface';\r\n\r\n/**\r\n * Swatch item data.\r\n */\r\nexport interface ISwatchItem {\r\n value: string;\r\n itemId: string;\r\n dimensionType: DimensionTypes;\r\n dimensionId: string;\r\n inventoryCode: string;\r\n variantIds?: IDimensionValueForSelectedVariant;\r\n colorHexCode?: string;\r\n imageUrl?: string;\r\n productImageUrls?: string[];\r\n isDisabled?: boolean;\r\n isDefault?: boolean;\r\n swatchItemAriaLabel?: string;\r\n NB?: boolean;\r\n itemNumber?: string;\r\n dimensionTypeId?: number;\r\n}\r\n\r\n/**\r\n * Swatch item configuration.\r\n */\r\nexport interface ISwatchItemProps {\r\n className: string;\r\n apiSettings: ICommerceApiSettings;\r\n requestContext: ICoreContext>;\r\n resources?: IBuyboxCommonResources;\r\n isSelected: boolean;\r\n isSelectionEnabled?: boolean;\r\n\r\n item: ISwatchItem;\r\n\r\n onSelectItem(item: ISwatchItem): void;\r\n context: ICoreContext;\r\n}\r\n\r\n/**\r\n * Represents a single item for swatch.\r\n * @param props - Item configuration.\r\n * @returns React node.\r\n */\r\nexport const SwatchItemComponent: React.FC = (props: ISwatchItemProps) => {\r\n const { isSelected, className, onSelectItem, item } = props;\r\n const { itemId, value, colorHexCode, imageUrl } = item;\r\n const style: React.CSSProperties = {};\r\n\r\n let isColored = false;\r\n\r\n const hasColor = !StringExtensions.isNullOrWhitespace(colorHexCode);\r\n const hasImage = !StringExtensions.isNullOrWhitespace(imageUrl);\r\n\r\n let modImageUrl = '';\r\n if (imageUrl) {\r\n const splitImgUrl = imageUrl?.split('/');\r\n // eslint-disable-next-line no-new-wrappers\r\n const modUrl = new String(`${splitImgUrl[0]}/${item.itemNumber}-${splitImgUrl[1]}`);\r\n modImageUrl = modUrl.toString();\r\n } else {\r\n modImageUrl = '';\r\n }\r\n\r\n\r\n const selectItem = React.useCallback(() => {\r\n onSelectItem(item);\r\n }, [onSelectItem, item]);\r\n\r\n const selectionHandler = props.isSelectionEnabled ? selectItem : undefined;\r\n if (hasColor && item.dimensionType.toLowerCase() === 'color') {\r\n style.backgroundColor = colorHexCode;\r\n isColored = true;\r\n } else if (hasImage) {\r\n const fullImageUrl = generateSwatchImageUrl(imageUrl!, props.apiSettings);\r\n const modifiedImageUrl = generateSwatchImageUrl(modImageUrl, props.apiSettings);\r\n const [imgSrc, setImgSrc] = React.useState(modifiedImageUrl);\r\n const onImgError = (event: React.SyntheticEvent) => {\r\n setImgSrc(fullImageUrl);\r\n if (!fullImageUrl) {\r\n event.currentTarget.classList.add('img-error');\r\n }\r\n };\r\n \r\n if (typeof window !== 'undefined') {\r\n return (\r\n onImgError(event)}\r\n />\r\n );\r\n }\r\n }\r\n\r\n const shouldDisplayText = !isColored;\r\n\r\n return (\r\n
\r\n \r\n {shouldDisplayText && value}\r\n \r\n
\r\n );\r\n};\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { ICommerceApiSettings } from '@msdyn365-commerce/core-internal';\r\nimport { ObjectExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\n\r\nimport { ISwatchItem, SwatchItemComponent } from './swatch-item';\r\n// import { ISwatchItem, SwatchItemComponent } from '@msdyn365-commerce/components';\r\nimport { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\r\nimport { ICBuyboxProps, ICBuyboxData } from '../../../modules/c-buybox';\r\nimport { IBuyboxCommonResources } from '../../../modules/c-buybox/components/c-buyboxInterface';\r\n\r\n/**\r\n * Swatch item configuration.\r\n */\r\nexport interface ISwatchProps {\r\n className?: string;\r\n requestContext: ICoreContext>;\r\n apiSettings: ICommerceApiSettings;\r\n resources: IBuyboxCommonResources;\r\n list: ISwatchItem[];\r\n isSelectionEnabled?: boolean;\r\n\r\n onSelectItem?(item: ISwatchItem): void;\r\n dropdownId: string;\r\n moduleProps: ICBuyboxProps;\r\n}\r\n\r\n/**\r\n * Represents a single item for swatch.\r\n * @param props - Item configuration.\r\n * @returns React node.\r\n */\r\nexport const SwatchComponent: React.FC = (props: ISwatchProps) => {\r\n const containerClassName = 'msc-swatch-container';\r\n const [selectedItemId, setSelectedItemId] = React.useState(undefined);\r\n const [didUserSetAnyItem, setDidUserSetAnyItem] = React.useState(false);\r\n\r\n const isSelectionEnabled = props.isSelectionEnabled ?? true;\r\n\r\n const onSelectItemCallback = props.onSelectItem;\r\n\r\n const onSelectItem = React.useCallback(\r\n (item: ISwatchItem) => {\r\n setSelectedItemId(item.itemId);\r\n if (!ObjectExtensions.isNullOrUndefined(onSelectItemCallback)) {\r\n onSelectItemCallback(item);\r\n }\r\n setDidUserSetAnyItem(true);\r\n },\r\n [setSelectedItemId, onSelectItemCallback]\r\n );\r\n\r\n if (!didUserSetAnyItem) {\r\n const defaultItem = props.list.find(item => item.isDefault);\r\n if (defaultItem && defaultItem.itemId !== selectedItemId) {\r\n setSelectedItemId(defaultItem.itemId);\r\n if (!ObjectExtensions.isNullOrUndefined(onSelectItemCallback)) {\r\n onSelectItemCallback(defaultItem);\r\n }\r\n }\r\n }\r\n\r\n return (\r\n
\r\n {props.list.map(item => {\r\n const itemId = item.itemId;\r\n const isSelected = selectedItemId === itemId;\r\n\r\n return (\r\n \r\n );\r\n })}\r\n
\r\n );\r\n};\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { IComponent, IComponentProps, msdyn365Commerce } from '@msdyn365-commerce/core';\r\nimport { ProductPrice } from '@msdyn365-commerce/retail-proxy';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\n\r\nconst defaultPrice: number = 0;\r\nconst freePrice: number = 0;\r\n\r\n/**\r\n * Interface for price component resources.\r\n * @param {string} priceRangeSeparator - The price range separator.\r\n */\r\nexport interface IPriceComponentResources {\r\n priceRangeSeparator?: string;\r\n}\r\n\r\n/**\r\n * Interface for price component props.\r\n * @param {boolean} isPriceMinMaxEnabled - Whether the price range feature is enabled or not.\r\n * @param {IPriceComponentResources} priceResources - The price range resources.\r\n */\r\nexport interface IPriceComponentProps extends IComponentProps<{ price: ProductPrice }> {\r\n data: any;\r\n className?: string;\r\n savingsText?: string;\r\n freePriceText?: string;\r\n originalPriceText?: string;\r\n currentPriceText?: string;\r\n isPriceMinMaxEnabled?: boolean;\r\n priceResources?: IPriceComponentResources;\r\n}\r\nexport interface IPriceComponent extends IComponent {}\r\n\r\nconst priceComponentActions = {};\r\n\r\n/**\r\n * Price.\r\n * @param props - The props.\r\n * @returns The JSX.Element.\r\n */\r\nconst Price: React.FC = (props: IPriceComponentProps): JSX.Element | null => {\r\n // CustomerContextualPrice could be zero\r\n if (props.data.price.CustomerContextualPrice === undefined) {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n {showStrikethroughPricing(props) ? renderCurrentPriceWithOriginalPrice(props) : renderCurrentPrice(props)}\r\n \r\n );\r\n};\r\n\r\n/**\r\n * ShowStrikethroughPricing.\r\n * @param props - The props.\r\n * @returns True if showStrikethroughPricing, false otherwise.\r\n */\r\nconst showStrikethroughPricing = (props: IPriceComponentProps): boolean => {\r\n const originalPrice = getOriginalPrice(props);\r\n const { BasePrice, CustomerContextualPrice, MinVariantPrice, MaxVariantPrice } = props.data.price;\r\n if (\r\n props.isPriceMinMaxEnabled &&\r\n props.data.price.MaxVariantPrice &&\r\n props.data.price.MinVariantPrice &&\r\n props.data.price.MaxVariantPrice > props.data.price.MinVariantPrice\r\n ) {\r\n return props.data.price.MinVariantPrice < originalPrice;\r\n }\r\n\r\n if (MinVariantPrice && !(MinVariantPrice > 0) && MaxVariantPrice && !(MaxVariantPrice > 0)) {\r\n console.log('Condition Variant 1');\r\n return !(MinVariantPrice === 0 && MaxVariantPrice === 0);\r\n }\r\n if (\r\n MinVariantPrice &&\r\n MinVariantPrice > 0 &&\r\n MaxVariantPrice &&\r\n MaxVariantPrice > 0 &&\r\n MinVariantPrice === MaxVariantPrice &&\r\n MinVariantPrice > originalPrice\r\n ) {\r\n console.log('Condition Variant 4');\r\n return true;\r\n }\r\n\r\n if (BasePrice === CustomerContextualPrice && BasePrice === MinVariantPrice && BasePrice === MaxVariantPrice) {\r\n console.log('Condition Variant 2');\r\n return false;\r\n }\r\n\r\n if (originalPrice === props.data.price.CustomerContextualPrice && MinVariantPrice === 0 && MaxVariantPrice === 0) {\r\n return false;\r\n }\r\n if (originalPrice && props.data.price.CustomerContextualPrice && originalPrice > MinVariantPrice) {\r\n return true;\r\n }\r\n\r\n if (originalPrice && props.data.price.CustomerContextualPrice) {\r\n console.log('Condition Variant 3');\r\n return originalPrice > props.data.price.CustomerContextualPrice;\r\n }\r\n\r\n return false;\r\n};\r\n\r\nconst getOriginalPrice = (props: IPriceComponentProps): number => {\r\n return Math.max(\r\n props.data.price.BasePrice ?? defaultPrice,\r\n props.data.price.TradeAgreementPrice ?? defaultPrice,\r\n props.data.price.AdjustedPrice ?? defaultPrice\r\n );\r\n};\r\n\r\nconst formatCurrency = (props: IPriceComponentProps, price: number | undefined, shouldUseFreePriceText: boolean | undefined): string => {\r\n if (price === undefined) {\r\n return '';\r\n }\r\n\r\n if (shouldUseFreePriceText && price === freePrice && props.freePriceText) {\r\n return props.freePriceText;\r\n }\r\n\r\n return props.context.cultureFormatter.formatCurrency(price);\r\n};\r\n\r\nconst renderCurrentPrice = (props: IPriceComponentProps): JSX.Element => {\r\n const { MinVariantPrice, MaxVariantPrice, CustomerContextualPrice } = props.data.price;\r\n const initialPrice: string = formatCurrency(props, CustomerContextualPrice, true);\r\n const maxVariantPrice: string = formatCurrency(props, MaxVariantPrice, false);\r\n const minVariantPrice: string = formatCurrency(props, MinVariantPrice, false);\r\n if (props.isPriceMinMaxEnabled && MaxVariantPrice && MinVariantPrice && MaxVariantPrice > MinVariantPrice) {\r\n return (\r\n \r\n {' '}\r\n \r\n {minVariantPrice}\r\n \r\n \r\n {props.priceResources?.priceRangeSeparator}\r\n \r\n \r\n {maxVariantPrice}\r\n \r\n \r\n );\r\n }\r\n return (\r\n \r\n {MinVariantPrice === MaxVariantPrice && MinVariantPrice !== 0 && MaxVariantPrice !== 0 ? maxVariantPrice : initialPrice}\r\n \r\n );\r\n};\r\n\r\nconst renderCurrentPriceWithOriginalPrice = (props: IPriceComponentProps): JSX.Element => {\r\n const originalPrice: number = getOriginalPrice(props);\r\n const initialPrice: string = formatCurrency(props, originalPrice, true);\r\n\r\n return (\r\n <>\r\n \r\n {' '}\r\n {props.originalPriceText} {initialPrice} {props.currentPriceText} {renderCurrentPrice(props)}\r\n \r\n \r\n \r\n {props.savingsText && {props.savingsText}}\r\n \r\n );\r\n};\r\n\r\nexport const PriceComponent: React.FunctionComponent = msdyn365Commerce.createComponent('Price', {\r\n component: Price,\r\n ...priceComponentActions\r\n});\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport {\r\n CacheType,\r\n IActionInput,\r\n IAny,\r\n ICommerceApiSettings,\r\n ICreateActionContext,\r\n IGeneric\r\n} from '@msdyn365-commerce/core';\r\nimport { convertToString, IQueryResultSettings, ProductRefinerValue, SortColumn } from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n buildCacheKey,\r\n QueryResultSettingsProxy\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\nimport { toJS } from 'mobx';\r\n\r\nimport { hydrateRefinersFromUrl } from './url-utils';\r\n\r\n/**\r\n * Export listPageType.\r\n */\r\nexport type listPageType = 'Category' | 'Search' | 'Unknown';\r\n\r\n/**\r\n * Get include attributes from config.\r\n * @param inputData - ICreateActionContext.\r\n * @returns Boolean.\r\n */\r\nfunction getIncludeAttributes(inputData: ICreateActionContext, IGeneric>): boolean {\r\n if (inputData &&\r\n inputData.config &&\r\n inputData.config.includeAttributes !== undefined &&\r\n inputData.config.includeAttributes === true) {\r\n return true;\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Get updateRefinerPanel from config.\r\n * @param inputData - ICreateActionContext.\r\n * @returns Boolean.\r\n */\r\nfunction getUpdateRefinerPanel(inputData: ICreateActionContext, IGeneric>): boolean {\r\n return !!inputData.config?.updateRefinerPanel;\r\n}\r\n\r\n/**\r\n * BaseCollection Action Input.\r\n */\r\nexport class BaseCollectionInput implements IActionInput {\r\n public pageType: listPageType;\r\n\r\n public category: number | undefined;\r\n\r\n public searchText: string | undefined;\r\n\r\n public refiners: ProductRefinerValue[];\r\n\r\n public queryResultSettings: IQueryResultSettings;\r\n\r\n public apiSettings: ICommerceApiSettings;\r\n\r\n public includeAttributes: boolean | undefined;\r\n\r\n public locale?: string;\r\n\r\n public isUpdateRefinerPanel?: boolean;\r\n\r\n public constructor(\r\n pageType: listPageType,\r\n apiSettings: ICommerceApiSettings,\r\n queryResultSettings: IQueryResultSettings,\r\n refiners: ProductRefinerValue[],\r\n category: number | undefined,\r\n searchText: string | undefined,\r\n includeAttributes: boolean | undefined,\r\n isUpdateRefinerPanel?: boolean | undefined,\r\n locale?: string\r\n ) {\r\n this.pageType = pageType;\r\n this.apiSettings = apiSettings;\r\n this.category = category;\r\n this.searchText = searchText;\r\n this.queryResultSettings = queryResultSettings;\r\n this.refiners = refiners;\r\n this.includeAttributes = includeAttributes;\r\n this.isUpdateRefinerPanel = isUpdateRefinerPanel;\r\n this.locale = locale;\r\n }\r\n\r\n public getCacheKey = () => {\r\n const queryResultSettings = {\r\n ...this.queryResultSettings.Paging,\r\n ...toJS(this.queryResultSettings.Sorting)\r\n };\r\n\r\n const cacheKey = buildCacheKey(\r\n `${this.pageType}-${this.locale}-${this.category || this.searchText}-${this.refiners.map(refiner => `${refiner.RefinerRecordId + (refiner.LeftValueBoundString || '') + (refiner.RightValueBoundString || '')}-`)}-${convertToString(queryResultSettings)}`,\r\n this.apiSettings, this.locale\r\n );\r\n return cacheKey;\r\n };\r\n\r\n public getCacheObjectType = () => 'CollectionActionResult';\r\n\r\n public dataCacheType = (): CacheType => 'request';\r\n}\r\n\r\n// TODO: Create a data model here or import one to capture the response of the action\r\nexport interface IGetFullProductsByCollectionData {\r\n text: string;\r\n}\r\n\r\nexport type CollectionClassConstructor = new (\r\n pageType: listPageType,\r\n apiSettings: ICommerceApiSettings,\r\n queryResultSettings: IQueryResultSettings,\r\n refiners: ProductRefinerValue[],\r\n category: number | undefined,\r\n searchText: string | undefined,\r\n includeAttributes: boolean | undefined,\r\n isUpdateRefinerPanel?: boolean | undefined,\r\n locale?: string\r\n) => BaseCollectionInput;\r\n\r\n/**\r\n * TODO: Use this function to create the input required to make the action call.\r\n * @param args\r\n * @param inputClassConstuctor\r\n */\r\nexport const createBaseCollectionInput = (\r\n args: ICreateActionContext,\r\n inputClassConstuctor: CollectionClassConstructor\r\n): BaseCollectionInput => {\r\n const pageType =\r\n args.requestContext.urlTokens.pageType === 'Category' || (args.requestContext.query && args.requestContext.query.categoryId) ? 'Category' : 'Search';\r\n\r\n const queryResultSettings = QueryResultSettingsProxy.fromInputData(args).QueryResultSettings;\r\n const queryRefiners = hydrateRefinersFromUrl(args.requestContext);\r\n const includeAttributes = getIncludeAttributes(args);\r\n const isUpdateRefinerPanel = getUpdateRefinerPanel(args);\r\n\r\n if (args.requestContext.query && args.requestContext.query.sorting) {\r\n queryResultSettings.Sorting = { Columns: JSON.parse(decodeURIComponent(args.requestContext.query.sorting)) };\r\n }\r\n\r\n if (pageType === 'Category') {\r\n return new inputClassConstuctor(\r\n pageType,\r\n args.requestContext.apiSettings,\r\n queryResultSettings,\r\n queryRefiners,\r\n +(args.requestContext.urlTokens.itemId || (args.requestContext.query && args.requestContext.query.categoryId) || 0),\r\n undefined,\r\n includeAttributes,\r\n isUpdateRefinerPanel,\r\n args.requestContext.locale\r\n );\r\n } else if (pageType === 'Search' && args.requestContext.query && args.requestContext.query.q) {\r\n return new inputClassConstuctor(\r\n pageType,\r\n args.requestContext.apiSettings,\r\n queryResultSettings,\r\n queryRefiners,\r\n undefined,\r\n args.requestContext.query.q,\r\n includeAttributes,\r\n isUpdateRefinerPanel,\r\n args.requestContext.locale\r\n );\r\n } else if (pageType === 'Search' && args.requestContext.query && args.requestContext.query.productId && args.requestContext.query.recommendation) {\r\n return new inputClassConstuctor(\r\n pageType,\r\n args.requestContext.apiSettings,\r\n queryResultSettings,\r\n queryRefiners,\r\n undefined,\r\n JSON.stringify({ ProductId: args.requestContext.query.productId, Recommendation: args.requestContext.query.recommendation }),\r\n includeAttributes,\r\n isUpdateRefinerPanel,\r\n args.requestContext.locale\r\n );\r\n }\r\n\r\n throw new Error('[getFullProductsForCollection]Unable to create input');\r\n};\r\n","/* eslint-disable security/detect-object-injection */\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\nimport { CacheType, createObservableDataAction, IAction, IActionContext, IActionInput, ICoreContext } from '@msdyn365-commerce/core';\r\nimport { ProductDimensionType, ProductDimensionValueInventoryAvailability, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n ArrayExtensions,\r\n checkIfShouldDisplayAsSwatch,\r\n DimensionTypes,\r\n getInventoryLevelCodeFromDimensionValue,\r\n IDimensionsApp,\r\n InventoryLevelValues,\r\n getDimensionAvailabilitiesForProductsAction,\r\n ProductsDimensionAvailabilitiesInput\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\n\r\n/**\r\n * CGetDimensionAvailabilitiesForProductSearchResult Input Action\r\n */\r\nexport class CGetDimensionAvailabilitiesForProductSearchResultInput implements IActionInput {\r\n public products: ProductSearchResult[];\r\n\r\n public dimensionContext: ICoreContext;\r\n // TODO: Construct the input needed to run the action\r\n constructor(products: ProductSearchResult[], dimensionContext: ICoreContext) {\r\n this.products = products;\r\n this.dimensionContext = dimensionContext;\r\n }\r\n\r\n // TODO: Determine if the results of this get action should cache the results and if so provide\r\n // a cache object type and an appropriate cache key\r\n /**\r\n * Get the cache key.\r\n * @returns The cache key.\r\n */\r\n public getCacheKey = (): string => 'DimensionAvailabilitiesForProductSearchResult';\r\n\r\n /**\r\n * Get the cache object type.\r\n * @returns The cache object type.\r\n */\r\n public getCacheObjectType = (): string => 'ProductDimensionValueInventoryAvailability';\r\n\r\n /**\r\n * Define the data cache type.\r\n * @returns The cache type.\r\n */\r\n public dataCacheType = (): CacheType => 'none';\r\n}\r\n\r\n/**\r\n * The createInput method for the GetDimensionAvailabilitiesForProductSearchResultDataAction.\r\n * @param products -- The product search result.\r\n * @param dimensionContext -- The dimension app context.\r\n * @returns The input.\r\n */\r\n\r\n// TODO: Create a data model here or import one to capture the response of the action\r\nexport interface ICGetDimensionAvailabilitiesForProductSearchResultData {\r\n text: string;\r\n}\r\n\r\n/**\r\n * TODO: Use this function to create the input required to make the action call\r\n */\r\n\r\nexport const createDimensionAvailabilitiesForProductSearchResultInput = (\r\n products: ProductSearchResult[],\r\n dimensionContext: ICoreContext\r\n): CGetDimensionAvailabilitiesForProductSearchResultInput => {\r\n return new CGetDimensionAvailabilitiesForProductSearchResultInput(products, dimensionContext);\r\n};\r\n\r\n/**\r\n * TODO: Use this function to call your action and process the results as needed\r\n */\r\nexport interface ICProductsDimensionsAvailabilities {\r\n value: string;\r\n isDisabled?: boolean;\r\n masterProductId?: number;\r\n NB?: boolean;\r\n typeCode?: number;\r\n}\r\nexport async function cgetDimensionAvailabilitiesForProductSearchResultAction(\r\n input: CGetDimensionAvailabilitiesForProductSearchResultInput,\r\n context: IActionContext\r\n): Promise {\r\n const products = input.products;\r\n const productsDimensionInputs: ProductsDimensionAvailabilitiesInput[] = [];\r\n const inventoryLevel = input.dimensionContext.app.config.inventoryLevel;\r\n\r\n for (const product of products) {\r\n const filteredProductAttributes = product.AttributeValues?.filter(attributeValue => {\r\n return (\r\n checkIfShouldDisplayAsSwatch((attributeValue.Name?.toLocaleLowerCase() ?? '') as DimensionTypes, input.dimensionContext) &&\r\n context.requestContext.app.config.dimensionsInProductCard.includes(attributeValue.Name?.toLocaleLowerCase())\r\n );\r\n });\r\n\r\n if (ArrayExtensions.hasElements(filteredProductAttributes)) {\r\n for (const attributeValue of filteredProductAttributes) {\r\n if (attributeValue.Name) {\r\n const productionDimensionType: ProductDimensionType =\r\n ProductDimensionType[attributeValue.Name as keyof typeof ProductDimensionType];\r\n\r\n productsDimensionInputs.push(\r\n new ProductsDimensionAvailabilitiesInput(product.MasterProductId ?? product.RecordId, productionDimensionType)\r\n );\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (!ArrayExtensions.hasElements(productsDimensionInputs)) {\r\n return Promise.resolve([]);\r\n }\r\n\r\n try {\r\n const disableStockCheckInAppForBackorderableProducts =\r\n context.requestContext.app.config.disableStockCheckInAppForBackorderableProducts;\r\n const enableStockCheck = context.requestContext.app.config.enableStockCheck;\r\n // context.requestContext.apiSettings.oun = '5001';\r\n const dimensionForProducts: ProductDimensionValueInventoryAvailability[][] = await getDimensionAvailabilitiesForProductsAction(\r\n productsDimensionInputs,\r\n context\r\n );\r\n const productsDimensionAvailabilities = productsDimensionInputs.map((dimensionInput, index) => {\r\n let OOSandNBDimensionIDs: string[] = [];\r\n const dimensionValuesOfProduct = dimensionForProducts[index].map(dimensionValuesWithInventory => {\r\n const inventoryLevelCode = getInventoryLevelCodeFromDimensionValue(dimensionValuesWithInventory, inventoryLevel);\r\n const dimensionValue = dimensionValuesWithInventory.DimensionValue!;\r\n const NBFlag =\r\n dimensionValue.ExtensionProperties &&\r\n dimensionValue.ExtensionProperties[1] &&\r\n dimensionValue.ExtensionProperties[1].Key === 'IsDimensionAvailableFlag'\r\n ? !dimensionValue.ExtensionProperties[1].Value?.BooleanValue\r\n : true;\r\n let isDisable = inventoryLevelCode === InventoryLevelValues.outOfStock;\r\n if (NBFlag && isDisable) {\r\n OOSandNBDimensionIDs = OOSandNBDimensionIDs\r\n ? [...OOSandNBDimensionIDs, dimensionValue.RecordId.toString()]\r\n : [dimensionValue.RecordId.toString()];\r\n } else if (enableStockCheck && disableStockCheckInAppForBackorderableProducts && !NBFlag && isDisable) {\r\n isDisable = false;\r\n }\r\n return {\r\n id: dimensionValue.RecordId.toString(),\r\n value: dimensionValue.Value ?? '',\r\n isDisabled: isDisable,\r\n NB: NBFlag,\r\n typeCode: dimensionValuesWithInventory.DimensionTypeValue,\r\n masterProductId: dimensionInput.masterProductId\r\n };\r\n });\r\n const newDimensionValuesOfProduct = dimensionValuesOfProduct.filter(cDimensions => {\r\n return !OOSandNBDimensionIDs.includes(cDimensions.id);\r\n });\r\n return newDimensionValuesOfProduct;\r\n });\r\n\r\n if (!ArrayExtensions.hasElements(productsDimensionAvailabilities)) {\r\n context.telemetry.warning('ProductsDimensionAvailabilities is empty');\r\n return Promise.resolve([]);\r\n }\r\n console.log('Products Dimension Availabilities', productsDimensionAvailabilities);\r\n return Promise.resolve(productsDimensionAvailabilities);\r\n } catch (error) {\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument -- existing error.\r\n if (typeof error === 'string') {\r\n context.telemetry.warning(error);\r\n }\r\n }\r\n\r\n return Promise.resolve([]);\r\n}\r\n\r\n/**\r\n * The GetDimensionAvailabilitiesForProductSearchResult data action.\r\n */\r\nexport const cgetDimensionAvailabilitiesForProductSearchResultDataAction = createObservableDataAction({\r\n id: 'CGetDimensionAvailabilitiesForProductSearchResult',\r\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- existing pattern.\r\n action: >cgetDimensionAvailabilitiesForProductSearchResultAction,\r\n input: createDimensionAvailabilitiesForProductSearchResultInput\r\n});\r\n\r\nexport default cgetDimensionAvailabilitiesForProductSearchResultDataAction;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport MsDyn365, {\r\n CacheType,\r\n createObservableDataAction,\r\n IAction,\r\n IActionContext,\r\n IActionInput,\r\n ICreateActionContext\r\n} from '@msdyn365-commerce/core';\r\nimport { AsyncResult, ChannelInventoryConfiguration, ProductSearchCriteria, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport { searchByCriteriaAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\nimport { getInventoryConfigurationAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/StoreOperationsDataActions.g';\r\nimport { ArrayExtensions, generateProductImageUrl, InventoryLevels, ObjectExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\n\r\nimport { ListPageStateInput } from '../list-page-state';\r\nimport {\r\n BaseCollectionInput,\r\n createBaseCollectionInput\r\n} from './base-collection-action';\r\n\r\n/**\r\n * GetFullProductsByCollection Action Input.\r\n */\r\nexport class GetFullProductsByCollectionInput extends BaseCollectionInput implements IActionInput {\r\n /**\r\n * The cache object type.\r\n * @returns The cache object type.\r\n */\r\n public getCacheObjectType = (): string => 'FullProductSearchResult';\r\n\r\n /**\r\n * The data cache type.\r\n * @returns The data cache type.\r\n */\r\n public dataCacheType = (): CacheType => {\r\n if (\r\n this.pageType !== 'Category' ||\r\n (this.refiners && this.refiners.length > 0) ||\r\n (this.queryResultSettings && this.queryResultSettings.Sorting && this.queryResultSettings.Sorting.Columns && this.queryResultSettings.Sorting.Columns.length > 0)\r\n ) {\r\n return 'request';\r\n }\r\n return 'application';\r\n\r\n };\r\n}\r\n\r\n/**\r\n * This setting defines inventory filtering options.\r\n */\r\nexport enum ProductListInventoryFilteringOptions {\r\n\r\n /**\r\n * Filter out all products out of stock.\r\n */\r\n HideOOS = 'hideOOS',\r\n\r\n /**\r\n * Sort products by availability, OOS goes last.\r\n */\r\n SortOOS = 'sortOOS',\r\n\r\n /**\r\n * No filtering selected.\r\n */\r\n Default = 'default'\r\n}\r\n\r\n/**\r\n * The full product search result with count interface.\r\n */\r\nexport interface IFullProductsSearchResultsWithCount {\r\n products: ProductSearchResult[];\r\n count: number;\r\n channelInventoryConfigurationId?: number;\r\n}\r\n\r\n/**\r\n * CreateInput function which creates and actionInput used to fetch products for a list page.\r\n * @param args - The API arguments.\r\n * @returns IActionInput - The action input.\r\n */\r\nconst createInput = (args: ICreateActionContext<{ itemsPerPage: number ;includedAttributes: boolean | undefined }>): IActionInput => {\r\n const input = createBaseCollectionInput(args, GetFullProductsByCollectionInput);\r\n\r\n // Set Top\r\n if (input.queryResultSettings.Paging && args.config) {\r\n input.queryResultSettings.Paging.Top = args.config.itemsPerPage || 1;\r\n }\r\n\r\n // Set Skip\r\n if (input.queryResultSettings.Paging && args.requestContext.query && args.requestContext.query.skip) {\r\n input.queryResultSettings.Paging.Skip = +args.requestContext.query.skip;\r\n }\r\n\r\n input.queryResultSettings.count = true;\r\n\r\n return input;\r\n};\r\n\r\n/**\r\n * Finds whether a product is out of stock based on the attribute.\r\n * @param product - The product.\r\n * @param channelInventoryConfiguration - The channel configuration.\r\n * @returns True if is OOS, false otherwise.\r\n */\r\nfunction isOutOfStock(product: ProductSearchResult, channelInventoryConfiguration: ChannelInventoryConfiguration): boolean {\r\n if (!ArrayExtensions.hasElements(product.AttributeValues)) {\r\n // If no attributes then assume is in stock\r\n return false;\r\n }\r\n for (const attribute of product.AttributeValues) {\r\n if (attribute.RecordId === channelInventoryConfiguration.InventoryProductAttributeRecordId &&\r\n attribute.TextValue === channelInventoryConfiguration.InventoryOutOfStockAttributeValueText) {\r\n // The matching recordId indicates that is the inventory attribute\r\n // if the text value are the same then is out of stock.\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n}\r\n\r\n/**\r\n * Returns only in stock products.\r\n * @param products - The product.\r\n * @param channelInventoryConfiguration - The channel configuration.\r\n * @returns Filtered product search result.\r\n */\r\nfunction filterOutOfStockProducts(\r\n products: ProductSearchResult[],\r\n channelInventoryConfiguration: ChannelInventoryConfiguration): ProductSearchResult[] {\r\n if (!ArrayExtensions.hasElements(products)) {\r\n return [];\r\n }\r\n const filteredProducts: ProductSearchResult[] = [];\r\n\r\n for (const product of products) {\r\n if (!isOutOfStock(product, channelInventoryConfiguration)) {\r\n filteredProducts.push(product);\r\n }\r\n }\r\n return filteredProducts;\r\n}\r\n\r\n/**\r\n * Returns sorted products based on availability.\r\n * @param products - The product.\r\n * @param channelInventoryConfiguration - The channel configuration.\r\n * @returns Sorted product search result.\r\n */\r\nfunction sortsProductsBasedOnAvailability(\r\n products: ProductSearchResult[],\r\n channelInventoryConfiguration: ChannelInventoryConfiguration): ProductSearchResult[] {\r\n\r\n if (!ArrayExtensions.hasElements(products)) {\r\n return [];\r\n }\r\n const inStockProducts: ProductSearchResult[] = [];\r\n const outOfStockProducts: ProductSearchResult[] = [];\r\n\r\n for (const product of products) {\r\n if (isOutOfStock(product, channelInventoryConfiguration)) {\r\n outOfStockProducts.push(product);\r\n } else {\r\n inStockProducts.push(product);\r\n }\r\n }\r\n return inStockProducts.concat(outOfStockProducts);\r\n}\r\n\r\n/**\r\n * Returns list of products based on inventory information.\r\n * @param products - The products.\r\n * @param channelInventoryConfiguration - The channel configuration.\r\n * @param context - The context.\r\n * @returns List of product based on the inventory information.\r\n */\r\nexport function returnProductsBasedOnInventoryInformation(\r\n products: ProductSearchResult[],\r\n channelInventoryConfiguration: ChannelInventoryConfiguration,\r\n context: IActionContext): ProductSearchResult[] {\r\n if (!ArrayExtensions.hasElements(products) || ObjectExtensions.isNullOrUndefined(channelInventoryConfiguration)) {\r\n return [];\r\n }\r\n switch (context.requestContext.app.config.productListInventoryDisplay) {\r\n case ProductListInventoryFilteringOptions.HideOOS:\r\n return filterOutOfStockProducts(products, channelInventoryConfiguration);\r\n case ProductListInventoryFilteringOptions.SortOOS:\r\n return sortsProductsBasedOnAvailability(products, channelInventoryConfiguration);\r\n default:\r\n return products;\r\n }\r\n}\r\n\r\n/**\r\n * Returns list of products based on inventory information.\r\n * @param productSearchResults - The products.\r\n * @param context - The context.\r\n * @param metadataCount - The metadata count.\r\n * @returns List of product based on the inventory information.\r\n */\r\nexport async function returnProducts(\r\n productSearchResults: ProductSearchResult[],\r\n context: IActionContext,\r\n metadataCount: number | undefined): Promise {\r\n\r\n const defaultProductCount: number = 0;\r\n\r\n const productSearchResultsWithImages = productSearchResults.map(productSearchResult => {\r\n const newImageUrl = generateProductImageUrl(\r\n productSearchResult,\r\n context.requestContext.apiSettings\r\n );\r\n\r\n if (newImageUrl) {\r\n productSearchResult.PrimaryImageUrl = newImageUrl;\r\n }\r\n\r\n return (productSearchResult);\r\n });\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- read config file.\r\n if (context.requestContext.app.config.inventoryLevel === InventoryLevels.threshold) {\r\n return {\r\n products: productSearchResultsWithImages,\r\n count: metadataCount ?? defaultProductCount\r\n };\r\n }\r\n const channelInventoryConfiguration = await getInventoryConfigurationAsync({ callerContext: context });\r\n\r\n const mappedProducts = productSearchResultsWithImages.map(productSearchResult => {\r\n if (ArrayExtensions.hasElements(productSearchResult.AttributeValues)) {\r\n for (const element of productSearchResult.AttributeValues) {\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- need check.\r\n if (channelInventoryConfiguration &&\r\n element.RecordId !== undefined &&\r\n element.RecordId === channelInventoryConfiguration.InventoryProductAttributeRecordId &&\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- read config file.\r\n context.requestContext.app.config.inventoryRanges !== 'all' &&\r\n element.TextValue !== channelInventoryConfiguration.InventoryOutOfStockAttributeValueText) {\r\n // If same RecordId then it means that is the Inventory attribute\r\n // Based on the inventory range (and filtering options), the inventory label will be displayed\r\n // If Inventory range is 'All' then in stock and out of stock labels are shown, else only OOS\r\n // if the text value is different that the channelInventoryConfiguration.InventoryOutOfStockAttributeValueText then is in stock\r\n element.TextValue = '';\r\n }\r\n }\r\n }\r\n\r\n return (productSearchResult);\r\n });\r\n const productsBasedOnInventory = returnProductsBasedOnInventoryInformation(mappedProducts, channelInventoryConfiguration, context);\r\n return {\r\n products: productsBasedOnInventory,\r\n count: metadataCount ?? defaultProductCount,\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- check config.\r\n channelInventoryConfigurationId: channelInventoryConfiguration ? channelInventoryConfiguration.InventoryProductAttributeRecordId : undefined\r\n };\r\n}\r\n\r\n/**\r\n * Action function to fetch products for a list page.\r\n * @param input - The input.\r\n * @param context - The context.\r\n * @returns IFullProductsSearchResultsWithCount - The full product search result with count.\r\n */\r\nasync function action(\r\n input: GetFullProductsByCollectionInput,\r\n context: IActionContext\r\n): Promise {\r\n\r\n let promise: AsyncResult;\r\n let searchProductId;\r\n const searchCriteriaInput: ProductSearchCriteria = {};\r\n searchCriteriaInput.Context = { ChannelId: context.requestContext.apiSettings.channelId, CatalogId: context.requestContext.apiSettings.catalogId };\r\n searchCriteriaInput.Refinement = input.refiners;\r\n searchCriteriaInput.IncludeAttributes = input.includeAttributes;\r\n searchCriteriaInput.SkipVariantExpansion = true;\r\n const defaultNumber: number = 0;\r\n\r\n if (input.pageType === 'Category' || (context.requestContext.query && context.requestContext.query.categoryId)) {\r\n if (input.category) {\r\n searchCriteriaInput.CategoryIds = [input.category || defaultNumber];\r\n promise = searchByCriteriaAsync(\r\n {\r\n callerContext: context,\r\n queryResultSettings: input.queryResultSettings\r\n },\r\n searchCriteriaInput\r\n );\r\n } else {\r\n throw new Error(\r\n '[GetFullProductsForCollection]Category Page Detected, but no global categoryId found'\r\n );\r\n }\r\n } else if (input.searchText && (context.requestContext.query && context.requestContext.query.q)) {\r\n searchCriteriaInput.SearchCondition = input.searchText;\r\n promise = searchByCriteriaAsync(\r\n {\r\n callerContext: context,\r\n queryResultSettings: input.queryResultSettings\r\n },\r\n searchCriteriaInput\r\n );\r\n } else if (input.searchText && (context.requestContext.query && context.requestContext.query.productId && context.requestContext.query.recommendation)) {\r\n const searchObject = JSON.parse(input.searchText);\r\n searchProductId = Number(searchObject.ProductId);\r\n if (Number.isNaN(searchProductId)) {\r\n throw new Error('Failed to cast search product id into a number.');\r\n } else if (!searchObject.Recommendation) {\r\n throw new Error('Failed to retrieve the Recommendation.');\r\n } else {\r\n searchCriteriaInput.RecommendationListId = searchObject.Recommendation;\r\n searchCriteriaInput.Ids = [searchProductId || defaultNumber];\r\n promise = searchByCriteriaAsync(\r\n {\r\n callerContext: context,\r\n queryResultSettings: input.queryResultSettings\r\n },\r\n searchCriteriaInput\r\n );\r\n }\r\n } else {\r\n throw new Error(\r\n '[GetFullProductsForCollection]Search Page Detected, but no q= or productId= query parameter found'\r\n );\r\n }\r\n\r\n const productSearchResults = await promise;\r\n\r\n // Update ListPageState For SSR\r\n if (!MsDyn365.isBrowser) {\r\n context.update(new ListPageStateInput(), { totalProductCount: promise.metadata.count ?? defaultNumber, activeFilters: input.refiners });\r\n }\r\n\r\n return returnProducts(productSearchResults, context, promise.metadata.count);\r\n}\r\n\r\nexport const actionDataAction = createObservableDataAction({\r\n id: '@msdyn365-commerce-modules/search-result-container/get-full-products-by-collection',\r\n action: >action,\r\n input: createInput\r\n});\r\n\r\nexport default actionDataAction;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { CacheType, createObservableDataAction, IAction, IActionContext, IActionInput, IAny, ICommerceApiSettings, ICreateActionContext, IGeneric } from '@msdyn365-commerce/core';\r\nimport { SortColumn } from '@msdyn365-commerce/retail-proxy';\r\nimport { getSearchConfigurationAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/StoreOperationsDataActions.g';\r\nimport { buildCacheKey } from '@msdyn365-commerce-modules/retail-actions';\r\n\r\n// TODO: import from commerce entities when available\r\ninterface SearchConfiguration {\r\n ProductSortColumns?: SortColumn[];\r\n}\r\n\r\nexport interface MappedSearchConfiguration {\r\n key: string;\r\n sortColumn: SortColumn;\r\n}\r\n\r\nexport const sortOptions = {\r\n sortByOptionRelevanceDesc: 'Ranking-Desc',\r\n sortByOptionRatingAsc: 'AverageRating-Asc',\r\n sortByOptionRatingDesc: 'AverageRating-Desc',\r\n sortByOptionNameAsc: 'Name-Asc',\r\n sortByOptionNameDesc: 'Name-Desc',\r\n sortByOptionPriceAsc: 'Price-Asc',\r\n sortByOptionPriceDesc: 'Price-Desc',\r\n sortByOptionBestSelling: 'BestSelling',\r\n sortByOptionNewScore: 'NewScore',\r\n sortByOptionTrendingScore: 'TrendingScore'\r\n};\r\n\r\n/**\r\n * ActionInput class for the get-mapped-search-configuration Data Action.\r\n */\r\nexport class MappedSearchInput implements IActionInput {\r\n private readonly apiSettings: ICommerceApiSettings;\r\n\r\n constructor(apiSettings: ICommerceApiSettings) {\r\n this.apiSettings = apiSettings;\r\n }\r\n\r\n public getCacheKey = () => buildCacheKey('MappedSearchInput', this.apiSettings);\r\n\r\n public getCacheObjectType = () => 'MappedSearchInput';\r\n\r\n public dataCacheType = (): CacheType => 'request';\r\n}\r\n\r\n/**\r\n * Get a mapped search configuration that is easy to use for sorting.\r\n * @param input\r\n * @param ctx\r\n */\r\nexport async function getMappedSearchConfiguration(input: MappedSearchInput, ctx: IActionContext): Promise {\r\n return getSearchConfigurationAsync({ callerContext: ctx }).then((searchConfiguration: SearchConfiguration) => {\r\n return ((searchConfiguration.ProductSortColumns || []).map((sortColumn: SortColumn) => {\r\n let key = '';\r\n if (sortColumn.ColumnName) {\r\n switch (sortColumn.ColumnName.toUpperCase()) {\r\n case 'NAME':\r\n key = sortColumn.IsDescending ? sortOptions.sortByOptionNameDesc : sortOptions.sortByOptionNameAsc;\r\n break;\r\n case 'PRICE':\r\n key = sortColumn.IsDescending ? sortOptions.sortByOptionPriceDesc : sortOptions.sortByOptionPriceAsc;\r\n break;\r\n case 'AVERAGERATING':\r\n key = sortColumn.IsDescending ? sortOptions.sortByOptionRatingDesc : sortOptions.sortByOptionRatingAsc;\r\n break;\r\n case 'RANKING':\r\n key = sortOptions.sortByOptionRelevanceDesc;\r\n break;\r\n case 'BESTSELLINGSCORE':\r\n key = sortOptions.sortByOptionBestSelling;\r\n break;\r\n case 'NEWSCORE':\r\n key = sortOptions.sortByOptionNewScore;\r\n break;\r\n case 'TRENDINGSCORE':\r\n key = sortOptions.sortByOptionTrendingScore;\r\n break;\r\n default:\r\n }\r\n } else {\r\n ctx.telemetry.warning('[get-mapped-search-configuration] unknown search option');\r\n }\r\n if (key) {\r\n return {\r\n key,\r\n sortColumn\r\n };\r\n }\r\n return undefined;\r\n\r\n }).filter(Boolean));\r\n });\r\n}\r\n\r\nexport const createInput = (inputData: ICreateActionContext>): IActionInput => {\r\n return new MappedSearchInput(inputData.requestContext.apiSettings);\r\n};\r\n\r\nexport const getMappedSearchConfigurationDataAction = createObservableDataAction({\r\n id: '@msdyn365-commerce-modules/search-result-container/get-mapped-search-configuration',\r\n action: >getMappedSearchConfiguration,\r\n input: createInput\r\n});\r\n\r\nexport default getMappedSearchConfigurationDataAction;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { createObservableDataAction, IAction, IActionContext, IActionInput, ICreateActionContext } from '@msdyn365-commerce/core';\r\n\r\nimport { BaseCollectionInput, createBaseCollectionInput } from './base-collection-action';\r\nimport { getProductRefinerHierarchy } from './get-product-refiner-hierarchy';\r\n\r\n/**\r\n * Default Category/Product Id Values.\r\n */\r\nenum DefaultValues {\r\n defaultCategoryIdValue = 0,\r\n defaultProductIdValue = 0\r\n}\r\n\r\n/**\r\n * Refiners-by-Collection Input action.\r\n */\r\nexport class RefinersByCollectionInput extends BaseCollectionInput implements IActionInput {\r\n public getCacheObjectType = () => 'ProductRefiner';\r\n\r\n public dataCacheType = () => {\r\n if (\r\n this.pageType !== 'Category' ||\r\n (this.refiners && this.refiners.length > 0) ||\r\n (this.queryResultSettings && this.queryResultSettings.Sorting && this.queryResultSettings.Sorting.Columns && this.queryResultSettings.Sorting.Columns.length > 0)\r\n ) {\r\n return 'request';\r\n }\r\n return 'application';\r\n\r\n };\r\n}\r\n\r\n/**\r\n * Create input method which creates an ActionInput for fetching list page refiners.\r\n * @param args\r\n */\r\nconst createInput = (args: ICreateActionContext): IActionInput => {\r\n return createBaseCollectionInput(args, RefinersByCollectionInput);\r\n};\r\n\r\n/**\r\n * Action method which fetches refiners for the given list page.\r\n * @param input\r\n * @param ctx\r\n */\r\nasync function action(input: RefinersByCollectionInput, ctx: IActionContext): Promise {\r\n let searchProductId;\r\n if (input.pageType === 'Category') {\r\n if (input.category) {\r\n return getProductRefinerHierarchy(\r\n {\r\n CategoryIds: [input.category || DefaultValues.defaultCategoryIdValue],\r\n Context: {\r\n ChannelId: input.apiSettings.channelId,\r\n CatalogId: input.apiSettings.catalogId\r\n },\r\n Refinement: input.isUpdateRefinerPanel ? input.refiners : []\r\n },\r\n input.queryResultSettings,\r\n ctx);\r\n }\r\n throw new Error('[GetRefinersForCollection]Category Page Detected, but no global categoryId found');\r\n\r\n } else {\r\n if (input.searchText && (ctx.requestContext.query && ctx.requestContext.query.q)) {\r\n return getProductRefinerHierarchy(\r\n {\r\n SearchCondition: input.searchText,\r\n Context: {\r\n ChannelId: input.apiSettings.channelId,\r\n CatalogId: input.apiSettings.catalogId\r\n },\r\n Refinement: input.isUpdateRefinerPanel ? input.refiners : []\r\n },\r\n input.queryResultSettings,\r\n ctx);\r\n }\r\n if (input.searchText && (ctx.requestContext.query && ctx.requestContext.query.productId)) {\r\n const searchObject = JSON.parse(input.searchText);\r\n searchProductId = Number(searchObject.ProductId);\r\n if (Number.isNaN(searchProductId)) {\r\n throw new Error('Failed to cast search product id into a number.');\r\n } else if (!searchObject.Recommendation) {\r\n throw new Error('Failed to retrieve the Recommendation.');\r\n } else {\r\n return getProductRefinerHierarchy(\r\n {\r\n Context: {\r\n ChannelId: input.apiSettings.channelId,\r\n CatalogId: input.apiSettings.catalogId\r\n },\r\n Refinement: input.isUpdateRefinerPanel ? input.refiners : [],\r\n RecommendationListId: searchObject.Recommendation,\r\n Ids: [searchProductId || DefaultValues.defaultProductIdValue]\r\n },\r\n input.queryResultSettings,\r\n ctx);\r\n }\r\n } else {\r\n throw new Error(\r\n '[GetFullProductsForCollection]Search Page Detected, but no q= or productId= query parameter found'\r\n );\r\n }\r\n\r\n }\r\n}\r\n\r\nexport const actionDataAction = createObservableDataAction({\r\n id: '@msdyn365-commerce-modules/search-result-container/get-refiners-for-collection',\r\n action: >action,\r\n input: createInput\r\n});\r\n\r\nexport default actionDataAction;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { IActionContext } from '@msdyn365-commerce/core';\r\nimport { IQueryResultSettings, ProductRefiner, ProductSearchCriteria } from '@msdyn365-commerce/retail-proxy';\r\nimport { getProductSearchRefinersAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\n\r\n/**\r\n * Uses Bulk refiner API to get refiners and child refiner values.\r\n * @param searchCriteria Product search criteria.\r\n * @param maxItems Max items.\r\n * @param queryResultSettings\r\n * @param ctx Action context.\r\n */\r\nexport async function getProductRefinerHierarchy(searchCriteria: ProductSearchCriteria, queryResultSettings: IQueryResultSettings, ctx: IActionContext): Promise {\r\n return getProductSearchRefinersAsync({ callerContext: ctx, queryResultSettings }, searchCriteria).then((productRefiners: ProductRefiner[]) => {\r\n if (!productRefiners) {\r\n ctx.trace('[getRefinersByCriteriaAction] returned no refiners');\r\n return [];\r\n }\r\n\r\n const result = (productRefiners || []).map((productRefiner: ProductRefiner) => productRefiner);\r\n\r\n if (result.length === 0) {\r\n ctx.trace('[getRefinersByCriteriaAction] returned no IProductRefinerHierarchy objects');\r\n return [];\r\n }\r\n\r\n return result;\r\n });\r\n}\r\n","/* eslint-disable security/detect-object-injection */\r\n/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport MsDyn365, { IRequestContext } from '@msdyn365-commerce/core';\r\nimport { ProductRefinerValue, SortColumn } from '@msdyn365-commerce/retail-proxy';\r\n\r\n/**\r\n * Refiner Compression:\r\n * Refiners contains a non-trivial amount of data that is required to successfully make\r\n * a refiner-based API call. To allow for deep-linking of refiners in the URL, refiner data\r\n * must be compressed so that URL max length is not exceeded. Refiners will be compressed into\r\n * the following array style index-based format:\r\n * [DataTypeValue, LeftValueBoundString, RefinerRecordId, RefinerSourceValue, RightValueBoundString, UnitText].\r\n */\r\nconst compressedRefinerKeys = ['DataTypeValue', 'LeftValueBoundString', 'RefinerRecordId', 'RefinerSourceValue', 'RightValueBoundString', 'UnitText'];\r\n\r\n/**\r\n * Hydrates compressed refiner data from URL.\r\n * @param fullUrl The full URL of the page.\r\n * @param requestContext\r\n */\r\nexport const hydrateRefinersFromUrl = (requestContext: IRequestContext): ProductRefinerValue[] => {\r\n const compressedRefinerArray = parseQueryParam<(string | number)[][]>('refiners', requestContext);\r\n if (!compressedRefinerArray || compressedRefinerArray.length === 0) {\r\n return [];\r\n }\r\n\r\n return compressedRefinerArray.map((compressedRefiner) => {\r\n try {\r\n const parsedRefiner: ProductRefinerValue = {};\r\n compressedRefinerKeys.forEach((refinerKey, index) => {\r\n parsedRefiner[refinerKey] = compressedRefiner[index];\r\n });\r\n return parsedRefiner;\r\n } catch {\r\n return undefined;\r\n }\r\n }).filter(Boolean);\r\n};\r\n\r\n/**\r\n * Compressed a list of refiners for use in URLs.\r\n * @param refiners The uncompressed refiners.\r\n */\r\nexport const compressRefiners = (refiners: ProductRefinerValue[]) => {\r\n const compressedRefiners: (string | number)[][] = [];\r\n\r\n refiners.forEach((refiner) => {\r\n const compressedRefiner: (string | number)[] = [];\r\n compressedRefinerKeys.forEach((refinerKey) => {\r\n compressedRefiner.push(refiner[refinerKey]);\r\n });\r\n compressedRefiners.push(compressedRefiner);\r\n });\r\n\r\n return compressedRefiners;\r\n};\r\n\r\n/**\r\n * Method which creates a URL contiaining serialized active refiners.\r\n * @param fullUrl The Current URL of the page.\r\n * @param refiners The refiners which should be added to the URL.\r\n * @param sortingColumns\r\n * @param skipCount\r\n */\r\nexport const buildListPageUrl = (fullUrl: URL, refiners?: ProductRefinerValue[], sortingColumns?: SortColumn[], skipCount?: number) => {\r\n // Refiner Change flow\r\n if (refiners !== undefined) {\r\n if (refiners.length === 0) {\r\n fullUrl.searchParams.delete('refiners');\r\n } else {\r\n const sortedRefiners = refiners.sort((first, second) => (first.RefinerRecordId && second.RefinerRecordId &&\r\n (first.RefinerRecordId > second.RefinerRecordId) ? 1 : -1));\r\n fullUrl.searchParams.set('refiners', JSON.stringify(compressRefiners(sortedRefiners)));\r\n }\r\n\r\n // Adding or removing a refiner means we want to always load page 1\r\n fullUrl.searchParams.delete('skip');\r\n return fullUrl.href;\r\n }\r\n\r\n if (sortingColumns !== undefined) {\r\n if (sortingColumns.length === 0) {\r\n fullUrl.searchParams.delete('sorting');\r\n } else {\r\n fullUrl.searchParams.set('sorting', JSON.stringify(sortingColumns));\r\n }\r\n\r\n // Changing the sort means always load page 1\r\n fullUrl.searchParams.delete('skip');\r\n return fullUrl.href;\r\n }\r\n\r\n if (skipCount) {\r\n fullUrl.searchParams.set('skip', skipCount.toString());\r\n }\r\n\r\n return fullUrl.href;\r\n};\r\n\r\n/**\r\n * Parses a query param from the query object of the request context.\r\n * @param key The query parameter key.\r\n * @param requestContext The request context.\r\n */\r\nexport const parseQueryParam = (key: string, requestContext: IRequestContext): T | null => {\r\n if (requestContext.query && requestContext.query[key]) {\r\n return JSON.parse(decodeURIComponent(requestContext.query[key]));\r\n }\r\n return null;\r\n};\r\n\r\n/**\r\n * Gets the current URL of the page from the request context.\r\n * @param requestContext The request context.\r\n */\r\nexport const getCurrentUrl = (requestContext: IRequestContext): URL => {\r\n if (MsDyn365.isBrowser) {\r\n return new URL(window.location.href);\r\n }\r\n\r\n // NOTE: Typing on requestURL is incorrect\r\n if (requestContext.url.requestUrl.href) {\r\n return new URL(requestContext.url.requestUrl.href);\r\n }\r\n return new URL((requestContext.url.requestUrl));\r\n\r\n};\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { ITelemetry } from '@msdyn365-commerce/core';\r\nimport { AttributeDataType, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\r\n\r\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\r\n\r\n/**\r\n * Types of product refiner values.\r\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\nexport enum ProductRefinerValueDataTypeValue {\r\n\r\n /**\r\n * Range slider is used for selections like price.\r\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Range = 1,\r\n\r\n /**\r\n * Range input is a different way to specify ranges and can be expressed with input boxes\r\n * as well as a set of discrete single-select type values.\r\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n RangeInput = 4,\r\n\r\n /**\r\n * This is a discrete list item, either multi-select or single-select.\r\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n List = 5,\r\n\r\n /**\r\n * Boolean types allows only single-select.\r\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Boolean = 6\r\n}\r\n\r\n/**\r\n * Types of product refiners.\r\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\nexport enum ProductRefinerTypeValue {\r\n\r\n /**\r\n * Refiner values are single-select.\r\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Single = 0,\r\n\r\n /**\r\n * Refiner values are multi-select.\r\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Multi = 1\r\n}\r\n\r\n/**\r\n * ProductRefinerSource enum type.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\nexport enum ProductRefinerSource {\r\n\r\n /**\r\n * The None member.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n None = 0,\r\n\r\n /**\r\n * The Attribute member.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Attribute = 1,\r\n\r\n /**\r\n * The Category member.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Category = 2,\r\n\r\n /**\r\n * The Price member.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Price = 3,\r\n\r\n /**\r\n * The Rating member.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Rating = 4\r\n}\r\n\r\n/**\r\n * Checks if the data type value corresponds to a slider.\r\n * @param dataTypeValue\r\n */\r\nexport function isRangeType(dataTypeValue: number | undefined): boolean {\r\n return dataTypeValue === AttributeDataType.Currency ||\r\n dataTypeValue === AttributeDataType.Decimal ||\r\n dataTypeValue === AttributeDataType.Integer;\r\n}\r\n\r\n/**\r\n * Find the refinement criterion associated with this product refiner value.\r\n * @param productRefinerValue Product refiner value to match.\r\n * @param refinementCriteria Selected refinement criteria.\r\n */\r\nexport function findMatchingRefinementCriterion(\r\n productRefinerValue: ProductRefinerValue,\r\n refinementCriteria: ProductRefinerValue[]\r\n): ProductRefinerValue | undefined {\r\n // If the value is a range, then match only on data type value; otherwise match on item string\r\n return refinementCriteria.find(\r\n (refinementCriterion: ProductRefinerValue) => isMatchingRefinementCriterion(productRefinerValue, refinementCriterion)\r\n );\r\n}\r\n\r\n/**\r\n * Find the refinement criterion associated with this product refiner value.\r\n * @param productRefinerValue Product refiner value to match.\r\n * @param refinementCriteria Selected refinement criteria.\r\n * @param refinementCriterion\r\n */\r\nexport function isMatchingRefinementCriterion(\r\n productRefinerValue: ProductRefinerValue,\r\n refinementCriterion: ProductRefinerValue\r\n): boolean {\r\n // If the value is a range, then match only on data type value; otherwise match on item string\r\n return refinementCriterion.RefinerRecordId === productRefinerValue.RefinerRecordId &&\r\n refinementCriterion.RefinerSourceValue === productRefinerValue.RefinerSourceValue &&\r\n refinementCriterion.DataTypeValue === productRefinerValue.DataTypeValue &&\r\n (isRangeType(refinementCriterion.DataTypeValue) || refinementCriterion.LeftValueBoundString === productRefinerValue.LeftValueBoundString);\r\n}\r\n\r\nexport function getUpdatedRefinementCriteria(\r\n itemToggleNotification: IRefineItemToggleNotification,\r\n currentRefinementCriteria: ProductRefinerValue[]): ProductRefinerValue[] {\r\n const updatedRefinementCriteria: ProductRefinerValue[] = [];\r\n let toggledItemFound = false;\r\n currentRefinementCriteria.forEach((selectedCriterion: ProductRefinerValue) => {\r\n if (isMatchingRefinementCriterion(itemToggleNotification.productRefinerValue, selectedCriterion)) {\r\n toggledItemFound = true;\r\n if (itemToggleNotification.isSelecting) {\r\n const next = {\r\n ...selectedCriterion,\r\n LeftValueBoundString: itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}` || selectedCriterion.LeftValueBoundString,\r\n RightValueBoundString: itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}` || selectedCriterion.RightValueBoundString\r\n };\r\n updatedRefinementCriteria.push(next);\r\n\r\n } // Else the item is being de-selected, so omit it from the refinement criteria\r\n } else {\r\n // Keep existing criterion because it is not in the item toggle notification\r\n updatedRefinementCriteria.push(selectedCriterion);\r\n }\r\n });\r\n\r\n if (!toggledItemFound) {\r\n const next = {\r\n ...itemToggleNotification.productRefinerValue,\r\n LeftValueBoundString: itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}` || itemToggleNotification.productRefinerValue.LeftValueBoundString,\r\n RightValueBoundString: itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}` || itemToggleNotification.productRefinerValue.RightValueBoundString\r\n };\r\n updatedRefinementCriteria.push(next);\r\n\r\n // If single select, then deselect any others in the parent refiner group\r\n if ((itemToggleNotification.productRefinerValue.DataTypeValue === AttributeDataType.Text || itemToggleNotification.productRefinerValue.DataTypeValue === AttributeDataType.TrueFalse) &&\r\n itemToggleNotification.parentProductRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect) {\r\n itemToggleNotification.parentProductRefinerHierarchy.Values.forEach((child: ProductRefinerValue) => {\r\n if (child.RefinerRecordId === next.RefinerRecordId && child.LeftValueBoundString === next.LeftValueBoundString) {\r\n // Do nothing\r\n } else {\r\n const matchingIndex = updatedRefinementCriteria.findIndex((criterion: ProductRefinerValue) => isMatchingRefinementCriterion(child, criterion));\r\n if (matchingIndex > -1) {\r\n updatedRefinementCriteria.splice(matchingIndex, 1);\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n return updatedRefinementCriteria;\r\n}\r\n\r\nexport function formatPrice(\r\n amount: string | undefined,\r\n currency: string | undefined,\r\n locale: string | undefined,\r\n telemetry: ITelemetry): string {\r\n if (!amount || !currency) {\r\n telemetry.trace(`[refine-menu.utilities.formatPrice] could not format price for ${amount} ${currency}`);\r\n return amount || '';\r\n }\r\n const priceAmount = (amount && Number(amount)) || 0;\r\n let result: string;\r\n\r\n try {\r\n result = new Intl.NumberFormat(locale, {\r\n style: 'currency',\r\n currencyDisplay: 'symbol',\r\n currency,\r\n minimumFractionDigits: 0\r\n }).format(priceAmount);\r\n } catch (error) {\r\n result = `${priceAmount} ${currency}`;\r\n telemetry.warning(`[refine-menu.utilities.formatPrice] Failed to format price for ${result}: ${error}`);\r\n }\r\n\r\n return result;\r\n}\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\r\nimport { getPayloadObject, getTelemetryAttributes, IPayLoad } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport { computed } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\n\r\nimport { IChoiceSummaryProps } from './choice-summary.props';\r\nimport { isMatchingRefinementCriterion, isRangeType } from './utilities';\r\n\r\ninterface IRefinerMap {\r\n key: string;\r\n value: ProductRefinerValue;\r\n}\r\n\r\n/**\r\n * ChoiceSummary component.\r\n */\r\n@observer\r\nexport default class ChoiceSummary extends React.PureComponent {\r\n private readonly closeButtonGlyph: string = 'msi-close-btn';\r\n\r\n private readonly payLoad: IPayLoad;\r\n\r\n @computed get selectedRefinersMap(): IRefinerMap[] {\r\n const { selectedChoices } = this.props;\r\n return selectedChoices.map((selectedRefiner: ProductRefinerValue) => {\r\n return {\r\n key: this._getKeyForRefinerValue(selectedRefiner),\r\n value: selectedRefiner\r\n } as IRefinerMap;\r\n });\r\n }\r\n\r\n constructor(props: Readonly) {\r\n super(props);\r\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, '');\r\n }\r\n\r\n public render(): JSX.Element {\r\n const { clearAllText, label, classNames, choiceAriaLabel, closeAriaLabel } = this.props;\r\n const items = this.selectedRefinersMap;\r\n this.payLoad.contentAction.etext = clearAllText;\r\n const clearAllAttributes = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\r\n return (\r\n
\r\n {items.length > 0 && label && \r\n {label}\r\n }\r\n
    \r\n {items.map((item: IRefinerMap, index: number) => {\r\n const listItemProps = {\r\n 'aria-posinset': index,\r\n 'aria-setsize': items.length\r\n };\r\n\r\n this.payLoad.contentAction.etext = item.key;\r\n const attribute = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\r\n\r\n return (\r\n
  • \r\n \r\n {item.key}\r\n \r\n \r\n
  • \r\n );\r\n })}\r\n
\r\n {items.length > 0 && clearAllText && \r\n {clearAllText}\r\n }\r\n
\r\n );\r\n }\r\n\r\n private _getKeyForRefinerValue(productRefinerValue: ProductRefinerValue): string {\r\n const { choiceFormat, choiceRangeValueFormat, refinerHierarchy, telemetry } = this.props;\r\n const overallFormat = choiceFormat || '{1}';\r\n const rangeFormat = choiceRangeValueFormat;\r\n let refinerName = '';\r\n if (refinerHierarchy && refinerHierarchy.find) {\r\n const parent = refinerHierarchy.find(\r\n (hierarchy: IProductRefinerHierarchy) => !!hierarchy.Values.find((value: ProductRefinerValue) => isMatchingRefinementCriterion(value, productRefinerValue))\r\n );\r\n\r\n if (!parent) {\r\n telemetry.warning('[choice-summary] could not find parent of selected refiner value');\r\n } else {\r\n refinerName = parent.KeyName || '';\r\n }\r\n }\r\n\r\n let refinerValueName: string;\r\n if (isRangeType(productRefinerValue.DataTypeValue)) {\r\n refinerValueName = rangeFormat\r\n .replace('{0}', this._formatPrice(productRefinerValue.LeftValueBoundString, productRefinerValue.UnitText))\r\n .replace('{1}', this._formatPrice(productRefinerValue.RightValueBoundString, productRefinerValue.UnitText));\r\n } else {\r\n refinerValueName = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\r\n }\r\n\r\n return overallFormat.replace('{0}', refinerName).replace('{1}', refinerValueName);\r\n }\r\n\r\n private _formatPrice(amount: string | undefined, currency: string | undefined): string {\r\n if (!amount || !currency) {\r\n this.props.telemetry.trace('[choice-summary] could not format price');\r\n return amount || '';\r\n }\r\n let result = amount;\r\n\r\n try {\r\n result = this.props.context!.cultureFormatter.formatCurrency(Number(amount), currency);\r\n } catch (error) {\r\n this.props.telemetry.warning(`Failed to format price for ${result}: ${error}`);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private readonly _onClick = (e: React.MouseEvent): void => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n const target = e.currentTarget as HTMLElement;\r\n const clearAll = target.getAttribute('class')!.includes('choice-summary__clear-all');\r\n const selectedRefiner = clearAll ? undefined : this._getSelectedRefinerChoice(target);\r\n\r\n if (this.props.onChoiceClicked) {\r\n this.props.onChoiceClicked({\r\n clearAll,\r\n itemClicked: target,\r\n choiceClicked: selectedRefiner,\r\n nextItemToFocus: target.nextSibling as HTMLElement\r\n });\r\n }\r\n };\r\n\r\n private _getSelectedRefinerChoice(itemClicked: HTMLElement): ProductRefinerValue | undefined {\r\n const result = this.selectedRefinersMap.find(selected => (itemClicked.textContent && itemClicked.textContent.trim()) === selected.key);\r\n return (result && result.value) || undefined;\r\n }\r\n}\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport * as React from 'react';\r\n\r\ninterface IErrorMessage {\r\n text?: string;\r\n}\r\n\r\nexport const ErrorMessage: React.FC = ({ text }) => {\r\n return (\r\n \r\n
\r\n {' '}\r\n {text}\r\n {' '}\r\n
\r\n
\r\n );\r\n};\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { ICoreContext, IGridSettings, IImageData, IImageSettings, Image, IRequestContext } from '@msdyn365-commerce/core';\r\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport { getFallbackImageUrl, getProductPageUrlSync } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, onTelemetryClick } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { ICSearchResultContainerResources } from '../c-search-result-container.props.autogenerated';\r\n\r\n// Import { IComponent, IComponentProps, ICoreContext, IGridSettings, IImageData, IImageSettings, Image, msdyn365Commerce } from '@msdyn365-commerce/core';\r\n\r\ninterface IFeatureSearchResultItem {\r\n product: SimpleProduct | null;\r\n context: ICoreContext;\r\n resources: ICSearchResultContainerResources;\r\n imageSettings?: IImageSettings;\r\n moduleType: string;\r\n moduleId: string;\r\n telemetryContent?: ITelemetryContent;\r\n recommendation?: string;\r\n}\r\n\r\nexport const FeatureSearchResultItem: React.FC = ({\r\n product,\r\n context,\r\n imageSettings,\r\n resources,\r\n telemetryContent,\r\n recommendation\r\n}) => {\r\n if (product === null) {\r\n return null;\r\n }\r\n\r\n const productName = product.Name;\r\n const productRecordId = product && product.RecordId ? product.RecordId : 0;\r\n const productUrl = getProductPageUrlSync(product.Name || '', productRecordId, context && context.actionContext, undefined);\r\n const fallbackImage = getFallbackImageUrl(product.ItemId, context.actionContext.requestContext.apiSettings);\r\n const heading = recommendation && recommendation === 'descriptions' ? resources.featureSimilarDescriptionTitle : resources.featureSimilarLooksTitle;\r\n\r\n // Construct telemetry attribute to render\r\n const payLoad = getPayloadObject('click', telemetryContent!, productName!, productRecordId.toString());\r\n\r\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\r\n return (\r\n
\r\n \r\n
\r\n {renderProductPlacementImage(\r\n imageSettings, context.request.gridSettings, product.PrimaryImageUrl,\r\n product.Name, fallbackImage, context.actionContext.requestContext)}\r\n
\r\n \r\n
\r\n

\r\n {heading}\r\n

\r\n {renderProductTitle(product?.Name)}\r\n
\r\n
\r\n );\r\n\r\n};\r\n\r\nfunction renderProductPlacementImage(\r\n imageSettings?: IImageSettings, gridSettings?: IGridSettings, imageUrl?: string,\r\n altText?: string, fallbackImage?: string, context?: IRequestContext): JSX.Element | null {\r\n\r\n if (!imageUrl || !gridSettings || !imageSettings) {\r\n return null;\r\n }\r\n const img: IImageData = {\r\n src: imageUrl,\r\n altText: altText ? altText : ''\r\n };\r\n const imageProps = {\r\n gridSettings,\r\n imageSettings,\r\n fallBackSrc: fallbackImage\r\n };\r\n return (\r\n \r\n );\r\n}\r\n\r\nfunction renderProductTitle(title?: string): JSX.Element | null {\r\n return (

\r\n {title}\r\n

);\r\n}\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport * as React from 'react';\r\n\r\ninterface ILink {\r\n className?: string;\r\n text?: string;\r\n href?: string;\r\n ariaLabel?: string;\r\n}\r\n\r\nexport const Link: React.FC = ({ text, className, href, ariaLabel }) => (\r\n {' '}\r\n {text}\r\n {' '}\r\n);\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport {\r\n Button,\r\n Modal,\r\n ModalBody,\r\n ModalFooter,\r\n ModalHeader\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport React from 'react';\r\n\r\nexport interface ISearchResultModalViewProps {\r\n modal: React.ReactElement;\r\n modalHeader: React.ReactElement;\r\n modalFooter: React.ReactElement;\r\n modalBody: React.ReactElement;\r\n}\r\n\r\ninterface IModalToggleProps {\r\n innerRef: React.RefObject | undefined;\r\n id: string;\r\n text: string;\r\n ariaLabel: string;\r\n onClick(): void;\r\n}\r\n\r\nexport interface ISearchResultModalResources {\r\n modalTitle: string;\r\n modalCloseButtonText: string;\r\n}\r\n\r\nexport interface ISearchResultModalProps {\r\n resources: ISearchResultModalResources;\r\n isOpen: boolean;\r\n returnRef: React.RefObject | undefined;\r\n onModalToggle(): void;\r\n}\r\n\r\nexport const ModalToggle: React.FC = (props: IModalToggleProps) => {\r\n const { text, onClick, ariaLabel, innerRef, id } = props;\r\n return (\r\n {text}\r\n );\r\n};\r\n\r\nexport const SearchResultModal = (props: ISearchResultModalProps): ISearchResultModalViewProps => {\r\n return {\r\n modal: modalNode(props),\r\n modalHeader: modalHeaderNode(props),\r\n modalFooter: modalFooterNode(props),\r\n modalBody: \r\n };\r\n};\r\n\r\nconst modalNode = (props: ISearchResultModalProps) => {\r\n return (\r\n \r\n );\r\n};\r\n\r\nconst modalHeaderNode = (props: ISearchResultModalProps) => {\r\n return (\r\n \r\n {props.resources.modalTitle}\r\n \r\n );\r\n};\r\n\r\nconst modalFooterNode = (props: ISearchResultModalProps) => {\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { ICProductsDimensionsAvailabilities } from './../actions/c-get-dimension-availabilities-for-product-search-result.action';\r\nimport { IPriceComponentResources } from '@msdyn365-commerce/components';\r\nimport { ProductComponent } from '../../../themes/peruvian/views/components/product.component';\r\nimport { IAny, ICoreContext, IGeneric, IImageSettings } from '@msdyn365-commerce/core';\r\nimport { ProductRefinerValue, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { ICSearchResultContainerResources } from '../c-search-result-container.props.autogenerated';\r\nimport { ICBuyboxProps, ICBuyboxData } from '../../../modules/c-buybox';\r\n\r\ninterface IProductSearchResultItems {\r\n products: ProductSearchResult[];\r\n context: ICoreContext>;\r\n resources: ICSearchResultContainerResources;\r\n imageSettings?: IImageSettings;\r\n moduleType: string;\r\n moduleId: string;\r\n allowBackNavigation?: boolean;\r\n telemetryContent: ITelemetryContent;\r\n quickviewSlot?: {} | null | undefined;\r\n channelInventoryConfigurationId?: number;\r\n isPriceMinMaxEnabled?: boolean;\r\n productsDimensionAvailabilities?: ICProductsDimensionsAvailabilities[][];\r\n selectedRefinerValues: ProductRefinerValue[];\r\n moduleProps: ICBuyboxProps;\r\n}\r\n\r\n/**\r\n * Returns the product inventory label.\r\n * @param channelInventoryConfigurationId - The channel configuration Id.\r\n * @param product - The product.\r\n * @returns The inventory label.\r\n */\r\nfunction getInventoryLabel(channelInventoryConfigurationId: number | undefined, product: ProductSearchResult): string | undefined {\r\n if (!channelInventoryConfigurationId || !ArrayExtensions.hasElements(product.AttributeValues)) {\r\n return undefined;\r\n }\r\n const inventoryAttribute = product.AttributeValues.find(attribute => attribute.RecordId === channelInventoryConfigurationId);\r\n if (inventoryAttribute) {\r\n return inventoryAttribute.TextValue;\r\n }\r\n return undefined;\r\n}\r\nexport const ProductSearchResultItems: React.FC = ({\r\n products,\r\n context,\r\n imageSettings,\r\n resources,\r\n moduleType,\r\n moduleId,\r\n allowBackNavigation,\r\n telemetryContent,\r\n quickviewSlot,\r\n channelInventoryConfigurationId,\r\n isPriceMinMaxEnabled,\r\n productsDimensionAvailabilities,\r\n selectedRefinerValues,\r\n moduleProps\r\n}) => {\r\n const { enableStockCheck, disableStockCheckInAppForBackorderableProducts } = context.app.config;\r\n const priceResources: IPriceComponentResources = {\r\n priceRangeSeparator: resources.priceRangeSeparator\r\n };\r\n let filteredProducts: ProductSearchResult[] = [];\r\n if (enableStockCheck && disableStockCheckInAppForBackorderableProducts && productsDimensionAvailabilities) {\r\n filteredProducts = products.filter((product: ProductSearchResult) => {\r\n return productsDimensionAvailabilities?.find(dimensionAvailability => {\r\n // console.log('product name', product.Name, 'product ID', product.MasterProductId, 'dimension', dimensionAvailability);\r\n return (\r\n dimensionAvailability.length > 0 &&\r\n dimensionAvailability[0].typeCode === 1 &&\r\n dimensionAvailability[0].masterProductId === product.MasterProductId\r\n );\r\n });\r\n });\r\n } else {\r\n filteredProducts = products;\r\n }\r\n if (filteredProducts.length === 0) {\r\n return

No Products found

;\r\n }\r\n console.log('filtered products', filteredProducts);\r\n return (\r\n
    \r\n {filteredProducts?.map((product: ProductSearchResult, index: number) => (\r\n
  • \r\n \r\n ArrayExtensions.hasElements(dimensionAvailability) &&\r\n dimensionAvailability[0].masterProductId === product.MasterProductId\r\n )}\r\n moduleProps={moduleProps}\r\n />\r\n
  • \r\n ))}\r\n
\r\n );\r\n};\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { ISliderLabel, ISliderThumbProps, Slider } from '@msdyn365-commerce-modules/utilities';\r\nimport debounce from 'lodash/debounce';\r\nimport { computed } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\n\r\nimport { IRefineItemProps, IRefineItemState } from './refine-item';\r\n\r\ntype InputType = 'Min' | 'Max';\r\n\r\nexport type RangeRefineItemType = 'slider' | 'input';\r\n\r\n/**\r\n * Range refine item properties.\r\n */\r\nexport interface IRangeRefineItemProps extends IRefineItemProps {\r\n rangeType: RangeRefineItemType;\r\n minValueSliderThumbAriaLabel?: string;\r\n maxValueSliderThumbAriaLabel?: string;\r\n sliderKey?: string;\r\n}\r\n\r\n/**\r\n * Range refine item state.\r\n */\r\nexport interface IRangeRefineItemState extends IRefineItemState {\r\n validationErrorMin: string | undefined;\r\n validationErrorMax: string | undefined;\r\n selectedMin: string | undefined;\r\n selectedMax: string | undefined;\r\n touchedMin: boolean;\r\n touchedMax: boolean;\r\n sliderId: string;\r\n minValue: string | undefined;\r\n maxValue: string | undefined;\r\n labels: ISliderLabel[];\r\n sliderThumbs: ISliderThumbProps[];\r\n}\r\n\r\n/**\r\n * RangeRefineItem component (controlled by RefineSubmenu).\r\n */\r\n@observer\r\nexport default class RangeRefineItem extends React.Component {\r\n private readonly _formattedPriceReverseLookup: Map = new Map();\r\n\r\n private readonly minInput: React.RefObject;\r\n\r\n private readonly maxInput: React.RefObject;\r\n\r\n @computed get currencyCode(): string {\r\n return this.props.productRefinerValue.UnitText || '';\r\n }\r\n\r\n public constructor(props: IRangeRefineItemProps) {\r\n super(props);\r\n this._onRangeUpdate = this._onRangeUpdate.bind(this);\r\n this._onRangeUpdateEnd = this._onRangeUpdateEnd.bind(this);\r\n this._handleRangeTooltipText = this._handleRangeTooltipText.bind(this);\r\n this._changeMin = this._changeMin.bind(this);\r\n this._changeMax = this._changeMax.bind(this);\r\n this._finishChangeMin = this._finishChangeMin.bind(this);\r\n this._finishChangeMax = this._finishChangeMax.bind(this);\r\n\r\n this.minInput = React.createRef();\r\n this.maxInput = React.createRef();\r\n\r\n const { selectedRefinementCriterion } = this.props;\r\n const initialMin = selectedRefinementCriterion?.LeftValueBoundString ?? '0';\r\n const initialMax = selectedRefinementCriterion?.RightValueBoundString;\r\n const sliderId = `slider_${String(this.props.parentProductRefinerHierarchy.RecordId)}_${String(this.props.productRefinerValue.RefinerRecordId)}`;\r\n const minValue = this.props.productRefinerValue.LeftValueBoundString;\r\n const maxValue = this.props.productRefinerValue.RightValueBoundString;\r\n const minPrice = this._formatPrice(minValue);\r\n const maxPrice = this._formatPrice(maxValue);\r\n const labels: ISliderLabel[] = this.getLabels(sliderId, minPrice, maxPrice);\r\n const selectedMin = this.props.selectedRefinementCriterion?.LeftValueBoundString ?? this.props.productRefinerValue.LeftValueBoundString ?? '0';\r\n const selectedMax = this.props.selectedRefinementCriterion?.RightValueBoundString ??\r\n this.props.productRefinerValue.RightValueBoundString ?? maxValue;\r\n const selectedMinPrice = this._formatPrice(selectedMin);\r\n const selectedMaxPrice = this._formatPrice(selectedMax);\r\n const sliderKeyString = this.props.sliderKey ? `_${String(this.props.sliderKey)}` : '';\r\n const sliderThumbs: ISliderThumbProps[] = this.getSliderThumbs(sliderId,\r\n sliderKeyString, selectedMin, selectedMinPrice, selectedMax, selectedMaxPrice, maxPrice);\r\n this.state = {\r\n isChecked: false,\r\n validationErrorMin: undefined,\r\n validationErrorMax: undefined,\r\n selectedMin: initialMin,\r\n selectedMax: initialMax,\r\n touchedMin: false,\r\n touchedMax: false,\r\n sliderId,\r\n minValue,\r\n maxValue,\r\n labels,\r\n sliderThumbs\r\n };\r\n }\r\n\r\n public shouldComponentUpdate(nextProps: IRangeRefineItemProps,\r\n nextState: IRangeRefineItemState): boolean {\r\n if (this.state === nextState && this.props === nextProps) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n public componentDidUpdate(previousProps: IRangeRefineItemProps): void {\r\n if (previousProps !== this.props) {\r\n this.updateSliderProps();\r\n }\r\n }\r\n\r\n public render(): JSX.Element | undefined {\r\n const { productRefinerValue, parentProductRefinerHierarchy, refineItemCommonProps } = this.props;\r\n\r\n if (!productRefinerValue || !parentProductRefinerHierarchy) {\r\n refineItemCommonProps.telemetry.error('Cannot render refine value range without productRefinerValue and parentProductRefinerHierarchy');\r\n return undefined;\r\n }\r\n\r\n if (this.props.rangeType === 'input') {\r\n return this._renderInputFields();\r\n }\r\n\r\n return this._renderSlider();\r\n }\r\n\r\n /**\r\n * Function to update slider props.\r\n */\r\n private updateSliderProps(): void {\r\n const sliderId = `slider_${String(this.props.parentProductRefinerHierarchy.RecordId)}_${String(this.props.productRefinerValue.RefinerRecordId)}`;\r\n const minValue = this.props.productRefinerValue.LeftValueBoundString;\r\n const maxValue = this.props.productRefinerValue.RightValueBoundString;\r\n const minPrice = this._formatPrice(minValue);\r\n const maxPrice = this._formatPrice(maxValue);\r\n const labels: ISliderLabel[] = this.getLabels(sliderId, minPrice, maxPrice);\r\n const selectedMin = this.props.selectedRefinementCriterion?.LeftValueBoundString ?? this.props.productRefinerValue.LeftValueBoundString ?? '0';\r\n const selectedMax = this.props.selectedRefinementCriterion?.RightValueBoundString ??\r\n this.props.productRefinerValue.RightValueBoundString ?? maxValue;\r\n const selectedMinPrice = this._formatPrice(selectedMin);\r\n const selectedMaxPrice = this._formatPrice(selectedMax);\r\n const sliderKeyString = this.props.sliderKey ? `_${String(this.props.sliderKey)}` : '';\r\n const sliderThumbs: ISliderThumbProps[] = this.getSliderThumbs(sliderId,\r\n sliderKeyString, selectedMin, selectedMinPrice, selectedMax, selectedMaxPrice, maxPrice);\r\n this.setState({ sliderId, minValue, maxValue, labels, sliderThumbs });\r\n }\r\n\r\n /**\r\n * Function to create the labels for slider.\r\n * @param sliderId - Slider element id for the DOM.\r\n * @param minPrice - Slider min value.\r\n * @param maxPrice - Slider max value.\r\n * @returns Array labels.\r\n */\r\n private readonly getLabels = (sliderId: string, minPrice: string, maxPrice: string): ISliderLabel[] => {\r\n return ([\r\n {\r\n labelId: `${sliderId}_start`,\r\n labelString: `${minPrice}`,\r\n labelPositioning: 'start'\r\n },\r\n {\r\n labelId: `${sliderId}_end`,\r\n labelString: `${maxPrice}`,\r\n labelPositioning: 'end'\r\n }\r\n ]);\r\n };\r\n\r\n /**\r\n * Function to create the slider thumbs for slider.\r\n * @param sliderId - Slider element id for the DOM.\r\n * @param sliderKey - Unique key for slider.\r\n * @param selectedMin - Slider selected min value.\r\n * @param selectedMinPrice - Slider selected min price.\r\n * @param selectedMax - Slider selected max value.\r\n * @param selectedMaxPrice - Slider selected max price..\r\n * @param maxPrice - Slider max price..\r\n * @returns Slider Thumb Props.\r\n */\r\n private readonly getSliderThumbs = (sliderId: string,\r\n sliderKey: string,\r\n selectedMin: string,\r\n selectedMinPrice: string,\r\n selectedMax: string | undefined,\r\n selectedMaxPrice: string,\r\n maxPrice: string): ISliderThumbProps[] => {\r\n const sliderThumbDefaultValue = 0;\r\n return ([\r\n {\r\n id: `${sliderId}${sliderKey}_slider_thumb_start`,\r\n value: (selectedMin && Number(selectedMin)) || sliderThumbDefaultValue,\r\n ariaLabel: `${this.props.minValueSliderThumbAriaLabel ?? ''} ${this.currencyCode}`,\r\n ariaValueText: `${selectedMinPrice}`\r\n },\r\n {\r\n id: `${sliderId}${sliderKey}_slider_thumb_end`,\r\n value: Number(selectedMax) || Number(maxPrice),\r\n ariaLabel: `${this.props.maxValueSliderThumbAriaLabel ?? ''} ${this.currencyCode}`,\r\n ariaValueText: `${selectedMaxPrice}`\r\n }\r\n ]);\r\n };\r\n\r\n private _renderInputFields(): JSX.Element | undefined {\r\n const { isDisabled, parentProductRefinerHierarchy, refineItemCommonProps } = this.props;\r\n const { selectedMin, selectedMax, touchedMin, touchedMax, validationErrorMin, validationErrorMax } = this.state;\r\n\r\n const rangeAriaLabel = (refineItemCommonProps.rangeNameFormat || '{0}').replace('{0}', (parentProductRefinerHierarchy.KeyName || ''));\r\n const formAttrs = {\r\n 'aria-label': rangeAriaLabel,\r\n 'aria-disabled': isDisabled\r\n };\r\n\r\n // To enable price formatting of selected fields, this is the approach:\r\n // initial value: min=0 formatted as price, max=undefined\r\n // onFocus/onChange: convert to number (unformat) and mark as touched to indicate value is being edited\r\n // onBlur: validate and format entered value as price\r\n const minInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-min ${validationErrorMin ? 'refine-submenu__input-range--error' : ''}`;\r\n const maxInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-max ${validationErrorMax ? 'refine-submenu__input-range--error' : ''}`;\r\n const minLabelClassName = 'ms-refine-submenu__input-range-label refine-submenu__input-range-label-min';\r\n const maxLabelClassName = 'ms-refine-submenu__input-range-label refine-submenu__input-range-label-max';\r\n const formattedSelectedMin = this._getFormattedSelectedValue(selectedMin, touchedMin, validationErrorMin);\r\n const formattedSelectedMax = this._getFormattedSelectedValue(selectedMax, touchedMax, validationErrorMax);\r\n return (\r\n
\r\n \r\n \r\n {validationErrorMin &&\r\n \r\n {validationErrorMin}\r\n }\r\n {validationErrorMax && validationErrorMin !== validationErrorMax &&\r\n \r\n {validationErrorMax}\r\n }\r\n
\r\n );\r\n }\r\n\r\n private _renderSlider(): JSX.Element | undefined {\r\n const { isDisabled, sliderKey } = this.props;\r\n const ariaAttributes = {\r\n 'aria-disabled': isDisabled\r\n };\r\n\r\n return (\r\n \r\n );\r\n }\r\n\r\n private _changeMin(event: React.FocusEvent): void {\r\n this._changeValue(event, 'Min');\r\n }\r\n\r\n private _changeMax(event: React.FocusEvent): void {\r\n this._changeValue(event, 'Max');\r\n }\r\n\r\n private _changeValue(event: React.FocusEvent, inputType: InputType): void {\r\n const selectedKey = `selected${inputType}`;\r\n const touchedKey = `touched${inputType}`;\r\n this.setState({\r\n [selectedKey]: this._getInputWithoutFormatting(event.currentTarget.value),\r\n [touchedKey]: true\r\n });\r\n }\r\n\r\n private _finishChangeMin(event: React.FocusEvent): boolean {\r\n const selectedMinValue = this._getInputWithoutFormatting(event.currentTarget.value);\r\n this.setState({\r\n selectedMin: selectedMinValue,\r\n minTouched: false\r\n });\r\n const minInput = Number(selectedMinValue);\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue, refineItemCommonProps, selectedRefinementCriterion } = this.props;\r\n const max = selectedRefinementCriterion && selectedRefinementCriterion.RightValueBoundString || undefined;\r\n\r\n const maxNum = max ? Number(max) : undefined;\r\n\r\n if (isNaN(minInput)) {\r\n this.setState({ validationErrorMin: refineItemCommonProps.validationErrorNaN });\r\n this._focus('Min');\r\n return false;\r\n }\r\n\r\n if (this._validateRange(minInput, maxNum)) {\r\n onToggle({\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: minInput,\r\n rangeEnd: maxNum\r\n });\r\n return true;\r\n }\r\n this._focus('Min');\r\n\r\n return false;\r\n }\r\n\r\n private _finishChangeMax(event: React.FocusEvent): boolean {\r\n const selectedMaxValue = this._getInputWithoutFormatting(event.currentTarget.value);\r\n this.setState({\r\n selectedMax: selectedMaxValue,\r\n maxTouched: false\r\n });\r\n const maxInput = Number(selectedMaxValue);\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue, refineItemCommonProps, selectedRefinementCriterion } = this.props;\r\n const min = selectedRefinementCriterion && selectedRefinementCriterion.LeftValueBoundString || '0';\r\n\r\n const minNum = Number(min);\r\n\r\n if (isNaN(maxInput)) {\r\n this.setState({ validationErrorMax: refineItemCommonProps.validationErrorNaN });\r\n this._focus('Max');\r\n return false;\r\n }\r\n\r\n if (this._validateRange(minNum, maxInput)) {\r\n if (productRefinerValue) {\r\n onToggle({\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: minNum,\r\n rangeEnd: maxInput\r\n });\r\n } else {\r\n this._focus('Max');\r\n }\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private _focus(inputType: InputType): void {\r\n const ref = inputType === 'Max' ? this.maxInput : this.minInput;\r\n\r\n setTimeout(() => {\r\n if (ref && ref.current) {\r\n ref.current.focus();\r\n }\r\n }, 50);\r\n }\r\n\r\n private _getFormattedSelectedValue(selected: string | undefined, touched: boolean, validationError: string | undefined): string | undefined {\r\n if (touched || validationError || selected === undefined) {\r\n return selected;\r\n }\r\n return this._formatPrice(selected);\r\n }\r\n\r\n private _validateRange(min: number, max: number | undefined): boolean {\r\n const { refineItemCommonProps } = this.props;\r\n if (max === undefined) {\r\n return true;\r\n }\r\n\r\n if (min > max) {\r\n this.setState({\r\n validationErrorMin: refineItemCommonProps.validationErrorRange,\r\n validationErrorMax: refineItemCommonProps.validationErrorRange\r\n });\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private _formatPrice(amount: string | undefined): string {\r\n const result = this.props.context.cultureFormatter.formatCurrency(Number(amount), this.currencyCode);\r\n return result;\r\n }\r\n\r\n private _getInputWithoutFormatting(input: string): string {\r\n // First try to cast raw input to a number\r\n const inputAsNum = Number(input);\r\n if (!isNaN(inputAsNum)) {\r\n return input;\r\n }\r\n\r\n // Otherwise try a reverse lookup and fall back to the raw input if all else fails\r\n const reverseLookupResult = this._formattedPriceReverseLookup.get(input);\r\n return reverseLookupResult || input;\r\n }\r\n\r\n // NOTE: Fix types once Shared Components build pipeline bug fixed\r\n private _onRangeUpdate(sliderChangeNotification: any): void {\r\n // Need to filter out mousemove events as these cause errors after the menu updates and slider re-renders\r\n if (sliderChangeNotification.eventType !== 'mousemove') {\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\r\n if (productRefinerValue && sliderChangeNotification) {\r\n onToggle({\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: sliderChangeNotification.firstThumbValue,\r\n rangeEnd: sliderChangeNotification.secondThumbValue\r\n });\r\n\r\n this._focusOnSliderThumb(sliderChangeNotification);\r\n }\r\n }\r\n }\r\n\r\n private _onRangeUpdateEnd(sliderChangeNotification: any): void {\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\r\n if (productRefinerValue && sliderChangeNotification) {\r\n onToggle({\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: sliderChangeNotification.firstThumbValue,\r\n rangeEnd: sliderChangeNotification.secondThumbValue\r\n });\r\n\r\n this._focusOnSliderThumb(sliderChangeNotification);\r\n }\r\n }\r\n\r\n private _focusOnSliderThumb(sliderChangeNotification: any): void {\r\n if (sliderChangeNotification.id) {\r\n const element = document.getElementById(`${sliderChangeNotification.id}range`);\r\n if (element) {\r\n setTimeout(\r\n () => {\r\n element.focus();\r\n }, 0);\r\n }\r\n }\r\n }\r\n\r\n private _handleRangeTooltipText(tooltip: number): string {\r\n return this._formatPrice(`${tooltip}`);\r\n }\r\n}\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { RatingComponent, SwatchComponent } from '@msdyn365-commerce/components';\r\nimport { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\r\nimport { ProductRefinerSource, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\r\nimport { checkIfShouldDisplayAsSwatch, DimensionTypes, IDimensionsApp, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { format, getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { IRefineItemCommonProps } from './refine-item.props.common';\r\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\r\n\r\n/**\r\n * RefineItem properties.\r\n */\r\nexport interface IRefineItemProps {\r\n\r\n parentProductRefinerHierarchy: IProductRefinerHierarchy;\r\n productRefinerValue: ProductRefinerValue;\r\n selectedRefinementCriterion: ProductRefinerValue | undefined;\r\n selectedRefinerValues?: ProductRefinerValue[];\r\n refineItemCommonProps: IRefineItemCommonProps;\r\n isDisabled: boolean;\r\n context: ICoreContext>;\r\n moduleId: string;\r\n moduleTypeName: string;\r\n index?: number;\r\n productCountAriaLabel?: string;\r\n singleProductCountAriaLabel?: string;\r\n isMobileView?: boolean;\r\n\r\n /**\r\n * The telemetry content\r\n */\r\n telemetryContent?: ITelemetryContent;\r\n onToggle(notfication: Readonly): void;\r\n urlBuilder(refiner: IRefineItemToggleNotification): string;\r\n}\r\n\r\n/**\r\n * Refine item state.\r\n */\r\nexport interface IRefineItemState extends React.ComponentState {\r\n isChecked: boolean;\r\n renderingError?: object;\r\n}\r\n\r\n/**\r\n * Single-select and multi-select refine item component (controlled by RefineSubmenu).\r\n */\r\nexport default class RefineItem extends React.Component {\r\n private readonly anchorType: React.RefObject;\r\n\r\n private readonly payLoad: IPayLoad;\r\n\r\n public constructor(props: IRefineItemProps) {\r\n super(props);\r\n this._onClick = this._onClick.bind(this);\r\n this.state = {\r\n isChecked: !!this.props.selectedRefinementCriterion\r\n };\r\n this.anchorType = React.createRef();\r\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, '');\r\n }\r\n\r\n public shouldComponentUpdate(nextProps: IRefineItemProps,\r\n nextState: IRefineItemState): boolean {\r\n if (this.state === nextState && this.props === nextProps) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n public render(): JSX.Element | undefined {\r\n const {\r\n isDisabled,\r\n refineItemCommonProps,\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n selectedRefinementCriterion,\r\n productCountAriaLabel,\r\n singleProductCountAriaLabel,\r\n index,\r\n children,\r\n onToggle,\r\n context,\r\n telemetryContent,\r\n ...attrs\r\n } = this.props;\r\n if (!productRefinerValue) {\r\n refineItemCommonProps.telemetry.error('[refine-item] Cannot render refineItem without productRefinerValue');\r\n return undefined;\r\n }\r\n if (!productRefinerValue.LeftValueBoundString) {\r\n refineItemCommonProps.telemetry.warning(`[refine-item] RefineItem without LeftValueBoundString: ${JSON.stringify(productRefinerValue)}`);\r\n }\r\n const isSingleSelect = parentProductRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect;\r\n let itemTypeClassName = isSingleSelect ? 'single-select' : 'multi-select';\r\n itemTypeClassName = `ms-refine-submenu-item ${itemTypeClassName}`;\r\n const inputType = isSingleSelect ? 'radio' : 'checkbox';\r\n const isChecked = !!selectedRefinementCriterion;\r\n itemTypeClassName = isChecked ? `${itemTypeClassName}-checked` : itemTypeClassName;\r\n if (parentProductRefinerHierarchy.SourceValue === ProductRefinerSource.Rating) {\r\n return this._renderRating(productRefinerValue, parentProductRefinerHierarchy, isChecked, context, index, telemetryContent,\r\n productCountAriaLabel, singleProductCountAriaLabel);\r\n\r\n }\r\n this.payLoad.contentAction.etext = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString;\r\n const attribute = getTelemetryAttributes(telemetryContent!, this.payLoad);\r\n\r\n return (\r\n
  • \r\n \r\n {this._renderSwatch()}\r\n \r\n {productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString}\r\n {productRefinerValue.Count !== undefined && ` (${productRefinerValue.Count})`}\r\n \r\n \r\n
  • \r\n );\r\n\r\n }\r\n\r\n private _renderSwatch(): JSX.Element | null {\r\n const productRefinerValue = this.props.productRefinerValue;\r\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\r\n const text = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\r\n\r\n const dimensionType = (this.props.parentProductRefinerHierarchy.KeyName?.toLocaleLowerCase() ?? '') as DimensionTypes;\r\n const hasColor = !StringExtensions.isNullOrWhitespace(productRefinerValue.SwatchColorHexCode);\r\n const hasImage = !StringExtensions.isNullOrWhitespace(productRefinerValue.SwatchImageUrl);\r\n const hasValidSwatch = hasColor || hasImage;\r\n const shouldDisplayAsSwatch = hasValidSwatch && checkIfShouldDisplayAsSwatch(\r\n dimensionType, this.props.context as ICoreContext);\r\n const swatchItems = shouldDisplayAsSwatch ? [\r\n {\r\n itemId: `${productRefinerValue.RefinerRecordId ?? ''}-${dimensionType}-${text}`,\r\n value: text,\r\n dimensionType,\r\n colorHexCode: productRefinerValue.SwatchColorHexCode,\r\n imageUrl: productRefinerValue.SwatchImageUrl\r\n }\r\n ] : undefined;\r\n\r\n if (!swatchItems) {\r\n return null;\r\n }\r\n return (\r\n \r\n );\r\n }\r\n\r\n private _getRefinerUrl(): string {\r\n const { urlBuilder, parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\r\n\r\n if (productRefinerValue) {\r\n return urlBuilder({\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n isSelecting: !selectedRefinementCriterion\r\n });\r\n }\r\n\r\n return '';\r\n }\r\n\r\n private readonly _onClick = (e: React.MouseEvent): void => {\r\n e.preventDefault();\r\n\r\n const { parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\r\n if (productRefinerValue) {\r\n this.props.onToggle({\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n isSelecting: !selectedRefinementCriterion\r\n });\r\n\r\n setTimeout(\r\n () => {\r\n this.anchorType.current && this.anchorType.current.focus();\r\n },\r\n 0\r\n );\r\n }\r\n };\r\n\r\n private _renderRating(productRefinerValue: ProductRefinerValue, parentProductRefinerHierarchy: IProductRefinerHierarchy,\r\n isChecked: boolean, context: ICoreContext, index?: number, telemetryContent?: ITelemetryContent,\r\n ratingUserCountAriaLabel?: string, ratingSingleUserCountAriaLabel?: string): JSX.Element | undefined {\r\n if (productRefinerValue.LeftValueBoundString) {\r\n this.payLoad.contentAction.etext = productRefinerValue.LeftValueBoundLocalizedString;\r\n const attribute = getTelemetryAttributes(telemetryContent!, this.payLoad);\r\n const refinerRating = Number.parseInt(productRefinerValue.LeftValueBoundString, 10);\r\n const ratingRefiner = this.props.selectedRefinerValues?.find(value => value.DataTypeValue === productRefinerValue.DataTypeValue);\r\n const selectedRating = Number.parseInt(ratingRefiner?.LeftValueBoundString || '0', 10);\r\n const defaultChkProductCount = 1;\r\n let ratingComponentClass: string = 'ms-rating-component';\r\n if (refinerRating > selectedRating) {\r\n ratingComponentClass = `${ratingComponentClass}__up`;\r\n } else if (refinerRating < selectedRating) {\r\n ratingComponentClass = `${ratingComponentClass}__down`;\r\n } else {\r\n ratingComponentClass = `${ratingComponentClass}__current`;\r\n }\r\n const productCountAriaLabelValue = (productRefinerValue.Count !== undefined &&\r\n productRefinerValue.Count === defaultChkProductCount) ? (ratingSingleUserCountAriaLabel &&\r\n format(ratingSingleUserCountAriaLabel, productRefinerValue.Count)) : (ratingUserCountAriaLabel &&\r\n format(ratingUserCountAriaLabel, productRefinerValue.Count));\r\n return (\r\n \r\n \r\n \r\n \r\n {productRefinerValue.Count !== undefined && `(${productRefinerValue.Count})`}\r\n \r\n \r\n \r\n );\r\n }\r\n return undefined;\r\n }\r\n\r\n}\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\r\nimport { DisplayTemplate, ProductRefinerSource, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\r\nimport { Button, Collapse, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport RangeRefineItem, { RangeRefineItemType } from './range-refine-item';\r\nimport RefineItem from './refine-item';\r\nimport { IRefineItemCommonProps } from './refine-item.props.common';\r\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\r\nimport { findMatchingRefinementCriterion, isRangeType } from './utilities';\r\n\r\n/**\r\n * Properties associated with the RefineSubmenu component.\r\n */\r\nexport interface IRefineSubmenuProps {\r\n tempRangeTypeTODO: RangeRefineItemType;\r\n minValueSliderThumbAriaLabel?: string;\r\n maxValueSliderThumbAriaLabel?: string;\r\n productRefinerHierarchy: IProductRefinerHierarchy;\r\n selectedRefinerValues: ProductRefinerValue[];\r\n refineItemCommonProps: IRefineItemCommonProps;\r\n isDisabled: boolean;\r\n isExpandedOnInitialLoad: boolean;\r\n context: ICoreContext>;\r\n moduleId: string;\r\n moduleTypeName: string;\r\n productCountAriaLabel?: string;\r\n singleProductCountAriaLabel?: string;\r\n isMobile?: boolean;\r\n\r\n /**\r\n * The telemetry content\r\n */\r\n telemetryContent?: ITelemetryContent;\r\n onUpdateRefiners(notfication: Readonly): void;\r\n urlBuilder(refiner: IRefineItemToggleNotification): string;\r\n}\r\n\r\n/**\r\n * Refine submenu state.\r\n */\r\nexport interface IRefineSubmenuState extends React.ComponentState {\r\n expanded: boolean;\r\n}\r\n\r\n/**\r\n *\r\n * The RefineSubmenu component renders the submenu category and child items.\r\n * This computed observes the stateful category hierarchy object.\r\n * @extends {React.PureComponent}\r\n */\r\nclass RefineSubmenu extends React.Component {\r\n constructor(props: IRefineSubmenuProps) {\r\n super(props);\r\n\r\n this._onToggleItem = this._onToggleItem.bind(this);\r\n this._onToggleSubmenu = this._onToggleSubmenu.bind(this);\r\n\r\n const isExpanded = this.props.isExpandedOnInitialLoad;\r\n\r\n // If (this.props.productRefinerHierarchy.DataTypeValue === ProductRefinerValueDataTypeValue.Range) {\r\n // isExpanded = true;\r\n // }\r\n\r\n this.state = {\r\n expanded: isExpanded\r\n };\r\n }\r\n\r\n public shouldComponentUpdate(nextProps: IRefineSubmenuProps,\r\n nextState: IRefineSubmenuState): boolean {\r\n if (this.state === nextState && this.props === nextProps) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { productRefinerHierarchy, refineItemCommonProps } = this.props;\r\n\r\n if (!productRefinerHierarchy) {\r\n refineItemCommonProps.telemetry.error('Cannot render submenu without refiner hierarchy data');\r\n }\r\n\r\n if ((productRefinerHierarchy.SourceValue === ProductRefinerSource.Rating) && (this.props.context.app.config.hideRating)) {\r\n return null;\r\n }\r\n return (\r\n
    \r\n \r\n {productRefinerHierarchy.KeyName}\r\n \r\n \r\n {this._renderChildItems(productRefinerHierarchy)}\r\n \r\n
    \r\n );\r\n }\r\n\r\n private _renderChildItems(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n if (isRangeType(productRefinerHierarchy.DataTypeValue)) {\r\n return this._renderRange(productRefinerHierarchy);\r\n }\r\n return this._renderSingleMultiSelect(productRefinerHierarchy);\r\n }\r\n\r\n private _renderSingleMultiSelect(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n const { isDisabled, refineItemCommonProps, selectedRefinerValues, context, productCountAriaLabel, singleProductCountAriaLabel, isMobile } = this.props;\r\n const isSingleSelect = (productRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect) && (productRefinerHierarchy.SourceValue === ProductRefinerSource.Rating);\r\n const role = isSingleSelect ? { role: 'radiogroup' } : undefined;\r\n const refinerValuesList = (productRefinerHierarchy.Values || []);\r\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\r\n if (!child) {\r\n refineItemCommonProps.telemetry.error(\r\n `[refine-submenu] Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\r\n );\r\n return null;\r\n }\r\n\r\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\r\n\r\n return (\r\n refinerValuesList.find(value => value.RefinerRecordId === selectedValue.RefinerRecordId))}\r\n refineItemCommonProps={refineItemCommonProps}\r\n onToggle={this._onToggleItem}\r\n urlBuilder={this.props.urlBuilder}\r\n isDisabled={isDisabled}\r\n key={index}\r\n index={index}\r\n context={context}\r\n moduleId={this.props.moduleId}\r\n moduleTypeName={this.props.moduleTypeName}\r\n telemetryContent={this.props.telemetryContent}\r\n productCountAriaLabel={productCountAriaLabel}\r\n singleProductCountAriaLabel={singleProductCountAriaLabel}\r\n isMobileView={isMobile}\r\n />\r\n );\r\n });\r\n return (\r\n
      \r\n {listItems}\r\n
    \r\n );\r\n }\r\n\r\n private _getRangeType(productRefinerHierarchy: IProductRefinerHierarchy): 'input' | 'slider' {\r\n if (productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Range ||\r\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Slider ||\r\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.SliderWithBars) {\r\n return 'slider';\r\n }\r\n return 'input';\r\n }\r\n\r\n private _renderRange(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n const { isDisabled, refineItemCommonProps, selectedRefinerValues, context, minValueSliderThumbAriaLabel, maxValueSliderThumbAriaLabel } = this.props;\r\n const submenuClassNamePrefix = 'ms-refine-submenu__item list-group-item refine-submenu__item';\r\n const refinerValuesList = (productRefinerHierarchy.Values || []);\r\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\r\n if (!child) {\r\n refineItemCommonProps.telemetry.error(\r\n `Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\r\n );\r\n return null;\r\n }\r\n\r\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\r\n\r\n const rangeType = this._getRangeType(productRefinerHierarchy);\r\n const key = selectedRefinementCriterion ? `${selectedRefinementCriterion.LeftValueBoundString}-${selectedRefinementCriterion.RightValueBoundString}` : `not-selected-${index}`;\r\n return (\r\n
  • \r\n \r\n
  • \r\n );\r\n });\r\n return (
      \r\n {listItems}\r\n
    );\r\n }\r\n\r\n private _onToggleItem(itemToggleNotification: IRefineItemToggleNotification): void {\r\n this.props.onUpdateRefiners(itemToggleNotification);\r\n }\r\n\r\n private _onToggleSubmenu(): void {\r\n this.setState(prevState => ({\r\n expanded: !prevState.expanded\r\n }));\r\n }\r\n}\r\n\r\nexport default RefineSubmenu;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport * as React from 'react';\r\n\r\ninterface ISeparator {\r\n separator: string;\r\n}\r\n\r\nexport const Separator: React.FC = ({ separator }) => (\r\n {' '}\r\n {separator}\r\n {' '}\r\n);\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport * as React from 'react';\r\n\r\ninterface ITitle {\r\n className: string;\r\n text: string;\r\n}\r\n\r\nexport const Title: React.FC = ({ text, className }) => (\r\n {' '}\r\n {text}\r\n {' '}\r\n);\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 * ICSearchResultContainer containerModule Interface Properties\r\n * THIS FILE IS AUTO-GENERATED - MANUAL MODIFICATIONS WILL BE LOST\r\n */\r\n\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport * as React from 'react';\r\n\r\nexport const enum expandRefinersCount {\r\n all = 'all',\r\n one = 'one',\r\n two = 'two',\r\n three = 'three',\r\n four = 'four'\r\n}\r\n\r\nexport interface ICSearchResultContainerConfig 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 linksCategory?: ILinksCategoryData[];\r\n titleCategory?: string;\r\n linksFeatured?: ILinksFeaturedData[];\r\n titleFeatured?: string;\r\n autoRedirect?: boolean;\r\n}\r\n\r\nexport interface ICSearchResultContainerResources {\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}\r\n\r\nexport interface ILinksCategoryData {\r\n linkText?: string;\r\n linkUrl: Msdyn365.ILinkData;\r\n ariaLabel?: string;\r\n openInNewTab?: boolean;\r\n}\r\n\r\nexport interface ILinksFeaturedData {\r\n linkText?: string;\r\n linkUrl: Msdyn365.ILinkData;\r\n ariaLabel?: string;\r\n openInNewTab?: boolean;\r\n}\r\n\r\nexport interface ICSearchResultContainerProps extends Msdyn365.IModule {\r\n resources: ICSearchResultContainerResources;\r\n config: ICSearchResultContainerConfig;\r\n slots: {\r\n quickview: React.ReactNode[];\r\n };\r\n}\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { CategoryHierarchy as CategoryHierarchyData, IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport {\r\n ICProductsDimensionsAvailabilities,\r\n cgetDimensionAvailabilitiesForProductSearchResultAction\r\n} from './actions/c-get-dimension-availabilities-for-product-search-result.action';\r\nimport MsDyn365, { /*getCatalogId, */ ICoreContext } from '@msdyn365-commerce/core';\r\nimport { format, ProductPrice, ProductRefinerValue, SortColumn, TextValueTranslation } from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n ArrayExtensions,\r\n DimensionAvailabilitiesForProductSearchResultInput,\r\n DimensionTypes,\r\n getPriceForProductSearchResult,\r\n IDimensionsApp,\r\n PriceForProductSearchResultInput\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\n\r\nimport {\r\n getTelemetryObject,\r\n ILabeledDropdownOnChangeNotification,\r\n ILabeledDropdownOption,\r\n IModuleProps,\r\n INodeProps,\r\n ITelemetryContent,\r\n LabeledDropdown,\r\n UncontrolledPagination\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport { computed, observable, reaction, transaction } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\n\r\nimport {\r\n buildListPageUrl,\r\n getCollectionProducts,\r\n getCollectionRefinersAction,\r\n getCurrentUrl,\r\n GetFullProductsByCollectionInput,\r\n parseQueryParam,\r\n RefinersByCollectionInput,\r\n sortOptions\r\n} from './actions';\r\nimport { hydrateRefinersFromUrl } from './actions/url-utils';\r\nimport {\r\n ErrorMessage,\r\n FeatureSearchResultItem,\r\n getUpdatedRefinementCriteria,\r\n IChoiceSummaryClickNotification,\r\n IRefineItemCommonProps,\r\n IRefineItemToggleNotification,\r\n ISearchResultModalViewProps,\r\n isMatchingRefinementCriterion,\r\n Link,\r\n ModalToggle,\r\n ProductSearchResultItems,\r\n SearchResultModal,\r\n Separator,\r\n Title\r\n} from './components';\r\nimport ChoiceSummary from './components/choice-summary';\r\nimport RefineSubmenu from './components/refine-submenu';\r\nimport { ICSearchResultContainerData } from './c-search-result-container.data';\r\nimport { expandRefinersCount, ICSearchResultContainerProps } from './c-search-result-container.props.autogenerated';\r\nimport { ICBuyboxProps, ICBuyboxData } from '../c-buybox';\r\n\r\nexport interface ISearchResultContainerViewProps extends ICSearchResultContainerProps {\r\n products?: React.ReactNode;\r\n className?: string;\r\n SearchResultContainer: IModuleProps;\r\n TitleViewProps: ITitleViewProps;\r\n categoryHierarchy: ICategoryHierarchyViewProps;\r\n pagination?: React.ReactNode;\r\n ProductsContainer: INodeProps;\r\n ProductSectionContainer: INodeProps;\r\n refineMenu: IRefineMenuViewProps;\r\n sortByOptions: ISortByViewProps;\r\n choiceSummary?: React.ReactNode;\r\n modalToggle: React.ReactNode;\r\n searchResultModal: ISearchResultModalViewProps;\r\n isMobile: boolean;\r\n CategoryNavContainer: INodeProps;\r\n RefineAndProductSectionContainer: INodeProps;\r\n errorMessage: React.ReactNode;\r\n FeatureSearchContainer: INodeProps;\r\n similarLookProduct?: React.ReactNode;\r\n productPrices?: ProductPrice[];\r\n moduleProps: ICBuyboxProps;\r\n}\r\n\r\nexport interface ITitleViewProps {\r\n TitleContainer: INodeProps;\r\n title: ISearchResultTitle;\r\n}\r\n\r\nexport interface IRefineMenuViewProps {\r\n RefineMenuContainer: INodeProps;\r\n RefinerSectionContainer: INodeProps;\r\n refiners?: React.ReactNode[];\r\n}\r\n\r\nexport interface ICategoryHierarchyViewProps {\r\n categoryHierarchyList?: React.ReactNode[];\r\n categoryHierarchySeparator?: React.ReactNode;\r\n CategoryHierarchyContainer: INodeProps;\r\n}\r\n\r\nexport interface ISortByViewProps {\r\n SortingContainer: INodeProps;\r\n sortByDropDown?: React.ReactNode;\r\n}\r\n\r\nexport type GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\r\n\r\n/**\r\n * Title component for search result container.\r\n */\r\nexport interface ISearchResultTitle {\r\n titlePrefix?: React.ReactNode;\r\n titleText?: React.ReactNode;\r\n titleCount?: React.ReactNode;\r\n}\r\n\r\nexport interface ISearchResultContainerState {\r\n sortingState: ISortByCollectionState;\r\n modalIsOpen: boolean;\r\n refiners: IProductRefinerHierarchy[];\r\n productsDimensionAvailabilities?: ICProductsDimensionsAvailabilities[][];\r\n}\r\n\r\ninterface ISortByCollectionState {\r\n selectedSortByOption: ILabeledDropdownOption;\r\n pending: boolean;\r\n}\r\n\r\n/**\r\n *\r\n * SearchResultContainer component.\r\n * @extends {React.PureComponent>}\r\n */\r\n@observer\r\nexport default class SearchResultContainer extends React.PureComponent<\r\n ICSearchResultContainerProps,\r\n ISearchResultContainerState\r\n> {\r\n @computed get isMobile(): boolean {\r\n return this._viewport === 'xs' || this._viewport === 'sm';\r\n }\r\n\r\n private readonly sortByDropdownOptions: ILabeledDropdownOption[] = [\r\n { key: sortOptions.sortByOptionRelevanceDesc, value: this.props.resources.sortByOptionRelevanceDesc },\r\n { key: sortOptions.sortByOptionNameAsc, value: this.props.resources.sortByOptionNameAsc },\r\n { key: sortOptions.sortByOptionNameDesc, value: this.props.resources.sortByOptionNameDesc },\r\n { key: sortOptions.sortByOptionPriceAsc, value: this.props.resources.sortByOptionPriceAsc },\r\n { key: sortOptions.sortByOptionPriceDesc, value: this.props.resources.sortByOptionPriceDesc },\r\n { key: sortOptions.sortByOptionRatingDesc, value: this.props.resources.sortByOptionRatingDesc },\r\n { key: sortOptions.sortByOptionBestSelling, value: this.props.resources.sortByOptionBestSelling },\r\n { key: sortOptions.sortByOptionNewScore, value: this.props.resources.sortByOptionNewScore },\r\n { key: sortOptions.sortByOptionTrendingScore, value: this.props.resources.sortByOptionTrendingScore }\r\n ];\r\n\r\n private readonly _refineItemCommonProps: IRefineItemCommonProps;\r\n\r\n private readonly _pageType: string | undefined = this.props.context.request.urlTokens.pageType;\r\n\r\n @observable\r\n private _viewport: GridSize;\r\n\r\n private readonly _modalToggleRef: React.RefObject;\r\n\r\n private readonly _sortAndFilterContainerRef: React.RefObject;\r\n\r\n private expandrefinerCount: number | undefined = 0;\r\n\r\n private readonly telemetryContent: ITelemetryContent;\r\n\r\n private readonly productPrices: ProductPrice[];\r\n\r\n private readonly defaultPageNumber = 0;\r\n\r\n // private readonly catalogId = getCatalogId(this.props.context.request);\r\n\r\n public constructor(props: ICSearchResultContainerProps, state: ISearchResultContainerState) {\r\n super(props);\r\n this._viewport =\r\n props.context.request && props.context.request.device && props.context.request.device.Type === 'Mobile' ? 'xs' : 'lg';\r\n this._modalToggleRef = React.createRef();\r\n this._sortAndFilterContainerRef = React.createRef();\r\n this._toggleModal = this._toggleModal.bind(this);\r\n this._updateViewport = this._updateViewport.bind(this);\r\n this.productPrices = [];\r\n this.state = {\r\n sortingState: {\r\n pending: false,\r\n selectedSortByOption: this.sortByDropdownOptions[0]\r\n },\r\n modalIsOpen: false,\r\n refiners: []\r\n };\r\n const { placeholderTextMax, minLabel, maxLabel, rangeNameFormat } = this.props.resources;\r\n\r\n const locale = this.props.context.request.locale;\r\n const telemetry = this.props.telemetry;\r\n const validationErrorNaN = this.props.resources.validationErrorNotNumber;\r\n const validationErrorRange = this.props.resources.validationErrorNotRange;\r\n this._refineItemCommonProps = {\r\n telemetry,\r\n locale,\r\n placeholderTextMax,\r\n minLabel,\r\n maxLabel,\r\n rangeNameFormat,\r\n validationErrorNaN,\r\n validationErrorRange\r\n };\r\n this.telemetryContent = getTelemetryObject(\r\n this.props.context.request.telemetryPageName!,\r\n this.props.friendlyName,\r\n this.props.telemetry\r\n );\r\n // Initalization of list page\r\n this.props.data.products.then(products => {\r\n this.props.data.listPageState.then(listPageState => {\r\n if (this._pageType === 'Category') {\r\n listPageState.pageType = 'Category';\r\n } else {\r\n listPageState.pageType = 'Search';\r\n }\r\n\r\n let querySorting: SortColumn[] = [];\r\n\r\n if (this.props.context.request.query && this.props.context.request.query.sorting) {\r\n querySorting = JSON.parse(decodeURIComponent(this.props.context.request.query.sorting)) as SortColumn[];\r\n }\r\n\r\n listPageState.currentPageNumber =\r\n (this.props.context.request.query && +this.props.context.request.query.skip / (this.props.config.itemsPerPage || 10)) ||\r\n 0;\r\n listPageState.sortingCritera = { Columns: querySorting };\r\n listPageState.pageSize = this.props.config.itemsPerPage || 10;\r\n listPageState.activeProducts = products.products;\r\n listPageState.totalProductCount = products.count;\r\n listPageState.activeFilters = hydrateRefinersFromUrl(this.props.context.request);\r\n\r\n // Initialize reaction based on listPageState properties\r\n reaction(\r\n () => {\r\n return [listPageState.activeProducts];\r\n },\r\n async () => {\r\n await this._getProductsDimensionsAvailabilities();\r\n }\r\n );\r\n reaction(\r\n () => {\r\n return [\r\n listPageState.activeFilters && listPageState.activeFilters.length,\r\n listPageState.currentPageNumber,\r\n listPageState.sortingCritera &&\r\n listPageState.sortingCritera.Columns &&\r\n listPageState.sortingCritera.Columns.length\r\n ];\r\n },\r\n () => {\r\n const input = new GetFullProductsByCollectionInput(\r\n listPageState.pageType,\r\n this.props.context.request.apiSettings,\r\n {\r\n Paging: {\r\n Top: this.props.config.itemsPerPage,\r\n Skip: Math.max(listPageState.pageSize * (listPageState.currentPageNumber || 0), 0)\r\n },\r\n count: true,\r\n Sorting: listPageState.sortingCritera || {}\r\n },\r\n listPageState.activeFilters || [],\r\n +(this.props.context.request.urlTokens.itemId || 0),\r\n\r\n this.props.context.request.query && this.props.context.request.query.q\r\n ? this.props.context.request.query.q\r\n : JSON.stringify({\r\n ProductId: this.props.context.request.query?.productId,\r\n Recommendation: this.props.context.request.query?.recommendation\r\n }),\r\n !!(\r\n this.props &&\r\n this.props.config &&\r\n this.props.config.includeAttributes !== undefined &&\r\n this.props.config.includeAttributes\r\n ),\r\n this.props.config.updateRefinerPanel,\r\n this.props.context.request.locale\r\n // ,\r\n // this.catalogId\r\n );\r\n getCollectionProducts(input, this.props.context.actionContext).then(productResults => {\r\n listPageState.activeProducts = productResults.products;\r\n listPageState.totalProductCount = productResults.count;\r\n if (\r\n this.props.config.enableAffiliationBasedPricing &&\r\n this.props.context.actionContext.requestContext?.user?.isAuthenticated\r\n ) {\r\n this._getActivePrice();\r\n }\r\n });\r\n\r\n if (this.props.config.updateRefinerPanel) {\r\n const refinerInput = new RefinersByCollectionInput(\r\n listPageState.pageType,\r\n this.props.context.request.apiSettings,\r\n {\r\n Paging: {\r\n Top: this.props.config.itemsPerPage,\r\n Skip: Math.max(\r\n listPageState.pageSize * (listPageState.currentPageNumber ?? this.defaultPageNumber),\r\n this.defaultPageNumber\r\n )\r\n },\r\n count: true,\r\n Sorting: listPageState.sortingCritera ?? {}\r\n },\r\n listPageState.activeFilters ?? [],\r\n +(this.props.context.request.urlTokens.itemId ?? 0),\r\n this.props.context.request.query?.q\r\n ? this.props.context.request.query.q\r\n : this.props.context.request.query?.productId,\r\n false,\r\n this.props.config.updateRefinerPanel\r\n // ,\r\n // undefined,\r\n // this.catalogId\r\n );\r\n\r\n getCollectionRefinersAction(refinerInput, this.props.context.actionContext)\r\n .then(refiners => {\r\n this.setState({ refiners });\r\n })\r\n .catch(error => {\r\n this.props.telemetry.error(error);\r\n });\r\n }\r\n }\r\n );\r\n });\r\n });\r\n\r\n if (this.props.context.request.query?.productId) {\r\n this.props.data.featureProduct.then(products => {\r\n this.props.data.listPageState.then(listPageStateFeature => {\r\n listPageStateFeature.featureProduct = products;\r\n });\r\n });\r\n }\r\n this._updateViewport();\r\n }\r\n\r\n public static getFriendlyName(locale: string, nameTranslations?: TextValueTranslation[]): string | undefined {\r\n let nameTranslation: TextValueTranslation | undefined;\r\n if (locale && nameTranslations && ArrayExtensions.hasElements(nameTranslations)) {\r\n nameTranslation = nameTranslations.find(item => item.Language!.toLowerCase() === locale.toLowerCase());\r\n }\r\n\r\n return nameTranslation?.Text;\r\n }\r\n\r\n public async componentDidMount(): Promise {\r\n if (MsDyn365.isBrowser && window.addEventListener) {\r\n window.addEventListener('resize', this._updateViewport);\r\n this._updateViewport();\r\n }\r\n if (this.props.config.enableAffiliationBasedPricing && this.props.context.actionContext.requestContext?.user?.isAuthenticated) {\r\n this._getActivePrice();\r\n }\r\n\r\n const context = this.props.context as ICoreContext;\r\n const dimensionsToDisplayOnProductCard = context.app.config.dimensionsInProductCard;\r\n const dimensionsToDisplayAsSwatch = context.app.config.dimensionsAsSwatchType;\r\n if (\r\n ArrayExtensions.hasElements(dimensionsToDisplayOnProductCard) &&\r\n !dimensionsToDisplayOnProductCard.includes(DimensionTypes.none) &&\r\n ArrayExtensions.hasElements(dimensionsToDisplayAsSwatch) &&\r\n !dimensionsToDisplayAsSwatch.includes(DimensionTypes.none) &&\r\n this.props.config.includeAttributes\r\n ) {\r\n await this._getProductsDimensionsAvailabilities();\r\n }\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n if (MsDyn365.isBrowser && window.removeEventListener) {\r\n window.removeEventListener('resize', this._updateViewport);\r\n }\r\n }\r\n public render(): JSX.Element {\r\n const { imageSettings, className } = this.props.config;\r\n const { resources } = this.props;\r\n const products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\r\n const searchProduct = (this.props.data.listPageState.result && this.props.data.listPageState.result.featureProduct) || null;\r\n let errorText = '';\r\n if (!products || products.length === 0) {\r\n errorText = this._pageType === 'Category' ? resources.resultCategoryNotFoundText : resources.resultSearchNotFoundText;\r\n }\r\n const productsComponent = this._getProducts();\r\n const featureComponent = (\r\n \r\n );\r\n\r\n const searchResultContainerViewProps = {\r\n ...this.props,\r\n moduleProps: this.props.data.moduleProps,\r\n products: productsComponent,\r\n TitleViewProps: this._getCollectionTitle(),\r\n categoryHierarchy: !this.props.config.disableHierarchy && this._getCategoryHierarchy(),\r\n refineMenu: this._getRefineMenu(),\r\n className: classnames('ms-search-result-container', className),\r\n SearchResultContainer: {\r\n moduleProps: this.props,\r\n className: classnames('ms-search-result-container', className)\r\n },\r\n sortByOptions:\r\n this.props.data.listPageState.result && this.props.data.listPageState.result.totalProductCount !== 0\r\n ? this._getSortingDropDown()\r\n : null,\r\n pagination: this._getPagination(),\r\n ProductsContainer: { className: 'ms-search-result-container__Products' },\r\n ProductSectionContainer: { className: 'ms-search-result-container__product-section' },\r\n CategoryNavContainer: { className: 'ms-search-result-container__category-nav-section' },\r\n RefineAndProductSectionContainer: { className: 'ms-search-result-container__refine-product-section' },\r\n choiceSummary: this._getChoiceSummary(),\r\n modalToggle:\r\n this.props.data.listPageState.result && this.props.data.listPageState.result.totalProductCount !== 0 ? (\r\n \r\n ) : null,\r\n searchResultModal: this._getSearchResultModal(),\r\n isMobile: this.isMobile,\r\n errorMessage: errorText && ,\r\n FeatureSearchContainer: { className: 'ms-feature-search-result' },\r\n similarLookProduct:\r\n this.props.data.listPageState.result &&\r\n this.props.data.listPageState.result.featureProduct !== null &&\r\n this.props.data.listPageState.result.featureProduct !== undefined\r\n ? featureComponent\r\n : null,\r\n productPrices: this.productPrices\r\n };\r\n return this.props.renderView(searchResultContainerViewProps) as React.ReactElement;\r\n }\r\n\r\n /**\r\n * Get products dimension availabilities.\r\n * @returns Void.\r\n */\r\n private readonly _getProductsDimensionsAvailabilities = async (): Promise => {\r\n const productsList = this.props.data.listPageState.result?.activeProducts ?? [];\r\n try {\r\n const productsDimensionAvailabilities = await cgetDimensionAvailabilitiesForProductSearchResultAction(\r\n new DimensionAvailabilitiesForProductSearchResultInput(productsList, this.props.context as ICoreContext),\r\n this.props.context.actionContext\r\n );\r\n if (ArrayExtensions.hasElements(productsDimensionAvailabilities)) {\r\n this.setState({ productsDimensionAvailabilities });\r\n }\r\n } catch (error) {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to get product dimensions');\r\n return;\r\n }\r\n };\r\n\r\n /**\r\n * Get the active price for the products.\r\n */\r\n private readonly _getActivePrice = async (): Promise => {\r\n const productsList = this.props.data.listPageState.result?.activeProducts ?? [];\r\n const products = await getPriceForProductSearchResult(\r\n new PriceForProductSearchResultInput(productsList),\r\n this.props.context.actionContext\r\n );\r\n\r\n const listPageState = await this.props.data.listPageState;\r\n listPageState.activeProducts = products;\r\n };\r\n\r\n private readonly _getSearchResultModal = (): ISearchResultModalViewProps => {\r\n const { resources } = this.props;\r\n return SearchResultModal({\r\n resources: {\r\n modalCloseButtonText: resources.modalCloseButtonText,\r\n modalTitle: resources.modalTitle\r\n },\r\n isOpen: this.state.modalIsOpen,\r\n returnRef: this._modalToggleRef,\r\n onModalToggle: this._toggleModal\r\n });\r\n };\r\n\r\n private readonly _getCollectionTitle = (): ITitleViewProps => {\r\n const { data, context, resources } = this.props;\r\n\r\n let collectionTitle: string | undefined = '';\r\n if (context && context.request && context.request.query && context.request.query.q) {\r\n collectionTitle = `\"${context.request.query.q}\"`;\r\n } else {\r\n collectionTitle =\r\n (data.category.result &&\r\n SearchResultContainer.getFriendlyName(context.request.locale, data.category.result.NameTranslations)) ||\r\n (data.category.result && data.category.result.Name);\r\n }\r\n let productCountText = '';\r\n let productCountNumber: number | undefined;\r\n if (data.listPageState && data.listPageState.result && data.listPageState.result.totalProductCount !== undefined) {\r\n productCountNumber = data.listPageState.result.totalProductCount;\r\n } else if (data.products && data.products.result) {\r\n productCountNumber = data.products.result.count;\r\n }\r\n\r\n if (productCountNumber && productCountNumber !== 0) {\r\n productCountText =\r\n productCountNumber !== 1\r\n ? format(this.props.resources.numberOfProducts, productCountNumber)\r\n : this.props.resources.oneProduct;\r\n } else {\r\n productCountText = format(this.props.resources.numberOfProducts, 0);\r\n }\r\n const pageName = context.request.telemetryPageName ? `result-count-${context.request.telemetryPageName.toLowerCase()}` : '';\r\n const titlePrefix = ;\r\n const titleText = collectionTitle && <Title className='ms-search-result__collection-title-text' text={collectionTitle} />;\r\n const titleCount = <Title className='ms-search-result__collection-title-count' text={productCountText} />;\r\n\r\n return {\r\n TitleContainer: { className: `ms-search-result-container__title ${pageName}` },\r\n title: {\r\n titlePrefix,\r\n titleText,\r\n titleCount\r\n }\r\n };\r\n };\r\n\r\n private readonly _getCategoryHierarchy = (): ICategoryHierarchyViewProps => {\r\n const { data } = this.props;\r\n const categoryHierarchy = data.categoryHierarchy.result;\r\n const categoryLinks =\r\n categoryHierarchy &&\r\n categoryHierarchy.map((value: CategoryHierarchyData, index: number) => {\r\n return (\r\n <Link\r\n key={index}\r\n text={value.Name}\r\n ariaLabel={`${this.props.resources.categoryLinkAriaLabel} ${value.Name}`}\r\n href={value.Url}\r\n />\r\n );\r\n });\r\n const categoryLinkSeparator = <Separator separator='/' />;\r\n\r\n return {\r\n CategoryHierarchyContainer: { tag: 'nav', className: 'ms-search-result-container__category-hierarchy' },\r\n categoryHierarchyList: categoryLinks,\r\n categoryHierarchySeparator: categoryLinkSeparator\r\n };\r\n };\r\n\r\n private readonly _getSortingDropDown = (): ISortByViewProps => {\r\n const { resources } = this.props;\r\n const activeDropdown = this._getCurrentlySelectedOption() || this.state.sortingState.selectedSortByOption;\r\n let dropdwonOptions = this.sortByDropdownOptions;\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- App config settings are of \"any\" value.\r\n if (this.props.context.app.config.hideRating) {\r\n dropdwonOptions = this.sortByDropdownOptions.filter(dropdownOption => dropdownOption.key !== 'AverageRating-Desc');\r\n }\r\n const dropdown = (\r\n <LabeledDropdown\r\n labelClassname='reviews-list-sort-by'\r\n labelText={resources.sortByDropdownLabel}\r\n dropdownId='categorySortByDropdown'\r\n dropdownClassname='reviews-list-dropdown'\r\n toggleColor='link'\r\n dropdownOptions={dropdwonOptions}\r\n selectedOption={activeDropdown}\r\n onSelectOption={this._updateSortByDropdown}\r\n ref={this._sortAndFilterContainerRef}\r\n />\r\n );\r\n return {\r\n SortingContainer: { className: 'ms-search-result-container__Sort-by-category' },\r\n sortByDropDown: dropdown\r\n };\r\n };\r\n\r\n private readonly _getPagination = (): React.ReactNode => {\r\n const { config, context, data, resources } = this.props;\r\n const listPageState = data && data.listPageState && data.listPageState.result;\r\n const fullUrl = getCurrentUrl(context.request);\r\n const itemsPerPage = config.itemsPerPage || 10;\r\n const skipCount =\r\n listPageState && listPageState.currentPageNumber !== null\r\n ? listPageState.currentPageNumber * (this.props.config.itemsPerPage || 10)\r\n : (this.props.context.request.query && +this.props.context.request.query.skip) || 0;\r\n const totalItems = (listPageState && listPageState.totalProductCount) || 0;\r\n const previousText = resources.flipperPrevious;\r\n const nextText = resources.flipperNext;\r\n\r\n if (totalItems <= itemsPerPage) {\r\n return null;\r\n }\r\n return (\r\n <UncontrolledPagination\r\n className='ms-search-result-container__pagination'\r\n role='navigation'\r\n aria-label={resources.paginationAriaLabel}\r\n url={fullUrl.href}\r\n qsp='skip'\r\n items={totalItems}\r\n itemsPerPage={itemsPerPage}\r\n startingItem={skipCount}\r\n previousText={this._renderPrev(previousText)}\r\n nextText={this._renderNext(nextText)}\r\n previousAriaLabel={previousText}\r\n nextAriaLabel={nextText}\r\n telemetryContent={this.telemetryContent}\r\n />\r\n );\r\n };\r\n\r\n private readonly _getRefineMenu = (): IRefineMenuViewProps => {\r\n const { data, context, config } = this.props;\r\n const tempRangeTypeTODO = context.request.query && context.request.query.inputRange ? 'input' : 'slider';\r\n const validRefiners =\r\n this.props.config.updateRefinerPanel && ArrayExtensions.hasElements(this.state.refiners)\r\n ? this.state.refiners.filter(refiner => {\r\n return ArrayExtensions.hasElements(refiner.Values);\r\n })\r\n : data.refiners.result &&\r\n data.refiners.result.filter(refiner => {\r\n return ArrayExtensions.hasElements(refiner.Values);\r\n });\r\n\r\n const activeRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n\r\n this._getexpandRefinerCount(validRefiners && validRefiners.length, config.expandRefinersCount);\r\n const expandedRefiners = this.expandrefinerCount;\r\n const subMenus =\r\n validRefiners &&\r\n validRefiners.map((productRefinerHierarchy: IProductRefinerHierarchy, index: number) => {\r\n return (\r\n <RefineSubmenu\r\n productRefinerHierarchy={productRefinerHierarchy}\r\n selectedRefinerValues={activeRefiners}\r\n refineItemCommonProps={this._refineItemCommonProps}\r\n minValueSliderThumbAriaLabel={this.props.resources.minValueSliderThumbAriaLabel}\r\n maxValueSliderThumbAriaLabel={this.props.resources.maxValueSliderThumbAriaLabel}\r\n key={index}\r\n onUpdateRefiners={this._onUpdateRefiners}\r\n urlBuilder={this._buildRefinerUrl}\r\n isDisabled={false}\r\n isExpandedOnInitialLoad={!!(expandedRefiners && expandedRefiners > index)}\r\n tempRangeTypeTODO={tempRangeTypeTODO}\r\n context={context}\r\n moduleId={this.props.id}\r\n moduleTypeName={this.props.typeName}\r\n telemetryContent={this.telemetryContent}\r\n productCountAriaLabel={this.props.resources.productCountAriaLabel}\r\n singleProductCountAriaLabel={this.props.resources.singleProductCountAriaLabel}\r\n isMobile={this.isMobile}\r\n />\r\n );\r\n });\r\n\r\n return {\r\n RefineMenuContainer: { className: 'ms-search-result-container__refine-menu' },\r\n RefinerSectionContainer: { className: 'ms-search-result-container__refiner-section' },\r\n refiners: subMenus\r\n };\r\n };\r\n\r\n private readonly _getChoiceSummary = (): React.ReactNode => {\r\n const { resources, data, telemetry } = this.props;\r\n const selectedRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n return (\r\n <ChoiceSummary\r\n classNames='ms-choice-summary-by-category'\r\n clearAllText={resources.clearAllText}\r\n label={resources.choiceSummaryLabel}\r\n closeAriaLabel={resources.closeAriaLabel}\r\n selectedChoices={selectedRefiners}\r\n // @ts-expect-error: NOTE Type-unsafe line below, null refinersByCategoryHierarchy case not handled\r\n refinerHierarchy={data.refiners.result}\r\n choiceFormat={resources.choiceFormat}\r\n choiceRangeValueFormat={resources.choiceRangeValueFormat}\r\n telemetry={telemetry}\r\n onChoiceClicked={this._onChoiceClicked}\r\n urlBuilder={this._buildRefinerUrlForChoiceSummary}\r\n choiceAriaLabel={resources.choiceAriaLabel}\r\n telemetryContent={this.telemetryContent}\r\n context={this.props.context}\r\n />\r\n );\r\n };\r\n\r\n private readonly _getProducts = (): JSX.Element => {\r\n const { imageSettings, allowBackNavigation } = this.props.config;\r\n const { resources } = this.props;\r\n const breaCrumbType = this.props.context.app.config.breadcrumbType;\r\n const allowBack = allowBackNavigation && (breaCrumbType === 'back' || breaCrumbType === 'categoryAndBack');\r\n const products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\r\n const quickviewslot = this.props.slots && this.props.slots.quickview && this.props.slots.quickview[0];\r\n const activeRefiner = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeFilters) || [];\r\n const isPriceMinMaxFeatureState = this.props.data.featureState.result?.find(\r\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailSearchPriceRangeFeature'\r\n );\r\n return (\r\n <ProductSearchResultItems\r\n products={products}\r\n context={this.props.context}\r\n imageSettings={imageSettings}\r\n resources={resources}\r\n moduleType={this.props.typeName}\r\n moduleId={this.props.id}\r\n allowBackNavigation={allowBack}\r\n telemetryContent={this.telemetryContent}\r\n quickviewSlot={quickviewslot}\r\n channelInventoryConfigurationId={this.props.data.products.result?.channelInventoryConfigurationId}\r\n isPriceMinMaxEnabled={isPriceMinMaxFeatureState?.IsEnabled}\r\n productsDimensionAvailabilities={this.state.productsDimensionAvailabilities}\r\n selectedRefinerValues={activeRefiner}\r\n moduleProps={this.props.data.moduleProps}\r\n />\r\n );\r\n };\r\n\r\n private readonly _updateSortByDropdown = (notification: ILabeledDropdownOnChangeNotification): void => {\r\n const { context } = this.props;\r\n const requestContext = context && context.request;\r\n const actionContext = context && context.actionContext;\r\n\r\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\r\n const error = `[sort-by-category] cannot sort without context: ${!requestContext ? 'requestContext ' : ''} ${\r\n !actionContext ? 'actionContext ' : ''\r\n } could not be found`;\r\n this.props.telemetry.warning(error);\r\n }\r\n\r\n window.history.pushState(\r\n {},\r\n '',\r\n buildListPageUrl(\r\n getCurrentUrl(this.props.context.request),\r\n undefined,\r\n [this._getSortColumnFromSelectedOption(notification.selectedOption)],\r\n undefined\r\n )\r\n );\r\n transaction(() => {\r\n this.props.data.listPageState.result!.currentPageNumber = 0;\r\n this.props.data.listPageState.result!.sortingCritera = {\r\n Columns: [this._getSortColumnFromSelectedOption(notification.selectedOption)]\r\n };\r\n });\r\n };\r\n\r\n private readonly _getSortColumnFromSelectedOption = (option: ILabeledDropdownOption): SortColumn => {\r\n const { data } = this.props;\r\n\r\n if (!data.searchConfiguration.result) {\r\n return {};\r\n }\r\n\r\n const mappedConfiguration = data.searchConfiguration.result.find(searchConfiguration => {\r\n return searchConfiguration.key === option.key;\r\n });\r\n\r\n if (mappedConfiguration) {\r\n return mappedConfiguration.sortColumn;\r\n }\r\n\r\n return {};\r\n };\r\n\r\n /**\r\n * Retrieves current sort criteria.\r\n * @returns Sort criteria column which is currently active or undefined if it's not specified.\r\n */\r\n private readonly _getSortCriteriaColumn = (): SortColumn | undefined => {\r\n const sortCriteria = this.props.data.listPageState.result?.sortingCritera;\r\n if (ArrayExtensions.hasElements(sortCriteria?.Columns)) {\r\n return sortCriteria!.Columns[0];\r\n }\r\n\r\n const queryColumns = parseQueryParam<SortColumn[]>('sorting', this.props.context.request);\r\n if (ArrayExtensions.hasElements(queryColumns)) {\r\n return queryColumns[0];\r\n }\r\n\r\n return undefined;\r\n };\r\n\r\n /**\r\n * Retrieves current selected dropdown option based on the sort criteria.\r\n * @returns Current dropdown option.\r\n */\r\n private readonly _getCurrentlySelectedOption = (): ILabeledDropdownOption | undefined => {\r\n const activeSortColumn = this._getSortCriteriaColumn();\r\n\r\n const searchConfiguration = this.props.data.searchConfiguration.result;\r\n\r\n if (!activeSortColumn || !searchConfiguration) {\r\n return undefined;\r\n }\r\n\r\n const activeMappedConfig = searchConfiguration.find(\r\n mappedSearchConfig =>\r\n mappedSearchConfig.sortColumn.ColumnName === activeSortColumn.ColumnName &&\r\n mappedSearchConfig.sortColumn.IsDescending === activeSortColumn.IsDescending\r\n );\r\n if (!activeMappedConfig) {\r\n return undefined;\r\n }\r\n\r\n return this.sortByDropdownOptions.find(dropdownOption => dropdownOption.key === activeMappedConfig.key);\r\n };\r\n\r\n private readonly _onUpdateRefiners = (itemToggleNotification: IRefineItemToggleNotification): void => {\r\n const { context } = this.props;\r\n const requestContext = context && context.request;\r\n const actionContext = context && context.actionContext;\r\n\r\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\r\n const error = `Refine menu cannot refine search criteria: ${!requestContext ? 'requestContext ' : ''} ${\r\n !actionContext ? 'actionContext ' : ''\r\n } could not be found`;\r\n this.props.telemetry.warning(error);\r\n }\r\n\r\n const updatedRefinementCriteria = getUpdatedRefinementCriteria(\r\n itemToggleNotification,\r\n (this.props.data.listPageState.result && this.props.data.listPageState.result.activeFilters) || []\r\n );\r\n\r\n window.history.pushState({}, '', buildListPageUrl(getCurrentUrl(this.props.context.request), updatedRefinementCriteria));\r\n transaction(() => {\r\n this.props.data.listPageState.result!.currentPageNumber = 0;\r\n this.props.data.listPageState.result!.activeFilters = updatedRefinementCriteria;\r\n });\r\n };\r\n\r\n private readonly _buildRefinerUrl = (itemToggleNotification: IRefineItemToggleNotification): string => {\r\n if (this.props.data.listPageState.result) {\r\n const newRefinementCriteria = getUpdatedRefinementCriteria(\r\n itemToggleNotification,\r\n this.props.data.listPageState.result.activeFilters || []\r\n );\r\n\r\n return buildListPageUrl(getCurrentUrl(this.props.context.request), newRefinementCriteria);\r\n }\r\n this.props.telemetry.warning('[buildRefinerQueryString]List Page State Not available, unable to build refiner URL');\r\n return '';\r\n };\r\n\r\n private readonly _onChoiceClicked = (notification: IChoiceSummaryClickNotification): void => {\r\n const { data, telemetry } = this.props;\r\n\r\n if (!data.listPageState.result) {\r\n telemetry.warning('[choice-summary-by-category._onChoiceClicked]ListPageState unavailable, unable to update refiners.');\r\n return;\r\n }\r\n\r\n let currentRefinementCriteria = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n\r\n if (!notification.clearAll) {\r\n const selectedChoice = notification.choiceClicked;\r\n if (!selectedChoice) {\r\n telemetry.warning('[choice-summary-by-category._onChoiceClicked] Choice could not be determined');\r\n return;\r\n }\r\n currentRefinementCriteria = currentRefinementCriteria.filter(\r\n (selectedCriterion: ProductRefinerValue) => !isMatchingRefinementCriterion(selectedChoice, selectedCriterion)\r\n );\r\n } else {\r\n currentRefinementCriteria = [];\r\n\r\n // Set focus to sort and filter\r\n const dropdownElementId = this._sortAndFilterContainerRef.current && this._sortAndFilterContainerRef.current.props.dropdownId;\r\n const dropdownElement = dropdownElementId && document.getElementById(dropdownElementId);\r\n setTimeout(() => {\r\n dropdownElement && dropdownElement.focus();\r\n }, 50);\r\n }\r\n\r\n const fullUrl = getCurrentUrl(this.props.context.request);\r\n window.history.pushState({}, '', buildListPageUrl(fullUrl, currentRefinementCriteria));\r\n data.listPageState.result.currentPageNumber = 0;\r\n data.listPageState.result.activeFilters = currentRefinementCriteria;\r\n };\r\n\r\n private readonly _buildRefinerUrlForChoiceSummary = (selectedRefiner: ProductRefinerValue, isClearAll: boolean): string => {\r\n const { data, telemetry } = this.props;\r\n const fullUrl = getCurrentUrl(this.props.context.request);\r\n\r\n if (!data.listPageState.result) {\r\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl]ListPageState unavailable, unable to create refiner URL.');\r\n return fullUrl.href;\r\n }\r\n\r\n let currentRefinementCriteria = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n\r\n if (!isClearAll) {\r\n if (!selectedRefiner) {\r\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl] URL for Choice could not be determined');\r\n return fullUrl.href;\r\n }\r\n currentRefinementCriteria = currentRefinementCriteria.filter(\r\n (selectedCriterion: ProductRefinerValue) => !isMatchingRefinementCriterion(selectedRefiner, selectedCriterion)\r\n );\r\n } else {\r\n currentRefinementCriteria = [];\r\n }\r\n\r\n return buildListPageUrl(fullUrl, currentRefinementCriteria);\r\n };\r\n\r\n private _getViewport(): GridSize {\r\n const { context } = this.props;\r\n\r\n // Always render in mobile viewport on a mobile device\r\n if (context.request && context.request.device && context.request.device.Type === 'Mobile') {\r\n return 'xs';\r\n }\r\n\r\n if (MsDyn365.isBrowser && window.innerWidth) {\r\n const gridSettings = context.request.gridSettings;\r\n if (gridSettings) {\r\n if (gridSettings.xs && window.innerWidth <= gridSettings.xs.w) {\r\n return 'xs';\r\n } else if (gridSettings.sm && window.innerWidth <= gridSettings.sm.w) {\r\n return 'sm';\r\n } else if (gridSettings.md && window.innerWidth <= gridSettings.md.w) {\r\n return 'md';\r\n } else if (gridSettings.lg && window.innerWidth <= gridSettings.lg.w) {\r\n return 'lg';\r\n }\r\n return 'xl';\r\n }\r\n }\r\n\r\n return 'lg';\r\n }\r\n\r\n private _toggleModal(): void {\r\n this.setState({\r\n modalIsOpen: !this.state.modalIsOpen\r\n });\r\n }\r\n\r\n private _updateViewport(): void {\r\n this._viewport = this._getViewport();\r\n\r\n if (this.state.modalIsOpen && !this.isMobile) {\r\n this._toggleModal();\r\n }\r\n }\r\n\r\n private readonly _getexpandRefinerCount = (validRefiners?: number, refinerCount?: expandRefinersCount): void => {\r\n switch (refinerCount) {\r\n case expandRefinersCount.all:\r\n this.expandrefinerCount = validRefiners;\r\n break;\r\n case expandRefinersCount.one:\r\n this.expandrefinerCount = 1;\r\n break;\r\n case expandRefinersCount.two:\r\n this.expandrefinerCount = 2;\r\n break;\r\n case expandRefinersCount.three:\r\n this.expandrefinerCount = 3;\r\n break;\r\n case expandRefinersCount.four:\r\n this.expandrefinerCount = 4;\r\n break;\r\n default:\r\n this.expandrefinerCount = 0;\r\n }\r\n };\r\n\r\n /**\r\n * Renders a Pagination previous text.\r\n * @param paginationPreviousText - Pagination previous text from resources.\r\n * @returns Previous text and flipper icon.\r\n */\r\n private readonly _renderPrev = (paginationPreviousText: string) => {\r\n return (\r\n <div className='msc-pagination__prev'>\r\n <span className='ms-search-result__pagination-left' aria-hidden='true' />\r\n <span className='prev-text'>{paginationPreviousText}</span>\r\n </div>\r\n );\r\n };\r\n\r\n /**\r\n * Renders a Pagination next text.\r\n * @param paginationNextText - Pagination next text from resources.\r\n * @returns Next text and flipper icon.\r\n */\r\n private readonly _renderNext = (paginationNextText: string) => {\r\n return (\r\n <div className='msc-pagination__next'>\r\n <span className='next-text'>{paginationNextText}</span>\r\n <span className='ms-search-result__pagination-right' aria-hidden='true' />\r\n </div>\r\n );\r\n };\r\n}\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { ISearchResultModalViewProps } from './components';\r\nimport { ICategoryHierarchyViewProps, IRefineMenuViewProps, ISearchResultContainerViewProps, ISortByViewProps, ITitleViewProps } from './c-search-result-container';\r\nimport { ICSearchResultContainerProps } from './c-search-result-container.props.autogenerated';\r\n\r\nimport { getProductPageUrlSync } from '@msdyn365-commerce-modules/retail-actions';\r\n\r\nconst SearchResultContainerView: React.FC<ISearchResultContainerViewProps & ICSearchResultContainerProps<{}>> = props => {\r\n const { SearchResultContainer, products, pagination, ProductsContainer, ProductSectionContainer, choiceSummary, isMobile, modalToggle, searchResultModal, TitleViewProps,\r\n refineMenu, categoryHierarchy, sortByOptions, CategoryNavContainer, RefineAndProductSectionContainer, errorMessage, FeatureSearchContainer, similarLookProduct } = props;\r\n const isRecoSearchPage = props.context.actionContext.requestContext.query?.recommendation;\r\n if (isMobile) {\r\n return (\r\n <Module {...SearchResultContainer}>\r\n {redirectIfOne(props)}\r\n {renderCategoryHierarchy(categoryHierarchy)}\r\n {renderTitle(TitleViewProps)}\r\n {choiceSummary}\r\n {modalToggle}\r\n {createSearchResultModal(searchResultModal, refineMenu, sortByOptions, isRecoSearchPage)}\r\n <Node {...FeatureSearchContainer}>\r\n {similarLookProduct}\r\n </Node>\r\n <Node {...ProductsContainer}>\r\n {errorMessage}\r\n {products}\r\n </Node>\r\n {pagination}\r\n </Module>\r\n );\r\n }\r\n return (\r\n <Module {...SearchResultContainer}>\r\n <Node {...CategoryNavContainer}>\r\n {/* {categoryHierarchy && renderCategoryHierarchy(categoryHierarchy)}\r\n {TitleViewProps && renderTitleCount(TitleViewProps)} */}\r\n <div className='row pc-category-nav-section'>\r\n <div className='col-3 pc-category-hierarchy'>\r\n {categoryHierarchy && renderCategoryHierarchy(categoryHierarchy)}\r\n </div>\r\n <div className='col-9'>\r\n <div className='row pc-sort-count-page'>\r\n {sortByOptions && !isRecoSearchPage && renderSort(sortByOptions)}\r\n {TitleViewProps && renderTitleCount(TitleViewProps)}\r\n {pagination}\r\n </div>\r\n </div>\r\n </div>\r\n </Node>\r\n <Node {...RefineAndProductSectionContainer}>\r\n {/* {refineMenu && renderRefiner(refineMenu)} */}\r\n <div className='pc-left-nav'>\r\n <p className='pc-left-nav-title pc-featured'>{props.config.titleFeatured}</p>\r\n {renderLNFeaturedLinks(props)}\r\n <p className='pc-left-nav-title pc-category'>{props.config.titleCategory}</p>\r\n {renderLNCatLinks(props)}\r\n {refineMenu && renderRefiner(refineMenu)}\r\n </div>\r\n <Node {...ProductSectionContainer}>\r\n {/* {TitleViewProps && renderTitle(TitleViewProps)} */}\r\n {choiceSummary}\r\n {/* {sortByOptions && !isRecoSearchPage && renderSort(sortByOptions)} */}\r\n <Node {...FeatureSearchContainer}>\r\n {similarLookProduct}\r\n </Node>\r\n <Node {...ProductsContainer}>\r\n {errorMessage}\r\n {products}\r\n </Node>\r\n {pagination}\r\n </Node>\r\n </Node>\r\n </Module>\r\n );\r\n\r\n};\r\n\r\nconst redirectIfOne = (props: ISearchResultContainerViewProps & ICSearchResultContainerProps<{}>): void => {\r\n React.useEffect(() => {\r\n if (props.config.autoRedirect === true) { //props.config.autoRedirect\r\n const products = (props.data.listPageState.result && props.data.listPageState.result.activeProducts) || [];\r\n if (products.length === 1) {\r\n const productUrl = getProductPageUrlSync(products[0].Name || '', products[0].RecordId, props.context && props.context.actionContext, undefined);\r\n // useEffect(() => {\r\n global.location.href = productUrl\r\n // });\r\n }\r\n }\r\n });\r\n}\r\n\r\nconst createSearchResultModal = (modalProps: ISearchResultModalViewProps, refineMenu: IRefineMenuViewProps,\r\n sortByDropDown: ISortByViewProps, isRecoSearchPage?: string): JSX.Element => {\r\n return React.cloneElement(modalProps.modal, {}, modalProps.modalHeader,\r\n createModalBody(modalProps, refineMenu, sortByDropDown, isRecoSearchPage), modalProps.modalFooter);\r\n};\r\n\r\nconst createModalBody = (props: ISearchResultModalViewProps, refineMenu: IRefineMenuViewProps,\r\n sortByDropDown: ISortByViewProps, isRecoSearchPage?: string): JSX.Element | null => {\r\n if (sortByDropDown) {\r\n return React.cloneElement(props.modalBody, {}, renderSort(sortByDropDown, isRecoSearchPage), renderRefiner(refineMenu));\r\n }\r\n return null;\r\n};\r\n\r\nconst renderLNCatLinks = (props: ICSearchResultContainerProps<{}>): JSX.Element | null => {\r\n const lnLinks = props.config.linksCategory;\r\n if (lnLinks) {\r\n return (\r\n <ul className='pc-left-nav-links pc-category-links'>\r\n {lnLinks.map((linkCategory, index) => (\r\n <li key={index} className='pc-left-nav-links-item'><a className='pc-left-nav-links-url' href={linkCategory.linkUrl.destinationUrl}>{linkCategory.linkText}</a></li>\r\n )) \r\n } \r\n </ul> \r\n ); \r\n }\r\n\r\n return null;\r\n}\r\n\r\nconst renderLNFeaturedLinks = (props: ICSearchResultContainerProps<{}>): JSX.Element | null => {\r\n const lnLinks = props.config.linksFeatured;\r\n if (lnLinks) {\r\n return (\r\n <ul className='pc-left-nav-links pc-featured-links'>\r\n {lnLinks.map((linkFeatured, index) => (\r\n <li key={index} className='pc-left-nav-links-item'><a className='pc-left-nav-links-url' href={linkFeatured.linkUrl.destinationUrl}>{linkFeatured.linkText}</a></li>\r\n )) \r\n } \r\n </ul> \r\n ); \r\n }\r\n\r\n return null;\r\n}\r\n\r\nconst renderRefiner = (props: IRefineMenuViewProps): JSX.Element | null => {\r\n const { refiners, RefineMenuContainer, RefinerSectionContainer } = props;\r\n if (refiners) {\r\n return (\r\n <Node {...RefinerSectionContainer}>\r\n <Node {...RefineMenuContainer}>\r\n {refiners.map((submenu, index) => (\r\n <React.Fragment key={index}>\r\n {submenu}\r\n </React.Fragment>\r\n ))}\r\n </Node>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst renderSort = (props: ISortByViewProps, isRecoSearchPage?: string): JSX.Element | null => {\r\n const { SortingContainer, sortByDropDown } = props;\r\n if (sortByDropDown && !isRecoSearchPage) {\r\n return (\r\n <Node {...SortingContainer}>\r\n {sortByDropDown}\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst renderCategoryHierarchy = (props: ICategoryHierarchyViewProps): JSX.Element | null => {\r\n const { CategoryHierarchyContainer, categoryHierarchyList, categoryHierarchySeparator } = props;\r\n if (categoryHierarchyList) {\r\n return (\r\n <Node {...CategoryHierarchyContainer}>\r\n {categoryHierarchyList.map((category, index) => (\r\n <React.Fragment key={index}>\r\n {category}\r\n {categoryHierarchyList && categoryHierarchyList[index + 1] && categoryHierarchySeparator}\r\n </React.Fragment>\r\n ))}\r\n </Node>\r\n );\r\n }\r\n\r\n return null;\r\n};\r\n\r\nconst renderTitle = (props: ITitleViewProps): JSX.Element | null => {\r\n const { title, TitleContainer } = props;\r\n if (title) {\r\n return (\r\n <Node {...TitleContainer}>\r\n <h2>\r\n {title.titlePrefix}\r\n {title.titleText}\r\n </h2>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst renderTitleCount = (props: ITitleViewProps): JSX.Element | null => {\r\n const { title, TitleContainer } = props;\r\n if (title) {\r\n return (\r\n <Node {...TitleContainer}>\r\n <h5>\r\n {title.titleCount}\r\n </h5>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nexport default SearchResultContainerView;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport {\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 { ProductPrice, ProductRefinerValue, ProductSearchResult, SimpleProduct, SortingInfo } from '@msdyn365-commerce/retail-proxy';\r\nimport { observable } from 'mobx';\r\n\r\nimport { listPageType } from './actions';\r\n\r\n/**\r\n * ListPageState class.\r\n */\r\nexport class ListPageState {\r\n @observable public activeFilters: ProductRefinerValue[] | null = null;\r\n\r\n @observable public activeProducts: ProductSearchResult[] = [];\r\n\r\n @observable public sortingCritera: SortingInfo | null = null;\r\n\r\n @observable public currentPageNumber: number | null = null;\r\n\r\n @observable public refiners: IProductRefinerHierarchy[] | null = null;\r\n\r\n @observable public totalProductCount: number | undefined;\r\n\r\n @observable public pageSize: number = 10;\r\n\r\n @observable public pageType: listPageType = 'Unknown';\r\n\r\n @observable public featureProduct: SimpleProduct | null = null;\r\n\r\n @observable public productPrices: ProductPrice[] | undefined = [];\r\n}\r\n\r\n/**\r\n * ListPageStateInput - action input.\r\n */\r\nexport class ListPageStateInput implements IActionInput {\r\n public getCacheKey = () => 'ListPageState';\r\n\r\n public getCacheObjectType = () => 'ListPageState';\r\n\r\n public dataCacheType = (): CacheType => 'request';\r\n}\r\n\r\nexport async function listPageStateAction(\r\n input: ListPageStateInput,\r\n ctx: IActionContext\r\n): Promise<ListPageState> {\r\n return new ListPageState();\r\n}\r\n\r\n/**\r\n * Create new input for create action.\r\n * @param inputData\r\n */\r\nexport const createListPageInput = (\r\n inputData: ICreateActionContext<IGeneric<IAny>>\r\n): IActionInput => {\r\n return new ListPageStateInput();\r\n};\r\n\r\n/**\r\n * ListPageState - create action.\r\n */\r\nexport default createObservableDataAction<ListPageState>({\r\n action: <IAction<ListPageState>>listPageStateAction,\r\n input: createListPageInput\r\n});\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['c-search-result-container'] = {\n c: () => require('partner/modules/c-search-result-container/c-search-result-container.tsx'),\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:'modules/c-search-result-container/list-page-state', runOn: 0},{name:'products', path:'modules/c-search-result-container/actions/get-full-products-by-collection', runOn: 0},{name:'refiners', path:'modules/c-search-result-container/actions/get-refiners-for-collection', runOn: 0},{name:'searchConfiguration', path:'modules/c-search-result-container/actions/get-mapped-search-configuration', runOn: 0}],\n \n iNM: false,\n ns: '__local__',\n n: 'c-search-result-container',\n p: '__local__',\n \n pdp: '',\n \n \n md: 'src/modules/c-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 = 'modules/c-search-result-container/actions/get-full-products-by-collection';\n let dataAction = require('partner/modules/c-search-result-container/actions/get-full-products-by-collection');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = 'modules/c-search-result-container/actions/get-mapped-search-configuration';\n let dataAction = require('partner/modules/c-search-result-container/actions/get-mapped-search-configuration');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = 'modules/c-search-result-container/actions/get-refiners-for-collection';\n let dataAction = require('partner/modules/c-search-result-container/actions/get-refiners-for-collection');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = 'modules/c-search-result-container/list-page-state';\n let dataAction = require('partner/modules/c-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__|modules|c-search-result-container|c-search-result-container'] = {\n c: () => require('partner/modules/c-search-result-container/c-search-result-container.view.tsx'),\n cn: '__local__-__local__-c-search-result-container'\n };\nwindow.__bindings__ = window.__bindings__ || {};\nwindow.__bindings__.viewDictionary = {\n ...window.__bindings__.viewDictionary || {},\n ...viewDictionary\n };","module.exports = React;","module.exports = ReactDOM;"],"names":["SwatchItemComponent","props","isSelected","className","onSelectItem","item","itemId","value","colorHexCode","imageUrl","style","isColored","hasColor","StringExtensions","isNullOrWhitespace","hasImage","modImageUrl","splitImgUrl","split","String","itemNumber","toString","selectItem","React","selectionHandler","isSelectionEnabled","undefined","dimensionType","toLowerCase","backgroundColor","fullImageUrl","generateSwatchImageUrl","apiSettings","modifiedImageUrl","imgSrc","setImgSrc","onImgError","event","currentTarget","classList","add","window","key","isDisabled","src","classnames","onClick","onKeyPress","title","alt","onError","shouldDisplayText","SwatchComponent","containerClassName","selectedItemId","setSelectedItemId","didUserSetAnyItem","setDidUserSetAnyItem","onSelectItemCallback","ObjectExtensions","isNullOrUndefined","defaultItem","list","find","isDefault","map","resources","requestContext","context","showStrikethroughPricing","originalPrice","getOriginalPrice","BasePrice","CustomerContextualPrice","MinVariantPrice","MaxVariantPrice","data","price","isPriceMinMaxEnabled","console","log","Math","max","TradeAgreementPrice","AdjustedPrice","formatCurrency","shouldUseFreePriceText","freePriceText","cultureFormatter","renderCurrentPrice","initialPrice","maxVariantPrice","minVariantPrice","itemProp","priceResources","priceRangeSeparator","renderCurrentPriceWithOriginalPrice","originalPriceText","currentPriceText","savingsText","PriceComponent","msdyn365Commerce","createComponent","component","BaseCollectionInput","constructor","pageType","queryResultSettings","refiners","category","searchText","includeAttributes","isUpdateRefinerPanel","locale","getCacheKey","this","Paging","toJS","Sorting","buildCacheKey","refiner","RefinerRecordId","LeftValueBoundString","RightValueBoundString","convertToString","getCacheObjectType","dataCacheType","createBaseCollectionInput","args","inputClassConstuctor","urlTokens","query","categoryId","QueryResultSettingsProxy","fromInputData","QueryResultSettings","queryRefiners","hydrateRefinersFromUrl","inputData","config","updateRefinerPanel","getUpdateRefinerPanel","sorting","Columns","JSON","parse","decodeURIComponent","q","productId","recommendation","stringify","ProductId","Recommendation","Error","CGetDimensionAvailabilitiesForProductSearchResultInput","products","dimensionContext","createDimensionAvailabilitiesForProductSearchResultInput","async","cgetDimensionAvailabilitiesForProductSearchResultAction","input","productsDimensionInputs","inventoryLevel","app","product","filteredProductAttributes","AttributeValues","filter","attributeValue","checkIfShouldDisplayAsSwatch","Name","toLocaleLowerCase","dimensionsInProductCard","includes","ArrayExtensions","hasElements","productionDimensionType","ProductDimensionType","push","ProductsDimensionAvailabilitiesInput","MasterProductId","RecordId","Promise","resolve","disableStockCheckInAppForBackorderableProducts","enableStockCheck","dimensionForProducts","getDimensionAvailabilitiesForProductsAction","productsDimensionAvailabilities","dimensionInput","index","OOSandNBDimensionIDs","dimensionValuesWithInventory","inventoryLevelCode","getInventoryLevelCodeFromDimensionValue","dimensionValue","DimensionValue","NBFlag","ExtensionProperties","Key","Value","BooleanValue","isDisable","InventoryLevelValues","outOfStock","id","NB","typeCode","DimensionTypeValue","masterProductId","cDimensions","telemetry","warning","error","cgetDimensionAvailabilitiesForProductSearchResultDataAction","createObservableDataAction","action","ProductListInventoryFilteringOptions","GetFullProductsByCollectionInput","length","isOutOfStock","channelInventoryConfiguration","attribute","InventoryProductAttributeRecordId","TextValue","InventoryOutOfStockAttributeValueText","returnProductsBasedOnInventoryInformation","productListInventoryDisplay","HideOOS","filteredProducts","filterOutOfStockProducts","SortOOS","inStockProducts","outOfStockProducts","concat","sortsProductsBasedOnAvailability","returnProducts","productSearchResults","metadataCount","productSearchResultsWithImages","productSearchResult","newImageUrl","generateProductImageUrl","PrimaryImageUrl","InventoryLevels","threshold","count","getInventoryConfigurationAsync","callerContext","element","inventoryRanges","channelInventoryConfigurationId","actionDataAction","promise","searchProductId","searchCriteriaInput","Context","ChannelId","channelId","CatalogId","catalogId","Refinement","IncludeAttributes","SkipVariantExpansion","CategoryIds","searchByCriteriaAsync","SearchCondition","searchObject","Number","isNaN","RecommendationListId","Ids","MsDyn365","isBrowser","update","ListPageStateInput","totalProductCount","metadata","activeFilters","Top","itemsPerPage","skip","Skip","sortOptions","sortByOptionRelevanceDesc","sortByOptionRatingAsc","sortByOptionRatingDesc","sortByOptionNameAsc","sortByOptionNameDesc","sortByOptionPriceAsc","sortByOptionPriceDesc","sortByOptionBestSelling","sortByOptionNewScore","sortByOptionTrendingScore","MappedSearchInput","getMappedSearchConfiguration","ctx","getSearchConfigurationAsync","then","searchConfiguration","ProductSortColumns","sortColumn","ColumnName","toUpperCase","IsDescending","Boolean","createInput","getMappedSearchConfigurationDataAction","DefaultValues","getProductRefinerHierarchy","searchCriteria","getProductSearchRefinersAsync","productRefiners","trace","result","productRefiner","RefinersByCollectionInput","defaultCategoryIdValue","defaultProductIdValue","compressedRefinerKeys","compressedRefinerArray","parseQueryParam","compressedRefiner","parsedRefiner","forEach","refinerKey","buildListPageUrl","fullUrl","sortingColumns","skipCount","searchParams","delete","sortedRefiners","sort","first","second","set","compressedRefiners","compressRefiners","href","getCurrentUrl","URL","location","url","requestUrl","ProductRefinerValueDataTypeValue","ProductRefinerTypeValue","ProductRefinerSource","isRangeType","dataTypeValue","AttributeDataType","Currency","Decimal","Integer","findMatchingRefinementCriterion","productRefinerValue","refinementCriteria","refinementCriterion","isMatchingRefinementCriterion","RefinerSourceValue","DataTypeValue","getUpdatedRefinementCriteria","itemToggleNotification","currentRefinementCriteria","updatedRefinementCriteria","toggledItemFound","selectedCriterion","isSelecting","next","rangeStart","rangeEnd","Text","TrueFalse","parentProductRefinerHierarchy","RefinerTypeValue","RefinerType","SingleSelect","Values","child","matchingIndex","findIndex","criterion","splice","ChoiceSummary","super","closeButtonGlyph","_onClick","e","preventDefault","stopPropagation","target","clearAll","getAttribute","selectedRefiner","_getSelectedRefinerChoice","onChoiceClicked","itemClicked","choiceClicked","nextItemToFocus","nextSibling","payLoad","getPayloadObject","telemetryContent","selectedChoices","_getKeyForRefinerValue","render","clearAllText","label","classNames","choiceAriaLabel","closeAriaLabel","items","selectedRefinersMap","contentAction","etext","clearAllAttributes","getTelemetryAttributes","listItemProps","urlBuilder","role","choiceFormat","choiceRangeValueFormat","refinerHierarchy","overallFormat","rangeFormat","refinerValueName","refinerName","parent","hierarchy","KeyName","replace","_formatPrice","UnitText","LeftValueBoundLocalizedString","amount","currency","selected","textContent","trim","__decorate","computed","observer","ErrorMessage","text","FeatureSearchResultItem","imageSettings","productName","productRecordId","productUrl","getProductPageUrlSync","actionContext","fallbackImage","getFallbackImageUrl","ItemId","heading","featureSimilarDescriptionTitle","featureSimilarLooksTitle","onTelemetryClick","gridSettings","altText","img","imageProps","fallBackSrc","Image","loadFailureBehavior","renderProductPlacementImage","request","Link","ariaLabel","ModalToggle","innerRef","ref","modalNode","Modal","autoFocus","applicationNode","returnFocusRef","returnRef","isOpen","toggle","onModalToggle","zIndex","modalHeaderNode","ModalHeader","modalTitle","modalFooterNode","ModalFooter","Button","modalCloseButtonText","getInventoryLabel","inventoryAttribute","ProductSearchResultItems","moduleType","moduleId","allowBackNavigation","quickviewSlot","selectedRefinerValues","moduleProps","dimensionAvailability","ProductComponent","priceFree","ratingAriaLabel","allowBack","typeName","quickViewButton","inventoryLabel","dimensionAvailabilities","RangeRefineItem","_formattedPriceReverseLookup","Map","getLabels","sliderId","minPrice","maxPrice","labelId","labelString","labelPositioning","getSliderThumbs","sliderKey","selectedMin","selectedMinPrice","selectedMax","selectedMaxPrice","minValueSliderThumbAriaLabel","currencyCode","ariaValueText","maxValueSliderThumbAriaLabel","_onRangeUpdate","bind","_onRangeUpdateEnd","_handleRangeTooltipText","_changeMin","_changeMax","_finishChangeMin","_finishChangeMax","minInput","maxInput","selectedRefinementCriterion","initialMin","initialMax","minValue","maxValue","labels","sliderKeyString","sliderThumbs","state","isChecked","validationErrorMin","validationErrorMax","touchedMin","touchedMax","shouldComponentUpdate","nextProps","nextState","componentDidUpdate","previousProps","updateSliderProps","refineItemCommonProps","rangeType","_renderInputFields","_renderSlider","setState","formAttrs","rangeNameFormat","minInputClassName","maxInputClassName","formattedSelectedMin","_getFormattedSelectedValue","formattedSelectedMax","minLabel","onChange","onFocus","onBlur","maxLabel","placeholder","placeholderTextMax","ariaAttributes","Slider","inForm","min","step","orientation","showLabels","showTooltip","onChangeEnd","debounce","handleTooltipText","_changeValue","inputType","selectedKey","touchedKey","_getInputWithoutFormatting","selectedMinValue","minTouched","onToggle","maxNum","validationErrorNaN","_focus","_validateRange","selectedMaxValue","maxTouched","minNum","setTimeout","current","focus","touched","validationError","validationErrorRange","inputAsNum","get","sliderChangeNotification","eventType","firstThumbValue","secondThumbValue","_focusOnSliderThumb","document","getElementById","tooltip","RefineItem","anchorType","productCountAriaLabel","singleProductCountAriaLabel","children","attrs","isSingleSelect","itemTypeClassName","SourceValue","Rating","_renderRating","_getRefinerUrl","tabIndex","_renderSwatch","Count","SwatchColorHexCode","SwatchImageUrl","swatchItems","ratingUserCountAriaLabel","ratingSingleUserCountAriaLabel","refinerRating","parseInt","ratingRefiner","selectedRating","defaultChkProductCount","ratingComponentClass","productCountAriaLabelValue","format","isMobileView","RatingComponent","avgRating","ratingCount","hideCount","readOnly","moduleTypeName","RefineSubmenu","_onToggleItem","_onToggleSubmenu","isExpanded","isExpandedOnInitialLoad","expanded","productRefinerHierarchy","hideRating","Collapse","timeout","_renderChildItems","_renderRange","_renderSingleMultiSelect","isMobile","refinerValuesList","listItems","selectedValue","_getRangeType","DisplayTemplateValue","DisplayTemplate","Range","SliderWithBars","onUpdateRefiners","prevState","Separator","separator","Title","expandRefinersCount","SearchResultContainer","sortByDropdownOptions","_pageType","expandrefinerCount","defaultPageNumber","_getProductsDimensionsAvailabilities","productsList","listPageState","activeProducts","DimensionAvailabilitiesForProductSearchResultInput","debug","_getActivePrice","getPriceForProductSearchResult","PriceForProductSearchResultInput","_getSearchResultModal","modal","modalHeader","modalFooter","modalBody","ModalBody","SearchResultModal","modalIsOpen","_modalToggleRef","_toggleModal","_getCollectionTitle","collectionTitle","SearchResultContainer_1","getFriendlyName","NameTranslations","productCountNumber","productCountText","numberOfProducts","oneProduct","TitleContainer","telemetryPageName","titlePrefix","searchTextPrefix","titleText","titleCount","_getCategoryHierarchy","categoryHierarchy","CategoryHierarchyContainer","tag","categoryHierarchyList","categoryLinkAriaLabel","Url","categoryHierarchySeparator","_getSortingDropDown","activeDropdown","_getCurrentlySelectedOption","sortingState","selectedSortByOption","dropdwonOptions","dropdownOption","SortingContainer","sortByDropDown","LabeledDropdown","labelClassname","labelText","sortByDropdownLabel","dropdownId","dropdownClassname","toggleColor","dropdownOptions","selectedOption","onSelectOption","_updateSortByDropdown","_sortAndFilterContainerRef","_getPagination","currentPageNumber","totalItems","previousText","flipperPrevious","nextText","flipperNext","UncontrolledPagination","paginationAriaLabel","qsp","startingItem","_renderPrev","_renderNext","previousAriaLabel","nextAriaLabel","_getRefineMenu","tempRangeTypeTODO","inputRange","validRefiners","activeRefiners","_getexpandRefinerCount","expandedRefiners","RefineMenuContainer","RefinerSectionContainer","_refineItemCommonProps","_onUpdateRefiners","_buildRefinerUrl","_getChoiceSummary","selectedRefiners","choiceSummaryLabel","_onChoiceClicked","_buildRefinerUrlForChoiceSummary","_getProducts","breaCrumbType","breadcrumbType","quickviewslot","slots","quickview","activeRefiner","isPriceMinMaxFeatureState","featureState","IsEnabled","notification","history","pushState","_getSortColumnFromSelectedOption","transaction","sortingCritera","option","mappedConfiguration","_getSortCriteriaColumn","sortCriteria","queryColumns","activeSortColumn","activeMappedConfig","mappedSearchConfig","newRefinementCriteria","dropdownElementId","dropdownElement","selectedChoice","isClearAll","refinerCount","all","one","two","three","four","paginationPreviousText","paginationNextText","_viewport","device","Type","_updateViewport","productPrices","pending","validationErrorNotNumber","validationErrorNotRange","getTelemetryObject","friendlyName","querySorting","pageSize","reaction","getCollectionProducts","productResults","enableAffiliationBasedPricing","user","isAuthenticated","refinerInput","getCollectionRefinersAction","catch","featureProduct","listPageStateFeature","nameTranslations","nameTranslation","Language","addEventListener","dimensionsToDisplayOnProductCard","dimensionsToDisplayAsSwatch","dimensionsAsSwatchType","DimensionTypes","none","componentWillUnmount","removeEventListener","searchProduct","errorText","resultCategoryNotFoundText","resultSearchNotFoundText","productsComponent","featureComponent","searchResultContainerViewProps","TitleViewProps","disableHierarchy","refineMenu","sortByOptions","pagination","ProductsContainer","ProductSectionContainer","CategoryNavContainer","RefineAndProductSectionContainer","choiceSummary","modalToggle","searchResultModal","errorMessage","FeatureSearchContainer","similarLookProduct","renderView","_getViewport","innerWidth","xs","w","sm","md","lg","observable","redirectIfOne","autoRedirect","global","createSearchResultModal","modalProps","isRecoSearchPage","createModalBody","renderSort","renderRefiner","renderLNCatLinks","lnLinks","linksCategory","linkCategory","linkUrl","destinationUrl","linkText","renderLNFeaturedLinks","linksFeatured","linkFeatured","Node","submenu","renderCategoryHierarchy","renderTitle","renderTitleCount","Module","titleFeatured","titleCategory","ListPageState","listPageStateAction","createListPageInput","binding","modules","dataActions","registerSanitizedActionPath","sanitizedActionPath","dataAction","default","prototype","RegistrationId","c","require","$type","da","name","path","runOn","iNM","ns","n","p","pdp","__bindings__","viewDictionary","cn","module","exports","ReactDOM"],"sourceRoot":""}