{"version":3,"file":"static/js/f56fe5b0e6f98a640143.bundle.js","mappings":"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","sources":["webpack://illumina-commerce/./src/actions/get-full-products-by-collection.override.action.ts?2b4a","webpack://illumina-commerce/./lib/__local__/module-registration.js?8a42","webpack://illumina-commerce/./src/modules/search-result-container/actions/base-collection-action.ts?ec13","webpack://illumina-commerce/./src/modules/search-result-container/actions/get-inventory-refiners.ts?eaa4","webpack://illumina-commerce/./src/modules/search-result-container/actions/get-product-refiner-hierarchy.ts?3937","webpack://illumina-commerce/./src/modules/search-result-container/actions/url-utils.ts?1541","webpack://illumina-commerce/external var \"React\"?0d3b","webpack://illumina-commerce/external var \"ReactDOM\"?853b"],"sourcesContent":["import { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\n/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\nimport {\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 {\r\n AsyncResult,\r\n ChannelInventoryConfiguration,\r\n ProductRefinerValue,\r\n ProductSearchCriteria,\r\n ProductSearchResult,\r\n SortColumn\r\n} 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 } from '@msdyn365-commerce-modules/retail-actions';\r\n\r\nimport {\r\n BaseCollectionInput,\r\n createBaseCollectionInput\r\n} from '@msdyn365-commerce-modules/search-result-container/dist/lib/modules/search-result-container/actions/base-collection-action';\r\nimport getInventoryRefinerAction, {\r\n InventoryInStockRefinerValueInput\r\n} from '@msdyn365-commerce-modules/search-result-container/dist/lib/modules/search-result-container/actions/get-inventory-refiners';\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 => 'FullProductSearchResultOverride';\r\n\r\n public getCacheKey = () => 'FullProductSearchResultOverride';\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 'request';\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 inventoryAwareSortableAttributeId?: 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 // Customization - Apply default sorting A-Z\r\n if (args.requestContext.query && !args.requestContext.query.sorting && args.requestContext.user.isB2b) {\r\n input.queryResultSettings.Sorting = { Columns: [{ ColumnName: 'NAME', IsDescending: false }] };\r\n }\r\n\r\n input.queryResultSettings.count = true;\r\n\r\n return input;\r\n};\r\n\r\n/**\r\n * Returns inventory in stock refiner value.\r\n * @param input - The inventory refiner input.\r\n * @param context - The request context.\r\n * @param channelInventoryConfiguration - The channelInventoryConfiguration.\r\n * @returns Refiners.\r\n */\r\nasync function getInventoryInStockRefinerValueAsync(\r\n input: GetFullProductsByCollectionInput,\r\n context: IActionContext,\r\n channelInventoryConfiguration: ChannelInventoryConfiguration\r\n): Promise {\r\n let inventoryRefiner: IProductRefinerHierarchy = input.inventoryRefiner;\r\n // For hydrate, the inventory refiner is not added on input parameter, need to query the inventory refiner\r\n // For reaction in browser, the inventory refiner is added in componentDidMount of search-result-container\r\n if (!inventoryRefiner) {\r\n const refinerInput = new InventoryInStockRefinerValueInput(input, channelInventoryConfiguration.InventoryProductAttributeRecordId);\r\n inventoryRefiner = await getInventoryRefinerAction(refinerInput, context);\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- inventoryRefiner may be null\r\n return (\r\n inventoryRefiner?.Values.find(\r\n value =>\r\n value.LeftValueBoundString !== channelInventoryConfiguration.InventoryOutOfStockAttributeValueText &&\r\n value.RightValueBoundString !== channelInventoryConfiguration.InventoryOutOfStockAttributeValueText\r\n ) ?? null\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 * @param channelInventoryConfiguration - The channel inventory configuration.\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 channelInventoryConfiguration?: ChannelInventoryConfiguration\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\r\n const mappedProducts = productSearchResultsWithImages.map(productSearchResult => {\r\n if (ArrayExtensions.hasElements(productSearchResult.AttributeValues)) {\r\n for (const element of productSearchResult.AttributeValues) {\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\r\n return {\r\n products: mappedProducts,\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 inventoryAwareSortableAttributeId: channelInventoryConfiguration\r\n ? channelInventoryConfiguration.ProductAvailabilitySortableAttributeRecordId\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\n// eslint-disable-next-line complexity -- ignore the complexity.\r\nasync function action(input: GetFullProductsByCollectionInput, context: IActionContext): Promise {\r\n let promise: AsyncResult;\r\n let channelInventoryConfigurationPromise: AsyncResult;\r\n let searchProductId;\r\n const searchCriteriaInput: ProductSearchCriteria = {};\r\n searchCriteriaInput.Context = { ChannelId: context.requestContext.apiSettings.channelId, CatalogId: input.catalogId };\r\n searchCriteriaInput.Refinement = input.refiners;\r\n searchCriteriaInput.IncludeAttributes = input.includeAttributes;\r\n searchCriteriaInput.SkipVariantExpansion = true;\r\n const defaultNumber: number = 0;\r\n\r\n if (input.channelInventoryConfiguration) {\r\n channelInventoryConfigurationPromise = AsyncResult.resolve(input.channelInventoryConfiguration);\r\n } else {\r\n channelInventoryConfigurationPromise = getInventoryConfigurationAsync({ callerContext: context });\r\n }\r\n const channelInventoryConfiguration = await channelInventoryConfigurationPromise;\r\n\r\n if (context.requestContext.app.config?.productListInventoryDisplay === ProductListInventoryFilteringOptions.HideOOS) {\r\n const inventoryInStockRefinerValue = await getInventoryInStockRefinerValueAsync(input, context, channelInventoryConfiguration);\r\n\r\n const isInventoryInStockRefinerValueExist = searchCriteriaInput.Refinement?.some(\r\n refiner => refiner.RefinerRecordId === inventoryInStockRefinerValue?.RefinerRecordId\r\n );\r\n if (!isInventoryInStockRefinerValueExist && inventoryInStockRefinerValue) {\r\n searchCriteriaInput.Refinement?.push(inventoryInStockRefinerValue);\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app configs are of generic type\r\n if (\r\n context.requestContext.app.config?.productListInventoryDisplay === ProductListInventoryFilteringOptions.SortOOS &&\r\n channelInventoryConfiguration.ProductAvailabilitySortableAttributeRecordId\r\n ) {\r\n input.queryResultSettings.Sorting = input.queryResultSettings.Sorting ?? {};\r\n input.queryResultSettings.Sorting.Columns = input.queryResultSettings.Sorting.Columns ?? [];\r\n const sortColumnName = `Attr_${channelInventoryConfiguration.ProductAvailabilitySortableAttributeRecordId}`;\r\n const isSortAttributeExist = input.queryResultSettings.Sorting.Columns.some(\r\n (column: SortColumn) => column.ColumnName === sortColumnName\r\n );\r\n if (!isSortAttributeExist) {\r\n input.queryResultSettings.Sorting.Columns.push({\r\n ColumnName: sortColumnName,\r\n IsDescending: true\r\n });\r\n }\r\n }\r\n\r\n if (input.pageType === 'Category' || context.requestContext.query?.categoryId) {\r\n if (input.category) {\r\n searchCriteriaInput.CategoryIds = [input.category || defaultNumber];\r\n promise = searchByCriteriaAsync(\r\n {\r\n callerContext: context,\r\n queryResultSettings: input.queryResultSettings\r\n },\r\n searchCriteriaInput\r\n );\r\n } else {\r\n throw new Error('[GetFullProductsForCollection]Category Page Detected, but no global categoryId found');\r\n }\r\n } else if (input.searchText && context.requestContext.query?.q) {\r\n searchCriteriaInput.SearchCondition = input.searchText;\r\n promise = searchByCriteriaAsync(\r\n {\r\n callerContext: context,\r\n queryResultSettings: input.queryResultSettings\r\n },\r\n searchCriteriaInput\r\n );\r\n } else if (input.searchText && context.requestContext.query && context.requestContext.query.recommendation) {\r\n const searchObject = JSON.parse(input.searchText);\r\n if (context.requestContext.query.productId) {\r\n searchProductId = Number(searchObject.ProductId);\r\n }\r\n if (Number.isNaN(searchProductId)) {\r\n throw new Error('Failed to cast search product id into a number.');\r\n } else if (\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Existing code\r\n !searchObject.Recommendation\r\n ) {\r\n throw new Error('Failed to retrieve the Recommendation.');\r\n } else {\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- Existing code\r\n searchCriteriaInput.RecommendationListId = searchObject.Recommendation;\r\n if (searchProductId) {\r\n searchCriteriaInput.Ids = [searchProductId || defaultNumber];\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 return returnProducts(productSearchResults, context, promise.metadata.count, channelInventoryConfiguration);\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 as IAction,\r\n input: createInput\r\n});\r\n\r\nexport default actionDataAction;\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 { \n const actionPath = 'actions/get-full-products-by-collection.override.action';\n binding.dataActions[actionPath] = require('partner/actions/get-full-products-by-collection.override.action');\n registerActionId(actionPath);\n }\n\n \n window.__bindings__ = window.__bindings__ || {};\n window.__bindings__.modules = {\n ...window.__bindings__.modules || {},\n ...binding.modules\n };\n \n window.__bindings__.packageDataActions = {};\n window.__bindings__.packageDataActions['__local__'] = {\n ...binding.dataActions\n };","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { CacheType, getCatalogId, IActionInput, IAny, ICommerceApiSettings, ICreateActionContext, IGeneric } from '@msdyn365-commerce/core';\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport {\n convertToString,\n ChannelInventoryConfiguration,\n IQueryResultSettings,\n ProductRefinerValue,\n SortColumn\n} from '@msdyn365-commerce/retail-proxy';\nimport { generateCacheKey, QueryResultSettingsProxy } from '@msdyn365-commerce-modules/retail-actions';\nimport { toJS } from 'mobx';\n\nimport { hydrateRefinersFromUrl } from './url-utils';\n\n/**\n * Export listPageType.\n */\nexport type listPageType = 'Category' | 'Search' | 'Unknown';\n\n/**\n * Get include attributes from config.\n * @param inputData - ICreateActionContext.\n * @returns Boolean.\n */\nfunction getIncludeAttributes(inputData: ICreateActionContext, IGeneric>): boolean {\n if (process.env.NODE_ENV === 'development' && process.env.ENABLE_CLOUD_SEARCH?.toLowerCase() !== 'true') {\n return false;\n }\n\n if (inputData && inputData.config && inputData.config.includeAttributes !== undefined && inputData.config.includeAttributes === true) {\n return true;\n }\n return false;\n}\n\n/**\n * Get updateRefinerPanel from config.\n * @param inputData - ICreateActionContext.\n * @returns Boolean.\n */\nfunction getUpdateRefinerPanel(inputData: ICreateActionContext, IGeneric>): boolean {\n return !!inputData.config?.updateRefinerPanel;\n}\n\n/**\n * BaseCollection Action Input.\n */\nexport class BaseCollectionInput implements IActionInput {\n public pageType: listPageType;\n\n public category: number | undefined;\n\n public searchText: string | undefined;\n\n public refiners: ProductRefinerValue[];\n\n public queryResultSettings: IQueryResultSettings;\n\n public apiSettings: ICommerceApiSettings;\n\n public includeAttributes: boolean | undefined;\n\n public locale?: string;\n\n public isUpdateRefinerPanel?: boolean;\n\n public catalogId?: number;\n\n public channelInventoryConfiguration?: ChannelInventoryConfiguration;\n\n public inventoryRefiner?: IProductRefinerHierarchy;\n\n public constructor(\n pageType: listPageType,\n apiSettings: ICommerceApiSettings,\n queryResultSettings: IQueryResultSettings,\n refiners: ProductRefinerValue[],\n category: number | undefined,\n searchText: string | undefined,\n includeAttributes: boolean | undefined,\n isUpdateRefinerPanel?: boolean | undefined,\n locale?: string,\n catalogId?: number,\n channelInventoryConfiguration?: ChannelInventoryConfiguration,\n inventoryRefiner?: IProductRefinerHierarchy\n ) {\n this.pageType = pageType;\n this.apiSettings = apiSettings;\n this.category = category;\n this.searchText = searchText;\n this.queryResultSettings = queryResultSettings;\n this.refiners = refiners;\n this.includeAttributes = includeAttributes;\n this.isUpdateRefinerPanel = isUpdateRefinerPanel;\n this.locale = locale;\n this.catalogId = catalogId ?? 0;\n this.channelInventoryConfiguration = channelInventoryConfiguration;\n this.inventoryRefiner = inventoryRefiner;\n }\n\n public getCacheKey = () => {\n const queryResultSettings = {\n ...this.queryResultSettings.Paging,\n ...toJS(this.queryResultSettings.Sorting)\n };\n\n const cacheKey = generateCacheKey(\n this.apiSettings,\n { key: 'PageType', value: this.pageType },\n { key: 'Category', value: this.category },\n { key: 'SearchText', value: this.searchText },\n { key: 'CatalogId', value: this.catalogId },\n {\n key: 'Refiners',\n value: this.refiners.map(\n refiner =>\n `RefinerRecordId:${refiner.RefinerRecordId}-LeftValueBoundString:${refiner.LeftValueBoundString ||\n ''}-RightValueBoundString:${refiner.RightValueBoundString || ''}`\n )\n },\n { key: 'QueryResultSettings', value: convertToString(queryResultSettings) },\n { key: 'Locale', value: this.locale }\n );\n return cacheKey;\n };\n\n public getCacheObjectType = () => 'CollectionActionResult';\n\n public dataCacheType = (): CacheType => 'request';\n}\n\n// TODO: Create a data model here or import one to capture the response of the action\nexport interface IGetFullProductsByCollectionData {\n text: string;\n}\n\nexport type CollectionClassConstructor = new (\n pageType: listPageType,\n apiSettings: ICommerceApiSettings,\n queryResultSettings: IQueryResultSettings,\n refiners: ProductRefinerValue[],\n category: number | undefined,\n searchText: string | undefined,\n includeAttributes: boolean | undefined,\n isUpdateRefinerPanel?: boolean | undefined,\n locale?: string,\n catalogId?: number,\n channelInventoryConfiguration?: ChannelInventoryConfiguration,\n inventoryRefiner?: IProductRefinerHierarchy\n) => BaseCollectionInput;\n\n/**\n * TODO: Use this function to create the input required to make the action call.\n * @param args\n * @param inputClassConstuctor\n */\nexport const createBaseCollectionInput = (\n args: ICreateActionContext,\n inputClassConstuctor: CollectionClassConstructor\n): BaseCollectionInput => {\n const pageType =\n args.requestContext.urlTokens.pageType === 'Category' || (args.requestContext.query && args.requestContext.query.categoryId)\n ? 'Category'\n : 'Search';\n\n const queryResultSettings = QueryResultSettingsProxy.fromInputData(args).QueryResultSettings;\n const queryRefiners = hydrateRefinersFromUrl(args.requestContext);\n const includeAttributes = getIncludeAttributes(args);\n const isUpdateRefinerPanel = getUpdateRefinerPanel(args);\n const catalogId = getCatalogId(args.requestContext);\n\n if (args.requestContext.query && args.requestContext.query.sorting) {\n queryResultSettings.Sorting = { Columns: JSON.parse(decodeURIComponent(args.requestContext.query.sorting)) };\n }\n\n if (pageType === 'Category') {\n return new inputClassConstuctor(\n pageType,\n args.requestContext.apiSettings,\n queryResultSettings,\n queryRefiners,\n +(args.requestContext.urlTokens.itemId || (args.requestContext.query && args.requestContext.query.categoryId) || 0),\n undefined,\n includeAttributes,\n isUpdateRefinerPanel,\n args.requestContext.locale,\n catalogId\n );\n } else if (pageType === 'Search' && args.requestContext.query && args.requestContext.query.q) {\n return new inputClassConstuctor(\n pageType,\n args.requestContext.apiSettings,\n queryResultSettings,\n queryRefiners,\n undefined,\n args.requestContext.query.q,\n includeAttributes,\n isUpdateRefinerPanel,\n args.requestContext.locale,\n catalogId\n );\n } else if (pageType === 'Search' && args.requestContext.query && args.requestContext.query.recommendation) {\n let searchText = '';\n if (args.requestContext.query.productId) {\n searchText = JSON.stringify({\n ProductId: args.requestContext.query.productId,\n Recommendation: args.requestContext.query.recommendation\n });\n } else {\n searchText = JSON.stringify({ Recommendation: args.requestContext.query.recommendation });\n }\n return new inputClassConstuctor(\n pageType,\n args.requestContext.apiSettings,\n queryResultSettings,\n queryRefiners,\n undefined,\n searchText,\n includeAttributes,\n isUpdateRefinerPanel,\n args.requestContext.locale,\n catalogId\n );\n } else if (pageType === 'Search' && args.requestContext.query && args.requestContext.query.discountIds) {\n const searchText = JSON.stringify({ DiscountIds: args.requestContext.query.discountIds });\n return new inputClassConstuctor(\n pageType,\n args.requestContext.apiSettings,\n queryResultSettings,\n queryRefiners,\n undefined,\n searchText,\n includeAttributes,\n isUpdateRefinerPanel,\n args.requestContext.locale,\n catalogId\n );\n }\n\n throw new Error('[getFullProductsForCollection]Unable to create input');\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport { CacheType, createObservableDataAction, IAction, IActionContext, IActionInput } from '@msdyn365-commerce/core';\nimport { buildCacheKey } from '@msdyn365-commerce-modules/retail-actions';\n\nimport {\n AttributeDataType,\n ChannelInventoryConfiguration,\n ProductRefinerSource,\n ProductRefinerValue\n} from '@msdyn365-commerce/retail-proxy';\nimport { BaseCollectionInput } from './base-collection-action';\nimport { getProductRefinerHierarchy } from './get-product-refiner-hierarchy';\n\n/**\n * Returns inventory in stock sortable refiner value.\n * @param channelInventoryConfiguration - The channelInventoryConfiguration.\n * @param isInStock - The flag indicating whether is getting in-stock refiner or out-of-stock refiner.\n * @returns Refiners.\n */\nexport const getInventorySortableRefinerValue = (\n channelInventoryConfiguration: ChannelInventoryConfiguration,\n isInStock: boolean\n): ProductRefinerValue | undefined => {\n if (channelInventoryConfiguration && channelInventoryConfiguration.ProductAvailabilitySortableAttributeRecordId) {\n return {\n RefinerRecordId: channelInventoryConfiguration.ProductAvailabilitySortableAttributeRecordId,\n DataTypeValue: AttributeDataType.TrueFalse,\n LeftValueBoundString: isInStock ? 'true' : 'false',\n RightValueBoundString: isInStock ? 'true' : 'false',\n UnitText: '',\n RowNumber: 0,\n Count: 0,\n ExtensionProperties: [],\n RefinerSourceValue: ProductRefinerSource.Attribute\n };\n }\n return undefined;\n};\n\n/**\n * InventoryInStockRefinerValue Input action.\n * @remark The get-inventory-refiners data action is obsoleted. Please use getInventorySortableRefinerValue instead.\n */\nexport class InventoryInStockRefinerValueInput extends BaseCollectionInput implements IActionInput {\n public inventoryProductAttributeRecordId: number;\n\n public constructor(input: BaseCollectionInput, inventoryProductAttributeRecordId: number = 0) {\n super(\n input.pageType,\n input.apiSettings,\n {\n count: true\n },\n\n // Parameter - refiners\n [],\n\n // Parameter - category\n undefined,\n\n // Parameter - searchText\n '',\n\n // Parameter - includeAttributes\n false,\n\n // Parameter - isUpdateRefinerPanel\n false,\n\n // Parameter - locale\n undefined,\n input.catalogId,\n input.channelInventoryConfiguration,\n input.inventoryRefiner\n );\n\n this.inventoryProductAttributeRecordId =\n inventoryProductAttributeRecordId || input.channelInventoryConfiguration?.InventoryProductAttributeRecordId || 0;\n }\n\n /**\n * GetCacheKey.\n * @returns - Returns string.\n */\n public getCacheKey = (): string => buildCacheKey('RefinerList', this.apiSettings);\n\n /**\n * GetCacheObjectType.\n * @returns - Returns string.\n */\n public getCacheObjectType = (): string => 'RefinerList';\n\n /**\n * DataCacheType.\n * @returns - CacheType string.\n */\n public dataCacheType = (): CacheType => 'application';\n}\n\n/**\n * Action method returns inventory in stock refiners.\n * @param input - InventoryInStockRefinerValueInput.\n * @param context - IActionContext.\n * @returns - Promise.\n * @remark The get-inventory-refiners data action is obsoleted. Please use getInventorySortableRefinerValue instead.\n */\nasync function action(input: InventoryInStockRefinerValueInput, context: IActionContext): Promise {\n const refiners = await getProductRefinerHierarchy(\n {\n Context: {\n ChannelId: input.apiSettings.channelId,\n CatalogId: input.catalogId\n }\n },\n input.queryResultSettings,\n context\n );\n\n // InventoryProductAttributeRecordId may be 0, and recId of default refiner Category/Price/Rating is always 0 by design. In this case, we should not return refiner\n // Why recId of default refiner Category/Price/Rating is 0: see GetChannelProductRefiners.sql\n return (\n (input.channelInventoryConfiguration?.InventoryProductAttributeRecordId !== 0 &&\n refiners.find(refiner => refiner.RecordId === input.channelInventoryConfiguration?.InventoryProductAttributeRecordId)) ||\n // keep legacy logic to avoid break existing customers usage from this file\n (input.inventoryProductAttributeRecordId !== 0 &&\n refiners.find(refiner => refiner.RecordId === input.inventoryProductAttributeRecordId)) ||\n null\n );\n}\n\n/**\n * Action.\n * @param id - Id.\n * @param action - Action.\n * @returns - Results.\n * @remark The get-inventory-refiners data action is obsoleted. Please use getInventorySortableRefinerValue instead.\n */\nexport const actionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/search-result-container/get-inventory-refiners',\n action: action as IAction\n});\n\nexport default actionDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { IQueryResultSettings, ProductRefiner, ProductSearchCriteria } from '@msdyn365-commerce/retail-proxy';\nimport { getProductSearchRefinersAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\n\n/**\n * Uses Bulk refiner API to get refiners and child refiner values.\n * @param searchCriteria Product search criteria.\n * @param maxItems Max items.\n * @param queryResultSettings\n * @param ctx Action context.\n */\nexport async function getProductRefinerHierarchy(\n searchCriteria: ProductSearchCriteria,\n queryResultSettings: IQueryResultSettings,\n ctx: IActionContext\n): Promise {\n return getProductSearchRefinersAsync({ callerContext: ctx, queryResultSettings }, searchCriteria).then(\n (productRefiners: ProductRefiner[]) => {\n if (!productRefiners) {\n ctx.trace('[getRefinersByCriteriaAction] returned no refiners');\n return [];\n }\n\n const result = (productRefiners || []).map((productRefiner: ProductRefiner) => productRefiner);\n\n if (result.length === 0) {\n ctx.trace('[getRefinersByCriteriaAction] returned no IProductRefinerHierarchy objects');\n return [];\n }\n\n return result;\n }\n );\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport MsDyn365, { IRequestContext } from '@msdyn365-commerce/core';\nimport { ProductRefinerValue, SortColumn } from '@msdyn365-commerce/retail-proxy';\n\n/**\n * Refiner Compression:\n * Refiners contains a non-trivial amount of data that is required to successfully make\n * a refiner-based API call. To allow for deep-linking of refiners in the URL, refiner data\n * must be compressed so that URL max length is not exceeded. Refiners will be compressed into\n * the following array style index-based format:\n * [DataTypeValue, LeftValueBoundString, RefinerRecordId, RefinerSourceValue, RightValueBoundString, UnitText].\n */\nconst compressedRefinerKeys = [\n 'DataTypeValue',\n 'LeftValueBoundString',\n 'RefinerRecordId',\n 'RefinerSourceValue',\n 'RightValueBoundString',\n 'UnitText'\n];\n\n/**\n * Hydrates compressed refiner data from URL.\n * @param fullUrl The full URL of the page.\n * @param requestContext\n */\nexport const hydrateRefinersFromUrl = (requestContext: IRequestContext): ProductRefinerValue[] => {\n const compressedRefinerArray = parseQueryParam<(string | number)[][]>('refiners', requestContext);\n if (!compressedRefinerArray || compressedRefinerArray.length === 0) {\n return [];\n }\n\n return compressedRefinerArray\n .map(compressedRefiner => {\n try {\n const parsedRefiner: ProductRefinerValue = {};\n compressedRefinerKeys.forEach((refinerKey, index) => {\n parsedRefiner[refinerKey] = compressedRefiner[index];\n });\n return parsedRefiner;\n } catch {\n return undefined;\n }\n })\n .filter(Boolean);\n};\n\n/**\n * Compressed a list of refiners for use in URLs.\n * @param refiners The uncompressed refiners.\n */\nexport const compressRefiners = (refiners: ProductRefinerValue[]) => {\n const compressedRefiners: (string | number)[][] = [];\n\n refiners.forEach(refiner => {\n const compressedRefiner: (string | number)[] = [];\n compressedRefinerKeys.forEach(refinerKey => {\n compressedRefiner.push(refiner[refinerKey]);\n });\n compressedRefiners.push(compressedRefiner);\n });\n\n return compressedRefiners;\n};\n\n/**\n * Method which creates a URL contiaining serialized active refiners.\n * @param fullUrl The Current URL of the page.\n * @param refiners The refiners which should be added to the URL.\n * @param sortingColumns\n * @param skipCount\n */\nexport const buildListPageUrl = (fullUrl: URL, refiners?: ProductRefinerValue[], sortingColumns?: SortColumn[], skipCount?: number) => {\n // Refiner Change flow\n if (refiners !== undefined) {\n if (refiners.length === 0) {\n fullUrl.searchParams.delete('refiners');\n } else {\n const sortedRefiners = refiners.sort((first, second) =>\n first.RefinerRecordId && second.RefinerRecordId && first.RefinerRecordId > second.RefinerRecordId ? 1 : -1\n );\n fullUrl.searchParams.set('refiners', JSON.stringify(compressRefiners(sortedRefiners)));\n }\n\n // Adding or removing a refiner means we want to always load page 1\n fullUrl.searchParams.delete('skip');\n return fullUrl.href;\n }\n\n if (sortingColumns !== undefined) {\n if (sortingColumns.length === 0) {\n fullUrl.searchParams.delete('sorting');\n } else {\n fullUrl.searchParams.set('sorting', JSON.stringify(sortingColumns));\n }\n\n // Changing the sort means always load page 1\n fullUrl.searchParams.delete('skip');\n return fullUrl.href;\n }\n\n if (skipCount) {\n fullUrl.searchParams.set('skip', skipCount.toString());\n }\n\n return fullUrl.href;\n};\n\n/**\n * Parses a query param from the query object of the request context.\n * @param key The query parameter key.\n * @param requestContext The request context.\n */\nexport const parseQueryParam = (key: string, requestContext: IRequestContext): T | null => {\n if (requestContext.query && requestContext.query[key]) {\n return JSON.parse(decodeURIComponent(requestContext.query[key]));\n }\n return null;\n};\n\n/**\n * Gets the current URL of the page from the request context.\n * @param requestContext The request context.\n */\nexport const getCurrentUrl = (requestContext: IRequestContext): URL => {\n if (MsDyn365.isBrowser) {\n return new URL(window.location.href);\n }\n\n // NOTE: Typing on requestURL is incorrect\n if (requestContext.url.requestUrl.href) {\n return new URL(requestContext.url.requestUrl.href);\n }\n return new URL((requestContext.url.requestUrl));\n};\n","module.exports = React;","module.exports = ReactDOM;"],"names":["ProductListInventoryFilteringOptions","GetFullProductsByCollectionInput","BaseCollectionInput","constructor","getCacheObjectType","getCacheKey","dataCacheType","this","pageType","refiners","length","queryResultSettings","Sorting","Columns","async","returnProducts","productSearchResults","context","metadataCount","channelInventoryConfiguration","productSearchResultsWithImages","map","productSearchResult","newImageUrl","generateProductImageUrl","requestContext","apiSettings","PrimaryImageUrl","app","config","inventoryLevel","InventoryLevels","threshold","enableStockCheck","products","count","ArrayExtensions","hasElements","AttributeValues","element","undefined","RecordId","InventoryProductAttributeRecordId","inventoryRanges","TextValue","InventoryOutOfStockAttributeValueText","channelInventoryConfigurationId","inventoryAwareSortableAttributeId","ProductAvailabilitySortableAttributeRecordId","actionDataAction","createObservableDataAction","id","action","input","_context$requestConte","_context$requestConte2","_context$requestConte3","_context$requestConte4","promise","channelInventoryConfigurationPromise","searchProductId","searchCriteriaInput","Context","ChannelId","channelId","CatalogId","catalogId","Refinement","IncludeAttributes","includeAttributes","SkipVariantExpansion","AsyncResult","resolve","getInventoryConfigurationAsync","callerContext","productListInventoryDisplay","HideOOS","_searchCriteriaInput$","inventoryInStockRefinerValue","_inventoryRefiner$Val","_inventoryRefiner","inventoryRefiner","refinerInput","InventoryInStockRefinerValueInput","getInventoryRefinerAction","Values","find","value","LeftValueBoundString","RightValueBoundString","getInventoryInStockRefinerValueAsync","_searchCriteriaInput$2","some","refiner","RefinerRecordId","push","SortOOS","_input$queryResultSet","_input$queryResultSet2","sortColumnName","column","ColumnName","IsDescending","query","categoryId","category","Error","CategoryIds","searchByCriteriaAsync","searchText","q","SearchCondition","recommendation","searchObject","JSON","parse","productId","Number","ProductId","isNaN","Recommendation","RecommendationListId","Ids","metadata","args","createBaseCollectionInput","Paging","Top","itemsPerPage","skip","Skip","sorting","user","isB2b","binding","modules","dataActions","actionPath","require","default","prototype","Object","keys","forEach","exportName","Action","registerActionId","window","__bindings__","_objectSpread","packageDataActions","isUpdateRefinerPanel","locale","toJS","generateCacheKey","key","convertToString","inputClassConstuctor","urlTokens","QueryResultSettingsProxy","fromInputData","QueryResultSettings","queryRefiners","hydrateRefinersFromUrl","inputData","_inputData$config","updateRefinerPanel","getUpdateRefinerPanel","getCatalogId","decodeURIComponent","itemId","stringify","discountIds","DiscountIds","getInventorySortableRefinerValue","isInStock","DataTypeValue","AttributeDataType","TrueFalse","UnitText","RowNumber","Count","ExtensionProperties","RefinerSourceValue","ProductRefinerSource","Attribute","_input$channelInvento","inventoryProductAttributeRecordId","arguments","super","buildCacheKey","_input$channelInvento2","getProductRefinerHierarchy","_input$channelInvento3","searchCriteria","ctx","getProductSearchRefinersAsync","then","productRefiners","trace","result","productRefiner","compressedRefinerKeys","compressedRefinerArray","parseQueryParam","compressedRefiner","parsedRefiner","refinerKey","index","_unused","filter","Boolean","buildListPageUrl","fullUrl","sortingColumns","skipCount","searchParams","delete","sortedRefiners","sort","first","second","set","compressedRefiners","compressRefiners","href","toString","getCurrentUrl","MsDyn365","isBrowser","URL","location","url","requestUrl","module","exports","React","ReactDOM"],"sourceRoot":""}