{"version":3,"file":"static/js/b9425a0bb33ba666baa2.bundle.js","mappings":"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","sources":["webpack://Msdyn365.Commerce.Online/./src/modules/only-c-search-result-container/actions/get-mapped-search-configuration.ts?f40a","webpack://Msdyn365.Commerce.Online/./src/modules/only-c-search-result-container/actions/get-refiners-for-collection.ts?10e6","webpack://Msdyn365.Commerce.Online/./src/modules/only-c-search-result-container/list-page-state.ts?487b","webpack://Msdyn365.Commerce.Online/./src/modules/only-c-search-result-container/components/utilities.ts?569b","webpack://Msdyn365.Commerce.Online/./src/modules/only-c-search-result-container/components/choice-summary.tsx?ab4e","webpack://Msdyn365.Commerce.Online/./src/modules/only-c-search-result-container/components/error-message.tsx?fec9","webpack://Msdyn365.Commerce.Online/./src/modules/only-c-search-result-container/components/feature-search-result-item.tsx?3e75","webpack://Msdyn365.Commerce.Online/./src/modules/only-c-search-result-container/components/link.tsx?04b2","webpack://Msdyn365.Commerce.Online/./src/modules/only-c-search-result-container/components/modal.tsx?d0a4","webpack://Msdyn365.Commerce.Online/./src/modules/only-c-search-result-container/components/product-search-result-items.tsx?0a3b","webpack://Msdyn365.Commerce.Online/./src/modules/only-c-search-result-container/components/range-refine-item.tsx?d295","webpack://Msdyn365.Commerce.Online/./src/modules/only-c-search-result-container/components/refine-item.tsx?f21e","webpack://Msdyn365.Commerce.Online/./src/modules/only-c-search-result-container/components/refine-submenu.tsx?3715","webpack://Msdyn365.Commerce.Online/./src/modules/only-c-search-result-container/components/separator.tsx?e3ce","webpack://Msdyn365.Commerce.Online/./src/modules/only-c-search-result-container/components/title.tsx?dc7b","webpack://Msdyn365.Commerce.Online/./src/modules/only-c-search-result-container/only-c-search-result-container.props.autogenerated.ts?e94a","webpack://Msdyn365.Commerce.Online/./src/modules/only-c-search-result-container/components/category-listing.tsx?29dd","webpack://Msdyn365.Commerce.Online/./src/actions/get-price-for-product-search-result.ts?fd24","webpack://Msdyn365.Commerce.Online/./src/modules/only-c-search-result-container/only-c-search-result-container.tsx?1581","webpack://Msdyn365.Commerce.Online/./src/modules/only-c-search-result-container/only-c-search-result-container.view.tsx?4141","webpack://Msdyn365.Commerce.Online/./lib/only-c-search-result-container/module-registration.js?4332","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 {\r\n CacheType,\r\n createObservableDataAction,\r\n IAction,\r\n IActionContext,\r\n IActionInput,\r\n IAny,\r\n ICommerceApiSettings,\r\n ICreateActionContext,\r\n IGeneric\r\n} 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\ninterface 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 || [])\r\n .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\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 &&\r\n this.queryResultSettings.Sorting &&\r\n this.queryResultSettings.Sorting.Columns &&\r\n 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 * 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.catalogId\r\n },\r\n Refinement: input.isUpdateRefinerPanel ? input.refiners : []\r\n },\r\n input.queryResultSettings,\r\n ctx\r\n );\r\n }\r\n throw new Error('[GetRefinersForCollection]Category Page Detected, but no global categoryId found');\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.catalogId\r\n },\r\n Refinement: input.isUpdateRefinerPanel ? input.refiners : []\r\n },\r\n input.queryResultSettings,\r\n ctx\r\n );\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.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 }\r\n } else {\r\n throw new Error('[GetFullProductsForCollection]Search Page Detected, but no q= or productId= query parameter found');\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\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(input: ListPageStateInput, ctx: IActionContext): Promise {\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 = (inputData: ICreateActionContext>): IActionInput => {\r\n return new ListPageStateInput();\r\n};\r\n\r\n/**\r\n * ListPageState - create action.\r\n */\r\nexport default createObservableDataAction({\r\n action: >listPageStateAction,\r\n input: createListPageInput\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 { ITelemetry } from '@msdyn365-commerce/core';\r\nimport { AttributeDataType, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\r\n\r\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\r\n\r\n/**\r\n * Types of product refiner values.\r\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\nexport enum ProductRefinerValueDataTypeValue {\r\n /**\r\n * Range slider is used for selections like price.\r\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Range = 1,\r\n\r\n /**\r\n * Range input is a different way to specify ranges and can be expressed with input boxes\r\n * as well as a set of discrete single-select type values.\r\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n RangeInput = 4,\r\n\r\n /**\r\n * This is a discrete list item, either multi-select or single-select.\r\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n List = 5,\r\n\r\n /**\r\n * Boolean types allows only single-select.\r\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Boolean = 6\r\n}\r\n\r\n/**\r\n * Types of product refiners.\r\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\nexport enum ProductRefinerTypeValue {\r\n /**\r\n * Refiner values are single-select.\r\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Single = 0,\r\n\r\n /**\r\n * Refiner values are multi-select.\r\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Multi = 1\r\n}\r\n\r\n/**\r\n * ProductRefinerSource enum type.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\nexport enum ProductRefinerSource {\r\n /**\r\n * The None member.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n None = 0,\r\n\r\n /**\r\n * The Attribute member.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Attribute = 1,\r\n\r\n /**\r\n * The Category member.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Category = 2,\r\n\r\n /**\r\n * The Price member.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Price = 3,\r\n\r\n /**\r\n * The Rating member.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Rating = 4\r\n}\r\n\r\n/**\r\n * Checks if the data type value corresponds to a slider.\r\n * @param dataTypeValue\r\n */\r\nexport function isRangeType(dataTypeValue: number | undefined): boolean {\r\n return (\r\n dataTypeValue === AttributeDataType.Currency ||\r\n dataTypeValue === AttributeDataType.Decimal ||\r\n dataTypeValue === AttributeDataType.Integer\r\n );\r\n}\r\n\r\n/**\r\n * Find the refinement criterion associated with this product refiner value.\r\n * @param productRefinerValue Product refiner value to match.\r\n * @param refinementCriteria Selected refinement criteria.\r\n */\r\nexport function findMatchingRefinementCriterion(\r\n productRefinerValue: ProductRefinerValue,\r\n refinementCriteria: ProductRefinerValue[]\r\n): ProductRefinerValue | undefined {\r\n // If the value is a range, then match only on data type value; otherwise match on item string\r\n return refinementCriteria.find((refinementCriterion: ProductRefinerValue) =>\r\n isMatchingRefinementCriterion(productRefinerValue, refinementCriterion)\r\n );\r\n}\r\n\r\n/**\r\n * Find the refinement criterion associated with this product refiner value.\r\n * @param productRefinerValue Product refiner value to match.\r\n * @param refinementCriteria Selected refinement criteria.\r\n * @param refinementCriterion\r\n */\r\nexport function isMatchingRefinementCriterion(productRefinerValue: ProductRefinerValue, refinementCriterion: ProductRefinerValue): boolean {\r\n // If the value is a range, then match only on data type value; otherwise match on item string\r\n return (\r\n refinementCriterion.RefinerRecordId === productRefinerValue.RefinerRecordId &&\r\n refinementCriterion.RefinerSourceValue === productRefinerValue.RefinerSourceValue &&\r\n refinementCriterion.DataTypeValue === productRefinerValue.DataTypeValue &&\r\n (isRangeType(refinementCriterion.DataTypeValue) ||\r\n refinementCriterion.LeftValueBoundString === productRefinerValue.LeftValueBoundString)\r\n );\r\n}\r\n\r\nexport function getUpdatedRefinementCriteria(\r\n itemToggleNotification: IRefineItemToggleNotification,\r\n currentRefinementCriteria: ProductRefinerValue[]\r\n): ProductRefinerValue[] {\r\n const updatedRefinementCriteria: ProductRefinerValue[] = [];\r\n let toggledItemFound = false;\r\n currentRefinementCriteria.forEach((selectedCriterion: ProductRefinerValue) => {\r\n if (isMatchingRefinementCriterion(itemToggleNotification.productRefinerValue, selectedCriterion)) {\r\n toggledItemFound = true;\r\n if (itemToggleNotification.isSelecting) {\r\n const next = {\r\n ...selectedCriterion,\r\n LeftValueBoundString:\r\n (itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}`) ||\r\n selectedCriterion.LeftValueBoundString,\r\n RightValueBoundString:\r\n (itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}`) ||\r\n selectedCriterion.RightValueBoundString\r\n };\r\n updatedRefinementCriteria.push(next);\r\n } // Else the item is being de-selected, so omit it from the refinement criteria\r\n } else {\r\n // Keep existing criterion because it is not in the item toggle notification\r\n updatedRefinementCriteria.push(selectedCriterion);\r\n }\r\n });\r\n\r\n if (!toggledItemFound) {\r\n const next = {\r\n ...itemToggleNotification.productRefinerValue,\r\n LeftValueBoundString:\r\n (itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}`) ||\r\n itemToggleNotification.productRefinerValue.LeftValueBoundString,\r\n RightValueBoundString:\r\n (itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}`) ||\r\n itemToggleNotification.productRefinerValue.RightValueBoundString\r\n };\r\n updatedRefinementCriteria.push(next);\r\n\r\n // If single select, then deselect any others in the parent refiner group\r\n if (\r\n (itemToggleNotification.productRefinerValue.DataTypeValue === AttributeDataType.Text ||\r\n itemToggleNotification.productRefinerValue.DataTypeValue === AttributeDataType.TrueFalse) &&\r\n itemToggleNotification.parentProductRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect\r\n ) {\r\n itemToggleNotification.parentProductRefinerHierarchy.Values.forEach((child: ProductRefinerValue) => {\r\n if (child.RefinerRecordId === next.RefinerRecordId && child.LeftValueBoundString === next.LeftValueBoundString) {\r\n // Do nothing\r\n } else {\r\n const matchingIndex = updatedRefinementCriteria.findIndex((criterion: ProductRefinerValue) =>\r\n isMatchingRefinementCriterion(child, criterion)\r\n );\r\n if (matchingIndex > -1) {\r\n updatedRefinementCriteria.splice(matchingIndex, 1);\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n return updatedRefinementCriteria;\r\n}\r\n\r\nexport function formatPrice(\r\n amount: string | undefined,\r\n currency: string | undefined,\r\n locale: string | undefined,\r\n telemetry: ITelemetry\r\n): string {\r\n if (!amount || !currency) {\r\n telemetry.trace(`[refine-menu.utilities.formatPrice] could not format price for ${amount} ${currency}`);\r\n return amount || '';\r\n }\r\n const priceAmount = (amount && Number(amount)) || 0;\r\n let result: string;\r\n\r\n try {\r\n result = new Intl.NumberFormat(locale, {\r\n style: 'currency',\r\n currencyDisplay: 'symbol',\r\n currency,\r\n minimumFractionDigits: 0\r\n }).format(priceAmount);\r\n } catch (error) {\r\n result = `${priceAmount} ${currency}`;\r\n telemetry.warning(`[refine-menu.utilities.formatPrice] Failed to format price for ${result}: ${error}`);\r\n }\r\n\r\n return result;\r\n}\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\r\nimport { getPayloadObject, getTelemetryAttributes, IPayLoad } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport { computed } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\n\r\nimport { ProductListInventoryFilteringOptions } from '../actions';\r\nimport { IChoiceSummaryProps } from './choice-summary.props';\r\nimport { isMatchingRefinementCriterion, isRangeType } from './utilities';\r\n\r\ninterface IRefinerMap {\r\n key: string;\r\n value: ProductRefinerValue;\r\n}\r\n\r\n/**\r\n * ChoiceSummary component.\r\n */\r\n@observer\r\nexport default class ChoiceSummary extends React.PureComponent {\r\n private readonly closeButtonGlyph: string = 'msi-close-btn';\r\n\r\n private readonly payLoad: IPayLoad;\r\n\r\n @computed get selectedRefinersMap(): IRefinerMap[] {\r\n let { selectedChoices } = this.props;\r\n const { channelInventoryConfigurationId, refinerHierarchy } = this.props;\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app configs are of generic type\r\n if (this.props.context?.app.config.productListInventoryDisplay === ProductListInventoryFilteringOptions.HideOOS) {\r\n selectedChoices = selectedChoices.filter(choice => {\r\n const parent = refinerHierarchy.find(\r\n (hierarchy: IProductRefinerHierarchy) =>\r\n !!hierarchy.Values.find((value: ProductRefinerValue) => isMatchingRefinementCriterion(value, choice))\r\n );\r\n return parent && parent.RecordId !== channelInventoryConfigurationId;\r\n });\r\n }\r\n return selectedChoices.map((selectedRefiner: ProductRefinerValue) => {\r\n return {\r\n key: this._getKeyForRefinerValue(selectedRefiner),\r\n value: selectedRefiner\r\n } as IRefinerMap;\r\n });\r\n }\r\n\r\n constructor(props: Readonly) {\r\n super(props);\r\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, '');\r\n }\r\n\r\n public render(): JSX.Element {\r\n const { clearAllText, label, classNames, choiceAriaLabel, closeAriaLabel } = this.props;\r\n const items = this.selectedRefinersMap;\r\n this.payLoad.contentAction.etext = clearAllText;\r\n const clearAllAttributes = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\r\n return (\r\n
\r\n {items.length > 0 && label && {label}}\r\n
    \r\n {items.map((item: IRefinerMap) => {\r\n this.payLoad.contentAction.etext = item.key;\r\n const attribute = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\r\n\r\n return (\r\n
  • \r\n \r\n {item.key}\r\n \r\n \r\n
  • \r\n );\r\n })}\r\n {items.length > 0 && clearAllText && (\r\n
  • \r\n \r\n {clearAllText}\r\n \r\n
  • \r\n )}\r\n
\r\n
\r\n );\r\n }\r\n\r\n private _getKeyForRefinerValue(productRefinerValue: ProductRefinerValue): string {\r\n const { choiceFormat, choiceRangeValueFormat, refinerHierarchy, telemetry } = this.props;\r\n const overallFormat = choiceFormat || '{1}';\r\n const rangeFormat = choiceRangeValueFormat;\r\n let refinerName = '';\r\n if (refinerHierarchy && refinerHierarchy.find) {\r\n const parent = refinerHierarchy.find(\r\n (hierarchy: IProductRefinerHierarchy) =>\r\n !!hierarchy.Values.find((value: ProductRefinerValue) => isMatchingRefinementCriterion(value, productRefinerValue))\r\n );\r\n\r\n if (!parent) {\r\n telemetry.warning('[choice-summary] could not find parent of selected refiner value');\r\n } else {\r\n refinerName = parent.KeyName || '';\r\n }\r\n }\r\n\r\n let refinerValueName: string;\r\n if (isRangeType(productRefinerValue.DataTypeValue)) {\r\n refinerValueName = rangeFormat\r\n .replace('{0}', this._formatPrice(productRefinerValue.LeftValueBoundString, productRefinerValue.UnitText))\r\n .replace('{1}', this._formatPrice(productRefinerValue.RightValueBoundString, productRefinerValue.UnitText));\r\n } else {\r\n refinerValueName = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\r\n }\r\n\r\n return overallFormat.replace('{0}', refinerName).replace('{1}', refinerValueName);\r\n }\r\n\r\n private _formatPrice(amount: string | undefined, currency: string | undefined): string {\r\n if (!amount || !currency) {\r\n this.props.telemetry.trace('[choice-summary] could not format price');\r\n return amount || '';\r\n }\r\n let result = amount;\r\n\r\n try {\r\n result = this.props.context!.cultureFormatter.formatCurrency(Number(amount), currency);\r\n } catch (error) {\r\n this.props.telemetry.warning(`Failed to format price for ${result}: ${error}`);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private readonly _onClick = (e: React.MouseEvent): void => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n const target = e.currentTarget as HTMLElement;\r\n const clearAll = target.getAttribute('class')!.includes('choice-summary__clear-all');\r\n const selectedRefiner = clearAll ? undefined : this._getSelectedRefinerChoice(target);\r\n\r\n if (this.props.onChoiceClicked) {\r\n this.props.onChoiceClicked({\r\n clearAll,\r\n itemClicked: target,\r\n choiceClicked: selectedRefiner,\r\n nextItemToFocus: target.nextSibling as HTMLElement\r\n });\r\n }\r\n };\r\n\r\n private _getSelectedRefinerChoice(itemClicked: HTMLElement): ProductRefinerValue | undefined {\r\n const result = this.selectedRefinersMap.find(\r\n selected => (itemClicked.textContent && itemClicked.textContent.trim()) === selected.key\r\n );\r\n return (result && result.value) || undefined;\r\n }\r\n}\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport * as React from 'react';\r\n\r\ninterface IErrorMessage {\r\n text?: string;\r\n}\r\n\r\nexport const ErrorMessage: React.FC = ({ text }) => {\r\n return (\r\n \r\n
{text}
\r\n
\r\n );\r\n};\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\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\nimport { IOnlyCSearchResultContainerResources } from '../only-c-search-result-container.props.autogenerated';\r\n\r\ninterface IFeatureSearchResultItem {\r\n product: SimpleProduct | null;\r\n context: ICoreContext;\r\n resources: IOnlyCSearchResultContainerResources;\r\n imageSettings?: IImageSettings;\r\n moduleType: string;\r\n moduleId: string;\r\n telemetryContent?: ITelemetryContent;\r\n recommendation?: string;\r\n}\r\n\r\nexport const FeatureSearchResultItem: React.FC = ({\r\n product,\r\n context,\r\n imageSettings,\r\n resources,\r\n telemetryContent,\r\n recommendation\r\n}) => {\r\n if (product === null) {\r\n return null;\r\n }\r\n\r\n const productName = product.Name;\r\n const productRecordId = product && product.RecordId ? product.RecordId : 0;\r\n const productUrl = getProductPageUrlSync(product.Name || '', productRecordId, context && context.actionContext, undefined);\r\n const fallbackImage = getFallbackImageUrl(product.ItemId, context.actionContext.requestContext.apiSettings);\r\n const heading =\r\n recommendation && recommendation === 'descriptions' ? resources.featureSimilarDescriptionTitle : resources.featureSimilarLooksTitle;\r\n\r\n // Construct telemetry attribute to render\r\n const payLoad = getPayloadObject('click', telemetryContent!, productName!, productRecordId.toString());\r\n\r\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\r\n return (\r\n
\r\n \r\n
\r\n {renderProductPlacementImage(\r\n imageSettings,\r\n context.request.gridSettings,\r\n product.PrimaryImageUrl,\r\n product.Name,\r\n fallbackImage,\r\n context.actionContext.requestContext\r\n )}\r\n
\r\n \r\n
\r\n

{heading}

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

{title}

;\r\n}\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\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\nimport { Button, Modal, ModalBody, ModalFooter, ModalHeader } from '@msdyn365-commerce-modules/utilities';\r\nimport React from 'react';\r\n\r\nexport interface ISearchResultModalViewProps {\r\n modal: React.ReactElement;\r\n modalHeader: React.ReactElement;\r\n modalFooter: React.ReactElement;\r\n modalBody: React.ReactElement;\r\n}\r\n\r\ninterface IModalToggleProps {\r\n innerRef: React.RefObject | undefined;\r\n id: string;\r\n text: string;\r\n ariaLabel: string;\r\n onClick(): void;\r\n}\r\n\r\nexport interface ISearchResultModalResources {\r\n modalTitle: string;\r\n modalCloseButtonText: string;\r\n modalClear: 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 onClearModal(): void;\r\n}\r\n\r\nexport const ModalToggle: React.FC = (props: IModalToggleProps) => {\r\n const { text, onClick, ariaLabel, innerRef, id } = props;\r\n return (\r\n \r\n );\r\n};\r\n\r\nexport const SearchResultModal = (props: ISearchResultModalProps): ISearchResultModalViewProps => {\r\n return {\r\n modal: modalNode(props),\r\n modalHeader: modalHeaderNode(props),\r\n modalFooter: modalFooterNode(props),\r\n modalBody: \r\n };\r\n};\r\n\r\nconst modalNode = (props: ISearchResultModalProps) => {\r\n return (\r\n \r\n );\r\n};\r\n\r\nconst modalHeaderNode = (props: ISearchResultModalProps) => {\r\n return (\r\n \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\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport { IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\r\nimport { IPriceComponentResources } from '@msdyn365-commerce/components';\r\nimport { ICoreContext, IGeneric, IAny, IImageSettings, Image, IImageData } from '@msdyn365-commerce/core';\r\nimport { CommerceList, 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 { ProductComponent } from '../../../themes/only/views/components/product.component';\r\nimport classnames from 'classnames';\r\n\r\nimport * as React from 'react';\r\n\r\nimport {\r\n ICampaignLinkData,\r\n ICampaignItemsData,\r\n IOnlyCSearchResultContainerConfig,\r\n IOnlyCSearchResultContainerResources,\r\n ICampaignTitleData\r\n} from '../only-c-search-result-container.props.autogenerated';\r\nimport { ProductSearchResultExtended } from '../actions/get-full-products-by-collection';\r\nimport { _readFromSessionStorage, _writeToSessionStorage } from '../../../utils/helper';\r\n\r\ninterface IProductSearchResultItems {\r\n products: ProductSearchResultExtended[];\r\n context: ICoreContext;\r\n resources: IOnlyCSearchResultContainerResources;\r\n imageSettings?: IImageSettings;\r\n moduleType: string;\r\n moduleId: string;\r\n allowBackNavigation?: boolean;\r\n telemetryContent: ITelemetryContent;\r\n quickviewSlot?: {} | null | undefined;\r\n channelInventoryConfigurationId?: number;\r\n isPriceMinMaxEnabled?: boolean;\r\n productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\r\n config: IOnlyCSearchResultContainerConfig;\r\n wishlist?: CommerceList[];\r\n pageNumber: number;\r\n categoryId: number;\r\n}\r\n\r\n/**\r\n * Returns the product inventory label.\r\n * @param channelInventoryConfigurationId - The channel configuration Id.\r\n * @param product - The product.\r\n * @returns The inventory label.\r\n */\r\nexport function getInventoryLabel(channelInventoryConfigurationId: number | undefined, product: ProductSearchResult): string | undefined {\r\n if (!channelInventoryConfigurationId || !ArrayExtensions.hasElements(product.AttributeValues)) {\r\n return undefined;\r\n }\r\n const inventoryAttribute = product.AttributeValues.find(attribute => attribute.RecordId === channelInventoryConfigurationId);\r\n if (inventoryAttribute) {\r\n return inventoryAttribute.TextValue;\r\n }\r\n return undefined;\r\n}\r\n\r\n// VSI Customization to render multiple campaigns\r\nfunction renderCampaign(\r\n index: number,\r\n campaignItems: ICampaignItemsData[] | undefined,\r\n context?: ICoreContext>,\r\n imageSettings?: IImageSettings\r\n) {\r\n const campaign = campaignItems?.find(c => c?.campaignIndex && c?.campaignIndex > 0 && c?.campaignIndex === index + 1);\r\n return campaign\r\n ? advertisement(\r\n campaign?.campaignImage,\r\n campaign?.campaignLink,\r\n campaign?.campaignTitle,\r\n campaign?.campaignText,\r\n campaign?.campaignTextWidthAlignment,\r\n campaign?.campaignTextHeightAlignment,\r\n context,\r\n imageSettings\r\n )\r\n : null;\r\n}\r\n\r\n// VSI Customization to render advertisements\r\nfunction advertisement(\r\n campaignImage?: IImageData,\r\n campaignLink?: ICampaignLinkData,\r\n campaignTitle?: ICampaignTitleData,\r\n campaignText?: string,\r\n campaignTextWidthAlignment?: string,\r\n campaignTextHeightAlignment?: string,\r\n context?: ICoreContext>,\r\n imageSettings?: IImageSettings\r\n) {\r\n const PromotionalImageProps = {\r\n gridSettings: context?.request.gridSettings || {},\r\n imageSettings: imageSettings\r\n };\r\n return (\r\n
  • \r\n {\r\n
    \r\n {campaignLink ? (\r\n \r\n {campaignLink.linkText ? (\r\n \r\n {campaignLink.linkText}\r\n \r\n ) : (\r\n ''\r\n )}\r\n \r\n {campaignImage && (\r\n
    \r\n \r\n
    \r\n )}\r\n \r\n ) : (\r\n
    \r\n
    \r\n \r\n {campaignImage && (\r\n
    \r\n \r\n
    \r\n )}\r\n
    \r\n
    \r\n )}\r\n
    \r\n }\r\n {campaignLink ? (\r\n
    \r\n \r\n \r\n

    {campaignText}

    \r\n \r\n
    \r\n ) : null}\r\n
  • \r\n );\r\n}\r\n\r\nexport const ProductSearchResultItems: React.FC = ({\r\n products,\r\n context,\r\n imageSettings,\r\n resources,\r\n moduleType,\r\n moduleId,\r\n allowBackNavigation,\r\n telemetryContent,\r\n quickviewSlot,\r\n channelInventoryConfigurationId,\r\n isPriceMinMaxEnabled,\r\n productsDimensionAvailabilities,\r\n wishlist,\r\n pageNumber,\r\n categoryId,\r\n config: { campaignItems, sizesHeading, maxSizeDisplay, favouritesContent, favouritesHeading, wishListLink, variantsToShow }\r\n}) => {\r\n const priceResources: IPriceComponentResources = {\r\n priceRangeSeparator: resources.priceRangeSeparator\r\n };\r\n\r\n // VSI Customization for scroll restoration\r\n const _persistProduct = (event: React.MouseEvent) => {\r\n const pid = event.currentTarget.getAttribute('data-pid') || '0';\r\n _writeToSessionStorage('pid', context, pid);\r\n _writeToSessionStorage('pageNo', context, pageNumber?.toString());\r\n _writeToSessionStorage('products', context, JSON.stringify(products));\r\n _writeToSessionStorage('pCategoryId', context, categoryId?.toString());\r\n };\r\n const pid = parseInt(_readFromSessionStorage('pid', context) || '0', 10);\r\n const _restorationRef = React.createRef();\r\n\r\n React.useEffect(() => {\r\n if (!_restorationRef || !pid) {\r\n return;\r\n }\r\n window.scrollTo({ behavior: 'smooth', top: _restorationRef?.current?.offsetTop || 0 });\r\n }, [_restorationRef]);\r\n const itemIds = Array.from(new Set(products.map(item => item.ItemId)));\r\n return (\r\n <>\r\n {/* Idea was to tag li elements with product item id class, then can hide any variants over 3rd with nth-child,\r\n but nth-child doesn't take class into accout so using sibling combinator instead\r\n Thanks to https://betterprogramming.pub/css-select-nth-element-with-class-a313d080e2bf */}\r\n {variantsToShow! !== undefined && variantsToShow > 0 && (\r\n \r\n )}\r\n\r\n
      \r\n {products.map((product: ProductSearchResultExtended, index: number) => {\r\n return (\r\n <>\r\n {renderCampaign(index, campaignItems, context, imageSettings)}\r\n \r\n \r\n ArrayExtensions.hasElements(dimensionAvailability) &&\r\n dimensionAvailability[0].masterProductId === product.MasterProductId\r\n )}\r\n wishlist={wishlist}\r\n sizesHeading={sizesHeading}\r\n newArrivalMsg={resources.newArrivalMsg}\r\n productLifeTag={resources.productLifeTag}\r\n maxSizeDisplay={maxSizeDisplay || 9}\r\n splitSizeText={resources.splitSizeText}\r\n colorText={resources.colorText}\r\n favouritesContent={favouritesContent}\r\n favouritesHeading={favouritesHeading}\r\n wishListLink={wishListLink}\r\n />\r\n \r\n \r\n );\r\n })}\r\n
    \r\n \r\n );\r\n};\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { ISliderLabel, ISliderThumbProps, Slider } from '@msdyn365-commerce-modules/utilities';\r\nimport debounce from 'lodash/debounce';\r\nimport { computed } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\n\r\nimport { IRefineItemProps, IRefineItemState } from './refine-item';\r\n\r\ntype InputType = 'Min' | 'Max';\r\n\r\nexport type RangeRefineItemType = 'slider' | 'input';\r\n\r\n/**\r\n * Range refine item properties.\r\n */\r\nexport interface IRangeRefineItemProps extends IRefineItemProps {\r\n rangeType: RangeRefineItemType;\r\n minValueSliderThumbAriaLabel?: string;\r\n maxValueSliderThumbAriaLabel?: string;\r\n sliderKey?: string;\r\n}\r\n\r\n/**\r\n * Range refine item state.\r\n */\r\nexport interface IRangeRefineItemState extends IRefineItemState {\r\n validationErrorMin: string | undefined;\r\n validationErrorMax: string | undefined;\r\n selectedMin: string | undefined;\r\n selectedMax: string | undefined;\r\n touchedMin: boolean;\r\n touchedMax: boolean;\r\n sliderId: string;\r\n minValue: string | undefined;\r\n maxValue: string | undefined;\r\n labels: ISliderLabel[];\r\n sliderThumbs: ISliderThumbProps[];\r\n}\r\n\r\n/**\r\n * RangeRefineItem component (controlled by RefineSubmenu).\r\n */\r\n@observer\r\nexport default class RangeRefineItem extends React.Component {\r\n private readonly _formattedPriceReverseLookup: Map = new Map();\r\n\r\n private readonly minInput: React.RefObject;\r\n\r\n private readonly maxInput: React.RefObject;\r\n\r\n @computed get currencyCode(): string {\r\n return this.props.productRefinerValue.UnitText || '';\r\n }\r\n\r\n public constructor(props: IRangeRefineItemProps) {\r\n super(props);\r\n this._onRangeUpdate = this._onRangeUpdate.bind(this);\r\n this._onRangeUpdateEnd = this._onRangeUpdateEnd.bind(this);\r\n this._handleRangeTooltipText = this._handleRangeTooltipText.bind(this);\r\n this._changeMin = this._changeMin.bind(this);\r\n this._changeMax = this._changeMax.bind(this);\r\n this._finishChangeMin = this._finishChangeMin.bind(this);\r\n this._finishChangeMax = this._finishChangeMax.bind(this);\r\n\r\n this.minInput = React.createRef();\r\n this.maxInput = React.createRef();\r\n\r\n const { selectedRefinementCriterion } = this.props;\r\n const initialMin = selectedRefinementCriterion?.LeftValueBoundString ?? '0';\r\n const initialMax = selectedRefinementCriterion?.RightValueBoundString;\r\n const sliderId = `slider_${String(this.props.parentProductRefinerHierarchy.RecordId)}_${String(\r\n this.props.productRefinerValue.RefinerRecordId\r\n )}`;\r\n const minValue = this.props.productRefinerValue.LeftValueBoundString;\r\n const maxValue = this.props.productRefinerValue.RightValueBoundString;\r\n const minPrice = this._formatPrice(minValue);\r\n const maxPrice = this._formatPrice(maxValue);\r\n const labels: ISliderLabel[] = this.getLabels(sliderId, minPrice, maxPrice);\r\n const selectedMin =\r\n this.props.selectedRefinementCriterion?.LeftValueBoundString ?? this.props.productRefinerValue.LeftValueBoundString ?? '0';\r\n const selectedMax =\r\n this.props.selectedRefinementCriterion?.RightValueBoundString ??\r\n this.props.productRefinerValue.RightValueBoundString ??\r\n maxValue;\r\n const selectedMinPrice = this._formatPrice(selectedMin);\r\n const selectedMaxPrice = this._formatPrice(selectedMax);\r\n const sliderKeyString = this.props.sliderKey ? `_${String(this.props.sliderKey)}` : '';\r\n const sliderThumbs: ISliderThumbProps[] = this.getSliderThumbs(\r\n sliderId,\r\n sliderKeyString,\r\n selectedMin,\r\n selectedMinPrice,\r\n selectedMax,\r\n selectedMaxPrice,\r\n maxPrice\r\n );\r\n this.state = {\r\n isChecked: false,\r\n validationErrorMin: undefined,\r\n validationErrorMax: undefined,\r\n selectedMin: initialMin,\r\n selectedMax: initialMax,\r\n touchedMin: false,\r\n touchedMax: false,\r\n sliderId,\r\n minValue,\r\n maxValue,\r\n labels,\r\n sliderThumbs\r\n };\r\n }\r\n\r\n public shouldComponentUpdate(nextProps: IRangeRefineItemProps, nextState: IRangeRefineItemState): boolean {\r\n if (this.state === nextState && this.props === nextProps) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n public componentDidUpdate(previousProps: IRangeRefineItemProps): void {\r\n if (previousProps !== this.props) {\r\n this.updateSliderProps();\r\n }\r\n }\r\n\r\n public render(): JSX.Element | undefined {\r\n const { productRefinerValue, parentProductRefinerHierarchy, refineItemCommonProps } = this.props;\r\n\r\n if (!productRefinerValue || !parentProductRefinerHierarchy) {\r\n refineItemCommonProps.telemetry.error(\r\n 'Cannot render refine value range without productRefinerValue and parentProductRefinerHierarchy'\r\n );\r\n return undefined;\r\n }\r\n\r\n if (this.props.rangeType === 'input') {\r\n return this._renderInputFields();\r\n }\r\n\r\n return this._renderSlider();\r\n }\r\n\r\n /**\r\n * Function to update slider props.\r\n */\r\n private updateSliderProps(): void {\r\n const sliderId = `slider_${String(this.props.parentProductRefinerHierarchy.RecordId)}_${String(\r\n this.props.productRefinerValue.RefinerRecordId\r\n )}`;\r\n const minValue = this.props.productRefinerValue.LeftValueBoundString;\r\n const maxValue = this.props.productRefinerValue.RightValueBoundString;\r\n const minPrice = this._formatPrice(minValue);\r\n const maxPrice = this._formatPrice(maxValue);\r\n const labels: ISliderLabel[] = this.getLabels(sliderId, minPrice, maxPrice);\r\n const selectedMin =\r\n this.props.selectedRefinementCriterion?.LeftValueBoundString ?? this.props.productRefinerValue.LeftValueBoundString ?? '0';\r\n const selectedMax =\r\n this.props.selectedRefinementCriterion?.RightValueBoundString ??\r\n this.props.productRefinerValue.RightValueBoundString ??\r\n maxValue;\r\n const selectedMinPrice = this._formatPrice(selectedMin);\r\n const selectedMaxPrice = this._formatPrice(selectedMax);\r\n const sliderKeyString = this.props.sliderKey ? `_${String(this.props.sliderKey)}` : '';\r\n const sliderThumbs: ISliderThumbProps[] = this.getSliderThumbs(\r\n sliderId,\r\n sliderKeyString,\r\n selectedMin,\r\n selectedMinPrice,\r\n selectedMax,\r\n selectedMaxPrice,\r\n maxPrice\r\n );\r\n this.setState({ sliderId, minValue, maxValue, labels, sliderThumbs });\r\n }\r\n\r\n /**\r\n * Function to create the labels for slider.\r\n * @param sliderId - Slider element id for the DOM.\r\n * @param minPrice - Slider min value.\r\n * @param maxPrice - Slider max value.\r\n * @returns Array labels.\r\n */\r\n private readonly getLabels = (sliderId: string, minPrice: string, maxPrice: string): ISliderLabel[] => {\r\n return [\r\n {\r\n labelId: `${sliderId}_start`,\r\n labelString: `${minPrice}`,\r\n labelPositioning: 'start'\r\n },\r\n {\r\n labelId: `${sliderId}_end`,\r\n labelString: `${maxPrice}`,\r\n labelPositioning: 'end'\r\n }\r\n ];\r\n };\r\n\r\n /**\r\n * Function to create the slider thumbs for slider.\r\n * @param sliderId - Slider element id for the DOM.\r\n * @param sliderKey - Unique key for slider.\r\n * @param selectedMin - Slider selected min value.\r\n * @param selectedMinPrice - Slider selected min price.\r\n * @param selectedMax - Slider selected max value.\r\n * @param selectedMaxPrice - Slider selected max price..\r\n * @param maxPrice - Slider max price..\r\n * @returns Slider Thumb Props.\r\n */\r\n private readonly getSliderThumbs = (\r\n sliderId: string,\r\n sliderKey: string,\r\n selectedMin: string,\r\n selectedMinPrice: string,\r\n selectedMax: string | undefined,\r\n selectedMaxPrice: string,\r\n maxPrice: string\r\n ): ISliderThumbProps[] => {\r\n const sliderThumbDefaultValue = 0;\r\n return [\r\n {\r\n id: `${sliderId}${sliderKey}_slider_thumb_start`,\r\n value: (selectedMin && Number(selectedMin)) || sliderThumbDefaultValue,\r\n ariaLabel: `${this.props.minValueSliderThumbAriaLabel ?? ''} ${this.currencyCode}`,\r\n ariaValueText: `${selectedMinPrice}`\r\n },\r\n {\r\n id: `${sliderId}${sliderKey}_slider_thumb_end`,\r\n value: Number(selectedMax) || Number(maxPrice),\r\n ariaLabel: `${this.props.maxValueSliderThumbAriaLabel ?? ''} ${this.currencyCode}`,\r\n ariaValueText: `${selectedMaxPrice}`\r\n }\r\n ];\r\n };\r\n\r\n private _renderInputFields(): JSX.Element | undefined {\r\n const { isDisabled, parentProductRefinerHierarchy, refineItemCommonProps } = this.props;\r\n const { selectedMin, selectedMax, touchedMin, touchedMax, validationErrorMin, validationErrorMax } = this.state;\r\n\r\n const rangeAriaLabel = (refineItemCommonProps.rangeNameFormat || '{0}').replace('{0}', parentProductRefinerHierarchy.KeyName || '');\r\n const formAttrs = {\r\n 'aria-label': rangeAriaLabel,\r\n 'aria-disabled': isDisabled\r\n };\r\n\r\n // To enable price formatting of selected fields, this is the approach:\r\n // initial value: min=0 formatted as price, max=undefined\r\n // onFocus/onChange: convert to number (unformat) and mark as touched to indicate value is being edited\r\n // onBlur: validate and format entered value as price\r\n const minInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-min ${\r\n validationErrorMin ? 'refine-submenu__input-range--error' : ''\r\n }`;\r\n const maxInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-max ${\r\n validationErrorMax ? 'refine-submenu__input-range--error' : ''\r\n }`;\r\n const minLabelClassName = 'ms-refine-submenu__input-range-label refine-submenu__input-range-label-min';\r\n const maxLabelClassName = 'ms-refine-submenu__input-range-label refine-submenu__input-range-label-max';\r\n const formattedSelectedMin = this._getFormattedSelectedValue(selectedMin, touchedMin, validationErrorMin);\r\n const formattedSelectedMax = this._getFormattedSelectedValue(selectedMax, touchedMax, validationErrorMax);\r\n return (\r\n
    \r\n \r\n \r\n {validationErrorMin && (\r\n \r\n {validationErrorMin}\r\n \r\n )}\r\n {validationErrorMax && validationErrorMin !== validationErrorMax && (\r\n \r\n {validationErrorMax}\r\n \r\n )}\r\n
    \r\n );\r\n }\r\n\r\n private _renderSlider(): JSX.Element | undefined {\r\n const { isDisabled, sliderKey } = this.props;\r\n const ariaAttributes = {\r\n 'aria-disabled': isDisabled\r\n };\r\n\r\n return (\r\n \r\n );\r\n }\r\n\r\n private _changeMin(event: React.FocusEvent): void {\r\n this._changeValue(event, 'Min');\r\n }\r\n\r\n private _changeMax(event: React.FocusEvent): void {\r\n this._changeValue(event, 'Max');\r\n }\r\n\r\n private _changeValue(event: React.FocusEvent, inputType: InputType): void {\r\n const selectedKey = `selected${inputType}`;\r\n const touchedKey = `touched${inputType}`;\r\n this.setState({\r\n [selectedKey]: this._getInputWithoutFormatting(event.currentTarget.value),\r\n [touchedKey]: true\r\n });\r\n }\r\n\r\n private _finishChangeMin(event: React.FocusEvent): boolean {\r\n const selectedMinValue = this._getInputWithoutFormatting(event.currentTarget.value);\r\n this.setState({\r\n selectedMin: selectedMinValue,\r\n minTouched: false\r\n });\r\n const minInput = Number(selectedMinValue);\r\n const {\r\n onToggle,\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n refineItemCommonProps,\r\n selectedRefinementCriterion\r\n } = this.props;\r\n const max = (selectedRefinementCriterion && selectedRefinementCriterion.RightValueBoundString) || undefined;\r\n\r\n const maxNum = max ? Number(max) : undefined;\r\n\r\n if (isNaN(minInput)) {\r\n this.setState({ validationErrorMin: refineItemCommonProps.validationErrorNaN });\r\n this._focus('Min');\r\n return false;\r\n }\r\n\r\n if (this._validateRange(minInput, maxNum)) {\r\n onToggle({\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: minInput,\r\n rangeEnd: maxNum\r\n });\r\n return true;\r\n }\r\n this._focus('Min');\r\n\r\n return false;\r\n }\r\n\r\n private _finishChangeMax(event: React.FocusEvent): boolean {\r\n const selectedMaxValue = this._getInputWithoutFormatting(event.currentTarget.value);\r\n this.setState({\r\n selectedMax: selectedMaxValue,\r\n maxTouched: false\r\n });\r\n const maxInput = Number(selectedMaxValue);\r\n const {\r\n onToggle,\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n refineItemCommonProps,\r\n selectedRefinementCriterion\r\n } = this.props;\r\n const min = (selectedRefinementCriterion && selectedRefinementCriterion.LeftValueBoundString) || '0';\r\n\r\n const minNum = Number(min);\r\n\r\n if (isNaN(maxInput)) {\r\n this.setState({ validationErrorMax: refineItemCommonProps.validationErrorNaN });\r\n this._focus('Max');\r\n return false;\r\n }\r\n\r\n if (this._validateRange(minNum, maxInput)) {\r\n if (productRefinerValue) {\r\n onToggle({\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: minNum,\r\n rangeEnd: maxInput\r\n });\r\n } else {\r\n this._focus('Max');\r\n }\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private _focus(inputType: InputType): void {\r\n const ref = inputType === 'Max' ? this.maxInput : this.minInput;\r\n\r\n setTimeout(() => {\r\n if (ref && ref.current) {\r\n ref.current.focus();\r\n }\r\n }, 50);\r\n }\r\n\r\n private _getFormattedSelectedValue(\r\n selected: string | undefined,\r\n touched: boolean,\r\n validationError: string | undefined\r\n ): string | undefined {\r\n if (touched || validationError || selected === undefined) {\r\n return selected;\r\n }\r\n return this._formatPrice(selected);\r\n }\r\n\r\n private _validateRange(min: number, max: number | undefined): boolean {\r\n const { refineItemCommonProps } = this.props;\r\n if (max === undefined) {\r\n return true;\r\n }\r\n\r\n if (min > max) {\r\n this.setState({\r\n validationErrorMin: refineItemCommonProps.validationErrorRange,\r\n validationErrorMax: refineItemCommonProps.validationErrorRange\r\n });\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private _formatPrice(amount: string | undefined): string {\r\n const result = this.props.context.cultureFormatter.formatCurrency(Number(amount), this.currencyCode);\r\n return result;\r\n }\r\n\r\n private _getInputWithoutFormatting(input: string): string {\r\n // First try to cast raw input to a number\r\n const inputAsNum = Number(input);\r\n if (!isNaN(inputAsNum)) {\r\n return input;\r\n }\r\n\r\n // Otherwise try a reverse lookup and fall back to the raw input if all else fails\r\n const reverseLookupResult = this._formattedPriceReverseLookup.get(input);\r\n return reverseLookupResult || input;\r\n }\r\n\r\n // NOTE: Fix types once Shared Components build pipeline bug fixed\r\n private _onRangeUpdate(sliderChangeNotification: any): void {\r\n // Need to filter out mousemove events as these cause errors after the menu updates and slider re-renders\r\n if (sliderChangeNotification.eventType !== 'mousemove') {\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\r\n if (productRefinerValue && sliderChangeNotification) {\r\n onToggle({\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: sliderChangeNotification.firstThumbValue,\r\n rangeEnd: sliderChangeNotification.secondThumbValue\r\n });\r\n\r\n this._focusOnSliderThumb(sliderChangeNotification);\r\n }\r\n }\r\n }\r\n\r\n private _onRangeUpdateEnd(sliderChangeNotification: any): void {\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\r\n if (productRefinerValue && sliderChangeNotification) {\r\n onToggle({\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: sliderChangeNotification.firstThumbValue,\r\n rangeEnd: sliderChangeNotification.secondThumbValue\r\n });\r\n\r\n this._focusOnSliderThumb(sliderChangeNotification);\r\n }\r\n }\r\n\r\n private _focusOnSliderThumb(sliderChangeNotification: any): void {\r\n if (sliderChangeNotification.id) {\r\n const element = document.getElementById(`${sliderChangeNotification.id}range`);\r\n if (element) {\r\n setTimeout(() => {\r\n element.focus();\r\n }, 0);\r\n }\r\n }\r\n }\r\n\r\n private _handleRangeTooltipText(tooltip: number): string {\r\n return this._formatPrice(`${tooltip}`);\r\n }\r\n}\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { RatingComponent, SwatchComponent } from '@msdyn365-commerce/components';\r\nimport { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\r\nimport { ProductRefinerSource, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\r\nimport { checkIfShouldDisplayAsSwatch, DimensionTypes, IDimensionsApp, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { format, getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { IRefineItemCommonProps } from './refine-item.props.common';\r\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\r\n\r\n/**\r\n * RefineItem properties.\r\n */\r\nexport interface IRefineItemProps {\r\n parentProductRefinerHierarchy: IProductRefinerHierarchy;\r\n productRefinerValue: ProductRefinerValue;\r\n selectedRefinementCriterion: ProductRefinerValue | undefined;\r\n selectedRefinerValues?: ProductRefinerValue[];\r\n refineItemCommonProps: IRefineItemCommonProps;\r\n isDisabled: boolean;\r\n context: ICoreContext>;\r\n moduleId: string;\r\n moduleTypeName: string;\r\n index?: number;\r\n productCountAriaLabel?: string;\r\n singleProductCountAriaLabel?: string;\r\n refineItemAriaLabel?: string;\r\n refineItemsAriaLabel?: string;\r\n isMobileView?: boolean;\r\n\r\n /**\r\n * The telemetry content\r\n */\r\n telemetryContent?: ITelemetryContent;\r\n onToggle(notfication: Readonly): void;\r\n urlBuilder(refiner: IRefineItemToggleNotification): string;\r\n}\r\n\r\n/**\r\n * Refine item state.\r\n */\r\nexport interface IRefineItemState extends React.ComponentState {\r\n isChecked: boolean;\r\n renderingError?: object;\r\n}\r\n\r\n/**\r\n * Single-select and multi-select refine item component (controlled by RefineSubmenu).\r\n */\r\nexport default class RefineItem extends React.Component {\r\n private readonly anchorType: React.RefObject;\r\n\r\n private readonly payLoad: IPayLoad;\r\n\r\n public constructor(props: IRefineItemProps) {\r\n super(props);\r\n this._onClick = this._onClick.bind(this);\r\n this.state = {\r\n isChecked: !!this.props.selectedRefinementCriterion\r\n };\r\n this.anchorType = React.createRef();\r\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, '');\r\n }\r\n\r\n public shouldComponentUpdate(nextProps: IRefineItemProps, nextState: IRefineItemState): boolean {\r\n if (this.state === nextState && this.props === nextProps) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n public render(): JSX.Element | undefined {\r\n const {\r\n isDisabled,\r\n refineItemCommonProps,\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n selectedRefinementCriterion,\r\n productCountAriaLabel,\r\n singleProductCountAriaLabel,\r\n index,\r\n children,\r\n onToggle,\r\n context,\r\n telemetryContent,\r\n refineItemAriaLabel,\r\n refineItemsAriaLabel,\r\n ...attrs\r\n } = this.props;\r\n if (!productRefinerValue) {\r\n refineItemCommonProps.telemetry.error('[refine-item] Cannot render refineItem without productRefinerValue');\r\n return undefined;\r\n }\r\n if (!productRefinerValue.LeftValueBoundString) {\r\n refineItemCommonProps.telemetry.warning(\r\n `[refine-item] RefineItem without LeftValueBoundString: ${JSON.stringify(productRefinerValue)}`\r\n );\r\n }\r\n const isSingleSelect = parentProductRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect;\r\n let itemTypeClassName = isSingleSelect ? 'single-select' : 'multi-select';\r\n itemTypeClassName = `ms-refine-submenu-item ${itemTypeClassName}`;\r\n const inputType = isSingleSelect ? 'radio' : 'checkbox';\r\n const isChecked = !!selectedRefinementCriterion;\r\n itemTypeClassName = isChecked ? `${itemTypeClassName}-checked` : itemTypeClassName;\r\n if (parentProductRefinerHierarchy.SourceValue === ProductRefinerSource.Rating) {\r\n return this._renderRating(\r\n productRefinerValue,\r\n parentProductRefinerHierarchy,\r\n isChecked,\r\n context,\r\n index,\r\n telemetryContent,\r\n productCountAriaLabel,\r\n singleProductCountAriaLabel\r\n );\r\n }\r\n this.payLoad.contentAction.etext = productRefinerValue.LeftValueBoundLocalizedString ?? productRefinerValue.LeftValueBoundString;\r\n const attribute = getTelemetryAttributes(telemetryContent!, this.payLoad);\r\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\r\n const productText = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\r\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\r\n const productCount = productRefinerValue.Count || 0;\r\n let refineMenuItemAriaLabel;\r\n if (productCount === 1) {\r\n refineMenuItemAriaLabel = refineItemAriaLabel\r\n ? format(refineItemAriaLabel, parentProductRefinerHierarchy.KeyName, productText)\r\n : '';\r\n } else {\r\n refineMenuItemAriaLabel = refineItemsAriaLabel\r\n ? format(refineItemsAriaLabel, parentProductRefinerHierarchy.KeyName, productText, productCount)\r\n : '';\r\n }\r\n\r\n const swatch = this._renderSwatch();\r\n return (\r\n \r\n \r\n {swatch}\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n private _renderSwatch(): JSX.Element | null {\r\n const productRefinerValue = this.props.productRefinerValue;\r\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\r\n const text = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\r\n\r\n const dimensionType = (this.props.parentProductRefinerHierarchy.KeyName?.toLocaleLowerCase() ?? '') as DimensionTypes;\r\n const hasColor = !StringExtensions.isNullOrWhitespace(productRefinerValue.SwatchColorHexCode);\r\n const hasImage = !StringExtensions.isNullOrWhitespace(productRefinerValue.SwatchImageUrl);\r\n const hasValidSwatch = hasColor || hasImage;\r\n const shouldDisplayAsSwatch =\r\n hasValidSwatch && checkIfShouldDisplayAsSwatch(dimensionType, this.props.context as ICoreContext);\r\n const swatchItems = shouldDisplayAsSwatch\r\n ? [\r\n {\r\n itemId: `${productRefinerValue.RefinerRecordId ?? ''}-${dimensionType}-${text}`,\r\n value: text,\r\n dimensionType,\r\n colorHexCode: productRefinerValue.SwatchColorHexCode,\r\n imageUrl: productRefinerValue.SwatchImageUrl\r\n }\r\n ]\r\n : undefined;\r\n\r\n if (!swatchItems) {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n );\r\n }\r\n\r\n private _getRefinerUrl(): string {\r\n const { urlBuilder, parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\r\n\r\n if (productRefinerValue) {\r\n return urlBuilder({\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n isSelecting: !selectedRefinementCriterion\r\n });\r\n }\r\n\r\n return '';\r\n }\r\n\r\n private readonly _onClick = (e: React.MouseEvent): void => {\r\n e.preventDefault();\r\n\r\n const { parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\r\n if (productRefinerValue) {\r\n this.props.onToggle({\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n isSelecting: !selectedRefinementCriterion\r\n });\r\n\r\n setTimeout(() => {\r\n this.anchorType.current && this.anchorType.current.focus();\r\n }, 0);\r\n }\r\n };\r\n\r\n private _renderRating(\r\n productRefinerValue: ProductRefinerValue,\r\n parentProductRefinerHierarchy: IProductRefinerHierarchy,\r\n isChecked: boolean,\r\n context: ICoreContext,\r\n index?: number,\r\n telemetryContent?: ITelemetryContent,\r\n ratingUserCountAriaLabel?: string,\r\n ratingSingleUserCountAriaLabel?: string\r\n ): JSX.Element | undefined {\r\n if (productRefinerValue.LeftValueBoundString) {\r\n this.payLoad.contentAction.etext = productRefinerValue.LeftValueBoundLocalizedString;\r\n const attribute = getTelemetryAttributes(telemetryContent!, this.payLoad);\r\n const refinerRating = Number.parseInt(productRefinerValue.LeftValueBoundString, 10);\r\n const ratingRefiner = this.props.selectedRefinerValues?.find(\r\n value => value.DataTypeValue === productRefinerValue.DataTypeValue\r\n );\r\n const selectedRating = Number.parseInt(ratingRefiner?.LeftValueBoundString || '0', 10);\r\n const defaultChkProductCount = 1;\r\n let ratingComponentClass: string = 'ms-rating-component';\r\n if (refinerRating > selectedRating) {\r\n ratingComponentClass = `${ratingComponentClass}__up`;\r\n } else if (refinerRating < selectedRating) {\r\n ratingComponentClass = `${ratingComponentClass}__down`;\r\n } else {\r\n ratingComponentClass = `${ratingComponentClass}__current`;\r\n }\r\n const productCountAriaLabelValue =\r\n productRefinerValue.Count !== undefined && productRefinerValue.Count === defaultChkProductCount\r\n ? ratingSingleUserCountAriaLabel && format(ratingSingleUserCountAriaLabel, productRefinerValue.Count)\r\n : ratingUserCountAriaLabel && format(ratingUserCountAriaLabel, productRefinerValue.Count);\r\n return (\r\n \r\n \r\n \r\n \r\n {productRefinerValue.Count !== undefined && `(${productRefinerValue.Count})`}\r\n \r\n \r\n \r\n );\r\n }\r\n return undefined;\r\n }\r\n}\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\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, ProductRefinerValueDataTypeValue } from './utilities';\r\n\r\n/**\r\n * Properties associated with the RefineSubmenu component.\r\n */\r\nexport interface IRefineSubmenuProps {\r\n tempRangeTypeTODO: RangeRefineItemType;\r\n minValueSliderThumbAriaLabel?: string;\r\n maxValueSliderThumbAriaLabel?: string;\r\n productRefinerHierarchy: IProductRefinerHierarchy;\r\n selectedRefinerValues: ProductRefinerValue[];\r\n refineItemCommonProps: IRefineItemCommonProps;\r\n isDisabled: boolean;\r\n isExpandedOnInitialLoad: boolean;\r\n context: ICoreContext>;\r\n moduleId: string;\r\n moduleTypeName: string;\r\n productCountAriaLabel?: string;\r\n singleProductCountAriaLabel?: string;\r\n refineItemAriaLabel?: string;\r\n refineItemsAriaLabel?: string;\r\n isMobile?: boolean;\r\n\r\n /**\r\n * The telemetry content\r\n */\r\n telemetryContent?: ITelemetryContent;\r\n onUpdateRefiners(notfication: Readonly): void;\r\n urlBuilder(refiner: IRefineItemToggleNotification): string;\r\n}\r\n\r\n/**\r\n * Refine submenu state.\r\n */\r\nexport interface IRefineSubmenuState extends React.ComponentState {\r\n expanded: boolean;\r\n}\r\n/**\r\n * Sizes need to sort by increasing size, not default sort by most items under the option first.\r\n * (tested using dimension sort order from D365, but looks like retail server overrides it)\r\n */\r\nconst sizeSort = ['xxxs', 'xxs', 'xs', 's', 'm', 'l', 'xl', 'xxl', 'xxxl'];\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 //; expanded has become show all / less\r\n let isExpanded = false; //this.props.isExpandedOnInitialLoad;\r\n\r\n if (this.props.productRefinerHierarchy.DataTypeValue === ProductRefinerValueDataTypeValue.Range || props.isMobile) {\r\n isExpanded = true;\r\n }\r\n\r\n this.state = {\r\n expanded: isExpanded\r\n };\r\n }\r\n\r\n public shouldComponentUpdate(nextProps: IRefineSubmenuProps, nextState: IRefineSubmenuState): boolean {\r\n if (this.state === nextState && this.props === nextProps) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { productRefinerHierarchy, refineItemCommonProps, isMobile } = 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 {!isRangeType(productRefinerHierarchy.DataTypeValue) && !!!isMobile && (\r\n
    \r\n {this.state.expanded ? refineItemCommonProps.showLessText : refineItemCommonProps.showAllText}\r\n
    \r\n )}\r\n \r\n {this._renderChildItems(productRefinerHierarchy, this.state.expanded)}\r\n {/* */}\r\n
    \r\n );\r\n }\r\n\r\n private _renderChildItems(productRefinerHierarchy: IProductRefinerHierarchy, showAll: boolean): JSX.Element | null {\r\n if (isRangeType(productRefinerHierarchy.DataTypeValue)) {\r\n return this._renderRange(productRefinerHierarchy);\r\n }\r\n return this._renderSingleMultiSelect(productRefinerHierarchy, showAll);\r\n }\r\n\r\n private _renderSingleMultiSelect(productRefinerHierarchy: IProductRefinerHierarchy, showAll: boolean): JSX.Element | null {\r\n const {\r\n isDisabled,\r\n refineItemCommonProps,\r\n selectedRefinerValues,\r\n context,\r\n productCountAriaLabel,\r\n singleProductCountAriaLabel,\r\n refineItemAriaLabel,\r\n refineItemsAriaLabel,\r\n isMobile\r\n } = this.props;\r\n const showTop = 4;\r\n const isSingleSelect =\r\n productRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect &&\r\n productRefinerHierarchy.SourceValue === ProductRefinerSource.Rating;\r\n const role = isSingleSelect ? { role: 'listbox' } : undefined;\r\n let refinerValuesList =\r\n productRefinerHierarchy.Values.sort((a, b) => {\r\n //performing a sort because seems inconsistent in retail server rsponse (some alphabetical, some by numeber of items per option, all seem to ignore any order configured in D365 )\r\n if (productRefinerHierarchy.KeyName?.toLocaleLowerCase() === 'size') {\r\n // some sizes defined in order in and array\r\n const posA = sizeSort.findIndex(item => item.toLocaleLowerCase() === a.LeftValueBoundString?.toLocaleLowerCase());\r\n const posB = sizeSort.findIndex(item => item.toLocaleLowerCase() === b.LeftValueBoundString?.toLocaleLowerCase());\r\n if (posA >= 0 && posB >= 0) {\r\n return posA - posB;\r\n } else if (posA >= 0) {\r\n return -1;\r\n } else {\r\n return (b.Count ?? 0) - (a.Count ?? 0) + 1000000; // just make sure any other sizes are after the defined ones\r\n }\r\n }\r\n // sort by refiner values with most items first\r\n return (b.Count ?? 0) - (a.Count ?? 0);\r\n }) || [];\r\n if (!showAll && refinerValuesList.length > showTop) {\r\n refinerValuesList = refinerValuesList.slice(0, showTop);\r\n }\r\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\r\n if (!child) {\r\n refineItemCommonProps.telemetry.error(\r\n `[refine-submenu] Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\r\n );\r\n return null;\r\n }\r\n\r\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\r\n\r\n return (\r\n \r\n refinerValuesList.find(value => value.RefinerRecordId === selectedValue.RefinerRecordId)\r\n )}\r\n refineItemCommonProps={refineItemCommonProps}\r\n onToggle={this._onToggleItem}\r\n urlBuilder={this.props.urlBuilder}\r\n isDisabled={isDisabled}\r\n key={index}\r\n index={index}\r\n context={context}\r\n moduleId={this.props.moduleId}\r\n moduleTypeName={this.props.moduleTypeName}\r\n telemetryContent={this.props.telemetryContent}\r\n productCountAriaLabel={productCountAriaLabel}\r\n refineItemAriaLabel={refineItemAriaLabel}\r\n refineItemsAriaLabel={refineItemsAriaLabel}\r\n singleProductCountAriaLabel={singleProductCountAriaLabel}\r\n isMobileView={isMobile}\r\n />\r\n );\r\n });\r\n return (\r\n \r\n {listItems}\r\n \r\n );\r\n }\r\n\r\n private _getRangeType(productRefinerHierarchy: IProductRefinerHierarchy): 'input' | 'slider' {\r\n if (\r\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Range ||\r\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Slider ||\r\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.SliderWithBars\r\n ) {\r\n return 'slider';\r\n }\r\n return 'input';\r\n }\r\n\r\n private _renderRange(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n const {\r\n isDisabled,\r\n refineItemCommonProps,\r\n selectedRefinerValues,\r\n context,\r\n minValueSliderThumbAriaLabel,\r\n maxValueSliderThumbAriaLabel\r\n } = this.props;\r\n const submenuClassNamePrefix = 'ms-refine-submenu__item list-group-item refine-submenu__item';\r\n const refinerValuesList = productRefinerHierarchy.Values || [];\r\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\r\n if (!child) {\r\n refineItemCommonProps.telemetry.error(\r\n `Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\r\n );\r\n return null;\r\n }\r\n\r\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\r\n\r\n const rangeType = this._getRangeType(productRefinerHierarchy);\r\n const key = selectedRefinementCriterion\r\n ? `${selectedRefinementCriterion.LeftValueBoundString}-${selectedRefinementCriterion.RightValueBoundString}`\r\n : `not-selected-${index}`;\r\n return (\r\n
  • \r\n \r\n
  • \r\n );\r\n });\r\n return
      {listItems}
    ;\r\n }\r\n\r\n private _onToggleItem(itemToggleNotification: IRefineItemToggleNotification): void {\r\n this.props.onUpdateRefiners(itemToggleNotification);\r\n }\r\n\r\n private _onToggleSubmenu(): void {\r\n this.setState(prevState => ({\r\n expanded: !prevState.expanded\r\n }));\r\n }\r\n}\r\n\r\nexport default RefineSubmenu;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport * as React from 'react';\r\n\r\ninterface ISeparator {\r\n separator: string;\r\n}\r\n\r\nexport const Separator: React.FC = ({ separator }) => {separator} ;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport * as React from 'react';\r\n\r\ninterface ITitle {\r\n className: string;\r\n text: string;\r\n}\r\n\r\nexport const Title: React.FC = ({ text, className }) => {text} ;\r\n","/**\r\n * Copyright (c) Microsoft Corporation\r\n * All rights reserved. See License.txt in the project root for license information.\r\n * IOnlyCSearchResultContainer 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 IOnlyCSearchResultContainerConfig extends Msdyn365.IModuleConfig {\r\n itemsPerPage?: number;\r\n variantsToShow?: number;\r\n allowBackNavigation?: boolean;\r\n imageSettings?: Msdyn365.IImageSettings;\r\n expandRefinersCount?: expandRefinersCount;\r\n disableHierarchy?: boolean;\r\n includeAttributes?: boolean;\r\n enableAffiliationBasedPricing?: boolean;\r\n updateRefinerPanel?: boolean;\r\n className?: string;\r\n clientRender?: boolean;\r\n maxSizeDisplay?: number;\r\n wishListLink?: IWishListLinkData;\r\n favouritesHeading?: string;\r\n favouritesContent?: string;\r\n sizesHeading?: string;\r\n campaignItems?: ICampaignItemsData[];\r\n hideCategory?: number;\r\n}\r\n\r\nexport interface IOnlyCSearchResultContainerResources {\r\n noResultsForRefinersText: string;\r\n resultCategoryNotFoundText: string;\r\n resultSearchNotFoundText: string;\r\n paginationAriaLabel: string;\r\n priceFree: string;\r\n priceRangeSeparator: string;\r\n originalPriceText: string;\r\n currentPriceText: string;\r\n ratingAriaLabel: string;\r\n flipperNext: string;\r\n flipperPrevious: string;\r\n searchTextPrefix: string;\r\n numberOfProducts: string;\r\n oneProduct: string;\r\n categoryLinkAriaLabel: string;\r\n sortByDropdownLabel: string;\r\n sortByOptionNameAsc: string;\r\n sortByOptionNameDesc: string;\r\n sortByOptionPriceAsc: string;\r\n sortByOptionPriceDesc: string;\r\n sortByOptionRatingDesc: string;\r\n sortByOptionBestSelling: string;\r\n sortByOptionNewScore: string;\r\n sortByOptionTrendingScore: string;\r\n sortByOptionRelevanceDesc: string;\r\n placeholderTextMax: string;\r\n minLabel: string;\r\n maxLabel: string;\r\n rangeNameFormat: string;\r\n validationErrorNotNumber: string;\r\n validationErrorNotRange: string;\r\n clearAllText: string;\r\n choiceSummaryLabel: string;\r\n choiceFormat: string;\r\n choiceRangeValueFormat: string;\r\n choiceAriaLabel: string;\r\n closeAriaLabel: string;\r\n modalTitle: string;\r\n modalCloseButtonText: string;\r\n minValueSliderThumbAriaLabel: string;\r\n maxValueSliderThumbAriaLabel: string;\r\n featureSimilarLooksTitle: string;\r\n featureSimilarDescriptionTitle: string;\r\n productCountAriaLabel: string;\r\n singleProductCountAriaLabel: string;\r\n swatchItemAriaLabel: string;\r\n refineItemsAriaLabel: string;\r\n refineItemAriaLabel: string;\r\n backtoCategories: string;\r\n lifeTag: string;\r\n newArrivalTag: string;\r\n productsNotFound: string;\r\n newArrivalMsg: string;\r\n productLifeTag: string;\r\n splitSizeText: string;\r\n colorText: string;\r\n showAllText: string;\r\n showLessText: string;\r\n}\r\n\r\nexport interface IWishListLinkData {\r\n linkText?: string;\r\n linkUrl: Msdyn365.ILinkData;\r\n ariaLabel?: string;\r\n openInNewTab?: boolean;\r\n}\r\n\r\nexport const enum CampaignItemsCampaignTextWidthAlignment {\r\n Verticalcenter = 'Verticalcenter',\r\n Verticalleft = 'Verticalleft',\r\n Verticalright = 'Verticalright'\r\n}\r\n\r\nexport const enum CampaignItemsCampaignTextHeightAlignment {\r\n Horizontalcenter = 'Horizontalcenter',\r\n Horizontaltop = 'Horizontaltop',\r\n Horizontalbottom = 'Horizontalbottom'\r\n}\r\n\r\nexport interface ICampaignItemsData {\r\n campaignTitle?: ICampaignTitleData;\r\n campaignIndex?: number;\r\n campaignImage?: Msdyn365.IImageData;\r\n campaignText?: string;\r\n campaignTextWidthAlignment?: CampaignItemsCampaignTextWidthAlignment;\r\n campaignTextHeightAlignment?: CampaignItemsCampaignTextHeightAlignment;\r\n campaignLink?: ICampaignLinkData;\r\n}\r\n\r\nexport const enum CampaignTitleTag {\r\n h1 = 'h1',\r\n h2 = 'h2',\r\n h3 = 'h3',\r\n h4 = 'h4',\r\n h5 = 'h5',\r\n h6 = 'h6'\r\n}\r\n\r\nexport interface ICampaignTitleData {\r\n text: string;\r\n tag?: CampaignTitleTag;\r\n}\r\n\r\nexport interface ICampaignLinkData {\r\n linkText?: string;\r\n linkUrl: Msdyn365.ILinkData;\r\n ariaLabel?: string;\r\n openInNewTab?: boolean;\r\n}\r\n\r\nexport interface IOnlyCSearchResultContainerProps extends Msdyn365.IModule {\r\n resources: IOnlyCSearchResultContainerResources;\r\n config: IOnlyCSearchResultContainerConfig;\r\n slots: {\r\n quickview: React.ReactNode[];\r\n };\r\n}\r\n","import { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport { CategoryHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { CommerceProperty, MediaLocation, TextValueTranslation } from '@msdyn365-commerce/retail-proxy';\r\n\r\nexport interface ICategoryProps {\r\n RecordId: number;\r\n OfflineImage?: string;\r\n Name?: string;\r\n ParentCategory?: number;\r\n DisplayOrder?: number;\r\n Images?: MediaLocation[];\r\n NameTranslations?: TextValueTranslation[];\r\n ExtensionProperties?: CommerceProperty[];\r\n Children?: ICategoryProps[] | undefined;\r\n Slug?: string;\r\n Url?: string;\r\n NeutralizedName?: string;\r\n expanded?: boolean;\r\n}\r\nexport interface ICategoryListingState {\r\n displayChildren: boolean;\r\n}\r\n\r\nexport interface ICategoryListingProps {\r\n categoryHierarchy: CategoryHierarchy;\r\n hideCategory?: number;\r\n}\r\n\r\n@observer\r\nexport default class CategoryListing extends React.PureComponent {\r\n constructor(props: Readonly) {\r\n super(props);\r\n this.state = {\r\n displayChildren: true\r\n };\r\n }\r\n\r\n private readonly _toggleCategory = () => {\r\n this.setState({ displayChildren: !this.state.displayChildren });\r\n };\r\n\r\n public render(): JSX.Element | null {\r\n const currentCategory = this.props.categoryHierarchy;\r\n const { displayChildren } = this.state;\r\n\r\n if (this.props.hideCategory === currentCategory.RecordId || (currentCategory.Children ?? []).length === 0) {\r\n return null;\r\n }\r\n return (\r\n
    \r\n
    \r\n {currentCategory.Children && (\r\n \r\n {currentCategory?.Name} \r\n \r\n )}\r\n {displayChildren\r\n ? currentCategory.Children?.map((item: ICategoryProps, index: number) => {\r\n return (\r\n \r\n );\r\n })\r\n : null}\r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n","import { ProductPrice, ProductsDataActions, ProductSearchResult, ProjectionDomain } from '@msdyn365-commerce/retail-proxy';\r\nimport { QueryResultSettingsProxy, ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { CacheType, createObservableDataAction, IAction, IActionContext, IActionInput, getCatalogId } from '@msdyn365-commerce/core';\r\n\r\n/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/**\r\n * Input class for the GetPriceForProductSearchResult Data Action.\r\n */\r\nexport class PriceForProductSearchResultInput implements IActionInput {\r\n public products: ProductSearchResult[];\r\n\r\n constructor(products: ProductSearchResult[]) {\r\n this.products = products;\r\n }\r\n\r\n /**\r\n * Get the cache key.\r\n * @returns The cache key.\r\n */\r\n public getCacheKey = (): string => `PriceForProductSearchResult-${JSON.stringify(this.products)}`;\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 => 'ProductSearchResult';\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 GetPriceForProductSearchResultDataAction.\r\n * @param products -- The product search result.\r\n * @returns The input.\r\n */\r\nconst createInput = (products: ProductSearchResult[]): PriceForProductSearchResultInput => {\r\n return new PriceForProductSearchResultInput(products);\r\n};\r\n\r\n/**\r\n * The Action Method for the GetPriceForProductSearchResult Data Action\r\n * Gets the active price for product search result via the getActivePrice RetailServer API.\r\n * @param input -- The data input.\r\n * @param context -- The action context.\r\n * @returns The product search result updated with price.\r\n */\r\nexport async function getPriceForProductSearchResultAction(\r\n input: PriceForProductSearchResultInput,\r\n context: IActionContext\r\n): Promise {\r\n let productRecIds: number[];\r\n if (ArrayExtensions.hasElements(input.products)) {\r\n productRecIds = input.products.map(product => product.RecordId);\r\n //Remove duplicate ids from variant splitting\r\n productRecIds = productRecIds.filter((item, index, array) => array.indexOf(item) === index);\r\n } else {\r\n return Promise.resolve([]);\r\n }\r\n\r\n const catalogId = getCatalogId(context.requestContext);\r\n\r\n const projectDomain: ProjectionDomain = { ChannelId: +context.requestContext.apiSettings.channelId, CatalogId: catalogId };\r\n const priceZero = 0;\r\n\r\n try {\r\n const productPrices: ProductPrice[] = await ProductsDataActions.getActivePricesAsync(\r\n { callerContext: context, queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(context) },\r\n projectDomain,\r\n productRecIds,\r\n new Date(),\r\n null,\r\n null,\r\n true,\r\n false,\r\n true\r\n );\r\n\r\n const productResults: ProductSearchResult[] = input.products.map(product => {\r\n const activePrice = productPrices.find(price => price.ProductId === product.RecordId);\r\n if (activePrice) {\r\n product.Price = activePrice.CustomerContextualPrice ?? product.Price;\r\n product.BasePrice = Math.max(\r\n activePrice.BasePrice ?? priceZero,\r\n activePrice.TradeAgreementPrice ?? priceZero,\r\n activePrice.AdjustedPrice ?? priceZero\r\n );\r\n }\r\n return product;\r\n });\r\n\r\n return Promise.resolve(productResults);\r\n } catch (error) {\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument -- existing error type.\r\n if (error instanceof Error) {\r\n context.telemetry.exception(error);\r\n context.telemetry.debug('[getPriceForProductSearchResultAction]Error executing action');\r\n context.telemetry.debug(error.message);\r\n }\r\n throw new Error('[getPriceForProductSearchResultAction]Error executing action');\r\n }\r\n}\r\n\r\n/**\r\n * The getPriceForProductSearchResult data action.\r\n */\r\nexport const getPriceForProductSearchResultDataAction = createObservableDataAction({\r\n id: 'Test',\r\n action: >getPriceForProductSearchResultAction,\r\n input: createInput\r\n});\r\n\r\nexport default getPriceForProductSearchResultAction;\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 {\r\n CategoryHierarchy as CategoryHierarchyData,\r\n IProductRefinerHierarchy,\r\n IProductsDimensionsAvailabilities\r\n} from '@msdyn365-commerce/commerce-entities';\r\nimport MsDyn365, { getCatalogId, ICoreContext } from '@msdyn365-commerce/core';\r\nimport { format, ProductPrice, ProductRefinerValue, SortColumn, TextValueTranslation } from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n ArrayExtensions,\r\n DimensionAvailabilitiesForProductSearchResultInput,\r\n DimensionTypes,\r\n getDimensionAvailabilitiesForProductSearchResultAction,\r\n IDimensionsApp,\r\n PriceForProductSearchResultInput\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n getTelemetryObject,\r\n ILabeledDropdownOnChangeNotification,\r\n ILabeledDropdownOption,\r\n IModuleProps,\r\n INodeProps,\r\n isMobile,\r\n ITelemetryContent,\r\n LabeledDropdown,\r\n UncontrolledPagination,\r\n VariantType\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport { computed, observable, reaction, transaction } 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 ProductListInventoryFilteringOptions,\r\n RefinersByCollectionInput,\r\n sortOptions\r\n} from './actions';\r\nimport { hydrateRefinersFromUrl } from './actions/url-utils';\r\nimport {\r\n ErrorMessage,\r\n FeatureSearchResultItem,\r\n getUpdatedRefinementCriteria,\r\n IChoiceSummaryClickNotification,\r\n IRefineItemCommonProps,\r\n IRefineItemToggleNotification,\r\n ISearchResultModalViewProps,\r\n isMatchingRefinementCriterion,\r\n isRangeType,\r\n Link,\r\n ModalToggle,\r\n ProductSearchResultItems,\r\n SearchResultModal,\r\n Separator,\r\n Title\r\n} from './components';\r\nimport ChoiceSummary from './components/choice-summary';\r\nimport RefineSubmenu from './components/refine-submenu';\r\nimport { ListPageState } from './list-page-state';\r\nimport { IFullProductsSearchResultsWithCount } from './actions/IFullProductsSearchResultsWithCount';\r\nimport { IOnlyCSearchResultContainerData } from './only-c-search-result-container.data';\r\nimport { expandRefinersCount, IOnlyCSearchResultContainerProps } from './only-c-search-result-container.props.autogenerated';\r\nimport CategoryListing from './components/category-listing';\r\nimport { _readFromSessionStorage, _removeFromSessionStorage } from '../../utils/helper';\r\nimport { ProductSearchResultExtended } from './actions/get-full-products-by-collection';\r\nimport { getPriceForProductSearchResultAction } from '../../actions/get-price-for-product-search-result';\r\n\r\nexport interface ISearchResultContainerViewProps extends IOnlyCSearchResultContainerProps {\r\n categoryListing: React.ReactNode;\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 loadMore: (pageNumber: number) => void;\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 initialRefiners: IProductRefinerHierarchy[];\r\n productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\r\n}\r\n\r\ninterface ISortByCollectionState {\r\n selectedSortByOption: ILabeledDropdownOption;\r\n pending: boolean;\r\n}\r\n\r\n/**\r\n *\r\n * SearchResultContainer component.\r\n * @extends {React.PureComponent>}\r\n */\r\n@observer\r\nexport default class SearchResultContainer extends React.PureComponent<\r\n IOnlyCSearchResultContainerProps,\r\n ISearchResultContainerState\r\n> {\r\n @computed get isMobile(): boolean {\r\n return this._viewport === 'xs' || this._viewport === 'sm';\r\n }\r\n\r\n private readonly sortByDropdownOptions: ILabeledDropdownOption[] = [\r\n { key: sortOptions.sortByOptionRelevanceDesc, value: this.props.resources.sortByOptionRelevanceDesc },\r\n { key: sortOptions.sortByOptionNameAsc, value: this.props.resources.sortByOptionNameAsc },\r\n { key: sortOptions.sortByOptionNameDesc, value: this.props.resources.sortByOptionNameDesc },\r\n { key: sortOptions.sortByOptionPriceAsc, value: this.props.resources.sortByOptionPriceAsc },\r\n { key: sortOptions.sortByOptionPriceDesc, value: this.props.resources.sortByOptionPriceDesc },\r\n { key: sortOptions.sortByOptionRatingDesc, value: this.props.resources.sortByOptionRatingDesc },\r\n { key: sortOptions.sortByOptionBestSelling, value: this.props.resources.sortByOptionBestSelling },\r\n { key: sortOptions.sortByOptionNewScore, value: this.props.resources.sortByOptionNewScore },\r\n { key: sortOptions.sortByOptionTrendingScore, value: this.props.resources.sortByOptionTrendingScore }\r\n ];\r\n\r\n private readonly _refineItemCommonProps: IRefineItemCommonProps;\r\n\r\n private readonly _pageType: string | undefined = this.props.context.request.urlTokens.pageType;\r\n\r\n @observable\r\n private _viewport: GridSize = 'lg';\r\n\r\n private readonly _modalToggleRef: React.RefObject;\r\n\r\n private readonly _sortAndFilterContainerRef: React.RefObject;\r\n\r\n private expandrefinerCount: number | undefined = 0;\r\n\r\n private readonly telemetryContent: ITelemetryContent;\r\n\r\n private readonly productPrices: ProductPrice[];\r\n\r\n private readonly defaultPageNumber = 0;\r\n\r\n private readonly catalogId = getCatalogId(this.props.context.request);\r\n\r\n private isListPageStateUpdated: boolean = false;\r\n\r\n private isLoadMore: boolean = true;\r\n\r\n public constructor(props: IOnlyCSearchResultContainerProps, state: ISearchResultContainerState) {\r\n super(props);\r\n this._viewport = props.context.request?.device?.Type === 'Mobile' ? 'xs' : 'lg';\r\n this._modalToggleRef = React.createRef();\r\n this._sortAndFilterContainerRef = React.createRef();\r\n this._toggleModal = this._toggleModal.bind(this);\r\n this._updateViewport = this._updateViewport.bind(this);\r\n this.productPrices = [];\r\n this.state = {\r\n sortingState: {\r\n pending: false,\r\n selectedSortByOption: this.sortByDropdownOptions[0]\r\n },\r\n modalIsOpen: false,\r\n refiners: [],\r\n initialRefiners: []\r\n };\r\n const { placeholderTextMax, minLabel, maxLabel, rangeNameFormat, showAllText, showLessText } = 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 showAllText,\r\n showLessText\r\n };\r\n this.telemetryContent = getTelemetryObject(\r\n this.props.context.request.telemetryPageName!,\r\n this.props.friendlyName,\r\n this.props.telemetry\r\n );\r\n this._updateViewport();\r\n\r\n const {\r\n data: { listPageState, products: productCollection }\r\n } = this.props;\r\n if (!this.isListPageStateUpdated && listPageState.result && productCollection.result) {\r\n this._updateListPageState(listPageState.result, productCollection.result);\r\n this.isListPageStateUpdated = true;\r\n }\r\n }\r\n\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 // VSI Customization to prevent empty Image display\r\n document.addEventListener('DOMNodeInserted', (event: Event) => {\r\n const target = event.target as HTMLElement;\r\n const item =\r\n target?.classList?.contains('msc-empty_image') &&\r\n target?.closest('li')?.classList?.contains('ms-product-search-result__item');\r\n if (item) {\r\n const productCard = target.closest('li');\r\n if (productCard !== null) {\r\n productCard.style.display = 'none';\r\n }\r\n }\r\n });\r\n }\r\n\r\n const listPageState = await this.props.data.listPageState;\r\n // const products = await this.props.data.products;\r\n\r\n // this._updateListPageState(listPageState, products);\r\n\r\n // Initialize reaction based on listPageState properties\r\n reaction(\r\n () => {\r\n return [\r\n listPageState.activeFilters?.length,\r\n listPageState.currentPageNumber,\r\n ArrayExtensions.hasElements(listPageState.sortingCritera?.Columns)\r\n ];\r\n },\r\n async () => {\r\n const newListPageState = await this.props.data.listPageState;\r\n const input = new GetFullProductsByCollectionInput(\r\n newListPageState.pageType,\r\n this.props.context.request.apiSettings,\r\n {\r\n Paging: {\r\n Top: this.props.config.itemsPerPage,\r\n Skip: Math.max(newListPageState.pageSize * (newListPageState.currentPageNumber ?? 0), 0)\r\n },\r\n count: true,\r\n Sorting: newListPageState.sortingCritera ?? {}\r\n },\r\n newListPageState.activeFilters ?? [],\r\n +(this.props.context.request.urlTokens.recordId || 0),\r\n\r\n this.props.context.request.query?.q\r\n ? this.props.context.request.query.q\r\n : JSON.stringify({\r\n ProductId: this.props.context.request.query?.productId,\r\n Recommendation: this.props.context.request.query?.recommendation\r\n }),\r\n !!this.props?.config?.includeAttributes,\r\n this.props.config.updateRefinerPanel,\r\n this.props.context.request.locale,\r\n this.catalogId\r\n );\r\n\r\n const productResults = await getCollectionProducts(input, this.props.context.actionContext);\r\n // VSI Customization for infinte scroll\r\n newListPageState.activeProducts = [...newListPageState.activeProducts, ...productResults.products];\r\n newListPageState.totalProductCount = newListPageState.activeProducts.length;\r\n\r\n this.isLoadMore = productResults.products.length > 0 ? true : false;\r\n\r\n if (this.props.config.enableAffiliationBasedPricing) {\r\n this._getActivePrice().catch(error => {\r\n this.props.telemetry.error(error);\r\n });\r\n }\r\n }\r\n );\r\n\r\n /**\r\n * Separate reaction for updating refiners so it only fires when the filters change\r\n */\r\n reaction(\r\n () => {\r\n return [listPageState.activeFilters?.length];\r\n },\r\n async () => {\r\n const newListPageState = await this.props.data.listPageState;\r\n if (this.props.config.updateRefinerPanel) {\r\n const refinerInput = new RefinersByCollectionInput(\r\n newListPageState.pageType,\r\n this.props.context.request.apiSettings,\r\n {\r\n Paging: {\r\n Top: this.props.config.itemsPerPage,\r\n Skip: Math.max(\r\n newListPageState.pageSize * (newListPageState.currentPageNumber ?? this.defaultPageNumber),\r\n this.defaultPageNumber\r\n )\r\n },\r\n count: true,\r\n Sorting: newListPageState.sortingCritera ?? {}\r\n },\r\n newListPageState.activeFilters ?? [],\r\n +(this.props.context.request.urlTokens.recordId || 0),\r\n this.props.context.request.query?.q\r\n ? this.props.context.request.query.q\r\n : this.props.context.request.query?.productId,\r\n false,\r\n this.props.config.updateRefinerPanel,\r\n undefined,\r\n this.catalogId\r\n );\r\n\r\n const refiners = await getCollectionRefinersAction(refinerInput, this.props.context.actionContext);\r\n this.setState({ refiners });\r\n }\r\n }\r\n );\r\n\r\n if (this.props.config.enableAffiliationBasedPricing) {\r\n this._getActivePrice().catch(error => {\r\n this.props.telemetry.error(error);\r\n });\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 const initialRefiners = this._getValidRefiners() ?? [];\r\n this.setState({ initialRefiners });\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n if (MsDyn365.isBrowser && window.removeEventListener) {\r\n window.removeEventListener('resize', this._updateViewport);\r\n }\r\n }\r\n\r\n public render(): JSX.Element {\r\n const {\r\n config: { imageSettings, className },\r\n resources,\r\n data: { listPageState }\r\n } = this.props;\r\n\r\n // if (!this.isListPageStateUpdated && listPageState.result && productCollection.result) {\r\n // this._updateListPageState(listPageState.result, productCollection.result);\r\n // this.isListPageStateUpdated = true;\r\n // }\r\n\r\n const products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\r\n const searchProduct = listPageState.result?.featureProduct ?? null;\r\n\r\n // VSI Customization\r\n const totalItems = (this.props.data.listPageState.result && this.props.data.listPageState.result.totalProductCount) || 0;\r\n let errorText = '';\r\n if (!ArrayExtensions.hasElements(products) && totalItems === 0) {\r\n errorText = this._pageType === 'Category' ? resources.resultCategoryNotFoundText : resources.resultSearchNotFoundText;\r\n }\r\n const productsComponent = this._getProducts();\r\n const categoryListingComponent = this._getCategoryListing();\r\n const featureComponent = (\r\n \r\n );\r\n\r\n const searchResultContainerViewProps = {\r\n ...this.props,\r\n categoryListing: categoryListingComponent,\r\n products: productsComponent,\r\n TitleViewProps: this._getCollectionTitle(),\r\n categoryHierarchy: !this.props.config.disableHierarchy && this._getCategoryHierarchy(),\r\n refineMenu: this._getRefineMenu(),\r\n className: classnames('ms-search-result-container', className),\r\n SearchResultContainer: {\r\n moduleProps: this.props,\r\n className: classnames('ms-search-result-container', className)\r\n },\r\n sortByOptions: this.props.data.listPageState.result?.totalProductCount !== 0 ? this._getSortingDropDown() : null,\r\n pagination: this._getPagination(),\r\n ProductsContainer: { className: 'ms-search-result-container__Products' },\r\n ProductSectionContainer: { className: 'ms-search-result-container__product-section' },\r\n CategoryNavContainer: { className: 'ms-search-result-container__category-nav-section' },\r\n RefineAndProductSectionContainer: { className: 'ms-search-result-container__refine-product-section' },\r\n choiceSummary: this._getChoiceSummary(),\r\n modalToggle:\r\n this.props.data.listPageState.result?.totalProductCount !== 0 ? (\r\n \r\n ) : null,\r\n searchResultModal: this._getSearchResultModal(),\r\n isMobile: this.isMobile,\r\n errorMessage: errorText && ,\r\n FeatureSearchContainer: { className: 'ms-feature-search-result' },\r\n similarLookProduct: searchProduct ? featureComponent : null,\r\n productPrices: this.productPrices,\r\n loadMore: this._loadMoreProducts\r\n };\r\n return this.props.renderView(searchResultContainerViewProps) as React.ReactElement;\r\n }\r\n\r\n /**\r\n * Update the list page state with initial data.\r\n * @param listPageState -- List page State.\r\n * @param products -- Products.\r\n */\r\n private readonly _updateListPageState = (listPageState: ListPageState, products: IFullProductsSearchResultsWithCount): void => {\r\n let querySorting: SortColumn[] = [];\r\n const defaultPageNumber: number = 10;\r\n\r\n if (this._pageType === 'Category') {\r\n listPageState.pageType = 'Category';\r\n } else {\r\n listPageState.pageType = 'Search';\r\n }\r\n\r\n if (this.props.context.request.query?.sorting) {\r\n querySorting = JSON.parse(decodeURIComponent(this.props.context.request.query.sorting)) as SortColumn[];\r\n }\r\n\r\n // VSI Customization for scroll restoration\r\n const sessionCategoryId = parseInt(_readFromSessionStorage('pCategoryId', this.props.context) || '0', 10);\r\n const categoryExist = sessionCategoryId === this.props.data.category.result?.RecordId;\r\n\r\n const sessionProducts = _readFromSessionStorage('products', this.props.context) || '';\r\n const scrollProducts: ProductSearchResultExtended[] =\r\n sessionProducts && categoryExist ? JSON.parse(sessionProducts) : products.products;\r\n\r\n const sessionPageNo = parseInt(_readFromSessionStorage('pageNo', this.props.context) || '0', 10);\r\n const scrollPageNo: number =\r\n sessionPageNo && categoryExist\r\n ? sessionPageNo\r\n : (this.props.context.request.query && +this.props.context.request.query.skip / (this.props.config.itemsPerPage || 10)) ||\r\n 0;\r\n\r\n listPageState.currentPageNumber = scrollPageNo;\r\n /* (this.props.context.request.query &&\r\n +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 ?? defaultPageNumber;\r\n listPageState.activeProducts = scrollProducts; // products.products;\r\n listPageState.totalProductCount = products.count;\r\n listPageState.activeFilters = hydrateRefinersFromUrl(this.props.context.request);\r\n\r\n if (this.props.context.request.query?.productId) {\r\n const featureProduct = this.props.data.featureProduct.result;\r\n if (featureProduct) {\r\n listPageState.featureProduct = featureProduct;\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * Get products dimension availabilities.\r\n * @returns Void.\r\n */\r\n private readonly _getProductsDimensionsAvailabilities = async (): Promise => {\r\n const productsList = this.props.data.listPageState.result?.activeProducts ?? [];\r\n\r\n const productsDimensionAvailabilities = await getDimensionAvailabilitiesForProductSearchResultAction(\r\n new DimensionAvailabilitiesForProductSearchResultInput(productsList, this.props.context as ICoreContext),\r\n this.props.context.actionContext\r\n );\r\n\r\n if (ArrayExtensions.hasElements(productsDimensionAvailabilities)) {\r\n this.setState({ productsDimensionAvailabilities });\r\n }\r\n };\r\n\r\n /**\r\n * Get the active price for the products.\r\n */\r\n private readonly _getActivePrice = async (): Promise => {\r\n var productsList = this.props.data.listPageState.result?.activeProducts ?? [];\r\n\r\n //Uses custom action\r\n const products = await getPriceForProductSearchResultAction(\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 modalClear: resources.clearAllText\r\n },\r\n isOpen: this.state.modalIsOpen,\r\n returnRef: this._modalToggleRef,\r\n onModalToggle: this._toggleModal,\r\n onClearModal: this._onClearClicked\r\n });\r\n };\r\n\r\n private readonly _getCollectionTitle = (): ITitleViewProps => {\r\n const { data, context, resources } = this.props;\r\n\r\n let collectionTitle: string | undefined = '';\r\n if (context && context.request && context.request.query && context.request.query.q) {\r\n collectionTitle = `\"${context.request.query.q}\"`;\r\n } else {\r\n collectionTitle =\r\n (data.category.result &&\r\n SearchResultContainer.getFriendlyName(context.request.locale, data.category.result.NameTranslations)) ||\r\n (data.category.result && data.category.result.Name);\r\n }\r\n let productCountText = '';\r\n let productCountNumber: number | undefined;\r\n if (data.listPageState && data.listPageState.result && data.listPageState.result.totalProductCount !== undefined) {\r\n productCountNumber = data.listPageState.result.totalProductCount;\r\n } else if (data.products && data.products.result) {\r\n productCountNumber = data.products.result.count;\r\n }\r\n\r\n if (productCountNumber && productCountNumber !== 0) {\r\n productCountText =\r\n productCountNumber !== 1\r\n ? format(this.props.resources.numberOfProducts, productCountNumber)\r\n : this.props.resources.oneProduct;\r\n } else {\r\n productCountText = format(this.props.resources.numberOfProducts, 0);\r\n }\r\n const pageName = context.request.telemetryPageName ? `result-count-${context.request.telemetryPageName.toLowerCase()}` : '';\r\n const titlePrefix = ;\r\n const titleText = collectionTitle && <Title className='ms-search-result__collection-title-text' text={collectionTitle} />;\r\n const titleCount = <Title className='ms-search-result__collection-title-count' text={productCountText} />;\r\n\r\n return {\r\n TitleContainer: { className: `ms-search-result-container__title ${pageName}` },\r\n title: {\r\n titlePrefix,\r\n titleText,\r\n titleCount\r\n }\r\n };\r\n };\r\n\r\n private readonly _getCategoryHierarchy = (): ICategoryHierarchyViewProps => {\r\n const { data } = this.props;\r\n const categoryHierarchy = data.categoryHierarchy.result;\r\n const categoryLinks =\r\n categoryHierarchy &&\r\n categoryHierarchy.map((value: CategoryHierarchyData, index: number) => {\r\n return (\r\n <Link\r\n key={index}\r\n text={value.Name}\r\n ariaLabel={`${this.props.resources.categoryLinkAriaLabel} ${value.Name}`}\r\n href={value.Url}\r\n />\r\n );\r\n });\r\n const categoryLinkSeparator = <Separator separator='/' />;\r\n\r\n return {\r\n CategoryHierarchyContainer: { tag: 'nav', className: 'ms-search-result-container__category-hierarchy' },\r\n categoryHierarchyList: categoryLinks,\r\n categoryHierarchySeparator: categoryLinkSeparator\r\n };\r\n };\r\n\r\n private readonly _getSortingDropDown = (): ISortByViewProps => {\r\n const { resources } = this.props;\r\n const activeDropdown = this._getCurrentlySelectedOption() || this.state.sortingState.selectedSortByOption;\r\n let dropdownOptions = this._getAllSortByOptions();\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- App config settings are of \"any\" value.\r\n if (this.props.context.app.config.hideRating) {\r\n dropdownOptions = dropdownOptions.filter(dropdownOption => dropdownOption.key !== sortOptions.sortByOptionRatingDesc);\r\n }\r\n\r\n const dropdown = (\r\n <LabeledDropdown\r\n labelClassname='reviews-list-sort-by'\r\n labelText={resources.sortByDropdownLabel}\r\n dropdownId='categorySortByDropdown'\r\n dropdownClassname='reviews-list-dropdown'\r\n toggleColor='link'\r\n dropdownOptions={dropdownOptions}\r\n selectedOption={activeDropdown}\r\n onSelectOption={this._updateSortByDropdown}\r\n ref={this._sortAndFilterContainerRef}\r\n />\r\n );\r\n return {\r\n SortingContainer: { className: 'ms-search-result-container__Sort-by-category' },\r\n sortByDropDown: dropdown\r\n };\r\n };\r\n\r\n private readonly _getPagination = (): React.ReactNode => {\r\n const { config, context, data, resources } = this.props;\r\n const listPageState = data.listPageState.result;\r\n const fullUrl = getCurrentUrl(context.request);\r\n const itemsPerPage = config.itemsPerPage || 10;\r\n const skipCount = listPageState?.currentPageNumber\r\n ? listPageState.currentPageNumber * (this.props.config.itemsPerPage || 10)\r\n : (this.props.context.request.query && +this.props.context.request.query.skip) || 0;\r\n const totalItems = listPageState?.totalProductCount || 0;\r\n const previousText = resources.flipperPrevious;\r\n const nextText = resources.flipperNext;\r\n\r\n if (totalItems <= itemsPerPage) {\r\n return null;\r\n }\r\n return (\r\n <UncontrolledPagination\r\n className='ms-search-result-container__pagination'\r\n role='navigation'\r\n aria-label={resources.paginationAriaLabel}\r\n url={fullUrl.href}\r\n qsp='skip'\r\n items={totalItems}\r\n itemsPerPage={itemsPerPage}\r\n startingItem={skipCount}\r\n previousText={this._renderPrev(previousText)}\r\n nextText={this._renderNext(nextText)}\r\n previousAriaLabel={previousText}\r\n nextAriaLabel={nextText}\r\n telemetryContent={this.telemetryContent}\r\n />\r\n );\r\n };\r\n\r\n private _getValidRefiners = (): IProductRefinerHierarchy[] | undefined => {\r\n const { data } = this.props;\r\n const validRefiners =\r\n this.props.config.updateRefinerPanel && ArrayExtensions.hasElements(this.state.refiners)\r\n ? this.state.refiners.filter(refiner => {\r\n return ArrayExtensions.hasElements(refiner.Values) && !this._shouldHideFromRefiners(refiner);\r\n })\r\n : data.refiners.result &&\r\n data.refiners.result.filter(refiner => {\r\n return ArrayExtensions.hasElements(refiner.Values) && !this._shouldHideFromRefiners(refiner);\r\n });\r\n return validRefiners;\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 = this._getValidRefiners();\r\n const activeRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n\r\n this._getexpandRefinerCount(validRefiners && validRefiners.length, config.expandRefinersCount);\r\n // not currently using because expanding has been change to show more / less\r\n const expandedRefiners = this.expandrefinerCount;\r\n const subMenus =\r\n validRefiners &&\r\n validRefiners.map((productRefinerHierarchy: IProductRefinerHierarchy, index: number) => {\r\n const initalRefiner = this.state.initialRefiners.find(r => r.KeyName === productRefinerHierarchy.KeyName);\r\n if (initalRefiner && isRangeType(productRefinerHierarchy.DataTypeValue)) {\r\n productRefinerHierarchy = initalRefiner;\r\n }\r\n return (\r\n <RefineSubmenu\r\n productRefinerHierarchy={productRefinerHierarchy}\r\n selectedRefinerValues={activeRefiners}\r\n refineItemCommonProps={this._refineItemCommonProps}\r\n minValueSliderThumbAriaLabel={this.props.resources.minValueSliderThumbAriaLabel}\r\n maxValueSliderThumbAriaLabel={this.props.resources.maxValueSliderThumbAriaLabel}\r\n key={index}\r\n onUpdateRefiners={this._onUpdateRefiners}\r\n urlBuilder={this._buildRefinerUrl}\r\n isDisabled={false}\r\n isExpandedOnInitialLoad={!!(expandedRefiners && expandedRefiners > index)}\r\n tempRangeTypeTODO={tempRangeTypeTODO}\r\n context={context}\r\n moduleId={this.props.id}\r\n moduleTypeName={this.props.typeName}\r\n telemetryContent={this.telemetryContent}\r\n productCountAriaLabel={this.props.resources.productCountAriaLabel}\r\n refineItemAriaLabel={this.props.resources.refineItemAriaLabel}\r\n refineItemsAriaLabel={this.props.resources.refineItemsAriaLabel}\r\n singleProductCountAriaLabel={this.props.resources.singleProductCountAriaLabel}\r\n isMobile={this.isMobile}\r\n />\r\n );\r\n });\r\n\r\n return {\r\n RefineMenuContainer: { className: 'ms-search-result-container__refine-menu' },\r\n RefinerSectionContainer: { className: 'ms-search-result-container__refiner-section' },\r\n refiners: subMenus\r\n };\r\n };\r\n\r\n /**\r\n * Should hide from refiners.\r\n * @param refiner - The refiner.\r\n * @returns ShouldHideFromRefiners.\r\n */\r\n private readonly _shouldHideFromRefiners = (refiner: IProductRefinerHierarchy): boolean => {\r\n // Always hide sortable attribute since it's just for sorting products in Azure search, not for customers\r\n return (\r\n // refiner.RecordId === this.props.data.products.result?.inventoryAwareSortableAttributeId ||\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app configs are of generic type\r\n this.props.context.app.config.productListInventoryDisplay === ProductListInventoryFilteringOptions.HideOOS &&\r\n refiner.RecordId === this.props.data.products.result?.channelInventoryConfigurationId\r\n );\r\n };\r\n\r\n private readonly _getChoiceSummary = (): React.ReactNode => {\r\n const { resources, data, telemetry } = this.props;\r\n const selectedRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n return (\r\n <ChoiceSummary\r\n classNames='ms-choice-summary-by-category'\r\n clearAllText={resources.clearAllText}\r\n label={resources.choiceSummaryLabel}\r\n closeAriaLabel={resources.closeAriaLabel}\r\n selectedChoices={selectedRefiners}\r\n // @ts-expect-error: NOTE Type-unsafe line below, null refinersByCategoryHierarchy case not handled\r\n refinerHierarchy={data.refiners.result}\r\n choiceFormat={resources.choiceFormat}\r\n choiceRangeValueFormat={resources.choiceRangeValueFormat}\r\n telemetry={telemetry}\r\n onChoiceClicked={this._onChoiceClicked}\r\n urlBuilder={this._buildRefinerUrlForChoiceSummary}\r\n choiceAriaLabel={resources.choiceAriaLabel}\r\n telemetryContent={this.telemetryContent}\r\n context={this.props.context}\r\n channelInventoryConfigurationId={this.props.data.products.result?.channelInventoryConfigurationId}\r\n />\r\n );\r\n };\r\n\r\n private readonly _getCategoryListing = (): JSX.Element | null => {\r\n const categoryHierarchy = this.props.data.category?.result;\r\n if (categoryHierarchy) {\r\n return <CategoryListing categoryHierarchy={categoryHierarchy} hideCategory={this.props.config.hideCategory} />;\r\n }\r\n return null;\r\n };\r\n\r\n /**\r\n * Get Active products.\r\n * @returns - JSX Elements.\r\n */\r\n private readonly _getProducts = (): JSX.Element => {\r\n const {\r\n resources,\r\n config: { imageSettings, allowBackNavigation: shouldAllowBackNavigation },\r\n data: {\r\n wishlists: { result: wishListItems }\r\n }\r\n } = this.props;\r\n\r\n const breadCrumbType: string = this.props.context.app.config.breadcrumbType;\r\n const shouldAllowBack = shouldAllowBackNavigation && (breadCrumbType === 'back' || breadCrumbType === 'categoryAndBack');\r\n\r\n // get the recIds the size and colour refiners (becase the values aren't saved to the active filters and the recIds aren't in the results)\r\n const validRefiners = this._getValidRefiners();\r\n const sizeRefinerRecId = validRefiners?.find(r => r.KeyName === 'Size')?.RecordId;\r\n const colourRefinerId = validRefiners?.find(r => r.KeyName === 'Color')?.RecordId;\r\n\r\n // fetch any active size and colour refiners\r\n const activeSizes = this.props.data.listPageState.result?.activeFilters\r\n ?.filter(r => {\r\n return r.RefinerRecordId === sizeRefinerRecId;\r\n })\r\n .map(r => {\r\n return r.LeftValueBoundString;\r\n })\r\n .filter(s => s !== undefined);\r\n const activeColours = this.props.data.listPageState.result?.activeFilters\r\n ?.filter(r => {\r\n return r.RefinerRecordId === colourRefinerId;\r\n })\r\n .map(r => {\r\n return r.LeftValueBoundString;\r\n })\r\n .filter(s => s !== undefined);\r\n\r\n // filter products so that ones that don't have active size or colours aren't included\r\n const products = ((this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || []).filter(\r\n (p: ProductSearchResultExtended) => {\r\n let matchesSizeColourRefiners = true;\r\n if (ArrayExtensions.hasElements(activeSizes)) {\r\n if (ArrayExtensions.hasElements(p.variantsizes)) {\r\n matchesSizeColourRefiners = p.variantsizes.some(size => {\r\n return activeSizes.some(refiner => {\r\n return refiner === size;\r\n });\r\n });\r\n } else {\r\n matchesSizeColourRefiners = false;\r\n }\r\n }\r\n if (matchesSizeColourRefiners && ArrayExtensions.hasElements(activeColours)) {\r\n if (p.variantColor) {\r\n matchesSizeColourRefiners = activeColours.some(refiner => {\r\n return refiner === p.variantColor;\r\n });\r\n } else {\r\n matchesSizeColourRefiners = false;\r\n }\r\n }\r\n\r\n return matchesSizeColourRefiners;\r\n }\r\n );\r\n const quickviewSlot = this.props.slots?.quickview?.[0];\r\n\r\n const isPriceMinMaxFeatureState = this.props.data.featureState.result?.find(\r\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailSearchPriceRangeFeature'\r\n );\r\n return (\r\n <ProductSearchResultItems\r\n products={products}\r\n context={this.props.context}\r\n imageSettings={imageSettings}\r\n resources={resources}\r\n moduleType={this.props.typeName}\r\n moduleId={this.props.id}\r\n allowBackNavigation={shouldAllowBack}\r\n telemetryContent={this.telemetryContent}\r\n quickviewSlot={quickviewSlot}\r\n channelInventoryConfigurationId={this.props.data.products.result?.channelInventoryConfigurationId}\r\n isPriceMinMaxEnabled={isPriceMinMaxFeatureState?.IsEnabled}\r\n productsDimensionAvailabilities={this.state.productsDimensionAvailabilities}\r\n config={this.props.config}\r\n wishlist={wishListItems}\r\n pageNumber={this.props.data.listPageState.result?.currentPageNumber || 0}\r\n categoryId={this.props.data.category.result?.RecordId || 0}\r\n />\r\n );\r\n };\r\n\r\n private readonly _updateSortByDropdown = (notification: ILabeledDropdownOnChangeNotification): void => {\r\n const {\r\n context: { request: requestContext, actionContext }\r\n } = this.props;\r\n\r\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\r\n const error = `[sort-by-category] cannot sort without context: ${!requestContext ? 'requestContext ' : ''} ${\r\n !actionContext ? 'actionContext ' : ''\r\n } could not be found`;\r\n this.props.telemetry.warning(error);\r\n return;\r\n }\r\n\r\n window.history.pushState(\r\n {},\r\n '',\r\n buildListPageUrl(\r\n getCurrentUrl(this.props.context.request),\r\n undefined,\r\n [this._getSortColumnFromSelectedOption(notification.selectedOption)],\r\n undefined\r\n )\r\n );\r\n transaction(() => {\r\n this.props.data.listPageState.result!.currentPageNumber = 0;\r\n this.props.data.listPageState.result!.sortingCritera = {\r\n Columns: [this._getSortColumnFromSelectedOption(notification.selectedOption)]\r\n };\r\n\r\n // VSI Customization - to Reset existing product in case of infinite scroll after sorting\r\n this.props.data.listPageState.result!.activeProducts = [];\r\n this.isLoadMore = false;\r\n });\r\n };\r\n\r\n private readonly _getSortColumnFromSelectedOption = (option: ILabeledDropdownOption): SortColumn => {\r\n const { data } = this.props;\r\n\r\n if (!data.searchConfiguration.result) {\r\n return {};\r\n }\r\n\r\n const mappedConfiguration = data.searchConfiguration.result.find(searchConfiguration => {\r\n return searchConfiguration.key === option.key;\r\n });\r\n\r\n if (mappedConfiguration) {\r\n return mappedConfiguration.sortColumn;\r\n }\r\n\r\n return {};\r\n };\r\n\r\n /**\r\n * Retrieves current sort criteria.\r\n * @returns Sort criteria column which is currently active or undefined if it's not specified.\r\n */\r\n private readonly _getSortCriteriaColumn = (): SortColumn | undefined => {\r\n const sortCriteria = this.props.data.listPageState.result?.sortingCritera;\r\n if (ArrayExtensions.hasElements(sortCriteria?.Columns)) {\r\n return sortCriteria!.Columns[0];\r\n }\r\n\r\n const queryColumns = parseQueryParam<SortColumn[]>('sorting', this.props.context.request);\r\n if (ArrayExtensions.hasElements(queryColumns)) {\r\n return queryColumns[0];\r\n }\r\n\r\n return undefined;\r\n };\r\n\r\n /**\r\n * Retrieves dropdown options.\r\n * @returns All dropdown options.\r\n */\r\n private readonly _getAllSortByOptions = (): ILabeledDropdownOption[] => {\r\n const searchConfiguration = this.props.data.searchConfiguration.result;\r\n\r\n if (!searchConfiguration) {\r\n return [];\r\n }\r\n\r\n const mappedSearchConfiguration = this.sortByDropdownOptions.filter(mappedSearchConfig =>\r\n searchConfiguration.find(item => mappedSearchConfig.key === item.key)\r\n );\r\n\r\n return ArrayExtensions.validValues(mappedSearchConfiguration);\r\n };\r\n\r\n /**\r\n * Retrieves current selected dropdown option based on the sort criteria.\r\n * @returns Current dropdown option.\r\n */\r\n private readonly _getCurrentlySelectedOption = (): ILabeledDropdownOption | undefined => {\r\n const activeSortColumn = this._getSortCriteriaColumn();\r\n\r\n const searchConfiguration = this.props.data.searchConfiguration.result;\r\n\r\n if (!activeSortColumn || !searchConfiguration) {\r\n return undefined;\r\n }\r\n\r\n const activeMappedConfig = searchConfiguration.find(\r\n mappedSearchConfig =>\r\n mappedSearchConfig.sortColumn.ColumnName === activeSortColumn.ColumnName &&\r\n mappedSearchConfig.sortColumn.IsDescending === activeSortColumn.IsDescending\r\n );\r\n if (!activeMappedConfig) {\r\n return undefined;\r\n }\r\n\r\n return this.sortByDropdownOptions.find(dropdownOption => dropdownOption.key === activeMappedConfig.key);\r\n };\r\n\r\n private readonly _onUpdateRefiners = (itemToggleNotification: IRefineItemToggleNotification): void => {\r\n const {\r\n context: { request: requestContext, actionContext }\r\n } = this.props;\r\n\r\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\r\n const error = `Refine menu cannot refine search criteria: \r\n ${!requestContext ? 'requestContext ' : ''} ${!actionContext ? 'actionContext ' : ''} could not be found`;\r\n this.props.telemetry.warning(error);\r\n return;\r\n }\r\n\r\n const updatedRefinementCriteria = getUpdatedRefinementCriteria(\r\n itemToggleNotification,\r\n this.props.data.listPageState.result?.activeFilters || []\r\n );\r\n\r\n window.history.pushState({}, '', buildListPageUrl(getCurrentUrl(this.props.context.request), updatedRefinementCriteria));\r\n\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 // VSI Customization - to Reset existing product in case of infinite scroll after applying filters\r\n this.props.data.listPageState.result!.activeProducts = [];\r\n this.isLoadMore = false;\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 _onClearClicked = (): void => {\r\n this._onChoiceClicked({\r\n clearAll: true,\r\n choiceClicked: undefined,\r\n itemClicked: undefined,\r\n nextItemToFocus: undefined\r\n });\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\r\n // VSI Customization - to Reset existing product in case of infinite scroll upon removing filters\r\n transaction(() => {\r\n data.listPageState.result!.currentPageNumber = 0;\r\n data.listPageState.result!.activeFilters = currentRefinementCriteria;\r\n\r\n data.listPageState.result!.activeProducts = [];\r\n this.isLoadMore = false;\r\n });\r\n };\r\n\r\n private readonly _buildRefinerUrlForChoiceSummary = (selectedRefiner: ProductRefinerValue, isClearAll: boolean): string => {\r\n const { data, telemetry } = this.props;\r\n const fullUrl = getCurrentUrl(this.props.context.request);\r\n\r\n if (!data.listPageState.result) {\r\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl]ListPageState unavailable, unable to create refiner URL.');\r\n return fullUrl.href;\r\n }\r\n\r\n let currentRefinementCriteria = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n\r\n if (!isClearAll) {\r\n if (!selectedRefiner) {\r\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl] URL for Choice could not be determined');\r\n return fullUrl.href;\r\n }\r\n currentRefinementCriteria = currentRefinementCriteria.filter(\r\n (selectedCriterion: ProductRefinerValue) => !isMatchingRefinementCriterion(selectedRefiner, selectedCriterion)\r\n );\r\n } else {\r\n currentRefinementCriteria = [];\r\n }\r\n\r\n return buildListPageUrl(fullUrl, currentRefinementCriteria);\r\n };\r\n\r\n private _getViewport(): GridSize {\r\n if (MsDyn365.isBrowser) {\r\n return isMobile({ variant: VariantType.Browser, context: this.props.context.request });\r\n }\r\n return isMobile({ variant: VariantType.Viewport, context: this.props.context.request });\r\n }\r\n\r\n private _toggleModal(): void {\r\n this.setState({\r\n modalIsOpen: !this.state.modalIsOpen\r\n });\r\n }\r\n\r\n private _updateViewport(): void {\r\n this._viewport = this._getViewport();\r\n\r\n if (this.state.modalIsOpen && !this.isMobile) {\r\n this._toggleModal();\r\n }\r\n }\r\n\r\n // private _updateVisibility(itemIds: (string | undefined)[]): void {\r\n // itemIds.forEach(itemId => {\r\n // const items = document.querySelectorAll(`li.ms-product-search-result__item[data-itemid=\"${itemId}\"]`);\r\n // let visible = 0;\r\n // items.forEach((li, i) => {\r\n // const emptyImg = li.querySelector('.msc-empty_image');\r\n // if (!emptyImg) {\r\n // const hidden = li.classList.contains('hidden');\r\n // if (visible < 4 && hidden) {\r\n // //li.classList.remove('hidden');\r\n // visible++;\r\n // } else if (!hidden) {\r\n // //li.classList.add('hidden');\r\n // }\r\n // }\r\n // });\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 * Renders a infinite scroll.\r\n */\r\n public _loadMoreProducts = (pageNumber: number) => {\r\n if (this.isLoadMore) {\r\n const info = `[_loadMoreProducts] Page Number: ${pageNumber}`;\r\n this.props.telemetry.information(info);\r\n\r\n transaction(() => {\r\n this.props.data.listPageState.result!.currentPageNumber =\r\n parseInt(this.props.data.listPageState.result!.currentPageNumber?.toString() || '0', 10) + 1;\r\n this.isLoadMore = false;\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 { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { ISearchResultModalViewProps } from './components';\r\nimport {\r\n ICategoryHierarchyViewProps,\r\n IRefineMenuViewProps,\r\n ISearchResultContainerViewProps,\r\n ISortByViewProps,\r\n ITitleViewProps\r\n} from './only-c-search-result-container';\r\nimport InfiniteScroll from 'react-infinite-scroller';\r\n\r\nconst SearchResultContainerView: React.FC<ISearchResultContainerViewProps> = props => {\r\n const {\r\n SearchResultContainer,\r\n categoryListing,\r\n products,\r\n // pagination,\r\n ProductsContainer,\r\n ProductSectionContainer,\r\n choiceSummary,\r\n isMobile,\r\n modalToggle,\r\n searchResultModal,\r\n TitleViewProps,\r\n refineMenu,\r\n categoryHierarchy,\r\n sortByOptions,\r\n CategoryNavContainer,\r\n RefineAndProductSectionContainer,\r\n errorMessage,\r\n FeatureSearchContainer,\r\n similarLookProduct\r\n } = props;\r\n const isRecoSearchPage = props.context.actionContext.requestContext.query?.recommendation;\r\n const hideSubCategories = false; //&& props.config.hideCategory === props.data.category?.result?.RecordId;\r\n if (isMobile) {\r\n return (\r\n <Module {...SearchResultContainer}>\r\n {renderCategoryHierarchy(categoryHierarchy)}\r\n <div className='ms-search-result__sticky-header'>\r\n {renderTitle(TitleViewProps)}\r\n <div className='filter-wrapper'>{modalToggle}</div>\r\n {choiceSummary}\r\n </div>\r\n {createSearchResultModal(searchResultModal, refineMenu, sortByOptions, isRecoSearchPage)}\r\n <Node {...FeatureSearchContainer}>{similarLookProduct}</Node>\r\n <Node {...ProductsContainer}>\r\n {errorMessage}\r\n <InfiniteScroll pageStart={0} loadMore={props.loadMore} hasMore={true || false}>\r\n {products}\r\n </InfiniteScroll>\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 </Node>\r\n <Node {...RefineAndProductSectionContainer}>\r\n {/* {refineMenu && renderRefiner(refineMenu)} */}\r\n <Node {...ProductSectionContainer}>\r\n <div className='ms-search-result__sticky-header'>\r\n {TitleViewProps && renderTitle(TitleViewProps)}\r\n <div className='filter-wrapper'>\r\n {modalToggle}\r\n {choiceSummary}\r\n {renderSort(sortByOptions, isRecoSearchPage)}\r\n </div>\r\n </div>\r\n {createSearchResultModal(searchResultModal, refineMenu)}\r\n <Node {...FeatureSearchContainer}>{similarLookProduct}</Node>\r\n <div className={hideSubCategories ? 'filter-hide search-result-with-title trending-style' : 'search-category-wrapper'}>\r\n {categoryListing}\r\n <Node {...ProductsContainer}>\r\n {errorMessage}\r\n <InfiniteScroll pageStart={0} loadMore={props.loadMore} hasMore={true || false}>\r\n {products}\r\n </InfiniteScroll>\r\n </Node>\r\n </div>\r\n {/* {pagination} */}\r\n </Node>\r\n </Node>\r\n </Module>\r\n );\r\n};\r\n\r\nconst createSearchResultModal = (\r\n modalProps: ISearchResultModalViewProps,\r\n refineMenu: IRefineMenuViewProps,\r\n sortByDropDown?: ISortByViewProps,\r\n isRecoSearchPage?: string\r\n): JSX.Element => {\r\n return React.cloneElement(\r\n modalProps.modal,\r\n {},\r\n modalProps.modalHeader,\r\n createModalBody(modalProps, refineMenu, sortByDropDown, isRecoSearchPage),\r\n modalProps.modalFooter\r\n );\r\n};\r\n\r\nconst createModalBody = (\r\n props: ISearchResultModalViewProps,\r\n refineMenu: IRefineMenuViewProps,\r\n sortByDropDown?: ISortByViewProps,\r\n isRecoSearchPage?: string\r\n): JSX.Element | null => {\r\n if (sortByDropDown) {\r\n return React.cloneElement(props.modalBody, {}, renderSort(sortByDropDown, isRecoSearchPage), renderRefiner(refineMenu));\r\n } else {\r\n return React.cloneElement(props.modalBody, {}, renderRefiner(refineMenu));\r\n }\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}>{submenu}</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 <Node {...SortingContainer}>{sortByDropDown}</Node>;\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>{title.titleCount}</h5>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nexport default SearchResultContainerView;\r\n","const binding = { modules: {}, dataActions: {} };\n\n const registerActionId = (actionPath) => {\n if (binding.dataActions[actionPath] &&\n binding.dataActions[actionPath].default &&\n binding.dataActions[actionPath].default.prototype &&\n binding.dataActions[actionPath].default.prototype.id) {\n binding.dataActions[binding.dataActions[actionPath].default.prototype.id] = binding.dataActions[actionPath];\n } else {\n Object.keys(binding.dataActions[actionPath] || {}).forEach(exportName => {\n if (binding.dataActions[actionPath][exportName] &&\n binding.dataActions[actionPath][exportName].prototype &&\n binding.dataActions[actionPath][exportName].prototype.Action) {\n binding.dataActions[binding.dataActions[actionPath][exportName].prototype.id] = binding.dataActions[actionPath][exportName];\n }\n })\n }\n };\n\n const registerSanitizedActionPath = (sanitizedActionPath, dataAction) => {\n if (process.env.NODE_ENV === 'development') {\n if (!dataAction.default) {\n throw new Error('Data action path does not have a default export');\n }\n if (!(dataAction.default.prototype.id && binding.dataActions[dataAction.default.prototype.id]) || !binding.dataActions[sanitizedActionPath]) {\n binding.dataActions[sanitizedActionPath] = dataAction;\n }\n } else {\n binding.dataActions[sanitizedActionPath] = dataAction;\n if (!binding.dataActions[sanitizedActionPath].default) {\n throw new Error('Data action path ' + sanitizedActionPath + ' does not have a default export');\n }\n binding.dataActions[sanitizedActionPath].default.prototype.RegistrationId = sanitizedActionPath;\n if (binding.dataActions[sanitizedActionPath].default.prototype.id) {\n binding.dataActions[binding.dataActions[sanitizedActionPath].default.prototype.id] = sanitizedActionPath;\n }\n }\n };\n \n\n (binding.modules['only-c-search-result-container'] = {\n c: () => require('partner/modules/only-c-search-result-container/only-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/only-c-search-result-container/list-page-state', runOn: 0},{name:'products', path:'modules/only-c-search-result-container/actions/get-full-products-by-collection', runOn: 0},{name:'refiners', path:'modules/only-c-search-result-container/actions/get-refiners-for-collection', runOn: 0},{name:'searchConfiguration', path:'modules/only-c-search-result-container/actions/get-mapped-search-configuration', runOn: 0},{name:'wishlists', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-wishlist-by-customer-id', runOn: 0}],\n \n iNM: false,\n ns: '__local__',\n n: 'only-c-search-result-container',\n p: '__local__',\n \n pdp: '',\n \n \n md: 'src/modules/only-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 = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-wishlist-by-customer-id';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-wishlist-by-customer-id');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = 'modules/only-c-search-result-container/actions/get-full-products-by-collection';\n let dataAction = require('partner/modules/only-c-search-result-container/actions/get-full-products-by-collection');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = 'modules/only-c-search-result-container/actions/get-mapped-search-configuration';\n let dataAction = require('partner/modules/only-c-search-result-container/actions/get-mapped-search-configuration');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = 'modules/only-c-search-result-container/actions/get-refiners-for-collection';\n let dataAction = require('partner/modules/only-c-search-result-container/actions/get-refiners-for-collection');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = 'modules/only-c-search-result-container/list-page-state';\n let dataAction = require('partner/modules/only-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|only-c-search-result-container|only-c-search-result-container'] = {\n c: () => require('partner/modules/only-c-search-result-container/only-c-search-result-container.view.tsx'),\n cn: '__local__-__local__-only-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":["sortOptions","sortByOptionRelevanceDesc","sortByOptionRatingAsc","sortByOptionRatingDesc","sortByOptionNameAsc","sortByOptionNameDesc","sortByOptionPriceAsc","sortByOptionPriceDesc","sortByOptionBestSelling","sortByOptionNewScore","sortByOptionTrendingScore","MappedSearchInput","constructor","apiSettings","getCacheKey","buildCacheKey","this","getCacheObjectType","dataCacheType","async","getMappedSearchConfiguration","input","ctx","getSearchConfigurationAsync","callerContext","then","searchConfiguration","ProductSortColumns","map","sortColumn","key","ColumnName","toUpperCase","IsDescending","telemetry","warning","filter","Boolean","createInput","inputData","requestContext","getMappedSearchConfigurationDataAction","createObservableDataAction","id","action","DefaultValues","RefinersByCollectionInput","BaseCollectionInput","pageType","refiners","length","queryResultSettings","Sorting","Columns","actionDataAction","searchProductId","category","getProductRefinerHierarchy","CategoryIds","defaultCategoryIdValue","Context","ChannelId","channelId","CatalogId","catalogId","Refinement","isUpdateRefinerPanel","Error","searchText","query","q","SearchCondition","productId","searchObject","JSON","parse","Number","ProductId","isNaN","Recommendation","RecommendationListId","Ids","defaultProductIdValue","args","createBaseCollectionInput","ListPageState","activeFilters","activeProducts","sortingCritera","currentPageNumber","pageSize","featureProduct","productPrices","__decorate","observable","ListPageStateInput","listPageStateAction","createListPageInput","ProductRefinerValueDataTypeValue","ProductRefinerTypeValue","ProductRefinerSource","isRangeType","dataTypeValue","AttributeDataType","Currency","Decimal","Integer","findMatchingRefinementCriterion","productRefinerValue","refinementCriteria","find","refinementCriterion","isMatchingRefinementCriterion","RefinerRecordId","RefinerSourceValue","DataTypeValue","LeftValueBoundString","getUpdatedRefinementCriteria","itemToggleNotification","currentRefinementCriteria","updatedRefinementCriteria","toggledItemFound","forEach","selectedCriterion","isSelecting","next","_objectSpread","undefined","rangeStart","RightValueBoundString","rangeEnd","push","Text","TrueFalse","parentProductRefinerHierarchy","RefinerTypeValue","RefinerType","SingleSelect","Values","child","matchingIndex","findIndex","criterion","splice","ChoiceSummary","React","props","super","closeButtonGlyph","_onClick","e","preventDefault","stopPropagation","target","currentTarget","clearAll","getAttribute","includes","selectedRefiner","_getSelectedRefinerChoice","onChoiceClicked","itemClicked","choiceClicked","nextItemToFocus","nextSibling","payLoad","getPayloadObject","telemetryContent","_this$props$context","selectedChoices","channelInventoryConfigurationId","refinerHierarchy","context","app","config","productListInventoryDisplay","ProductListInventoryFilteringOptions","HideOOS","choice","parent","hierarchy","value","RecordId","_getKeyForRefinerValue","render","clearAllText","label","classNames","choiceAriaLabel","closeAriaLabel","items","selectedRefinersMap","contentAction","etext","clearAllAttributes","getTelemetryAttributes","className","classnames","item","attribute","Object","assign","href","urlBuilder","onClick","role","choiceFormat","choiceRangeValueFormat","overallFormat","rangeFormat","refinerValueName","refinerName","KeyName","replace","_formatPrice","UnitText","LeftValueBoundLocalizedString","amount","currency","trace","result","cultureFormatter","formatCurrency","error","selected","textContent","trim","computed","observer","ErrorMessage","_ref","text","FeatureSearchResultItem","product","imageSettings","resources","recommendation","productName","Name","productRecordId","productUrl","getProductPageUrlSync","actionContext","fallbackImage","getFallbackImageUrl","ItemId","heading","featureSimilarDescriptionTitle","featureSimilarLooksTitle","toString","onTelemetryClick","gridSettings","imageUrl","altText","img","src","imageProps","fallBackSrc","Image","loadFailureBehavior","renderProductPlacementImage","request","PrimaryImageUrl","title","Link","ariaLabel","ModalToggle","innerRef","ref","modalNode","Modal","autoFocus","applicationNode","returnFocusRef","returnRef","isOpen","toggle","onModalToggle","zIndex","modalHeaderNode","ModalHeader","Button","onClearModal","modalClear","modalTitle","modalFooterNode","ModalFooter","modalCloseButtonText","getInventoryLabel","ArrayExtensions","hasElements","AttributeValues","inventoryAttribute","TextValue","renderCampaign","index","campaignItems","campaign","c","campaignIndex","campaignImage","campaignLink","campaignTitle","campaignText","campaignTextWidthAlignment","campaignTextHeightAlignment","PromotionalImageProps","linkUrl","destinationUrl","linkText","openInNewTab","rel","Msdyn365","tag","advertisement","ProductSearchResultItems","products","moduleType","moduleId","allowBackNavigation","quickviewSlot","isPriceMinMaxEnabled","productsDimensionAvailabilities","wishlist","pageNumber","categoryId","sizesHeading","maxSizeDisplay","favouritesContent","favouritesHeading","wishListLink","variantsToShow","priceResources","priceRangeSeparator","_persistProduct","event","pid","_writeToSessionStorage","stringify","parseInt","_readFromSessionStorage","_restorationRef","_restorationRef$curre","window","scrollTo","behavior","top","current","offsetTop","itemIds","Array","from","Set","type","itemId","cssSelector","i","ProductComponent","freePriceText","priceFree","originalPriceText","currentPriceText","ratingAriaLabel","allowBack","typeName","data","quickViewButton","inventoryLabel","swatchItemAriaLabel","dimensionAvailabilities","dimensionAvailability","masterProductId","MasterProductId","newArrivalMsg","productLifeTag","splitSizeText","colorText","RangeRefineItem","_selectedRefinementCr","_this$props$selectedR","_this$props$selectedR2","_ref2","_this$props$selectedR3","_this$props$selectedR4","_formattedPriceReverseLookup","Map","getLabels","sliderId","minPrice","maxPrice","labelId","labelString","labelPositioning","getSliderThumbs","sliderKey","selectedMin","selectedMinPrice","selectedMax","selectedMaxPrice","_this$props$minValueS","_this$props$maxValueS","minValueSliderThumbAriaLabel","currencyCode","ariaValueText","maxValueSliderThumbAriaLabel","_onRangeUpdate","bind","_onRangeUpdateEnd","_handleRangeTooltipText","_changeMin","_changeMax","_finishChangeMin","_finishChangeMax","minInput","maxInput","selectedRefinementCriterion","initialMin","initialMax","String","minValue","maxValue","labels","sliderKeyString","sliderThumbs","state","isChecked","validationErrorMin","validationErrorMax","touchedMin","touchedMax","shouldComponentUpdate","nextProps","nextState","componentDidUpdate","previousProps","updateSliderProps","refineItemCommonProps","rangeType","_renderInputFields","_renderSlider","_ref3","_this$props$selectedR5","_this$props$selectedR6","_ref4","_this$props$selectedR7","_this$props$selectedR8","setState","isDisabled","formAttrs","rangeNameFormat","minInputClassName","maxInputClassName","formattedSelectedMin","_getFormattedSelectedValue","formattedSelectedMax","minLabel","onChange","onFocus","onBlur","maxLabel","placeholder","placeholderTextMax","ariaAttributes","Slider","inForm","min","max","step","orientation","showLabels","showTooltip","onChangeEnd","debounce","handleTooltipText","_changeValue","inputType","selectedKey","touchedKey","_getInputWithoutFormatting","selectedMinValue","minTouched","onToggle","maxNum","validationErrorNaN","_focus","_validateRange","selectedMaxValue","maxTouched","minNum","setTimeout","focus","touched","validationError","validationErrorRange","inputAsNum","get","sliderChangeNotification","eventType","firstThumbValue","secondThumbValue","_focusOnSliderThumb","element","document","getElementById","tooltip","RefineItem","anchorType","_productRefinerValue$","_this$props","productCountAriaLabel","singleProductCountAriaLabel","children","refineItemAriaLabel","refineItemsAriaLabel","attrs","_objectWithoutProperties","_excluded","isSingleSelect","itemTypeClassName","SourceValue","Rating","_renderRating","productText","productCount","Count","refineMenuItemAriaLabel","format","swatch","_renderSwatch","_getRefinerUrl","tabIndex","_this$props$parentPro","_this$props$parentPro2","_productRefinerValue$2","dimensionType","toLocaleLowerCase","hasColor","StringExtensions","isNullOrWhitespace","SwatchColorHexCode","hasImage","SwatchImageUrl","swatchItems","checkIfShouldDisplayAsSwatch","colorHexCode","SwatchComponent","list","isSelectionEnabled","isRefineItem","ratingUserCountAriaLabel","ratingSingleUserCountAriaLabel","_productRefinerValue$3","refinerRating","ratingRefiner","selectedRefinerValues","selectedRating","defaultChkProductCount","ratingComponentClass","productCountAriaLabelValue","isMobileView","RatingComponent","avgRating","ratingCount","hideCount","readOnly","moduleTypeName","sizeSort","RefineSubmenu","_onToggleItem","_onToggleSubmenu","isExpanded","productRefinerHierarchy","Range","isMobile","expanded","hideRating","showLessText","showAllText","_renderChildItems","showAll","_renderRange","_renderSingleMultiSelect","refinerValuesList","sort","a","b","_productRefinerHierar","_b$Count2","_a$Count2","posA","_a$LeftValueBoundStri","posB","_b$LeftValueBoundStri","_b$Count","_a$Count","slice","listItems","selectedValue","_getRangeType","DisplayTemplateValue","DisplayTemplate","SliderWithBars","onUpdateRefiners","prevState","Separator","separator","Title","expandRefinersCount","CampaignItemsCampaignTextWidthAlignment","CampaignItemsCampaignTextHeightAlignment","CampaignTitleTag","CategoryListing","_toggleCategory","displayChildren","_currentCategory$Chil","_currentCategory$Chil2","currentCategory","categoryHierarchy","hideCategory","Children","Url","PriceForProductSearchResultInput","getPriceForProductSearchResultAction","productRecIds","Promise","resolve","array","indexOf","getCatalogId","projectDomain","ProductsDataActions","QueryResultSettingsProxy","getPagingFromInputDataOrDefaultValue","Date","productResults","activePrice","price","_activePrice$Customer","_activePrice$BasePric","_activePrice$TradeAgr","_activePrice$Adjusted","Price","CustomerContextualPrice","BasePrice","Math","TradeAgreementPrice","AdjustedPrice","exception","debug","message","SearchResultContainer","SearchResultContainer_1","_props$context$reques","sortByDropdownOptions","_pageType","urlTokens","_viewport","expandrefinerCount","defaultPageNumber","isListPageStateUpdated","isLoadMore","_updateListPageState","listPageState","_this$props$context$r","_this$props$data$cate","_this$props$config$it","_this$props$context$r2","querySorting","sorting","decodeURIComponent","categoryExist","sessionProducts","scrollProducts","sessionPageNo","scrollPageNo","skip","itemsPerPage","totalProductCount","count","hydrateRefinersFromUrl","_getProductsDimensionsAvailabilities","_this$props$data$list","_this$props$data$list2","productsList","getDimensionAvailabilitiesForProductSearchResultAction","DimensionAvailabilitiesForProductSearchResultInput","_getActivePrice","_this$props$data$list3","_this$props$data$list4","_getSearchResultModal","modal","modalHeader","modalFooter","modalBody","ModalBody","SearchResultModal","modalIsOpen","_modalToggleRef","_toggleModal","_onClearClicked","_getCollectionTitle","collectionTitle","getFriendlyName","locale","NameTranslations","productCountNumber","productCountText","numberOfProducts","oneProduct","TitleContainer","telemetryPageName","toLowerCase","titlePrefix","searchTextPrefix","titleText","titleCount","_getCategoryHierarchy","CategoryHierarchyContainer","categoryHierarchyList","categoryLinkAriaLabel","categoryHierarchySeparator","_getSortingDropDown","activeDropdown","_getCurrentlySelectedOption","sortingState","selectedSortByOption","dropdownOptions","_getAllSortByOptions","dropdownOption","SortingContainer","sortByDropDown","LabeledDropdown","labelClassname","labelText","sortByDropdownLabel","dropdownId","dropdownClassname","toggleColor","selectedOption","onSelectOption","_updateSortByDropdown","_sortAndFilterContainerRef","_getPagination","fullUrl","getCurrentUrl","skipCount","totalItems","previousText","flipperPrevious","nextText","flipperNext","UncontrolledPagination","paginationAriaLabel","url","qsp","startingItem","_renderPrev","_renderNext","previousAriaLabel","nextAriaLabel","_getValidRefiners","updateRefinerPanel","refiner","_shouldHideFromRefiners","_getRefineMenu","tempRangeTypeTODO","inputRange","validRefiners","activeRefiners","_getexpandRefinerCount","expandedRefiners","RefineMenuContainer","RefinerSectionContainer","initalRefiner","initialRefiners","r","_refineItemCommonProps","_onUpdateRefiners","_buildRefinerUrl","isExpandedOnInitialLoad","_this$props$data$prod","_getChoiceSummary","_this$props$data$prod2","selectedRefiners","choiceSummaryLabel","_onChoiceClicked","_buildRefinerUrlForChoiceSummary","_getCategoryListing","_this$props$data$cate2","_getProducts","_validRefiners$find","_validRefiners$find2","_this$props$data$list5","_this$props$data$list6","_this$props$slots","_this$props$data$feat","_this$props$data$prod3","_this$props$data$list7","_this$props$data$cate3","shouldAllowBackNavigation","wishlists","wishListItems","breadCrumbType","breadcrumbType","shouldAllowBack","sizeRefinerRecId","colourRefinerId","activeSizes","s","activeColours","p","matchesSizeColourRefiners","variantsizes","some","size","variantColor","slots","quickview","isPriceMinMaxFeatureState","featureState","IsEnabled","notification","history","pushState","buildListPageUrl","_getSortColumnFromSelectedOption","transaction","option","mappedConfiguration","_getSortCriteriaColumn","_this$props$data$list8","sortCriteria","queryColumns","parseQueryParam","mappedSearchConfiguration","mappedSearchConfig","validValues","activeSortColumn","activeMappedConfig","_this$props$data$list9","newRefinementCriteria","dropdownElementId","dropdownElement","selectedChoice","isClearAll","refinerCount","all","one","two","three","four","paginationPreviousText","paginationNextText","_loadMoreProducts","info","information","_this$props$data$list10","device","Type","_updateViewport","pending","validationErrorNotNumber","validationErrorNotRange","getTelemetryObject","friendlyName","productCollection","nameTranslations","_nameTranslation","nameTranslation","Language","_this$_getValidRefine","MsDyn365","isBrowser","addEventListener","_target$classList","_target$closest","classList","contains","closest","productCard","style","display","reaction","_listPageState$active","_listPageState$sortin","_newListPageState$cur","_newListPageState$sor","_newListPageState$act","_this$props$context$r3","_this$props$context$r4","_this$props$context$r5","newListPageState","GetFullProductsByCollectionInput","Paging","Top","Skip","recordId","includeAttributes","getCollectionProducts","enableAffiliationBasedPricing","catch","_listPageState$active2","_newListPageState$cur2","_newListPageState$sor2","_newListPageState$act2","_this$props$context$r6","_this$props$context$r7","refinerInput","getCollectionRefinersAction","dimensionsToDisplayOnProductCard","dimensionsInProductCard","dimensionsToDisplayAsSwatch","dimensionsAsSwatchType","DimensionTypes","none","componentWillUnmount","removeEventListener","_listPageState$result","_listPageState$result2","_this$props$context$r8","_this$props$data$list11","_this$props$data$list12","searchProduct","errorText","resultCategoryNotFoundText","resultSearchNotFoundText","productsComponent","categoryListingComponent","featureComponent","searchResultContainerViewProps","categoryListing","TitleViewProps","disableHierarchy","refineMenu","moduleProps","sortByOptions","pagination","ProductsContainer","ProductSectionContainer","CategoryNavContainer","RefineAndProductSectionContainer","choiceSummary","modalToggle","searchResultModal","errorMessage","FeatureSearchContainer","similarLookProduct","loadMore","renderView","_getViewport","variant","VariantType","Browser","Viewport","createSearchResultModal","modalProps","isRecoSearchPage","createModalBody","renderSort","renderRefiner","Node","submenu","renderCategoryHierarchy","renderTitle","renderTitleCount","_props$context$action","Module","InfiniteScroll","pageStart","hasMore","binding","modules","dataActions","registerSanitizedActionPath","sanitizedActionPath","dataAction","default","prototype","RegistrationId","require","$type","da","name","path","runOn","iNM","ns","n","pdp","md","__bindings__","viewDictionary","cn","module","exports","ReactDOM"],"sourceRoot":""}