{"version":3,"file":"static/js/21818e2c04b80ffdc2ef.bundle.js","mappings":"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","sources":["webpack://Dobbies.Commerce/./src/modules/dobbies-search-result-container/actions/base-collection-action.ts?6f2b","webpack://Dobbies.Commerce/./src/modules/dobbies-search-result-container/actions/get-full-products-by-collection.ts?1eea","webpack://Dobbies.Commerce/./src/modules/dobbies-search-result-container/actions/get-mapped-search-configuration.ts?cef7","webpack://Dobbies.Commerce/./src/modules/dobbies-search-result-container/actions/get-refiners-for-collection.ts?2fad","webpack://Dobbies.Commerce/./src/modules/dobbies-search-result-container/actions/get-product-refiner-hierarchy.ts?5ea0","webpack://Dobbies.Commerce/./src/modules/dobbies-search-result-container/actions/url-utils.ts?e355","webpack://Dobbies.Commerce/./src/modules/dobbies-search-result-container/dobbies-search-result-container.props.autogenerated.ts?30bd","webpack://Dobbies.Commerce/./src/modules/dobbies-search-result-container/dobbies-search-result-container.tsx?0279","webpack://Dobbies.Commerce/./src/modules/dobbies-search-result-container/dobbies-search-result-container.view.tsx?7af5","webpack://Dobbies.Commerce/./src/modules/dobbies-search-result-container/list-page-state.ts?94e6","webpack://Dobbies.Commerce/./src/themes/dobbies/actions/modules-state-share-action.ts?117d","webpack://Dobbies.Commerce/./src/themes/dobbies/views/custom-components/dobbies-modal.tsx?9a82","webpack://Dobbies.Commerce/./lib/dobbies-search-result-container/module-registration.js?3a5f","webpack://Dobbies.Commerce/external var \"React\"?0d3b","webpack://Dobbies.Commerce/external var \"ReactDOM\"?853b"],"sourcesContent":["/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { CacheType, getCatalogId, IActionInput, IAny, ICommerceApiSettings, ICreateActionContext, IGeneric } from '@msdyn365-commerce/core';\r\nimport { convertToString, IQueryResultSettings, ProductRefinerValue, SortColumn } from '@msdyn365-commerce/retail-proxy';\r\nimport { buildCacheKey, QueryResultSettingsProxy } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { toJS } from 'mobx';\r\n\r\nimport { hydrateRefinersFromUrl } from './url-utils';\r\n\r\n/**\r\n * Export listPageType.\r\n */\r\nexport type listPageType = 'Category' | 'Search' | 'Unknown';\r\n\r\n/**\r\n * Get include attributes from config.\r\n * @param inputData - ICreateActionContext.\r\n * @returns Boolean.\r\n */\r\nfunction getIncludeAttributes(inputData: ICreateActionContext, IGeneric>): boolean {\r\n if (inputData && inputData.config && inputData.config.includeAttributes !== undefined && inputData.config.includeAttributes === true) {\r\n return true;\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Get updateRefinerPanel from config.\r\n * @param inputData - ICreateActionContext.\r\n * @returns Boolean.\r\n */\r\nfunction getUpdateRefinerPanel(inputData: ICreateActionContext, IGeneric>): boolean {\r\n return !!inputData.config?.updateRefinerPanel;\r\n}\r\n\r\n/**\r\n * BaseCollection Action Input.\r\n */\r\nexport class BaseCollectionInput implements IActionInput {\r\n public pageType: listPageType;\r\n\r\n public category: number | undefined;\r\n\r\n public searchText: string | undefined;\r\n\r\n public refiners: ProductRefinerValue[];\r\n\r\n public queryResultSettings: IQueryResultSettings;\r\n\r\n public apiSettings: ICommerceApiSettings;\r\n\r\n public includeAttributes: boolean | undefined;\r\n\r\n public locale?: string;\r\n\r\n public isUpdateRefinerPanel?: boolean;\r\n\r\n public catalogId?: number;\r\n\r\n public constructor(\r\n pageType: listPageType,\r\n apiSettings: ICommerceApiSettings,\r\n queryResultSettings: IQueryResultSettings,\r\n refiners: ProductRefinerValue[],\r\n category: number | undefined,\r\n searchText: string | undefined,\r\n includeAttributes: boolean | undefined,\r\n isUpdateRefinerPanel?: boolean | undefined,\r\n locale?: string,\r\n catalogId?: number\r\n ) {\r\n this.pageType = pageType;\r\n this.apiSettings = apiSettings;\r\n this.category = category;\r\n this.searchText = searchText;\r\n this.queryResultSettings = queryResultSettings;\r\n this.refiners = refiners;\r\n this.includeAttributes = includeAttributes;\r\n this.isUpdateRefinerPanel = isUpdateRefinerPanel;\r\n this.locale = locale;\r\n this.catalogId = catalogId ?? 0;\r\n }\r\n\r\n public getCacheKey = () => {\r\n const queryResultSettings = {\r\n ...this.queryResultSettings.Paging,\r\n ...toJS(this.queryResultSettings.Sorting)\r\n };\r\n\r\n const cacheKey = buildCacheKey(\r\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions -- disabling this as inputs can be undefined depending on page type\r\n `${this.pageType}-${this.locale}-${this.category || this.searchText}-${this.catalogId}-${this.refiners.map(\r\n refiner => `${refiner.RefinerRecordId + (refiner.LeftValueBoundString || '') + (refiner.RightValueBoundString || '')}-`\r\n )}-${convertToString(queryResultSettings)}`,\r\n this.apiSettings,\r\n this.locale\r\n );\r\n return cacheKey;\r\n };\r\n\r\n public getCacheObjectType = () => 'CollectionActionResult';\r\n\r\n public dataCacheType = (): CacheType => 'request';\r\n}\r\n\r\n// TODO: Create a data model here or import one to capture the response of the action\r\nexport interface IGetFullProductsByCollectionData {\r\n text: string;\r\n}\r\n\r\nexport type CollectionClassConstructor = new (\r\n pageType: listPageType,\r\n apiSettings: ICommerceApiSettings,\r\n queryResultSettings: IQueryResultSettings,\r\n refiners: ProductRefinerValue[],\r\n category: number | undefined,\r\n searchText: string | undefined,\r\n includeAttributes: boolean | undefined,\r\n isUpdateRefinerPanel?: boolean | undefined,\r\n locale?: string,\r\n catalogId?: number\r\n) => BaseCollectionInput;\r\n\r\n/**\r\n * TODO: Use this function to create the input required to make the action call.\r\n * @param args\r\n * @param inputClassConstuctor\r\n */\r\nexport const createBaseCollectionInput = (\r\n args: ICreateActionContext,\r\n inputClassConstuctor: CollectionClassConstructor\r\n): BaseCollectionInput => {\r\n const pageType =\r\n args.requestContext.urlTokens.pageType === 'Category' || (args.requestContext.query && args.requestContext.query.categoryId)\r\n ? 'Category'\r\n : 'Search';\r\n\r\n const queryResultSettings = QueryResultSettingsProxy.fromInputData(args).QueryResultSettings;\r\n const queryRefiners = hydrateRefinersFromUrl(args.requestContext);\r\n const includeAttributes = getIncludeAttributes(args);\r\n const isUpdateRefinerPanel = getUpdateRefinerPanel(args);\r\n const catalogId = getCatalogId(args.requestContext);\r\n\r\n if (args.requestContext.query && args.requestContext.query.sorting) {\r\n queryResultSettings.Sorting = { Columns: JSON.parse(decodeURIComponent(args.requestContext.query.sorting)) };\r\n }\r\n\r\n if (pageType === 'Category') {\r\n return new inputClassConstuctor(\r\n pageType,\r\n args.requestContext.apiSettings,\r\n queryResultSettings,\r\n queryRefiners,\r\n +(args.requestContext.urlTokens.itemId || (args.requestContext.query && args.requestContext.query.categoryId) || 0),\r\n undefined,\r\n includeAttributes,\r\n isUpdateRefinerPanel,\r\n args.requestContext.locale,\r\n catalogId\r\n );\r\n } else if (pageType === 'Search' && args.requestContext.query && args.requestContext.query.q) {\r\n return new inputClassConstuctor(\r\n pageType,\r\n args.requestContext.apiSettings,\r\n queryResultSettings,\r\n queryRefiners,\r\n undefined,\r\n args.requestContext.query.q,\r\n includeAttributes,\r\n isUpdateRefinerPanel,\r\n args.requestContext.locale,\r\n catalogId\r\n );\r\n } else if (\r\n pageType === 'Search' &&\r\n args.requestContext.query &&\r\n args.requestContext.query.productId &&\r\n args.requestContext.query.recommendation\r\n ) {\r\n return new inputClassConstuctor(\r\n pageType,\r\n args.requestContext.apiSettings,\r\n queryResultSettings,\r\n queryRefiners,\r\n undefined,\r\n JSON.stringify({ ProductId: args.requestContext.query.productId, Recommendation: args.requestContext.query.recommendation }),\r\n includeAttributes,\r\n isUpdateRefinerPanel,\r\n args.requestContext.locale,\r\n catalogId\r\n );\r\n }\r\n\r\n throw new Error('[getFullProductsForCollection]Unable to create input');\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/* eslint-disable no-duplicate-imports */\r\nimport MsDyn365, {\r\n CacheType,\r\n createObservableDataAction,\r\n IAction,\r\n IActionContext,\r\n IActionInput,\r\n ICreateActionContext\r\n} from '@msdyn365-commerce/core';\r\nimport { AsyncResult, ChannelInventoryConfiguration, ProductSearchCriteria, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport { searchByCriteriaAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\nimport { getInventoryConfigurationAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/StoreOperationsDataActions.g';\r\nimport { ArrayExtensions, generateProductImageUrl, InventoryLevels, ObjectExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\n\r\nimport { ListPageStateInput } from '../list-page-state';\r\nimport { BaseCollectionInput, createBaseCollectionInput } from './base-collection-action';\r\n\r\n/**\r\n * GetFullProductsByCollection Action Input.\r\n */\r\nexport class GetFullProductsByCollectionInput extends BaseCollectionInput implements IActionInput {\r\n /**\r\n * The cache object type.\r\n * @returns The cache object type.\r\n */\r\n public getCacheObjectType = (): string => 'FullProductSearchResult';\r\n\r\n /**\r\n * The data cache type.\r\n * @returns The data cache type.\r\n */\r\n public dataCacheType = (): CacheType => {\r\n if (\r\n this.pageType !== 'Category' ||\r\n (this.refiners && this.refiners.length > 0) ||\r\n (this.queryResultSettings &&\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 * This setting defines inventory filtering options.\r\n */\r\nexport enum ProductListInventoryFilteringOptions {\r\n /**\r\n * Filter out all products out of stock.\r\n */\r\n HideOOS = 'hideOOS',\r\n\r\n /**\r\n * Sort products by availability, OOS goes last.\r\n */\r\n SortOOS = 'sortOOS',\r\n\r\n /**\r\n * No filtering selected.\r\n */\r\n Default = 'default'\r\n}\r\n\r\n/**\r\n * The full product search result with count interface.\r\n */\r\nexport interface IFullProductsSearchResultsWithCount {\r\n products: ProductSearchResult[];\r\n count: number;\r\n channelInventoryConfigurationId?: number;\r\n}\r\n\r\n/**\r\n * CreateInput function which creates and actionInput used to fetch products for a list page.\r\n * @param args - The API arguments.\r\n * @returns IActionInput - The action input.\r\n */\r\nconst createInput = (args: ICreateActionContext<{ itemsPerPage: number; includedAttributes: boolean | undefined }>): IActionInput => {\r\n const input = createBaseCollectionInput(args, GetFullProductsByCollectionInput);\r\n\r\n // Set Top\r\n if (input.queryResultSettings.Paging && args.config) {\r\n input.queryResultSettings.Paging.Top = args.config.itemsPerPage || 1;\r\n }\r\n\r\n // Set Skip\r\n if (input.queryResultSettings.Paging && args.requestContext.query && args.requestContext.query.skip) {\r\n input.queryResultSettings.Paging.Skip = +args.requestContext.query.skip;\r\n }\r\n\r\n input.queryResultSettings.count = true;\r\n\r\n return input;\r\n};\r\n\r\n/**\r\n * Finds whether a product is out of stock based on the attribute.\r\n * @param product - The product.\r\n * @param channelInventoryConfiguration - The channel configuration.\r\n * @returns True if is OOS, false otherwise.\r\n */\r\nfunction isOutOfStock(product: ProductSearchResult, channelInventoryConfiguration: ChannelInventoryConfiguration): boolean {\r\n if (!ArrayExtensions.hasElements(product.AttributeValues)) {\r\n // If no attributes then assume is in stock\r\n return false;\r\n }\r\n for (const attribute of product.AttributeValues) {\r\n if (\r\n attribute.RecordId === channelInventoryConfiguration.InventoryProductAttributeRecordId &&\r\n attribute.TextValue === channelInventoryConfiguration.InventoryOutOfStockAttributeValueText\r\n ) {\r\n // The matching recordId indicates that is the inventory attribute\r\n // if the text value are the same then is out of stock.\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n}\r\n\r\n/**\r\n * Returns only in stock products.\r\n * @param products - The product.\r\n * @param channelInventoryConfiguration - The channel configuration.\r\n * @returns Filtered product search result.\r\n */\r\nfunction filterOutOfStockProducts(\r\n products: ProductSearchResult[],\r\n channelInventoryConfiguration: ChannelInventoryConfiguration\r\n): ProductSearchResult[] {\r\n if (!ArrayExtensions.hasElements(products)) {\r\n return [];\r\n }\r\n const filteredProducts: ProductSearchResult[] = [];\r\n\r\n for (const product of products) {\r\n if (!isOutOfStock(product, channelInventoryConfiguration)) {\r\n filteredProducts.push(product);\r\n }\r\n }\r\n return filteredProducts;\r\n}\r\n\r\n/**\r\n * Returns sorted products based on availability.\r\n * @param products - The product.\r\n * @param channelInventoryConfiguration - The channel configuration.\r\n * @returns Sorted product search result.\r\n */\r\nfunction sortsProductsBasedOnAvailability(\r\n products: ProductSearchResult[],\r\n channelInventoryConfiguration: ChannelInventoryConfiguration\r\n): ProductSearchResult[] {\r\n if (!ArrayExtensions.hasElements(products)) {\r\n return [];\r\n }\r\n const inStockProducts: ProductSearchResult[] = [];\r\n const outOfStockProducts: ProductSearchResult[] = [];\r\n\r\n for (const product of products) {\r\n if (isOutOfStock(product, channelInventoryConfiguration)) {\r\n outOfStockProducts.push(product);\r\n } else {\r\n inStockProducts.push(product);\r\n }\r\n }\r\n return inStockProducts.concat(outOfStockProducts);\r\n}\r\n\r\n/**\r\n * Returns list of products based on inventory information.\r\n * @param products - The products.\r\n * @param channelInventoryConfiguration - The channel configuration.\r\n * @param context - The context.\r\n * @returns List of product based on the inventory information.\r\n */\r\nexport function returnProductsBasedOnInventoryInformation(\r\n products: ProductSearchResult[],\r\n channelInventoryConfiguration: ChannelInventoryConfiguration,\r\n context: IActionContext\r\n): ProductSearchResult[] {\r\n if (!ArrayExtensions.hasElements(products) || ObjectExtensions.isNullOrUndefined(channelInventoryConfiguration)) {\r\n return [];\r\n }\r\n switch (context.requestContext.app.config.productListInventoryDisplay) {\r\n case ProductListInventoryFilteringOptions.HideOOS:\r\n return filterOutOfStockProducts(products, channelInventoryConfiguration);\r\n case ProductListInventoryFilteringOptions.SortOOS:\r\n return sortsProductsBasedOnAvailability(products, channelInventoryConfiguration);\r\n default:\r\n return products;\r\n }\r\n}\r\n\r\n/**\r\n * Returns list of products based on inventory information.\r\n * @param productSearchResults - The products.\r\n * @param context - The context.\r\n * @param metadataCount - The metadata count.\r\n * @returns List of product based on the inventory information.\r\n */\r\nexport async function returnProducts(\r\n productSearchResults: ProductSearchResult[],\r\n context: IActionContext,\r\n metadataCount: number | undefined\r\n): Promise {\r\n const defaultProductCount: number = 0;\r\n\r\n const productSearchResultsWithImages = productSearchResults.map(productSearchResult => {\r\n const newImageUrl = generateProductImageUrl(productSearchResult, context.requestContext.apiSettings);\r\n\r\n if (newImageUrl) {\r\n productSearchResult.PrimaryImageUrl = newImageUrl;\r\n }\r\n\r\n return productSearchResult;\r\n });\r\n\r\n // If inventory level is threshold or inventory check is disabled then return the list of products without the inventory configuration\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- read config file.\r\n if (\r\n context.requestContext.app.config.inventoryLevel === InventoryLevels.threshold ||\r\n context.requestContext.app.config.enableStockCheck === false\r\n ) {\r\n return {\r\n products: productSearchResultsWithImages,\r\n count: metadataCount ?? defaultProductCount\r\n };\r\n }\r\n const channelInventoryConfiguration = await getInventoryConfigurationAsync({ callerContext: context });\r\n\r\n const mappedProducts = productSearchResultsWithImages.map(productSearchResult => {\r\n if (ArrayExtensions.hasElements(productSearchResult.AttributeValues)) {\r\n for (const element of productSearchResult.AttributeValues) {\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- need check.\r\n if (\r\n channelInventoryConfiguration &&\r\n element.RecordId !== undefined &&\r\n element.RecordId === channelInventoryConfiguration.InventoryProductAttributeRecordId &&\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- read config file.\r\n context.requestContext.app.config.inventoryRanges !== 'all' &&\r\n element.TextValue !== channelInventoryConfiguration.InventoryOutOfStockAttributeValueText\r\n ) {\r\n // If same RecordId then it means that is the Inventory attribute\r\n // Based on the inventory range (and filtering options), the inventory label will be displayed\r\n // If Inventory range is 'All' then in stock and out of stock labels are shown, else only OOS\r\n // if the text value is different that the channelInventoryConfiguration.InventoryOutOfStockAttributeValueText then is in stock\r\n element.TextValue = '';\r\n }\r\n }\r\n }\r\n\r\n return productSearchResult;\r\n });\r\n const productsBasedOnInventory = returnProductsBasedOnInventoryInformation(mappedProducts, channelInventoryConfiguration, context);\r\n return {\r\n products: productsBasedOnInventory,\r\n count: metadataCount ?? defaultProductCount,\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- check config.\r\n channelInventoryConfigurationId: channelInventoryConfiguration\r\n ? channelInventoryConfiguration.InventoryProductAttributeRecordId\r\n : undefined\r\n };\r\n}\r\n\r\n/**\r\n * Action function to fetch products for a list page.\r\n * @param input - The input.\r\n * @param context - The context.\r\n * @returns IFullProductsSearchResultsWithCount - The full product search result with count.\r\n */\r\nasync function action(input: GetFullProductsByCollectionInput, context: IActionContext): Promise {\r\n let promise: AsyncResult;\r\n let searchProductId;\r\n const searchCriteriaInput: ProductSearchCriteria = {};\r\n searchCriteriaInput.Context = {\r\n ChannelId: context.requestContext.apiSettings.channelId,\r\n CatalogId: context.requestContext.apiSettings.catalogId\r\n };\r\n searchCriteriaInput.Refinement = input.refiners;\r\n searchCriteriaInput.IncludeAttributes = input.includeAttributes;\r\n searchCriteriaInput.SkipVariantExpansion = true;\r\n const defaultNumber: number = 0;\r\n\r\n // VSI CUSTOMIZATION - START - pass uc_param to searchByCriteria if exist in url\r\n let uc_param = context.requestContext.query && context.requestContext.query.uc_param ? context.requestContext.query.uc_param : '';\r\n uc_param = uc_param.replace(/\\s/g, '%20');\r\n // VSI CUSTOMIZATION - END -\r\n if (input.pageType === 'Category' || (context.requestContext.query && context.requestContext.query.categoryId)) {\r\n if (input.category) {\r\n searchCriteriaInput.CategoryIds = [input.category || defaultNumber];\r\n if (uc_param) {\r\n searchCriteriaInput.SearchCondition = `&uc_param=${uc_param}`;\r\n }\r\n promise = searchByCriteriaAsync(\r\n {\r\n callerContext: context,\r\n queryResultSettings: input.queryResultSettings\r\n },\r\n searchCriteriaInput\r\n );\r\n } else {\r\n throw new Error('[GetFullProductsForCollection]Category Page Detected, but no global categoryId found');\r\n }\r\n } else if (input.searchText && context.requestContext.query && context.requestContext.query.q) {\r\n searchCriteriaInput.SearchCondition = input.searchText;\r\n searchCriteriaInput.SearchCondition = uc_param ? `${input.searchText}&uc_param=${uc_param}` : input.searchText;\r\n promise = searchByCriteriaAsync(\r\n {\r\n callerContext: context,\r\n queryResultSettings: input.queryResultSettings\r\n },\r\n searchCriteriaInput\r\n );\r\n } else if (\r\n input.searchText &&\r\n context.requestContext.query &&\r\n context.requestContext.query.productId &&\r\n context.requestContext.query.recommendation\r\n ) {\r\n const searchObject = JSON.parse(input.searchText);\r\n searchProductId = Number(searchObject.ProductId);\r\n if (Number.isNaN(searchProductId)) {\r\n throw new Error('Failed to cast search product id into a number.');\r\n } else if (!searchObject.Recommendation) {\r\n throw new Error('Failed to retrieve the Recommendation.');\r\n } else {\r\n searchCriteriaInput.RecommendationListId = searchObject.Recommendation;\r\n searchCriteriaInput.Ids = [searchProductId || defaultNumber];\r\n if (uc_param) {\r\n searchCriteriaInput.SearchCondition = `&uc_param=${uc_param}`;\r\n }\r\n promise = searchByCriteriaAsync(\r\n {\r\n callerContext: context,\r\n queryResultSettings: input.queryResultSettings\r\n },\r\n searchCriteriaInput\r\n );\r\n }\r\n } else {\r\n throw new Error('[GetFullProductsForCollection]Search Page Detected, but no q= or productId= query parameter found');\r\n }\r\n\r\n const productSearchResults = await promise;\r\n\r\n // Update ListPageState For SSR\r\n if (!MsDyn365.isBrowser) {\r\n context.update(new ListPageStateInput(), {\r\n totalProductCount: promise.metadata.count ?? defaultNumber,\r\n activeFilters: input.refiners\r\n });\r\n }\r\n\r\n return returnProducts(productSearchResults, context, promise.metadata.count);\r\n}\r\n\r\nexport const actionDataAction = createObservableDataAction({\r\n id: '@msdyn365-commerce-modules/search-result-container/get-full-products-by-collection',\r\n action: >action,\r\n input: createInput\r\n});\r\n\r\nexport default actionDataAction;\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport {\r\n CacheType,\r\n 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\n// eslint-disable-next-line @typescript-eslint/naming-convention -- Name change will require many modifications\r\ninterface SearchConfiguration {\r\n ProductSortColumns?: SortColumn[];\r\n}\r\n\r\n// eslint-disable-next-line @typescript-eslint/naming-convention -- Name change will require many modifications\r\nexport interface MappedSearchConfiguration {\r\n key: string;\r\n sortColumn: SortColumn;\r\n}\r\n\r\nexport const sortOptions = {\r\n sortByOptionRelevanceDesc: 'Ranking-Desc',\r\n sortByOptionRatingAsc: 'AverageRating-Asc',\r\n sortByOptionRatingDesc: 'AverageRating-Desc',\r\n sortByOptionNameAsc: 'Name-Asc',\r\n sortByOptionNameDesc: 'Name-Desc',\r\n sortByOptionPriceAsc: 'Price-Asc',\r\n sortByOptionPriceDesc: 'Price-Desc',\r\n sortByOptionBestSelling: 'BestSelling',\r\n sortByOptionNewScore: 'NewScore',\r\n sortByOptionTrendingScore: 'TrendingScore'\r\n};\r\n\r\n/**\r\n * ActionInput class for the get-mapped-search-configuration Data Action.\r\n */\r\nexport class MappedSearchInput implements IActionInput {\r\n private readonly apiSettings: ICommerceApiSettings;\r\n\r\n constructor(apiSettings: ICommerceApiSettings) {\r\n this.apiSettings = apiSettings;\r\n }\r\n\r\n public getCacheKey = () => buildCacheKey('MappedSearchInput', this.apiSettings);\r\n\r\n public getCacheObjectType = () => 'MappedSearchInput';\r\n\r\n public dataCacheType = (): CacheType => 'request';\r\n}\r\n\r\n/**\r\n * Get a mapped search configuration that is easy to use for sorting.\r\n * @param input\r\n * @param ctx\r\n */\r\nexport async function getMappedSearchConfiguration(input: MappedSearchInput, ctx: IActionContext): Promise {\r\n return getSearchConfigurationAsync({ callerContext: ctx }).then((searchConfiguration: SearchConfiguration) => {\r\n return (searchConfiguration.ProductSortColumns || [])\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.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { createObservableDataAction, IAction, IActionContext, IActionInput, ICreateActionContext } from '@msdyn365-commerce/core';\r\n\r\nimport { BaseCollectionInput, createBaseCollectionInput } from './base-collection-action';\r\nimport { getProductRefinerHierarchy } from './get-product-refiner-hierarchy';\r\n\r\n/**\r\n * Default Category/Product Id Values.\r\n */\r\nenum DefaultValues {\r\n defaultCategoryIdValue = 0,\r\n defaultProductIdValue = 0\r\n}\r\n\r\n/**\r\n * Refiners-by-Collection Input action.\r\n */\r\nexport class RefinersByCollectionInput extends BaseCollectionInput implements IActionInput {\r\n public getCacheObjectType = () => 'ProductRefiner';\r\n\r\n public dataCacheType = () => {\r\n if (\r\n this.pageType !== 'Category' ||\r\n (this.refiners && this.refiners.length > 0) ||\r\n (this.queryResultSettings &&\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.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { IActionContext } from '@msdyn365-commerce/core';\r\nimport { IQueryResultSettings, ProductRefiner, ProductSearchCriteria } from '@msdyn365-commerce/retail-proxy';\r\nimport { getProductSearchRefinersAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\n\r\n/**\r\n * Uses Bulk refiner API to get refiners and child refiner values.\r\n * @param searchCriteria Product search criteria.\r\n * @param maxItems Max items.\r\n * @param queryResultSettings\r\n * @param ctx Action context.\r\n */\r\nexport async function getProductRefinerHierarchy(\r\n searchCriteria: ProductSearchCriteria,\r\n queryResultSettings: IQueryResultSettings,\r\n ctx: IActionContext\r\n): Promise {\r\n return getProductSearchRefinersAsync({ callerContext: ctx, queryResultSettings }, searchCriteria).then(\r\n (productRefiners: ProductRefiner[]) => {\r\n if (!productRefiners) {\r\n ctx.trace('[getRefinersByCriteriaAction] returned no refiners');\r\n return [];\r\n }\r\n\r\n const result = (productRefiners || []).map((productRefiner: ProductRefiner) => productRefiner);\r\n\r\n if (result.length === 0) {\r\n ctx.trace('[getRefinersByCriteriaAction] returned no IProductRefinerHierarchy objects');\r\n return [];\r\n }\r\n\r\n return result;\r\n }\r\n );\r\n}\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/* eslint-disable no-duplicate-imports */\r\n/* eslint-disable security/detect-object-injection */\r\nimport MsDyn365, { IRequestContext } from '@msdyn365-commerce/core';\r\nimport { ProductRefinerValue, SortColumn } from '@msdyn365-commerce/retail-proxy';\r\n\r\n/**\r\n * Refiner Compression:\r\n * Refiners contains a non-trivial amount of data that is required to successfully make\r\n * a refiner-based API call. To allow for deep-linking of refiners in the URL, refiner data\r\n * must be compressed so that URL max length is not exceeded. Refiners will be compressed into\r\n * the following array style index-based format:\r\n * [DataTypeValue, LeftValueBoundString, RefinerRecordId, RefinerSourceValue, RightValueBoundString, UnitText].\r\n */\r\nconst compressedRefinerKeys = [\r\n 'DataTypeValue',\r\n 'LeftValueBoundString',\r\n 'RefinerRecordId',\r\n 'RefinerSourceValue',\r\n 'RightValueBoundString',\r\n 'UnitText'\r\n];\r\n\r\n/**\r\n * Hydrates compressed refiner data from URL.\r\n * @param fullUrl The full URL of the page.\r\n * @param requestContext\r\n */\r\nexport const hydrateRefinersFromUrl = (requestContext: IRequestContext): ProductRefinerValue[] => {\r\n const compressedRefinerArray = parseQueryParam<(string | number)[][]>('refiners', requestContext);\r\n if (!compressedRefinerArray || compressedRefinerArray.length === 0) {\r\n return [];\r\n }\r\n\r\n return compressedRefinerArray\r\n .map(compressedRefiner => {\r\n try {\r\n const parsedRefiner: ProductRefinerValue = {};\r\n compressedRefinerKeys.forEach((refinerKey, index) => {\r\n parsedRefiner[refinerKey] = compressedRefiner[index];\r\n });\r\n return parsedRefiner;\r\n } catch {\r\n return undefined;\r\n }\r\n })\r\n .filter(Boolean);\r\n};\r\n\r\n/**\r\n * Compressed a list of refiners for use in URLs.\r\n * @param refiners The uncompressed refiners.\r\n */\r\nexport const compressRefiners = (refiners: ProductRefinerValue[]) => {\r\n const compressedRefiners: (string | number)[][] = [];\r\n\r\n refiners.forEach(refiner => {\r\n const compressedRefiner: (string | number)[] = [];\r\n compressedRefinerKeys.forEach(refinerKey => {\r\n compressedRefiner.push(refiner[refinerKey]);\r\n });\r\n compressedRefiners.push(compressedRefiner);\r\n });\r\n\r\n return compressedRefiners;\r\n};\r\n\r\n/**\r\n * Method which creates a URL contiaining serialized active refiners.\r\n * @param fullUrl The Current URL of the page.\r\n * @param refiners The refiners which should be added to the URL.\r\n * @param sortingColumns\r\n * @param skipCount\r\n */\r\nexport const buildListPageUrl = (fullUrl: URL, refiners?: ProductRefinerValue[], sortingColumns?: SortColumn[], skipCount?: number) => {\r\n // Refiner Change flow\r\n if (refiners !== undefined) {\r\n if (refiners.length === 0) {\r\n fullUrl.searchParams.delete('refiners');\r\n } else {\r\n const sortedRefiners = refiners.sort((first, second) =>\r\n first.RefinerRecordId && second.RefinerRecordId && first.RefinerRecordId > second.RefinerRecordId ? 1 : -1\r\n );\r\n fullUrl.searchParams.set('refiners', JSON.stringify(compressRefiners(sortedRefiners)));\r\n }\r\n\r\n // Adding or removing a refiner means we want to always load page 1\r\n fullUrl.searchParams.delete('skip');\r\n return fullUrl.href;\r\n }\r\n\r\n if (sortingColumns !== undefined) {\r\n if (sortingColumns.length === 0) {\r\n fullUrl.searchParams.delete('sorting');\r\n } else {\r\n fullUrl.searchParams.set('sorting', JSON.stringify(sortingColumns));\r\n }\r\n\r\n // Changing the sort means always load page 1\r\n fullUrl.searchParams.delete('skip');\r\n return fullUrl.href;\r\n }\r\n\r\n if (skipCount) {\r\n fullUrl.searchParams.set('skip', skipCount.toString());\r\n }\r\n\r\n return fullUrl.href;\r\n};\r\n\r\n/**\r\n * Parses a query param from the query object of the request context.\r\n * @param key The query parameter key.\r\n * @param requestContext The request context.\r\n */\r\nexport const parseQueryParam = (key: string, requestContext: IRequestContext): T | null => {\r\n if (requestContext.query && requestContext.query[key]) {\r\n return JSON.parse(decodeURIComponent(requestContext.query[key]));\r\n }\r\n return null;\r\n};\r\n\r\n/**\r\n * Gets the current URL of the page from the request context.\r\n * @param requestContext The request context.\r\n */\r\nexport const getCurrentUrl = (requestContext: IRequestContext): URL => {\r\n if (MsDyn365.isBrowser && window) {\r\n return new URL(window.location.href);\r\n }\r\n\r\n // NOTE: Typing on requestURL is incorrect\r\n if (requestContext.url.requestUrl.href) {\r\n return new URL(requestContext.url.requestUrl.href);\r\n }\r\n return new URL((requestContext.url.requestUrl));\r\n};\r\n","/**\r\n * Copyright (c) Microsoft Corporation\r\n * All rights reserved. See License.txt in the project root for license information.\r\n * IDobbiesSearchResultContainer 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 IDobbiesSearchResultContainerConfig extends Msdyn365.IModuleConfig {\r\n itemsPerPage?: number;\r\n allowBackNavigation?: boolean;\r\n imageSettings?: Msdyn365.IImageSettings;\r\n className?: string;\r\n expandRefinersCount?: expandRefinersCount;\r\n disableHierarchy?: boolean;\r\n startingRefinerList?: string[];\r\n includeAttributes?: boolean;\r\n enableAffiliationBasedPricing?: boolean;\r\n enableOutOfStockButton?: boolean;\r\n updateRefinerPanel?: boolean;\r\n clubPlusBadgeLink?: string;\r\n clientRender?: boolean;\r\n}\r\n\r\nexport interface IDobbiesSearchResultContainerResources {\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 filterActiveText: 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 browseButtonText: string;\r\n outOfStockNavText: string;\r\n showOutofStockBtn: string;\r\n hideOutOfStockBtn: 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}\r\n\r\nexport interface IDobbiesSearchResultContainerProps extends Msdyn365.IModule {\r\n resources: IDobbiesSearchResultContainerResources;\r\n config: IDobbiesSearchResultContainerConfig;\r\n slots: {\r\n browse: React.ReactNode[];\r\n quickview: React.ReactNode[];\r\n productComparisonButton: React.ReactNode[];\r\n };\r\n}\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\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 from '@msdyn365-commerce/core';\r\nimport { getCartFromCustomer } from '@msdyn365-commerce/global-state';\r\nimport {\r\n format,\r\n ProductPrice,\r\n ProductRefinerValue,\r\n ProjectionDomain,\r\n SortColumn,\r\n TextValueTranslation,\r\n DiscountLine\r\n} from '@msdyn365-commerce/retail-proxy';\r\nimport { getActivePricesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\nimport { ArrayExtensions } 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 ITelemetryContent,\r\n LabeledDropdown,\r\n UncontrolledPagination\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport { computed, observable, reaction, transaction } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\n\r\nimport {\r\n buildListPageUrl,\r\n getCollectionProducts,\r\n getCollectionRefinersAction,\r\n getCurrentUrl,\r\n GetFullProductsByCollectionInput,\r\n parseQueryParam,\r\n RefinersByCollectionInput,\r\n sortOptions\r\n} from './actions';\r\nimport { hydrateRefinersFromUrl } from './actions/url-utils';\r\nimport {\r\n ErrorMessage,\r\n FeatureSearchResultItem,\r\n getUpdatedRefinementCriteria,\r\n IChoiceSummaryClickNotification,\r\n IRefineItemCommonProps,\r\n IRefineItemToggleNotification,\r\n ISearchResultModalViewProps,\r\n isMatchingRefinementCriterion,\r\n Link,\r\n ModalToggle,\r\n ProductSearchResultItems,\r\n SearchResultModal,\r\n Separator,\r\n Title\r\n} from './components';\r\nimport ChoiceSummary from './components/choice-summary';\r\nimport RefineSubmenu from './components/refine-submenu';\r\nimport { IDobbiesSearchResultContainerData } from './dobbies-search-result-container.data';\r\nimport { expandRefinersCount, IDobbiesSearchResultContainerProps } from './dobbies-search-result-container.props.autogenerated';\r\n// import { useState, useEffect } from \"react\";\r\nexport interface ISearchResultContainerViewProps extends IDobbiesSearchResultContainerProps {\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 refinersRef: React.RefObject;\r\n onMoreFiltersClicked?(keyName: string | undefined, isExpanded: boolean, isFromMoreFilters?: boolean): 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 endingRefiners?: 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 discountLines: (DiscountLine[] | undefined)[];\r\n showProdPrice: boolean;\r\n productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\r\n isUpdated: boolean;\r\n nonClubPlusDiscount: ProductPrice[];\r\n updatedProducts: number[] | undefined;\r\n lastUrlStr: string;\r\n refinersExpandedStateData?: IDobbiesRefinerExpandedState[][];\r\n scrollClass: boolean;\r\n}\r\n\r\ninterface ISortByCollectionState {\r\n selectedSortByOption: ILabeledDropdownOption;\r\n pending: boolean;\r\n}\r\n\r\nexport interface IDobbiesRefinerExpandedState {\r\n refinerId?: number;\r\n isExpanded: boolean;\r\n keyName?: string;\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 IDobbiesSearchResultContainerProps,\r\n ISearchResultContainerState\r\n> {\r\n @computed get isMobile(): boolean {\r\n return this._viewport === 'xs' || this._viewport === 'sm' || this._viewport === 'md';\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 ];\r\n\r\n private readonly _refineItemCommonProps: IRefineItemCommonProps;\r\n\r\n private readonly _pageType: string | undefined = this.props.context.request.urlTokens.pageType;\r\n\r\n @observable\r\n private _viewport: GridSize;\r\n\r\n private readonly _modalToggleRef: React.RefObject;\r\n\r\n private readonly _sortAndFilterContainerRef: React.RefObject;\r\n\r\n private expandrefinerCount: number | undefined = 0;\r\n\r\n private readonly telemetryContent: ITelemetryContent;\r\n\r\n private productPrices: ProductPrice[];\r\n\r\n private readonly defaultPageNumber = 0;\r\n\r\n private refinersRef: React.RefObject;\r\n\r\n public static getFriendlyName(locale: string, nameTranslations?: TextValueTranslation[]): string | undefined {\r\n let nameTranslation: TextValueTranslation | undefined;\r\n if (locale && nameTranslations && nameTranslations.length > 0) {\r\n nameTranslation = nameTranslations.find(item => item.Language!.toLowerCase() === locale.toLowerCase());\r\n }\r\n\r\n return nameTranslation && nameTranslation.Text;\r\n }\r\n\r\n private lastChangedScrollStateMobile: Date | undefined;\r\n\r\n constructor(props: IDobbiesSearchResultContainerProps, state: ISearchResultContainerState) {\r\n super(props);\r\n this._viewport =\r\n props.context.request && props.context.request.device && props.context.request.device.Type === 'Mobile' ? 'xs' : 'lg';\r\n this._modalToggleRef = React.createRef();\r\n this._sortAndFilterContainerRef = React.createRef();\r\n this._toggleModal = this._toggleModal.bind(this);\r\n this._updateViewport = this._updateViewport.bind(this);\r\n this.productPrices = [];\r\n this.refinersRef = React.createRef();\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 discountLines: [],\r\n showProdPrice: false,\r\n isUpdated: false,\r\n nonClubPlusDiscount: [],\r\n updatedProducts: [],\r\n lastUrlStr: '',\r\n scrollClass: false\r\n };\r\n const { placeholderTextMax, minLabel, maxLabel, rangeNameFormat } = this.props.resources;\r\n\r\n const locale = this.props.context.request.locale;\r\n const telemetry = this.props.telemetry;\r\n const validationErrorNaN = this.props.resources.validationErrorNotNumber;\r\n const validationErrorRange = this.props.resources.validationErrorNotRange;\r\n this._refineItemCommonProps = {\r\n telemetry,\r\n locale,\r\n placeholderTextMax,\r\n minLabel,\r\n maxLabel,\r\n rangeNameFormat,\r\n validationErrorNaN,\r\n validationErrorRange\r\n };\r\n this.telemetryContent = getTelemetryObject(\r\n this.props.context.request.telemetryPageName!,\r\n this.props.friendlyName,\r\n this.props.telemetry\r\n );\r\n\r\n // VSI-Customization -- START check & redirect if found url in returns of search query\r\n if (props.data.products.result && props.data.products.result.count === 0) {\r\n const redirectUrl = props.data.products.result.products[0].ExtensionProperties?.find(item => item.Key === 'RedirectURL');\r\n if (redirectUrl && redirectUrl.Value!.StringValue && MsDyn365.isBrowser && window) {\r\n window.location.assign(redirectUrl.Value!.StringValue);\r\n }\r\n }\r\n /* VSI-Customization -- END */\r\n\r\n // Initalization of list page\r\n this.props.data.products.then(products => {\r\n this.props.data.listPageState.then(listPageState => {\r\n if (this._pageType === 'Category') {\r\n listPageState.pageType = 'Category';\r\n } else {\r\n listPageState.pageType = 'Search';\r\n }\r\n\r\n let querySorting: SortColumn[] = [];\r\n\r\n if (this.props.context.request.query && this.props.context.request.query.sorting) {\r\n querySorting = JSON.parse(decodeURIComponent(this.props.context.request.query.sorting)) as SortColumn[];\r\n }\r\n\r\n listPageState.currentPageNumber =\r\n (this.props.context.request.query && +this.props.context.request.query.skip / (this.props.config.itemsPerPage || 10)) ||\r\n 0;\r\n listPageState.sortingCritera = { Columns: querySorting };\r\n listPageState.pageSize = this.props.config.itemsPerPage || 10;\r\n listPageState.activeProducts = products.products;\r\n listPageState.totalProductCount = products.count;\r\n listPageState.activeFilters = hydrateRefinersFromUrl(this.props.context.request);\r\n\r\n // Initialize reaction based on listPageState properties\r\n reaction(\r\n () => {\r\n return [\r\n listPageState.activeFilters && listPageState.activeFilters.length,\r\n listPageState.currentPageNumber,\r\n listPageState.sortingCritera && this.state.isUpdated\r\n ];\r\n },\r\n () => {\r\n const input = new GetFullProductsByCollectionInput(\r\n listPageState.pageType,\r\n this.props.context.request.apiSettings,\r\n {\r\n Paging: {\r\n Top: this.props.config.itemsPerPage,\r\n Skip: Math.max(listPageState.pageSize * (listPageState.currentPageNumber || 0), 0)\r\n },\r\n count: true,\r\n Sorting: listPageState.sortingCritera || {}\r\n },\r\n listPageState.activeFilters || [],\r\n +(this.props.context.request.urlTokens.itemId || 0),\r\n\r\n this.props.context.request.query && this.props.context.request.query.q\r\n ? this.props.context.request.query.q\r\n : JSON.stringify({\r\n ProductId: this.props.context.request.query?.productId,\r\n Recommendation: this.props.context.request.query?.recommendation\r\n }),\r\n !!(\r\n this.props &&\r\n this.props.config &&\r\n this.props.config.includeAttributes !== undefined &&\r\n this.props.config.includeAttributes\r\n ),\r\n this.props.config.updateRefinerPanel,\r\n this.props.context.request.locale\r\n );\r\n getCollectionProducts(input, this.props.context.actionContext).then(productResults => {\r\n listPageState.activeProducts = productResults.products;\r\n listPageState.totalProductCount = productResults.count;\r\n // if (\r\n // this.props.config.enableAffiliationBasedPricing &&\r\n // this.props.context.actionContext.requestContext?.user?.isAuthenticated\r\n // ) {\r\n // this._getActivePrice();\r\n // }\r\n if (this.props.config.enableAffiliationBasedPricing) {\r\n this._getActivePrice();\r\n }\r\n });\r\n\r\n if (this.props.config.updateRefinerPanel) {\r\n const refinerInput = new RefinersByCollectionInput(\r\n listPageState.pageType,\r\n this.props.context.request.apiSettings,\r\n {\r\n Paging: {\r\n Top: this.props.config.itemsPerPage,\r\n Skip: Math.max(\r\n listPageState.pageSize * (listPageState.currentPageNumber ?? this.defaultPageNumber),\r\n this.defaultPageNumber\r\n )\r\n },\r\n count: true,\r\n Sorting: listPageState.sortingCritera ?? {}\r\n },\r\n listPageState.activeFilters ?? [],\r\n +(this.props.context.request.urlTokens.itemId ?? 0),\r\n this.props.context.request.query?.q\r\n ? this.props.context.request.query.q\r\n : this.props.context.request.query?.productId,\r\n false,\r\n this.props.config.updateRefinerPanel\r\n );\r\n\r\n getCollectionRefinersAction(refinerInput, this.props.context.actionContext)\r\n .then(refiners => {\r\n this.setState({ refiners });\r\n })\r\n .catch(error => {\r\n this.props.telemetry.error(error);\r\n });\r\n }\r\n }\r\n );\r\n });\r\n });\r\n\r\n if (this.props.context.request.query?.productId) {\r\n this.props.data.featureProduct.then(products => {\r\n this.props.data.listPageState.then(listPageStateFeature => {\r\n listPageStateFeature.featureProduct = products;\r\n });\r\n });\r\n }\r\n this._updateViewport();\r\n }\r\n\r\n public componentDidMount(): void {\r\n if (MsDyn365.isBrowser && window && window && window.addEventListener) {\r\n window.addEventListener('resize', this._updateViewport);\r\n this._updateViewport();\r\n window.addEventListener('scroll', this._mainMenuScroll);\r\n }\r\n if (this.props.config.enableAffiliationBasedPricing) {\r\n this._getActivePrice();\r\n }\r\n // if (this.props.config.enableAffiliationBasedPricing && this.props.context.actionContext.requestContext?.user?.isAuthenticated) {\r\n // this._getActivePrice();\r\n // }\r\n this.getNonClubPlusDiscountPrices();\r\n reaction(\r\n () => this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts,\r\n async () => {\r\n const url = MsDyn365.isBrowser && window && window.location.href;\r\n if (this.props.data.listPageState.result?.activeProducts.length && this.state.lastUrlStr !== url) {\r\n this.getNonClubPlusDiscountPrices();\r\n this.setState({ lastUrlStr: url ? url : '' });\r\n }\r\n }\r\n );\r\n }\r\n\r\n public checkDifference = (array1: number[] | undefined, array2: number[] | undefined) => {\r\n if (!array1 || !array2) {\r\n return true;\r\n }\r\n if (array1?.length !== array2?.length) {\r\n return true;\r\n }\r\n for (let i = 0; i < array1.length; i++) {\r\n if (array1[i] !== array2[i]) {\r\n return true;\r\n }\r\n }\r\n return false;\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 if (MsDyn365.isBrowser && window && window.addEventListener) {\r\n window.addEventListener('scroll', this._mainMenuScroll);\r\n }\r\n }\r\n\r\n public render(): JSX.Element {\r\n const { imageSettings, className } = this.props.config;\r\n const { resources } = this.props;\r\n // VSI-Customization START - check empty product object on searching special character.\r\n const products =\r\n (this.props.data.listPageState.result &&\r\n this.props.data.listPageState.result.activeProducts &&\r\n this.props.data.listPageState.result.activeProducts.length === 1 &&\r\n !this.props.data.listPageState.result.activeProducts[0].ItemId\r\n ? []\r\n : this.props.data.listPageState.result!.activeProducts) || [];\r\n // VSI-Customization END\r\n const searchProduct = (this.props.data.listPageState.result && this.props.data.listPageState.result.featureProduct) || null;\r\n let errorText = '';\r\n if (!products || products.length === 0) {\r\n errorText = this._pageType === 'Category' ? resources.resultCategoryNotFoundText : resources.resultSearchNotFoundText;\r\n }\r\n const productsComponent = this._getProducts();\r\n const featureComponent = (\r\n \r\n );\r\n\r\n const searchResultContainerViewProps = {\r\n ...this.props,\r\n\r\n products: productsComponent,\r\n TitleViewProps: !this.props.config.disableHierarchy && 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 new-filter-ms-search-result-container', className)\r\n },\r\n sortByOptions:\r\n this.props.data.listPageState.result && this.props.data.listPageState.result.totalProductCount !== 0\r\n ? this._getSortingDropDown()\r\n : null,\r\n pagination: this._getPagination(),\r\n ProductsContainer: { className: 'ms-search-result-container__Products' },\r\n ProductSectionContainer: { className: 'ms-search-result-container__product-section' },\r\n CategoryNavContainer: { className: 'ms-search-result-container__category-nav-section new-filter__category-nav-section' },\r\n RefineAndProductSectionContainer: {\r\n className: 'ms-search-result-container__refine-product-section new-filter__refine-product-section'\r\n },\r\n choiceSummary: this._getChoiceSummary(),\r\n modalToggle:\r\n this.props.data.listPageState.result && this.props.data.listPageState.result.totalProductCount !== 0 ? (\r\n \r\n ) : null,\r\n searchResultModal: this._getSearchResultModal(),\r\n isMobile: this.isMobile,\r\n errorMessage: errorText && ,\r\n FeatureSearchContainer: { className: 'ms-feature-search-result' },\r\n similarLookProduct:\r\n this.props.data.listPageState.result &&\r\n this.props.data.listPageState.result.featureProduct !== null &&\r\n this.props.data.listPageState.result.featureProduct !== undefined\r\n ? featureComponent\r\n : null,\r\n productPrices: this.productPrices,\r\n refinersRef: this.refinersRef,\r\n onMoreFiltersClicked: this.toggleRefinersInSameColumn\r\n };\r\n return this.props.renderView(searchResultContainerViewProps) as React.ReactElement;\r\n }\r\n\r\n private readonly _getActivePrice = async (): Promise => {\r\n const priceAffiliations = [\r\n {\r\n AffiliationId: this.props.context.app.config.AffiliationId,\r\n LoyaltyTierId: this.props.context.app.config.LoyaltyTierId,\r\n AffiliationTypeValue: this.props.context.app.config.AffiliationTypeValue,\r\n ReasonCodeLines: [],\r\n CustomerId: '',\r\n ExtensionProperties: []\r\n }\r\n ];\r\n\r\n let products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\r\n const productRecIds = ArrayExtensions.hasElements(products) ? products.map(prod => prod.RecordId) : [];\r\n const projectDomain: ProjectionDomain = {\r\n ChannelId: this.props.context.request.apiSettings.channelId,\r\n CatalogId: this.props.context.request.apiSettings.catalogId\r\n };\r\n const cart = await getCartFromCustomer(this.props.context.actionContext);\r\n const affliations = cart?.AffiliationLines;\r\n console.log(affliations);\r\n await getActivePricesAsync(\r\n {\r\n callerContext: this.props.context.actionContext,\r\n queryResultSettings: {}\r\n },\r\n projectDomain,\r\n productRecIds,\r\n new Date(),\r\n null,\r\n priceAffiliations,\r\n true\r\n )\r\n .then((activePricesResponse: ProductPrice[]) => {\r\n this.productPrices = activePricesResponse;\r\n const discountLines = activePricesResponse.map(priceResp => priceResp.DiscountLines);\r\n const prodIds: number[] = [];\r\n activePricesResponse.map(priceResp => {\r\n if (priceResp.ProductId) {\r\n prodIds.push(priceResp.ProductId);\r\n }\r\n });\r\n if (this.checkDifference(prodIds, this.state.updatedProducts)) {\r\n this.setState({\r\n discountLines: discountLines,\r\n showProdPrice: true,\r\n updatedProducts: prodIds\r\n });\r\n }\r\n\r\n products = products.map(prod => {\r\n const activePrice = activePricesResponse.find(price => price.ProductId === prod.RecordId);\r\n if (activePrice) {\r\n prod.Price = activePrice.CustomerContextualPrice ?? prod.Price;\r\n prod.BasePrice = Math.max(\r\n activePrice.BasePrice || 0,\r\n activePrice.TradeAgreementPrice || 0,\r\n activePrice.AdjustedPrice || 0\r\n );\r\n }\r\n return prod;\r\n });\r\n products = products?.filter(prod => {\r\n const activePrice = activePricesResponse.find(price => price.ProductId === prod.RecordId);\r\n if (activePrice) {\r\n return true;\r\n }\r\n return false;\r\n });\r\n this.props.data.listPageState.then(listPageState => {\r\n listPageState.activeProducts = products;\r\n });\r\n })\r\n .catch((error: Error) => {\r\n this.setState({\r\n showProdPrice: true\r\n });\r\n this.props.context.actionContext.trace(error.message);\r\n this.props.context.actionContext.telemetry.exception(error);\r\n this.props.context.actionContext.telemetry.debug(\r\n '[get Affiliation based price on search result container ]Error executing action'\r\n );\r\n throw new Error('[get Affiliation based price on search result container]Error executing action');\r\n });\r\n };\r\n\r\n private readonly getNonClubPlusDiscountPrices = async (): Promise => {\r\n const products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\r\n const productRecIds = ArrayExtensions.hasElements(products) ? products.map(prod => prod.RecordId) : [];\r\n const projectDomain: ProjectionDomain = {\r\n ChannelId: this.props.context.request.apiSettings.channelId,\r\n CatalogId: this.props.context.request.apiSettings.catalogId\r\n };\r\n await getActivePricesAsync(\r\n {\r\n callerContext: this.props.context.actionContext,\r\n queryResultSettings: {}\r\n },\r\n projectDomain,\r\n productRecIds,\r\n new Date(),\r\n null,\r\n null,\r\n true\r\n )\r\n .then((activePricesResponse: ProductPrice[]) => {\r\n if (activePricesResponse && activePricesResponse.length > 0) {\r\n activePricesResponse = activePricesResponse.filter(prod => {\r\n const activePrice = products?.find(price => price.RecordId === prod.ProductId);\r\n if (activePrice) {\r\n return true;\r\n }\r\n return false;\r\n });\r\n this.setState({\r\n nonClubPlusDiscount: activePricesResponse\r\n });\r\n }\r\n })\r\n .catch((error: Error) => {\r\n this.setState({\r\n showProdPrice: true\r\n });\r\n this.props.context.actionContext.trace(error.message);\r\n this.props.context.actionContext.telemetry.exception(error);\r\n this.props.context.actionContext.telemetry.debug(\r\n '[get Affiliation based price on search result container ]Error executing action'\r\n );\r\n throw new Error('[get Affiliation based price on search result container]Error executing action');\r\n });\r\n };\r\n\r\n private readonly _getSearchResultModal = (): ISearchResultModalViewProps => {\r\n const { resources } = this.props;\r\n return SearchResultModal({\r\n resources: {\r\n modalCloseButtonText: resources.modalCloseButtonText,\r\n modalTitle: resources.modalTitle\r\n },\r\n isOpen: this.state.modalIsOpen,\r\n returnRef: this._modalToggleRef,\r\n onModalToggle: this._toggleModal\r\n });\r\n };\r\n\r\n private readonly _getCollectionTitle = (): ITitleViewProps => {\r\n const { data, context, resources } = this.props;\r\n\r\n let collectionTitle: string | undefined = '';\r\n if (context && context.request && context.request.query && context.request.query.q) {\r\n collectionTitle = `\"${context.request.query.q}\"`;\r\n } else {\r\n collectionTitle =\r\n (data.category.result &&\r\n SearchResultContainer.getFriendlyName(context.request.locale, data.category.result.NameTranslations)) ||\r\n (data.category.result && data.category.result.Name);\r\n }\r\n let productCountText = '';\r\n let productCountNumber: number | undefined;\r\n if (data.listPageState && data.listPageState.result && data.listPageState.result.totalProductCount !== undefined) {\r\n productCountNumber = data.listPageState.result.totalProductCount;\r\n } else if (data.products && data.products.result) {\r\n productCountNumber = data.products.result.count;\r\n }\r\n\r\n if (productCountNumber && productCountNumber !== 0) {\r\n productCountText =\r\n productCountNumber !== 1\r\n ? format(this.props.resources.numberOfProducts, productCountNumber)\r\n : this.props.resources.oneProduct;\r\n } else {\r\n productCountText = format(this.props.resources.numberOfProducts, 0);\r\n }\r\n const isSearchPage = this.props.context.request.query?.q;\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 ${collectionTitle ? '' : 'd-none'} ${pageName}` },\r\n title: {\r\n titlePrefix,\r\n titleText,\r\n titleCount: isSearchPage ? titleCount : undefined\r\n }\r\n };\r\n };\r\n\r\n private readonly _getCategoryHierarchy = (): ICategoryHierarchyViewProps => {\r\n const { data } = this.props;\r\n const categoryHierarchy = data.categoryHierarchy.result;\r\n const categoryLinks =\r\n categoryHierarchy &&\r\n categoryHierarchy.map((value: CategoryHierarchyData, index: number) => {\r\n return (\r\n <Link\r\n key={index}\r\n text={value.Name}\r\n ariaLabel={`${this.props.resources.categoryLinkAriaLabel} ${value.Name}`}\r\n href={value.Url}\r\n />\r\n );\r\n });\r\n const categoryLinkSeparator = <Separator separator='/' />;\r\n\r\n return {\r\n CategoryHierarchyContainer: { tag: 'nav', className: 'ms-search-result-container__category-hierarchy' },\r\n categoryHierarchyList: categoryLinks,\r\n categoryHierarchySeparator: categoryLinkSeparator\r\n };\r\n };\r\n\r\n private readonly _getSortingDropDown = (): ISortByViewProps => {\r\n const { resources } = this.props;\r\n const activeDropdown = this._getCurrentlySelectedOption() || this.state.sortingState.selectedSortByOption;\r\n let dropdwonOptions = this.sortByDropdownOptions;\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- App config settings are of \"any\" value.\r\n if (this.props.context.app.config.hideRating) {\r\n dropdwonOptions = this.sortByDropdownOptions.filter(dropdownOption => dropdownOption.key !== 'AverageRating-Desc');\r\n }\r\n const dropdown = (\r\n <LabeledDropdown\r\n labelClassname='reviews-list-sort-by'\r\n labelText={resources.sortByDropdownLabel}\r\n dropdownId='categorySortByDropdown'\r\n dropdownClassname='reviews-list-dropdown'\r\n toggleColor='link'\r\n dropdownOptions={dropdwonOptions}\r\n selectedOption={activeDropdown}\r\n onSelectOption={this._updateSortByDropdown}\r\n ref={this._sortAndFilterContainerRef}\r\n />\r\n );\r\n return {\r\n SortingContainer: { className: 'ms-search-result-container__Sort-by-category' },\r\n sortByDropDown: dropdown\r\n };\r\n };\r\n\r\n private readonly _getPagination = (): React.ReactNode => {\r\n const { config, context, data, resources } = this.props;\r\n const listPageState = data && data.listPageState && data.listPageState.result;\r\n const fullUrl = getCurrentUrl(context.request);\r\n const itemsPerPage = config.itemsPerPage || 10;\r\n const skipCount =\r\n listPageState && listPageState.currentPageNumber !== null\r\n ? listPageState.currentPageNumber * (this.props.config.itemsPerPage || 10)\r\n : (this.props.context.request.query && +this.props.context.request.query.skip) || 0;\r\n const totalItems = (listPageState && listPageState.totalProductCount) || 0;\r\n const previousText = resources.flipperPrevious;\r\n const nextText = resources.flipperNext;\r\n\r\n if (totalItems <= itemsPerPage) {\r\n return null;\r\n }\r\n return (\r\n <UncontrolledPagination\r\n className='ms-search-result-container__pagination'\r\n role='navigation'\r\n aria-label={resources.paginationAriaLabel}\r\n url={fullUrl.href}\r\n qsp='skip'\r\n items={totalItems}\r\n itemsPerPage={itemsPerPage}\r\n startingItem={skipCount}\r\n previousText={this._renderPrev(previousText)}\r\n nextText={this._renderNext(nextText)}\r\n previousAriaLabel={previousText}\r\n nextAriaLabel={nextText}\r\n telemetryContent={this.telemetryContent}\r\n />\r\n );\r\n };\r\n\r\n private toggleRefinersInSameColumn = (keyName: string, isExpanded: boolean, isFromMoreFilters?: boolean) => {\r\n if (this.state.refinersExpandedStateData && this.state.refinersExpandedStateData.length) {\r\n const expandedStateData: IDobbiesRefinerExpandedState[][] = [];\r\n this.state.refinersExpandedStateData.map(refRow => {\r\n expandedStateData.push(refRow);\r\n });\r\n if (isFromMoreFilters && expandedStateData && expandedStateData.length) {\r\n let hasFilterOpened = false;\r\n for (let i = 0; i < expandedStateData.length; i++) {\r\n for (let j = 0; j < expandedStateData[i].length; j++) {\r\n if (!expandedStateData[i][j].isExpanded) {\r\n hasFilterOpened = true;\r\n }\r\n }\r\n }\r\n if (!hasFilterOpened) {\r\n return;\r\n }\r\n for (let i = 0; i < expandedStateData.length; i++) {\r\n for (let j = 0; j < expandedStateData[i].length; j++) {\r\n expandedStateData[i][j].isExpanded = true;\r\n }\r\n }\r\n this.setState({ refinersExpandedStateData: expandedStateData });\r\n } else if (expandedStateData && expandedStateData.length) {\r\n for (let i = 0; i < expandedStateData.length; i++) {\r\n for (let j = 0; j < expandedStateData[i].length; j++) {\r\n if (expandedStateData[i][j] && expandedStateData[i][j].keyName === keyName) {\r\n expandedStateData[i][j].isExpanded = isExpanded;\r\n }\r\n if (expandedStateData[i][j].keyName === keyName && !isExpanded) {\r\n for (let k = 0; k < expandedStateData.length; k++) {\r\n for (let m = 0; m < expandedStateData[k].length; m++) {\r\n if (expandedStateData[k][m] && expandedStateData[k][m].keyName !== keyName) {\r\n expandedStateData[k][m].isExpanded = true;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n this.setState({ refinersExpandedStateData: expandedStateData });\r\n }\r\n }\r\n };\r\n\r\n private setInitialSameColumnRefinerDetails = (endingRefiners: IProductRefinerHierarchy[] | undefined) => {\r\n const maxRefinersColumns = this._getViewport() !== 'xl' && this._getViewport() !== 'lg' ? 4 : 5;\r\n const filtersNavData: (string | undefined)[][] = [];\r\n let filtersRow: (string | undefined)[] = [];\r\n if (endingRefiners) {\r\n for (let index = 0; index < endingRefiners.length; index++) {\r\n if (index % maxRefinersColumns === 0 && index !== 0) {\r\n filtersNavData.push(filtersRow);\r\n filtersRow = [];\r\n }\r\n filtersRow.push(endingRefiners[index].KeyName);\r\n }\r\n if (filtersRow.length) {\r\n filtersNavData.push(filtersRow);\r\n }\r\n const refinersExpandedStateData: IDobbiesRefinerExpandedState[][] = [];\r\n if (filtersNavData && filtersNavData.length) {\r\n for (let i = 0; i < filtersNavData.length; i++) {\r\n const refinersRowExpandedStates: IDobbiesRefinerExpandedState[] = [];\r\n for (let j = 0; j < filtersNavData[i].length; j++) {\r\n const filtersKeyName = filtersNavData[i][j];\r\n refinersRowExpandedStates.push({ isExpanded: true, keyName: filtersKeyName });\r\n }\r\n if (refinersRowExpandedStates.length) {\r\n refinersExpandedStateData.push(refinersRowExpandedStates);\r\n }\r\n }\r\n }\r\n this.setState({ refinersExpandedStateData: refinersExpandedStateData });\r\n }\r\n };\r\n\r\n private readonly _getRefineMenu = (): IRefineMenuViewProps => {\r\n const { data, context, config } = this.props;\r\n const tempRangeTypeTODO = context.request.query && context.request.query.inputRange ? 'input' : 'slider';\r\n const validRefiners =\r\n this.props.config.updateRefinerPanel && ArrayExtensions.hasElements(this.state.refiners)\r\n ? this.state.refiners.filter(refiner => {\r\n return ArrayExtensions.hasElements(refiner.Values);\r\n })\r\n : data.refiners.result &&\r\n data.refiners.result.filter(refiner => {\r\n return ArrayExtensions.hasElements(refiner.Values);\r\n });\r\n\r\n const activeRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n\r\n this._getexpandRefinerCount(validRefiners && validRefiners.length, config.expandRefinersCount);\r\n\r\n const sortedRefiners = validRefiners;\r\n\r\n const startingRefinerList = this.props.config.startingRefinerList || [];\r\n\r\n const startingRefiners = sortedRefiners?.filter(refiner => startingRefinerList.indexOf(refiner.KeyName!) > -1);\r\n\r\n const endingRefiners = sortedRefiners?.filter(refiner => {\r\n const existsInStarting = startingRefiners?.find(startingRefiner => startingRefiner.RecordId === refiner.RecordId);\r\n\r\n return !existsInStarting;\r\n });\r\n\r\n const expandedRefiners = this.expandrefinerCount;\r\n\r\n const subMenus =\r\n startingRefiners &&\r\n startingRefiners.map((productRefinerHierarchy: IProductRefinerHierarchy, index: number) => {\r\n return (\r\n <RefineSubmenu\r\n productRefinerHierarchy={productRefinerHierarchy}\r\n selectedRefinerValues={activeRefiners}\r\n refineItemCommonProps={this._refineItemCommonProps}\r\n minValueSliderThumbAriaLabel={this.props.resources.minValueSliderThumbAriaLabel}\r\n maxValueSliderThumbAriaLabel={this.props.resources.maxValueSliderThumbAriaLabel}\r\n key={index}\r\n onUpdateRefiners={this._onUpdateRefiners}\r\n urlBuilder={this._buildRefinerUrl}\r\n isDisabled={false}\r\n isExpandedOnInitialLoad={!!(expandedRefiners && expandedRefiners > index)}\r\n tempRangeTypeTODO={tempRangeTypeTODO}\r\n context={context}\r\n moduleId={this.props.id}\r\n moduleTypeName={this.props.typeName}\r\n />\r\n );\r\n });\r\n\r\n const endingSubMenus =\r\n endingRefiners &&\r\n endingRefiners.map((productRefinerHierarchy: IProductRefinerHierarchy, index: number) => {\r\n return (\r\n <RefineSubmenu\r\n productRefinerHierarchy={productRefinerHierarchy}\r\n selectedRefinerValues={activeRefiners}\r\n refineItemCommonProps={this._refineItemCommonProps}\r\n minValueSliderThumbAriaLabel={this.props.resources.minValueSliderThumbAriaLabel}\r\n maxValueSliderThumbAriaLabel={this.props.resources.maxValueSliderThumbAriaLabel}\r\n key={index}\r\n onUpdateRefiners={this._onUpdateRefiners}\r\n urlBuilder={this._buildRefinerUrl}\r\n isDisabled={false}\r\n isExpandedOnInitialLoad={!!(expandedRefiners && expandedRefiners > index)}\r\n tempRangeTypeTODO={tempRangeTypeTODO}\r\n context={context}\r\n moduleId={this.props.id}\r\n moduleTypeName={this.props.typeName}\r\n refinersExpandedStateData={this.state.refinersExpandedStateData}\r\n onToggle={this.toggleRefinersInSameColumn}\r\n />\r\n );\r\n });\r\n if (!this.state.refinersExpandedStateData) {\r\n this.setInitialSameColumnRefinerDetails(endingRefiners);\r\n }\r\n return {\r\n RefineMenuContainer: { className: `ms-search-result-container__refine-menu` },\r\n RefinerSectionContainer: {\r\n className: `ms-search-result-container__refiner-section new-filter__refiner-section ${\r\n this.state.scrollClass ? 'scrolled' : ''\r\n }`\r\n },\r\n refiners: subMenus,\r\n endingRefiners: endingSubMenus\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 FilterActiveText={resources.filterActiveText}\r\n label={resources.choiceSummaryLabel}\r\n selectedChoices={selectedRefiners}\r\n // @ts-expect-error: NOTE Type-unsafe line below, null refinersByCategoryHierarchy case not handled\r\n refinerHierarchy={data.refiners.result}\r\n choiceFormat={resources.choiceFormat}\r\n choiceRangeValueFormat={resources.choiceRangeValueFormat}\r\n telemetry={telemetry}\r\n onChoiceClicked={this._onChoiceClicked}\r\n urlBuilder={this._buildRefinerUrlForChoiceSummary}\r\n choiceAriaLabel={resources.choiceAriaLabel}\r\n telemetryContent={this.telemetryContent}\r\n context={this.props.context}\r\n />\r\n );\r\n };\r\n\r\n private readonly _getProducts = (): JSX.Element => {\r\n const { imageSettings, allowBackNavigation } = this.props.config;\r\n const { resources } = this.props;\r\n const breaCrumbType = this.props.context.app.config.breadcrumbType;\r\n const allowBack = allowBackNavigation && (breaCrumbType === 'back' || breaCrumbType === 'categoryAndBack');\r\n const products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\r\n const quickviewslot = this.props.slots && this.props.slots.quickview && this.props.slots.quickview[0];\r\n const isPriceMinMaxFeatureState = this.props.data.featureState.result?.find(\r\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailSearchPriceRangeFeature'\r\n );\r\n return (\r\n <ProductSearchResultItems\r\n products={products}\r\n context={this.props.context}\r\n imageSettings={imageSettings}\r\n resources={resources}\r\n moduleType={this.props.typeName}\r\n moduleId={this.props.id}\r\n allowBackNavigation={allowBack}\r\n telemetryContent={this.telemetryContent}\r\n quickviewSlot={quickviewslot}\r\n channelInventoryConfigurationId={this.props.data.products.result?.channelInventoryConfigurationId}\r\n isPriceMinMaxEnabled={isPriceMinMaxFeatureState?.IsEnabled}\r\n discountLines={this.state.discountLines}\r\n config={this.props.config}\r\n showProdPrice={this.state.showProdPrice}\r\n wishlists={this.props.data.wishlists.result}\r\n isMobile={this.isMobile}\r\n loyalty={this.props.data.loyaltyCard.result}\r\n nonClubPlusDiscount={this.state.nonClubPlusDiscount && this.state.nonClubPlusDiscount}\r\n />\r\n );\r\n };\r\n\r\n private readonly _updateSortByDropdown = (notification: ILabeledDropdownOnChangeNotification): void => {\r\n const { context } = this.props;\r\n const requestContext = context && context.request;\r\n const actionContext = context && context.actionContext;\r\n\r\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\r\n const error = `[sort-by-category] cannot sort without context: ${!requestContext ? 'requestContext ' : ''} ${\r\n !actionContext ? 'actionContext ' : ''\r\n } could not be found`;\r\n this.props.telemetry.warning(error);\r\n }\r\n\r\n MsDyn365.isBrowser &&\r\n window &&\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 this.setState({ isUpdated: !this.state.isUpdated, discountLines: [] });\r\n\r\n transaction(() => {\r\n this.props.data.listPageState.result!.currentPageNumber = 0;\r\n this.props.data.listPageState.result!.sortingCritera = {\r\n Columns: [this._getSortColumnFromSelectedOption(notification.selectedOption)]\r\n };\r\n });\r\n };\r\n\r\n private readonly _getSortColumnFromSelectedOption = (option: ILabeledDropdownOption): SortColumn => {\r\n const { data } = this.props;\r\n\r\n if (!data.searchConfiguration.result) {\r\n return {};\r\n }\r\n\r\n const mappedConfiguration = data.searchConfiguration.result.find(searchConfiguration => {\r\n return searchConfiguration.key === option.key;\r\n });\r\n\r\n if (mappedConfiguration) {\r\n return mappedConfiguration.sortColumn;\r\n }\r\n\r\n return {};\r\n };\r\n\r\n private readonly _getCurrentlySelectedOption = (): ILabeledDropdownOption | undefined => {\r\n const { data } = this.props;\r\n const sortCriteria = data.listPageState.result && data.listPageState.result.sortingCritera;\r\n\r\n const activeSortColumn =\r\n (sortCriteria && sortCriteria.Columns && sortCriteria.Columns[0]) ||\r\n (parseQueryParam<SortColumn[]>('sorting', this.props.context.request) || [])[0];\r\n\r\n if (activeSortColumn && data.searchConfiguration.result) {\r\n const activeMappedConfig = data.searchConfiguration.result.find(mappedSearchConfig => {\r\n return (\r\n mappedSearchConfig.sortColumn.ColumnName === activeSortColumn.ColumnName &&\r\n mappedSearchConfig.sortColumn.IsDescending === activeSortColumn.IsDescending\r\n );\r\n });\r\n if (activeMappedConfig) {\r\n return this.sortByDropdownOptions.find(dropdownOption => dropdownOption.key === activeMappedConfig.key);\r\n }\r\n }\r\n\r\n return;\r\n };\r\n\r\n private readonly _onUpdateRefiners = (itemToggleNotification: IRefineItemToggleNotification): void => {\r\n const { context } = this.props;\r\n const requestContext = context && context.request;\r\n const actionContext = context && context.actionContext;\r\n\r\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\r\n const error = `Refine menu cannot refine search criteria: ${!requestContext ? 'requestContext ' : ''} ${\r\n !actionContext ? 'actionContext ' : ''\r\n } could not be found`;\r\n this.props.telemetry.warning(error);\r\n }\r\n\r\n const updatedRefinementCriteria = getUpdatedRefinementCriteria(\r\n itemToggleNotification,\r\n (this.props.data.listPageState.result && this.props.data.listPageState.result.activeFilters) || []\r\n );\r\n\r\n MsDyn365.isBrowser &&\r\n window &&\r\n window.history.pushState({}, '', buildListPageUrl(getCurrentUrl(this.props.context.request), updatedRefinementCriteria));\r\n transaction(() => {\r\n this.props.data.listPageState.result!.currentPageNumber = 0;\r\n this.props.data.listPageState.result!.activeFilters = updatedRefinementCriteria;\r\n });\r\n };\r\n\r\n private readonly _buildRefinerUrl = (itemToggleNotification: IRefineItemToggleNotification): string => {\r\n if (this.props.data.listPageState.result) {\r\n const newRefinementCriteria = getUpdatedRefinementCriteria(\r\n itemToggleNotification,\r\n this.props.data.listPageState.result.activeFilters || []\r\n );\r\n\r\n return buildListPageUrl(getCurrentUrl(this.props.context.request), newRefinementCriteria);\r\n }\r\n this.props.telemetry.warning('[buildRefinerQueryString]List Page State Not available, unable to build refiner URL');\r\n return '';\r\n };\r\n\r\n private readonly _onChoiceClicked = (notification: IChoiceSummaryClickNotification): void => {\r\n const { data, telemetry } = this.props;\r\n\r\n if (!data.listPageState.result) {\r\n telemetry.warning('[choice-summary-by-category._onChoiceClicked]ListPageState unavailable, unable to update refiners.');\r\n return;\r\n }\r\n\r\n let currentRefinementCriteria = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n\r\n if (!notification.clearAll) {\r\n const selectedChoice = notification.choiceClicked;\r\n if (!selectedChoice) {\r\n telemetry.warning('[choice-summary-by-category._onChoiceClicked] Choice could not be determined');\r\n return;\r\n }\r\n currentRefinementCriteria = currentRefinementCriteria.filter(\r\n (selectedCriterion: ProductRefinerValue) => !isMatchingRefinementCriterion(selectedChoice, selectedCriterion)\r\n );\r\n } else {\r\n currentRefinementCriteria = [];\r\n\r\n // Set focus to sort and filter\r\n const dropdownElementId = this._sortAndFilterContainerRef.current && this._sortAndFilterContainerRef.current.props.dropdownId;\r\n const dropdownElement = dropdownElementId && document.getElementById(dropdownElementId);\r\n setTimeout(() => {\r\n dropdownElement && dropdownElement.focus();\r\n }, 50);\r\n }\r\n\r\n const fullUrl = getCurrentUrl(this.props.context.request);\r\n MsDyn365.isBrowser && window && window.history.pushState({}, '', buildListPageUrl(fullUrl, currentRefinementCriteria));\r\n data.listPageState.result.currentPageNumber = 0;\r\n data.listPageState.result.activeFilters = currentRefinementCriteria;\r\n };\r\n\r\n private readonly _buildRefinerUrlForChoiceSummary = (selectedRefiner: ProductRefinerValue, isClearAll: boolean): string => {\r\n const { data, telemetry } = this.props;\r\n const fullUrl = getCurrentUrl(this.props.context.request);\r\n\r\n if (!data.listPageState.result) {\r\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl]ListPageState unavailable, unable to create refiner URL.');\r\n return fullUrl.href;\r\n }\r\n\r\n let currentRefinementCriteria = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n\r\n if (!isClearAll) {\r\n if (!selectedRefiner) {\r\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl] URL for Choice could not be determined');\r\n return fullUrl.href;\r\n }\r\n currentRefinementCriteria = currentRefinementCriteria.filter(\r\n (selectedCriterion: ProductRefinerValue) => !isMatchingRefinementCriterion(selectedRefiner, selectedCriterion)\r\n );\r\n } else {\r\n currentRefinementCriteria = [];\r\n }\r\n\r\n return buildListPageUrl(fullUrl, currentRefinementCriteria);\r\n };\r\n\r\n private _getViewport(): GridSize {\r\n const { context } = this.props;\r\n\r\n // Always render in mobile viewport on a mobile device\r\n if (context.request && context.request.device && context.request.device.Type === 'Mobile') {\r\n return 'xs';\r\n }\r\n\r\n if (MsDyn365.isBrowser && window && window.innerWidth) {\r\n const gridSettings = context.request.gridSettings;\r\n if (gridSettings) {\r\n if (gridSettings.xs && window && window.innerWidth <= gridSettings.xs.w) {\r\n return 'xs';\r\n } else if (gridSettings.sm && window && window.innerWidth <= gridSettings.sm.w) {\r\n return 'sm';\r\n } else if (gridSettings.md && window && window.innerWidth <= gridSettings.md.w) {\r\n return 'md';\r\n } else if (gridSettings.lg && window && window.innerWidth <= gridSettings.lg.w) {\r\n return 'lg';\r\n }\r\n return 'xl';\r\n }\r\n }\r\n\r\n return 'lg';\r\n }\r\n\r\n private _toggleModal(): void {\r\n this.setState({\r\n modalIsOpen: !this.state.modalIsOpen\r\n });\r\n }\r\n\r\n private _updateViewport(): void {\r\n this._viewport = this._getViewport();\r\n\r\n if (this.state.modalIsOpen && !this.isMobile) {\r\n this._toggleModal();\r\n }\r\n }\r\n\r\n private readonly _getexpandRefinerCount = (validRefiners?: number, refinerCount?: expandRefinersCount): void => {\r\n switch (refinerCount) {\r\n case expandRefinersCount.all:\r\n this.expandrefinerCount = validRefiners;\r\n break;\r\n case expandRefinersCount.one:\r\n this.expandrefinerCount = 1;\r\n break;\r\n case expandRefinersCount.two:\r\n this.expandrefinerCount = 2;\r\n break;\r\n case expandRefinersCount.three:\r\n this.expandrefinerCount = 3;\r\n break;\r\n case expandRefinersCount.four:\r\n this.expandrefinerCount = 4;\r\n break;\r\n default:\r\n this.expandrefinerCount = 0;\r\n }\r\n };\r\n\r\n /**\r\n * Renders a Pagination previous text.\r\n * @param paginationPreviousText - Pagination previous text from resources.\r\n * @returns Previous text and flipper icon.\r\n */\r\n private readonly _renderPrev = (paginationPreviousText: string) => {\r\n return (\r\n <div className='msc-pagination__prev'>\r\n <span className='ms-search-result__pagination-left' aria-hidden='true' />\r\n <span className='prev-text'>{paginationPreviousText}</span>\r\n </div>\r\n );\r\n };\r\n\r\n /**\r\n * Renders a Pagination next text.\r\n * @param paginationNextText - Pagination next text from resources.\r\n * @returns Next text and flipper icon.\r\n */\r\n private readonly _renderNext = (paginationNextText: string) => {\r\n return (\r\n <div className='msc-pagination__next'>\r\n <span className='next-text'>{paginationNextText}</span>\r\n <span className='ms-search-result__pagination-right' aria-hidden='true' />\r\n </div>\r\n );\r\n };\r\n\r\n private isInViewport = () => {\r\n const bounding = this.refinersRef.current?.getBoundingClientRect();\r\n const refinerMenu =\r\n MsDyn365.isBrowser && window && (document.querySelector('.ms-search-result-container__refine-menu') as HTMLElement);\r\n const refinerMenuHeight = refinerMenu ? refinerMenu.offsetHeight : 0;\r\n const categoryBanners = MsDyn365.isBrowser && window && document.getElementsByClassName('category-banner');\r\n\r\n const HamburgerMenuBtn =\r\n MsDyn365.isBrowser && window && (document.getElementsByClassName('ms-header__nav-icon msc-btn')[0] as HTMLElement);\r\n // const contentBlock =\r\n // MsDyn365.isBrowser &&\r\n // window &&\r\n // document.getElementsByClassName('ms-content-block category-banner').length &&\r\n // (document.getElementsByClassName('ms-content-block category-banner')[\r\n // document.getElementsByClassName('ms-content-block category-banner').length - 1\r\n // ] as HTMLElement);\r\n const isHamburgerMenuBtn = HamburgerMenuBtn ? HamburgerMenuBtn.offsetHeight : 0;\r\n if (\r\n !categoryBanners ||\r\n !categoryBanners.length ||\r\n (categoryBanners && categoryBanners.length && document.getElementsByClassName('no-image-categories').length)\r\n ) {\r\n //for plps desktop\r\n if (isHamburgerMenuBtn) {\r\n return bounding && bounding.top + 66 + 40 >= refinerMenuHeight;\r\n } else {\r\n return bounding && bounding.top + 66 >= refinerMenuHeight;\r\n }\r\n } else {\r\n //for clps desktop\r\n if (isHamburgerMenuBtn) {\r\n if (MsDyn365.isBrowser && window && window.innerWidth <= 426) {\r\n return bounding && bounding.top + 190 >= refinerMenuHeight;\r\n }\r\n return bounding && bounding.top + 100 >= refinerMenuHeight;\r\n } else {\r\n return bounding && bounding.top >= refinerMenuHeight;\r\n }\r\n }\r\n };\r\n\r\n /* VSI Customization - START - 29/10/20 */\r\n /* Sticky Navigation function added */\r\n private _mainMenuScroll = (): void => {\r\n if (this.isInViewport()) {\r\n if (MsDyn365.isBrowser && window && window.innerWidth <= 426 && this.lastChangedScrollStateMobile) {\r\n const now = new Date();\r\n if (now.getTime() - this.lastChangedScrollStateMobile.getTime() <= 500) {\r\n return;\r\n }\r\n }\r\n this.setState({\r\n scrollClass: false\r\n });\r\n } else if (!this.state.scrollClass) {\r\n if (MsDyn365.isBrowser && window && window.innerWidth <= 426) {\r\n this.lastChangedScrollStateMobile = new Date();\r\n }\r\n this.setState({\r\n scrollClass: true\r\n });\r\n }\r\n };\r\n /* VSI Customization - END - 29/10/20 */\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/* eslint-disable no-duplicate-imports */\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport React, { useEffect, useState } from 'react';\r\nimport { ModulesStateShareInput } from '../../themes/dobbies/actions/modules-state-share-action';\r\nimport DobbiesModal from '../../themes/dobbies/views/custom-components/dobbies-modal';\r\nimport { ISearchResultModalViewProps } from './components';\r\nimport MsDyn365 from '@msdyn365-commerce/core';\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport {\r\n // GridSize,\r\n ICategoryHierarchyViewProps,\r\n IRefineMenuViewProps,\r\n ISearchResultContainerViewProps,\r\n ISortByViewProps,\r\n ITitleViewProps\r\n} from './dobbies-search-result-container';\r\nimport Button from 'reactstrap/lib/Button';\r\n\r\nconst SearchResultContainerView: React.FC<ISearchResultContainerViewProps> = props => {\r\n const {\r\n data: {\r\n category: { result: currentCategory }\r\n },\r\n SearchResultContainer,\r\n products,\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 slots: { browse },\r\n // resources: { browseButtonText },\r\n pagination,\r\n refinersRef\r\n } = props;\r\n const [showModal, setShowModal] = useState(false); /* VSI-Customization -- START showModal Hook for managing state of showModal */\r\n const [categoryTitle, SetCategoryTitle] = useState<string | undefined>(); // Following hook is used to store category name\r\n const [shouldShowMoreRefiners, setShouldShowMoreRefiners] = useState(false);\r\n // const { category } = props.data;\r\n // const categoryName = category && category.result && category.result.Name;\r\n\r\n useEffect(() => {\r\n document.addEventListener('keydown', (e: KeyboardEvent) => {\r\n if (e.key.toLocaleLowerCase() === 'escape') {\r\n if (showModal) {\r\n setShowModal(!showModal);\r\n }\r\n }\r\n });\r\n // Store categoryName in state data action to display it in category header\r\n if (categoryTitle === undefined) {\r\n const currentCategoryName = currentCategory && currentCategory.Name ? currentCategory.Name : '';\r\n props.context.actionContext.update(new ModulesStateShareInput(), { categoryName: currentCategoryName });\r\n SetCategoryTitle(currentCategoryName);\r\n }\r\n }, [showModal]);\r\n\r\n const isClickInsideElementByClassName = (className: string, event: MouseEvent): boolean => {\r\n let target: EventTarget | null = event.target;\r\n while (target && target !== document) {\r\n if ((target as Element).classList && (target as Element).classList.contains(className)) {\r\n return true;\r\n }\r\n target = (target as Node).parentNode;\r\n }\r\n return false;\r\n };\r\n\r\n useEffect(() => {\r\n document.body.addEventListener(\r\n 'click',\r\n evt => {\r\n const filtersDivs = document.getElementsByClassName('new-filter__filter-section');\r\n if (filtersDivs && filtersDivs.length) {\r\n if (\r\n !isClickInsideElementByClassName('new-filter__filter-section', evt) &&\r\n !isClickInsideElementByClassName('ms-product-search-result__item', evt)\r\n ) {\r\n if (props.onMoreFiltersClicked) {\r\n props.onMoreFiltersClicked(undefined, false, true);\r\n }\r\n }\r\n }\r\n },\r\n true\r\n );\r\n }, []);\r\n const modalTitle = (): JSX.Element => {\r\n const { category } = props.data;\r\n const categoryName = category && category.result && category.result.Name;\r\n const handleShowModal = () => setShowModal(!showModal);\r\n return (\r\n <Node tag='div' className='view-all-popup-header'>\r\n <Node tag='span' className='title-text'>\r\n {categoryName}\r\n </Node>\r\n <div className='header-close-button' onClick={handleShowModal} role='button'>\r\n <i className='msc-modal__close-button' />\r\n </div>\r\n </Node>\r\n );\r\n };\r\n\r\n const modalFooter = (): JSX.Element => {\r\n const handleShowModal = () => setShowModal(!showModal);\r\n return <div className='close-button' role='button' onClick={handleShowModal} />;\r\n };\r\n const _modalToggle = () => {\r\n setShowModal(!showModal);\r\n };\r\n const renderToggle = (slotBrowse: React.ReactNode): JSX.Element | undefined => {\r\n // const handleShowModal = () => setShowModal(!showModal);\r\n return (\r\n <>\r\n <div className='category-list-mobile'>{/* <button onClick={handleShowModal}>{browseButtonText}</button> */}</div>\r\n <DobbiesModal\r\n className='modal ms-dobbies-browse'\r\n isOpen={showModal}\r\n modalBodySlots={browse}\r\n onModalToggle={_modalToggle}\r\n modalTitle={modalTitle()}\r\n modalFooter={modalFooter()}\r\n />\r\n </>\r\n );\r\n };\r\n const redirectUrl = props.data.products.result!.products[0].ExtensionProperties?.find(item => item.Key === 'RedirectURL');\r\n let shouldRedirect = false;\r\n if (props.data.products.result!.count === 0 && redirectUrl && redirectUrl.Value!.StringValue) {\r\n shouldRedirect = true;\r\n }\r\n const isSearchPage = props.context.request.query?.q;\r\n let hasContentBlockTitle = false;\r\n if (MsDyn365.isBrowser && window) {\r\n const categoryBanners = document.getElementsByClassName('ms-content-block category-banner');\r\n if (categoryBanners && categoryBanners.length) {\r\n const contentBlockTitleDivs = document.getElementsByClassName('ms-content-block__title');\r\n if (contentBlockTitleDivs && contentBlockTitleDivs.length && contentBlockTitleDivs[0].innerHTML) {\r\n hasContentBlockTitle = true;\r\n }\r\n }\r\n }\r\n\r\n /* VSI-Customization -- END */\r\n // let collectionTitle: string | undefined = '';\r\n // if (props.context && props.context.request && props.context.request.query && props.context.request.query.q) {\r\n // collectionTitle = `\"${props.context.request.query.q}\"`;\r\n // } else {\r\n // collectionTitle = undefined;\r\n // }\r\n if (isMobile) {\r\n return !shouldRedirect ? (\r\n <Module {...SearchResultContainer}>\r\n {/* {!collectionTitle && <h1 className='top-title'>{categoryName} </h1>} */}\r\n {/* {renderOutOfStockBtn(props)} */}\r\n {categoryHierarchy && renderCategoryHierarchy(categoryHierarchy)}\r\n {(isSearchPage || !hasContentBlockTitle) && TitleViewProps && renderTitleAndProductCount(TitleViewProps, props)}\r\n {/* {TitleViewProps && renderTitleAndProductCount(TitleViewProps, props)} */}\r\n {/* VSI-Customization -- START Render Browse Module for Mobile view */}\r\n {renderToggle(browse)}\r\n {/* VSI-Customization -- END */}\r\n {modalToggle}\r\n {createSearchResultModal(\r\n props,\r\n searchResultModal,\r\n refineMenu,\r\n sortByOptions,\r\n isMobile,\r\n shouldShowMoreRefiners,\r\n setShouldShowMoreRefiners\r\n )}\r\n <div className='sticky-check' ref={refinersRef}>\r\n {renderRefiner(props, refineMenu, browse, false, shouldShowMoreRefiners, setShouldShowMoreRefiners)}\r\n </div>\r\n {sortByOptions && renderSort(sortByOptions)}\r\n {choiceSummary}\r\n <Node {...FeatureSearchContainer}>{similarLookProduct}</Node>\r\n <Node {...ProductsContainer}>\r\n {errorMessage}\r\n {products}\r\n </Node>\r\n {pagination}\r\n </Module>\r\n ) : (\r\n <></>\r\n );\r\n }\r\n return !shouldRedirect ? (\r\n <Module {...SearchResultContainer}>\r\n {/* {!collectionTitle && <h1 className='top-title'>{categoryName} </h1>} */}\r\n <Node {...CategoryNavContainer}>\r\n {/* {renderOutOfStockBtn(props)} */}\r\n {/* {outOfStock && renderOOSBtn(props)} */}\r\n {categoryHierarchy && renderCategoryHierarchy(categoryHierarchy)}\r\n {(isSearchPage || !hasContentBlockTitle) && TitleViewProps && renderTitleAndProductCount(TitleViewProps, props)}\r\n </Node>\r\n <Node {...RefineAndProductSectionContainer} ref={refinersRef}>\r\n <div className='sticky-check' ref={refinersRef}>\r\n {renderRefiner(props, refineMenu, browse, isMobile, shouldShowMoreRefiners, setShouldShowMoreRefiners)}\r\n </div>\r\n <Node {...ProductSectionContainer}>\r\n {choiceSummary}\r\n {sortByOptions && renderSort(sortByOptions)}\r\n <Node {...FeatureSearchContainer}>{similarLookProduct}</Node>\r\n <Node {...ProductsContainer}>\r\n {errorMessage}\r\n {products}\r\n </Node>\r\n {pagination}\r\n </Node>\r\n </Node>\r\n </Module>\r\n ) : (\r\n <></>\r\n );\r\n};\r\n\r\nconst createSearchResultModal = (\r\n oosProps: ISearchResultContainerViewProps,\r\n modalProps: ISearchResultModalViewProps,\r\n refineMenu: IRefineMenuViewProps,\r\n sortByDropDown: ISortByViewProps,\r\n isMobile: Boolean,\r\n shouldShowMoreRefiners: boolean,\r\n setShouldShowMoreRefiners: React.Dispatch<React.SetStateAction<boolean>>\r\n): JSX.Element => {\r\n return React.cloneElement(\r\n modalProps.modal,\r\n {},\r\n modalProps.modalHeader,\r\n createModalBody(oosProps, modalProps, refineMenu, sortByDropDown, isMobile, shouldShowMoreRefiners, setShouldShowMoreRefiners),\r\n modalProps.modalFooter\r\n );\r\n};\r\n\r\nconst createModalBody = (\r\n oosProps: ISearchResultContainerViewProps,\r\n props: ISearchResultModalViewProps,\r\n refineMenu: IRefineMenuViewProps,\r\n sortByDropDown: ISortByViewProps,\r\n isMobile: Boolean,\r\n shouldShowMoreRefiners: boolean,\r\n setShouldShowMoreRefiners: React.Dispatch<React.SetStateAction<boolean>>\r\n): JSX.Element | null => {\r\n if (sortByDropDown) {\r\n return React.cloneElement(\r\n props.modalBody,\r\n {},\r\n renderSort(sortByDropDown),\r\n renderRefiner(oosProps, refineMenu, null, isMobile, shouldShowMoreRefiners, setShouldShowMoreRefiners)\r\n );\r\n }\r\n return null;\r\n};\r\n\r\n// const _getViewport = (props: ISearchResultContainerViewProps): GridSize => {\r\n// const { context } = props;\r\n\r\n// // Always render in mobile viewport on a mobile device\r\n// if (context.request && context.request.device && context.request.device.Type === 'Mobile') {\r\n// return 'xs';\r\n// }\r\n\r\n// if (MsDyn365.isBrowser && window.innerWidth) {\r\n// const gridSettings = context.request.gridSettings;\r\n// if (gridSettings) {\r\n// if (gridSettings.xs && window.innerWidth <= gridSettings.xs.w) {\r\n// return 'xs';\r\n// } else if (gridSettings.sm && window.innerWidth <= gridSettings.sm.w) {\r\n// return 'sm';\r\n// } else if (gridSettings.md && window.innerWidth <= gridSettings.md.w) {\r\n// return 'md';\r\n// } else if (gridSettings.lg && window.innerWidth <= gridSettings.lg.w) {\r\n// return 'lg';\r\n// }\r\n// return 'xl';\r\n// }\r\n// }\r\n\r\n// return 'xs';\r\n// };\r\nconst _getScreenSize = (ctx: Msdyn365.ICoreContext): number => {\r\n if (MsDyn365.isBrowser && window && window.innerWidth) {\r\n const gridSettings = ctx.request.gridSettings;\r\n if (gridSettings) {\r\n if (window.innerWidth < 768) {\r\n // mobile\r\n return 1;\r\n } else if (window.innerWidth < 1280) {\r\n // iPad\r\n return 2;\r\n } else if (window.innerWidth >= 1280) {\r\n // Desktop\r\n return 3;\r\n } else {\r\n return 3;\r\n }\r\n // else if (gridSettings.lg && window.innerWidth <= gridSettings.lg.w) {\r\n // // Desktop\r\n // return 3;\r\n // }\r\n }\r\n }\r\n\r\n return 3; // desktop\r\n};\r\nconst renderRefiner = (\r\n viewProps: ISearchResultContainerViewProps,\r\n props: IRefineMenuViewProps,\r\n slotBrowse: React.ReactNode[] | null,\r\n isMobile: Boolean,\r\n shouldShowMoreRefiners: boolean,\r\n setShouldShowMoreRefiners: React.Dispatch<React.SetStateAction<boolean>>\r\n): JSX.Element | null => {\r\n const { refiners, endingRefiners, RefineMenuContainer, RefinerSectionContainer } = props;\r\n let endingRefinersToShow = endingRefiners;\r\n const screenSize = _getScreenSize(viewProps.context);\r\n // const maxRefinersColumns = _getViewport(viewProps) !== 'xl' && _getViewport(viewProps) !== 'lg' ? 4 : 5;\r\n let maxRefinersColumns = screenSize === 3 ? 5 : screenSize === 2 ? 4 : 0;\r\n maxRefinersColumns = screenSize === 1 ? 2 : maxRefinersColumns;\r\n if (endingRefiners && endingRefiners?.length > maxRefinersColumns && !shouldShowMoreRefiners) {\r\n endingRefinersToShow = endingRefiners.slice(0, maxRefinersColumns);\r\n }\r\n\r\n if (refiners && endingRefiners) {\r\n console.log('Inside Refiners Category listing');\r\n return (\r\n <>\r\n <Node {...RefinerSectionContainer}>\r\n {refiners.map((submenu, index) => (\r\n <React.Fragment key={index}>{submenu}</React.Fragment>\r\n ))}\r\n\r\n <div className={isMobile ? '' : `refiner-add-remove`}>\r\n <Node {...RefineMenuContainer}>\r\n {console.log('Inside Refiners Category listing Rendering Category Listing')}\r\n <div className='category-listing'>{slotBrowse && slotBrowse}</div>\r\n <div className='new-filter__filter-section'>\r\n <div className={`filter-list ${shouldShowMoreRefiners ? 'filter-more' : 'filter-less'}`}>\r\n {endingRefinersToShow?.map((submenu, index) => (\r\n <React.Fragment key={index}>{submenu}</React.Fragment>\r\n ))}\r\n </div>\r\n {endingRefiners && endingRefiners.length > maxRefinersColumns && (\r\n <Button\r\n className={`more-filters-btn ${shouldShowMoreRefiners ? 'filter-minus' : 'filter-plus'}`}\r\n onClick={() => {\r\n setShouldShowMoreRefiners(!shouldShowMoreRefiners);\r\n if (viewProps.onMoreFiltersClicked) {\r\n viewProps.onMoreFiltersClicked(undefined, false, true);\r\n }\r\n }}\r\n >\r\n {shouldShowMoreRefiners ? 'Less filters' : 'More filters'}\r\n\r\n <span className='icon'></span>\r\n </Button>\r\n )}\r\n </div>\r\n </Node>\r\n </div>\r\n </Node>\r\n </>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst renderSort = (props: ISortByViewProps): JSX.Element | null => {\r\n const { SortingContainer, sortByDropDown } = props;\r\n if (sortByDropDown) {\r\n return <Node {...SortingContainer}>{sortByDropDown}</Node>;\r\n }\r\n return null;\r\n};\r\n\r\n// const renderOOSBtn = (props: ISearchResultContainerViewProps) : JSX.Element | null => {\r\n// return (\r\n// <Node className=''>\r\n// {outOfStock}\r\n// </Node>\r\n// )\r\n// }\r\n\r\n// const renderOutOfStockBtn = (props: ISearchResultContainerViewProps): JSX.Element | null => {\r\n// const {showOutOfStock,hideOutOfStock, outOfStockStatus, isMobile, resources} = props;\r\n// return (\r\n// <Node className={isMobile ? 'out-of-stock-mob-container' : 'out-of-stock-container'}>\r\n// <p className='out-of-stock-text'>{resources.outOfStockNavText}</p>\r\n// <Node className='out-of-stock-btn-container'>\r\n// <button className={outOfStockStatus ? 'out-of-stock-active' : 'out-of-stock-hide'} onClick={showOutOfStock}>{resources.showOutofStockBtn}</button>\r\n// <button className={!outOfStockStatus ? 'out-of-stock-active' : 'out-of-stock-hide'} onClick={hideOutOfStock}>{resources.hideOutOfStockBtn}</button>\r\n// </Node>\r\n// {/* <button onClick={toggleOutOfStock}>Out Of Stock</button> */}\r\n// </Node>\r\n// )\r\n// }\r\n\r\nconst renderCategoryHierarchy = (props: ICategoryHierarchyViewProps): JSX.Element | null => {\r\n const { CategoryHierarchyContainer, categoryHierarchyList, categoryHierarchySeparator } = props;\r\n if (categoryHierarchyList) {\r\n return (\r\n <Node {...CategoryHierarchyContainer}>\r\n {categoryHierarchyList.map((category, index) => (\r\n <React.Fragment key={index}>\r\n {category}\r\n {categoryHierarchyList && categoryHierarchyList[index + 1] && categoryHierarchySeparator}\r\n </React.Fragment>\r\n ))}\r\n </Node>\r\n );\r\n }\r\n\r\n return null;\r\n};\r\n\r\nconst renderTitleAndProductCount = (props: ITitleViewProps, srcProps: ISearchResultContainerViewProps): JSX.Element | null => {\r\n const { title, TitleContainer } = props;\r\n const isSearchPage = srcProps.context.request.query?.q;\r\n if (title) {\r\n return (\r\n <Node {...TitleContainer}>\r\n {isSearchPage ? (\r\n <h2>\r\n {title.titlePrefix} {title.titleText} - {title.titleCount}\r\n </h2>\r\n ) : (\r\n <h1>{title.titleText}</h1>\r\n )}\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nexport default SearchResultContainerView;\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport {\r\n CacheType,\r\n createObservableDataAction,\r\n IAction,\r\n IActionContext,\r\n IActionInput,\r\n IAny,\r\n ICreateActionContext,\r\n IGeneric\r\n} from '@msdyn365-commerce/core';\r\nimport { ProductPrice, ProductRefinerValue, ProductSearchResult, SimpleProduct, SortingInfo } from '@msdyn365-commerce/retail-proxy';\r\nimport { observable } from 'mobx';\r\n\r\nimport { listPageType } from './actions';\r\n\r\n/**\r\n * ListPageState class.\r\n */\r\nexport class ListPageState {\r\n @observable public activeFilters: ProductRefinerValue[] | null = null;\r\n\r\n @observable public activeProducts: ProductSearchResult[] = [];\r\n\r\n @observable public sortingCritera: SortingInfo | null = null;\r\n\r\n @observable public currentPageNumber: number | null = null;\r\n\r\n @observable public refiners: IProductRefinerHierarchy[] | null = null;\r\n\r\n @observable public totalProductCount: number | undefined;\r\n\r\n @observable public pageSize: number = 10;\r\n\r\n @observable public pageType: listPageType = 'Unknown';\r\n\r\n @observable public featureProduct: SimpleProduct | null = null;\r\n\r\n @observable public productPrices: ProductPrice[] | undefined = [];\r\n}\r\n\r\n/**\r\n * ListPageStateInput - action input.\r\n */\r\nexport class ListPageStateInput implements IActionInput {\r\n public getCacheKey = () => 'ListPageState';\r\n\r\n public getCacheObjectType = () => 'ListPageState';\r\n\r\n public dataCacheType = (): CacheType => 'request';\r\n}\r\n\r\nexport async function listPageStateAction(input: ListPageStateInput, ctx: IActionContext): Promise<ListPageState> {\r\n return new ListPageState();\r\n}\r\n\r\n/**\r\n * Create new input for create action.\r\n * @param inputData\r\n */\r\nexport const createListPageInput = (inputData: ICreateActionContext<IGeneric<IAny>>): IActionInput => {\r\n return new ListPageStateInput();\r\n};\r\n\r\n/**\r\n * ListPageState - create action.\r\n */\r\nexport default createObservableDataAction<ListPageState>({\r\n action: <IAction<ListPageState>>listPageStateAction,\r\n input: createListPageInput\r\n});\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport {\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\n\r\n/**\r\n * LoyaltyCardState Input Action\r\n */\r\n\r\nexport class ModulesStateShareInput implements IActionInput {\r\n // TODO: Determine if the results of this get action should cache the results and if so provide\r\n // a cache object type and an appropriate cache key\r\n public getCacheKey = () => `modulesSharedState`;\r\n public getCacheObjectType = () => 'modulesSharedState';\r\n public dataCacheType = (): CacheType => 'request';\r\n}\r\n\r\n// TODO: Create a data model here or import one to capture the response of the action\r\nexport interface IModulesSharedState {\r\n customerLoyaltyTierId: string | undefined;\r\n categoryName: string | undefined;\r\n}\r\n\r\n/**\r\n * TODO: Use this function to create the input required to make the action call\r\n */\r\nconst createInput = (inputData: ICreateActionContext<IGeneric<IAny>>): IActionInput => {\r\n return new ModulesStateShareInput();\r\n};\r\n/**\r\n * TODO: Use this function to call your action and process the results as needed\r\n */\r\nexport async function sampleStateAction(input: ModulesStateShareInput, ctx: IActionContext): Promise<IModulesSharedState> {\r\n return { customerLoyaltyTierId: undefined, categoryName: undefined };\r\n}\r\n\r\n/**\r\n * SampleState - create action\r\n */\r\nexport default createObservableDataAction<IModulesSharedState>({\r\n action: <IAction<IModulesSharedState>>sampleStateAction,\r\n input: createInput\r\n});\r\n","import { Modal, ModalBody, ModalFooter, ModalHeader } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nexport interface IDobbiesModalProps {\r\n modalBodySlots?: React.ReactNode[];\r\n modalBodyElement?: JSX.Element;\r\n isOpen: boolean;\r\n className: string;\r\n modalTitle: JSX.Element;\r\n modalFooter: JSX.Element;\r\n onModalToggle?(): void;\r\n}\r\n\r\nconst DobbiesModal: React.FC<IDobbiesModalProps> = (props: IDobbiesModalProps) => {\r\n return (\r\n <Modal\r\n isOpen={props.isOpen}\r\n zIndex={1050}\r\n applicationNode={'renderPage'}\r\n autoFocus={true}\r\n toggle={props.onModalToggle}\r\n className={`dobbies-modal ${props.className}`}\r\n >\r\n {props.modalTitle && <ModalHeader> {props.modalTitle}</ModalHeader>}\r\n {props.modalBodySlots && <ModalBody className='dobbies-modal-body'>{props.modalBodySlots}</ModalBody>}\r\n {props.modalBodyElement && <ModalBody className='dobbies-modal-body'>{props.modalBodyElement}</ModalBody>}\r\n {props.modalFooter && <ModalFooter>{props.modalFooter}</ModalFooter>}\r\n </Modal>\r\n );\r\n};\r\n\r\nexport default DobbiesModal;\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['dobbies-search-result-container'] = {\n c: () => require('partner/modules/dobbies-search-result-container/dobbies-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/dobbies-search-result-container/list-page-state', runOn: 0},{name:'loyaltyCard', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-loyalty-card', runOn: 0},{name:'modulesSharedState', path:'themes/dobbies/actions/modules-state-share-action', runOn: 0},{name:'products', path:'modules/dobbies-search-result-container/actions/get-full-products-by-collection', runOn: 0},{name:'refiners', path:'modules/dobbies-search-result-container/actions/get-refiners-for-collection', runOn: 0},{name:'searchConfiguration', path:'modules/dobbies-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: 1}],\n \n iNM: false,\n ns: '__local__',\n n: 'dobbies-search-result-container',\n p: '__local__',\n \n pdp: '',\n \n \n md: 'src/modules/dobbies-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-loyalty-card';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-loyalty-card');\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/dobbies-search-result-container/actions/get-full-products-by-collection';\n let dataAction = require('partner/modules/dobbies-search-result-container/actions/get-full-products-by-collection');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = 'modules/dobbies-search-result-container/actions/get-mapped-search-configuration';\n let dataAction = require('partner/modules/dobbies-search-result-container/actions/get-mapped-search-configuration');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = 'modules/dobbies-search-result-container/actions/get-refiners-for-collection';\n let dataAction = require('partner/modules/dobbies-search-result-container/actions/get-refiners-for-collection');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = 'modules/dobbies-search-result-container/list-page-state';\n let dataAction = require('partner/modules/dobbies-search-result-container/list-page-state');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = 'themes/dobbies/actions/modules-state-share-action';\n let dataAction = require('partner/themes/dobbies/actions/modules-state-share-action');\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|dobbies-search-result-container|dobbies-search-result-container'] = {\n c: () => require('partner/modules/dobbies-search-result-container/dobbies-search-result-container.view.tsx'),\n cn: '__local__-__local__-dobbies-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":["BaseCollectionInput","constructor","pageType","apiSettings","queryResultSettings","refiners","category","searchText","includeAttributes","isUpdateRefinerPanel","locale","catalogId","getCacheKey","_objectSpread","this","Paging","toJS","Sorting","buildCacheKey","map","refiner","RefinerRecordId","LeftValueBoundString","RightValueBoundString","convertToString","getCacheObjectType","dataCacheType","createBaseCollectionInput","args","inputClassConstuctor","requestContext","urlTokens","query","categoryId","QueryResultSettingsProxy","fromInputData","QueryResultSettings","queryRefiners","hydrateRefinersFromUrl","inputData","config","undefined","_inputData$config","updateRefinerPanel","getUpdateRefinerPanel","getCatalogId","sorting","Columns","JSON","parse","decodeURIComponent","itemId","q","productId","recommendation","stringify","ProductId","Recommendation","Error","ProductListInventoryFilteringOptions","GetFullProductsByCollectionInput","length","isOutOfStock","product","channelInventoryConfiguration","ArrayExtensions","hasElements","AttributeValues","attribute","RecordId","InventoryProductAttributeRecordId","TextValue","InventoryOutOfStockAttributeValueText","returnProductsBasedOnInventoryInformation","products","context","ObjectExtensions","isNullOrUndefined","app","productListInventoryDisplay","HideOOS","filteredProducts","push","filterOutOfStockProducts","SortOOS","inStockProducts","outOfStockProducts","concat","sortsProductsBasedOnAvailability","async","returnProducts","productSearchResults","metadataCount","productSearchResultsWithImages","productSearchResult","newImageUrl","generateProductImageUrl","PrimaryImageUrl","inventoryLevel","InventoryLevels","threshold","enableStockCheck","count","getInventoryConfigurationAsync","callerContext","element","inventoryRanges","channelInventoryConfigurationId","actionDataAction","createObservableDataAction","id","action","input","promise","searchProductId","searchCriteriaInput","Context","ChannelId","channelId","CatalogId","Refinement","IncludeAttributes","SkipVariantExpansion","uc_param","replace","CategoryIds","SearchCondition","searchByCriteriaAsync","searchObject","Number","isNaN","RecommendationListId","Ids","_promise$metadata$cou","MsDyn365","isBrowser","update","ListPageStateInput","totalProductCount","metadata","activeFilters","Top","itemsPerPage","skip","Skip","sortOptions","sortByOptionRelevanceDesc","sortByOptionRatingAsc","sortByOptionRatingDesc","sortByOptionNameAsc","sortByOptionNameDesc","sortByOptionPriceAsc","sortByOptionPriceDesc","sortByOptionBestSelling","sortByOptionNewScore","sortByOptionTrendingScore","MappedSearchInput","getMappedSearchConfiguration","ctx","getSearchConfigurationAsync","then","searchConfiguration","ProductSortColumns","sortColumn","key","ColumnName","toUpperCase","IsDescending","telemetry","warning","filter","Boolean","createInput","getMappedSearchConfigurationDataAction","DefaultValues","getProductRefinerHierarchy","searchCriteria","getProductSearchRefinersAsync","productRefiners","trace","result","productRefiner","RefinersByCollectionInput","defaultCategoryIdValue","defaultProductIdValue","compressedRefinerKeys","compressedRefinerArray","parseQueryParam","compressedRefiner","parsedRefiner","forEach","refinerKey","index","_unused","buildListPageUrl","fullUrl","sortingColumns","skipCount","searchParams","delete","sortedRefiners","sort","first","second","set","compressedRefiners","compressRefiners","href","toString","getCurrentUrl","window","URL","location","url","requestUrl","expandRefinersCount","SearchResultContainer","SearchResultContainer_1","React","props","state","_this$props$context$r7","super","sortByDropdownOptions","value","resources","_pageType","request","expandrefinerCount","defaultPageNumber","checkDifference","array1","array2","i","_getActivePrice","priceAffiliations","AffiliationId","LoyaltyTierId","AffiliationTypeValue","ReasonCodeLines","CustomerId","ExtensionProperties","data","listPageState","activeProducts","productRecIds","prod","projectDomain","cart","getCartFromCustomer","actionContext","affliations","AffiliationLines","console","log","getActivePricesAsync","Date","activePricesResponse","_products","productPrices","discountLines","priceResp","DiscountLines","prodIds","updatedProducts","setState","showProdPrice","activePrice","find","price","_activePrice$Customer","Price","CustomerContextualPrice","BasePrice","Math","max","TradeAgreementPrice","AdjustedPrice","catch","error","message","exception","debug","getNonClubPlusDiscountPrices","nonClubPlusDiscount","_getSearchResultModal","SearchResultModal","modalCloseButtonText","modalTitle","isOpen","modalIsOpen","returnRef","_modalToggleRef","onModalToggle","_toggleModal","_getCollectionTitle","_this$props$context$r","collectionTitle","getFriendlyName","NameTranslations","Name","productCountNumber","productCountText","format","numberOfProducts","oneProduct","isSearchPage","pageName","telemetryPageName","toLowerCase","titlePrefix","Title","className","text","searchTextPrefix","titleText","titleCount","TitleContainer","title","_getCategoryHierarchy","categoryHierarchy","CategoryHierarchyContainer","tag","categoryHierarchyList","Link","ariaLabel","categoryLinkAriaLabel","Url","categoryHierarchySeparator","Separator","separator","_getSortingDropDown","activeDropdown","_getCurrentlySelectedOption","sortingState","selectedSortByOption","dropdwonOptions","hideRating","dropdownOption","SortingContainer","sortByDropDown","LabeledDropdown","labelClassname","labelText","sortByDropdownLabel","dropdownId","dropdownClassname","toggleColor","dropdownOptions","selectedOption","onSelectOption","_updateSortByDropdown","ref","_sortAndFilterContainerRef","_getPagination","currentPageNumber","totalItems","previousText","flipperPrevious","nextText","flipperNext","UncontrolledPagination","role","paginationAriaLabel","qsp","items","startingItem","_renderPrev","_renderNext","previousAriaLabel","nextAriaLabel","telemetryContent","toggleRefinersInSameColumn","keyName","isExpanded","isFromMoreFilters","refinersExpandedStateData","expandedStateData","refRow","hasFilterOpened","j","k","m","setInitialSameColumnRefinerDetails","endingRefiners","maxRefinersColumns","_getViewport","filtersNavData","filtersRow","KeyName","refinersRowExpandedStates","filtersKeyName","_getRefineMenu","tempRangeTypeTODO","inputRange","validRefiners","Values","activeRefiners","_getexpandRefinerCount","startingRefinerList","startingRefiners","indexOf","startingRefiner","expandedRefiners","subMenus","productRefinerHierarchy","RefineSubmenu","selectedRefinerValues","refineItemCommonProps","_refineItemCommonProps","minValueSliderThumbAriaLabel","maxValueSliderThumbAriaLabel","onUpdateRefiners","_onUpdateRefiners","urlBuilder","_buildRefinerUrl","isDisabled","isExpandedOnInitialLoad","moduleId","moduleTypeName","typeName","endingSubMenus","onToggle","RefineMenuContainer","RefinerSectionContainer","scrollClass","_getChoiceSummary","selectedRefiners","ChoiceSummary","classNames","clearAllText","FilterActiveText","filterActiveText","label","choiceSummaryLabel","selectedChoices","refinerHierarchy","choiceFormat","choiceRangeValueFormat","onChoiceClicked","_onChoiceClicked","_buildRefinerUrlForChoiceSummary","choiceAriaLabel","_getProducts","_this$props$data$feat","_this$props$data$prod","imageSettings","allowBackNavigation","breaCrumbType","breadcrumbType","allowBack","quickviewslot","slots","quickview","isPriceMinMaxFeatureState","featureState","ProductSearchResultItems","moduleType","quickviewSlot","isPriceMinMaxEnabled","IsEnabled","wishlists","isMobile","loyalty","loyaltyCard","notification","history","pushState","_getSortColumnFromSelectedOption","isUpdated","transaction","sortingCritera","option","mappedConfiguration","sortCriteria","activeSortColumn","activeMappedConfig","mappedSearchConfig","itemToggleNotification","updatedRefinementCriteria","getUpdatedRefinementCriteria","newRefinementCriteria","currentRefinementCriteria","clearAll","dropdownElementId","current","dropdownElement","document","getElementById","setTimeout","focus","selectedChoice","choiceClicked","selectedCriterion","isMatchingRefinementCriterion","selectedRefiner","isClearAll","refinerCount","all","one","two","three","four","paginationPreviousText","paginationNextText","isInViewport","_this$refinersRef$cur","bounding","refinersRef","getBoundingClientRect","refinerMenu","querySelector","refinerMenuHeight","offsetHeight","categoryBanners","getElementsByClassName","HamburgerMenuBtn","isHamburgerMenuBtn","top","innerWidth","_mainMenuScroll","lastChangedScrollStateMobile","getTime","_viewport","device","Type","bind","_updateViewport","pending","lastUrlStr","placeholderTextMax","minLabel","maxLabel","rangeNameFormat","validationErrorNaN","validationErrorNotNumber","validationErrorRange","validationErrorNotRange","getTelemetryObject","friendlyName","_props$data$products$","redirectUrl","item","Key","Value","StringValue","assign","querySorting","pageSize","reaction","_this$props$context$r2","_this$props$context$r3","getCollectionProducts","productResults","enableAffiliationBasedPricing","_listPageState$curren","_listPageState$sortin","_listPageState$active","_this$props$context$r4","_this$props$context$r5","_this$props$context$r6","refinerInput","getCollectionRefinersAction","featureProduct","listPageStateFeature","nameTranslations","nameTranslation","Language","Text","componentDidMount","addEventListener","_this$props$data$list","componentWillUnmount","removeEventListener","render","ItemId","searchProduct","errorText","resultCategoryNotFoundText","resultSearchNotFoundText","productsComponent","featureComponent","FeatureSearchResultItem","searchResultContainerViewProps","TitleViewProps","disableHierarchy","refineMenu","classnames","moduleProps","sortByOptions","pagination","ProductsContainer","ProductSectionContainer","CategoryNavContainer","RefineAndProductSectionContainer","choiceSummary","modalToggle","ModalToggle","innerRef","onClick","searchResultModal","errorMessage","ErrorMessage","FeatureSearchContainer","similarLookProduct","onMoreFiltersClicked","renderView","gridSettings","xs","w","sm","md","lg","__decorate","computed","observable","observer","createSearchResultModal","oosProps","modalProps","shouldShowMoreRefiners","setShouldShowMoreRefiners","modal","modalHeader","createModalBody","modalFooter","modalBody","renderSort","renderRefiner","viewProps","slotBrowse","endingRefinersToShow","screenSize","_getScreenSize","_endingRefinersToShow","slice","Node","Object","submenu","Button","renderCategoryHierarchy","renderTitleAndProductCount","srcProps","_srcProps$context$req","_props$context$reques","currentCategory","browse","showModal","setShowModal","useState","categoryTitle","SetCategoryTitle","useEffect","e","toLocaleLowerCase","currentCategoryName","ModulesStateShareInput","categoryName","isClickInsideElementByClassName","event","target","classList","contains","parentNode","body","evt","filtersDivs","handleShowModal","_modalToggle","shouldRedirect","hasContentBlockTitle","contentBlockTitleDivs","innerHTML","Module","DobbiesModal","modalBodySlots","ListPageState","listPageStateAction","createListPageInput","sampleStateAction","customerLoyaltyTierId","Modal","zIndex","applicationNode","autoFocus","toggle","ModalHeader","ModalBody","modalBodyElement","ModalFooter","binding","modules","dataActions","registerSanitizedActionPath","sanitizedActionPath","dataAction","default","prototype","RegistrationId","c","require","$type","da","name","path","runOn","iNM","ns","n","p","pdp","__bindings__","viewDictionary","cn","module","exports","ReactDOM"],"sourceRoot":""}