{"version":3,"file":"static/js/97adfeb142f50c95906b.bundle.js","mappings":"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","sources":["webpack://Msdyn365.Commerce.Online/./src/actions/get-organization-customer.ts?79c2","webpack://Msdyn365.Commerce.Online/./src/modules/dlvry-search-result-container/actions/refiner-utils.ts?04ba","webpack://Msdyn365.Commerce.Online/./src/modules/dlvry-search/actions/get-auto-suggest-suggestions.ts?de55","webpack://Msdyn365.Commerce.Online/./src/modules/dlvry-search/components/dlvry-search.categorysuggest.tsx?421f","webpack://Msdyn365.Commerce.Online/./src/modules/dlvry-search/components/dlvry-search.form.tsx?6f55","webpack://Msdyn365.Commerce.Online/./src/modules/dlvry-search/components/dlvry-search.keywordsuggest.tsx?f399","webpack://Msdyn365.Commerce.Online/./src/modules/dlvry-search/components/dlvry-search.label.tsx?35ea","webpack://Msdyn365.Commerce.Online/./src/modules/dlvry-search/components/cart-count.tsx?8b32","webpack://Msdyn365.Commerce.Online/./src/modules/dlvry-search/components/dlvry-search.productsuggest.tsx?20c9","webpack://Msdyn365.Commerce.Online/./src/modules/dlvry-search/dlvry-search.props.autogenerated.ts?c305","webpack://Msdyn365.Commerce.Online/./src/modules/dlvry-search/dlvry-search.tsx?e0db","webpack://Msdyn365.Commerce.Online/./src/modules/dlvry-search/components/dlvry-search.hooks.tsx?2f7a","webpack://Msdyn365.Commerce.Online/./src/modules/dlvry-search/dlvry-search.view.tsx?08b5","webpack://Msdyn365.Commerce.Online/./src/shared-utils/string-utils.ts?de49","webpack://Msdyn365.Commerce.Online/./lib/dlvry-search/module-registration.js?3943","webpack://Msdyn365.Commerce.Online/./src/search-state.ts?dd10","webpack://Msdyn365.Commerce.Online/./src/search-state-data-action.ts?8223","webpack://Msdyn365.Commerce.Online/external var \"React\"?0d3b","webpack://Msdyn365.Commerce.Online/external var \"ReactDOM\"?853b"],"sourcesContent":["import { createObservableDataAction, IActionContext, IAction, ICreateActionContext, IGeneric, IAny, ICommerceApiSettings } from '@msdyn365-commerce/core';\r\nimport { CacheType, callActionOrExecute, Customer, DataServiceQuery, IActionInput, IDataServiceRequest } from \"@msdyn365-commerce/retail-proxy\";\r\nimport * as Entities from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceModels.g';\r\n\r\nexport class GetOrganizationCustomerInput implements IActionInput {\r\n private readonly user: string | undefined;\r\n private readonly query: DataServiceQuery;\r\n\r\n constructor(apiSettings: ICommerceApiSettings, user: string) {\r\n this.user = user;\r\n\r\n this.query = new DataServiceQuery();\r\n }\r\n\r\n public getDataServiceRequest = (): IDataServiceRequest => {\r\n return this.query.createDataServiceRequestForOperation(\r\n 'GetOrganizationCustomer',\r\n false,\r\n Entities.CustomerClass,\r\n 'false',\r\n {\r\n bypassCache: 'get',\r\n returnEntity: 'Entities.CustomerClass'\r\n },\r\n {}\r\n );\r\n };\r\n\r\n public shouldCacheOutput = (): boolean => false;\r\n\r\n public getCacheKey = () => `OrganizationCustomer-${this.user}`;\r\n public getCacheObjectType = () => 'OrganizationCustomer';\r\n public dataCacheType = (): CacheType => 'request';\r\n}\r\n\r\nconst createInput = (inputData: ICreateActionContext>): GetOrganizationCustomerInput => {\r\n const { user } = inputData.requestContext;\r\n return new GetOrganizationCustomerInput(inputData.requestContext.apiSettings, user.customerAccountNumber ?? \"\");\r\n};\r\n\r\nexport const getOrganizationCustomerAction = async (input: GetOrganizationCustomerInput, ctx: IActionContext): Promise => {\r\n if (!ctx.requestContext.user.isAuthenticated) {\r\n return {};\r\n }\r\n var customer = await callActionOrExecute(input.getDataServiceRequest(), ctx);\r\n return customer;\r\n};\r\n\r\nexport const getOrganizationCustomer = createObservableDataAction({\r\n id: 'src/actions/get-organization-customer',\r\n action: >getOrganizationCustomerAction,\r\n input: createInput\r\n});\r\n\r\nexport default getOrganizationCustomer;\r\n","import { IActionContext } from '@msdyn365-commerce/core';\r\nimport { AttributeDataType, CustomerAttribute, ProductRefinerSource, ProductRefinerValue, ProductSearchCriteria } from '@msdyn365-commerce/retail-proxy';\r\n// @ts-ignore\r\nimport { getCustomer, GetCustomerInput } from '@msdyn365-commerce-modules/retail-actions';\r\nimport getOrganizationCustomer, { GetOrganizationCustomerInput } from '../../../actions/get-organization-customer';\r\n\r\n// Pre populated with ids from STAGE for local development\r\nconst AlcoholGroupAttributeId = 5637155076;\r\n\r\nfunction isGodmodeEnabled(context: IActionContext): boolean {\r\n const godmode = context.requestContext.url.requestUrl.searchParams.get('godmode')?.toLowerCase();\r\n\r\n return godmode === '1' || godmode === 'true';\r\n}\r\n\r\nexport function shouldFilterAlcohol(context: IActionContext): boolean {\r\n const doAlcoholFiltering = context.requestContext.url.requestUrl.searchParams.get('alcohol')?.toLowerCase() !== 'false';\r\n const alcoholRefinerRecordId = Number(context.requestContext.app.config?.alcoholRefinerRecordId);\r\n\r\n return doAlcoholFiltering && !isNaN(alcoholRefinerRecordId) && alcoholRefinerRecordId > 0;\r\n}\r\n\r\nexport async function getAlcoholRefiners(context: IActionContext): Promise {\r\n let alcoholGroupAttributeId = Number(context.requestContext.app.config?.alcoholRefinerRecordId);\r\n\r\n if (isNaN(alcoholGroupAttributeId) || alcoholGroupAttributeId === 0) {\r\n alcoholGroupAttributeId = AlcoholGroupAttributeId;\r\n }\r\n\r\n const result: ProductRefinerValue[] = [];\r\n const alcoholRefiner: ProductRefinerValue = {\r\n DataTypeValue: 5,\r\n LeftValueBoundString: '0',\r\n RefinerRecordId: alcoholGroupAttributeId,\r\n RefinerSourceValue: 1,\r\n RightValueBoundString: '0',\r\n UnitText: ''\r\n };\r\n\r\n result.push(alcoholRefiner);\r\n\r\n try {\r\n let alcoholLicenseValue = 0;\r\n\r\n if (context.requestContext.user.isAuthenticated) {\r\n // Get Customer attributes\r\n // const customer = await getCustomer(new GetCustomerInput(context.requestContext.apiSettings, context.requestContext.user.customerAccountNumber), context);\r\n const customer = await getOrganizationCustomer(new GetOrganizationCustomerInput(context.requestContext.apiSettings, context.requestContext.user.customerAccountNumber!), context);\r\n const alcoholLicense = Number(customer.Attributes?.find(x => x.RecordId === alcoholGroupAttributeId)?.AttributeValue?.StringValue);\r\n\r\n if (isNaN(alcoholLicense)) {\r\n // Throw NaN error\r\n console.warn('Alcohol license value is missing or not a number.');\r\n } else {\r\n alcoholLicenseValue = alcoholLicense;\r\n }\r\n } else {\r\n // If user is not logged in show all products\r\n alcoholLicenseValue = 3;\r\n }\r\n\r\n // TODO: Verify we can do ranges like this on text attributes\r\n // If we can do range on text attributes use this:\r\n //alcoholRefiner.RightValueBoundString = alcoholLicense?.AttributeValue?.StringValue ?? '0';\r\n\r\n // Add a refiner for each alcohol group\r\n Array(alcoholLicenseValue).fill(0).forEach((_, index) => {\r\n result.push({\r\n ...alcoholRefiner,\r\n LeftValueBoundString: (index + 1).toString(),\r\n RightValueBoundString: (index + 1).toString()\r\n });\r\n });\r\n } catch (error) {\r\n console.warn('Failed to get customer attributes for alcohol license or parse value of attribute. No alcohol license applied to search.', error);\r\n }\r\n\r\n return result;\r\n}\r\n\r\nexport async function addAlcoholRefiner(context: IActionContext, searchCriteriaInput: ProductSearchCriteria): Promise {\r\n let alcoholGroupAttributeId = Number(context.requestContext.app.config?.alcoholRefinerRecordId);\r\n\r\n if (isNaN(alcoholGroupAttributeId) || alcoholGroupAttributeId === 0) {\r\n alcoholGroupAttributeId = AlcoholGroupAttributeId;\r\n }\r\n\r\n if (searchCriteriaInput.Refinement!.some(x => x.RefinerRecordId === alcoholGroupAttributeId)) {\r\n // Remove existing, shouldn't be here\r\n searchCriteriaInput.Refinement = searchCriteriaInput.Refinement!.filter(x => x.RefinerRecordId !== alcoholGroupAttributeId);\r\n }\r\n\r\n const refiners = await getAlcoholRefiners(context);\r\n\r\n searchCriteriaInput.Refinement = searchCriteriaInput.Refinement!.concat(refiners);\r\n\r\n return Promise.resolve();\r\n}\r\n\r\nexport function addOrUpdateZeroPriceRefiner(context: IActionContext, refiners?: ProductRefinerValue[]): ProductRefinerValue[] {\r\n // Check criteria for allowing user to see zero price products. Example:\r\n // - Has ?godmode=true in url\r\n const allowZeroPriceProducts = isGodmodeEnabled(context);\r\n\r\n if (!allowZeroPriceProducts) {\r\n const result = refiners ? [...refiners] : [];\r\n\r\n // Make sure we don't show zero price products\r\n const priceRefiner = result.find(x => x.RefinerRecordId === 0);\r\n\r\n if (priceRefiner) {\r\n // There is a price refiner, make sure it has a min value of 0.01 or more\r\n if (!priceRefiner.LeftValueBoundString || Number(priceRefiner.LeftValueBoundString) < 0.01) {\r\n priceRefiner.LeftValueBoundString = '0.01';\r\n }\r\n } else {\r\n // No price refiner, add one\r\n result.push({\r\n '@odata.type': '#Microsoft.Dynamics.Commerce.Runtime.DataModel.ProductRefinerValue',\r\n Count: 0,\r\n DataTypeValue: 1,\r\n LeftValueBoundString: '0.01',\r\n ExtensionProperties: [],\r\n RefinerRecordId: 0,\r\n RefinerSourceValue: 3,\r\n RightValueBoundString: '1000000000',\r\n RowNumber: 0,\r\n UnitText: context.requestContext.channel?.Currency\r\n } as any);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n return refiners || [];\r\n}\r\n\r\nexport async function getAttributeRefiners(context: IActionContext, customerAttributes: CustomerAttribute[] | undefined, attributeRecordId: number, friendlyName?: string): Promise {\r\n const result: ProductRefinerValue[] = [];\r\n const refiner: ProductRefinerValue = {\r\n DataTypeValue: 5,\r\n LeftValueBoundString: '0',\r\n RefinerRecordId: attributeRecordId,\r\n RefinerSourceValue: 1,\r\n RightValueBoundString: '0',\r\n UnitText: ''\r\n };\r\n\r\n result.push(refiner);\r\n\r\n try {\r\n let attributeValue = 0;\r\n\r\n if (context.requestContext.user.isAuthenticated) {\r\n const attribute = Number(customerAttributes?.find(x => x.RecordId === attributeRecordId)?.AttributeValue?.StringValue);\r\n\r\n if (isNaN(attribute)) {\r\n // Throw NaN error\r\n if (friendlyName) {\r\n console.warn(`${friendlyName} attribute value is missing or not a number.`);\r\n } else {\r\n console.warn(`Attribute with record id ${attributeRecordId} is missing a value or not a number.`);\r\n }\r\n } else {\r\n attributeValue = attribute;\r\n }\r\n } else {\r\n // If user is not logged in show all products\r\n attributeValue = 1;\r\n }\r\n\r\n if (attributeValue !== 0) {\r\n result.push({\r\n ...refiner,\r\n LeftValueBoundString: attributeValue.toString(),\r\n RightValueBoundString: attributeValue.toString()\r\n });\r\n }\r\n } catch (error) {\r\n if (friendlyName) {\r\n console.warn(`Failed to get ${friendlyName} customer attribute or parse value of attribute. No filter applied to search.`, error);\r\n } else {\r\n console.warn(`Failed to get customer attribute (record id: ${attributeRecordId}) or parse value of attribute. No filter applied to search.`, error);\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\nexport async function getForsvaretRefiner(context: IActionContext, customerAttributes: CustomerAttribute[] | undefined): Promise {\r\n const forsvaretAttributeId = context.requestContext.app.config?.forsvaretAttributeRecordId;\r\n\r\n if (!forsvaretAttributeId || !context.requestContext.user.isAuthenticated) {\r\n return;\r\n }\r\n\r\n try {\r\n const attribute = customerAttributes?.find(x => x.RecordId === Number(forsvaretAttributeId))?.AttributeValue?.IntegerValue;\r\n\r\n if (!attribute || isNaN(attribute) || attribute === 0) {\r\n return;\r\n }\r\n\r\n return {\r\n DataTypeValue: AttributeDataType.Integer,\r\n LeftValueBoundString: attribute.toString(),\r\n RefinerRecordId: Number(forsvaretAttributeId),\r\n RefinerSourceValue: ProductRefinerSource.Attribute,\r\n RightValueBoundString: attribute.toString(),\r\n UnitText: ''\r\n };\r\n } catch (error) {\r\n console.error('Failed to get forsvaret attribute', error);\r\n return;\r\n }\r\n}\r\n\r\nexport async function addAttributeRefiner(context: IActionContext, customerAttributes: CustomerAttribute[] | undefined, searchCriteriaInput: ProductSearchCriteria, attributeRecordId: number): Promise {\r\n if (searchCriteriaInput.Refinement!.some(x => x.RefinerRecordId === attributeRecordId)) {\r\n // Remove existing, shouldn't be here\r\n searchCriteriaInput.Refinement = searchCriteriaInput.Refinement!.filter(x => x.RefinerRecordId !== attributeRecordId);\r\n }\r\n\r\n const refiners = await getAttributeRefiners(context, customerAttributes, attributeRecordId);\r\n\r\n searchCriteriaInput.Refinement = searchCriteriaInput.Refinement!.concat(refiners);\r\n}\r\n\r\nexport async function addAttributeRefinerKeepExisting(context: IActionContext, customerAttributes: CustomerAttribute[] | undefined, searchCriteriaInput: ProductSearchCriteria, attributeRecordId: number): Promise {\r\n if (searchCriteriaInput.Refinement!.some(x => x.RefinerRecordId === attributeRecordId)) {\r\n return;\r\n }\r\n\r\n const refiners = await getAttributeRefiners(context, customerAttributes, attributeRecordId);\r\n\r\n searchCriteriaInput.Refinement = searchCriteriaInput.Refinement!.concat(refiners);\r\n}\r\n\r\nexport async function addAllAttributeRefiners(context: IActionContext, searchCriteriaInput: ProductSearchCriteria): Promise {\r\n const godmode = isGodmodeEnabled(context);\r\n\r\n if (godmode) {\r\n return;\r\n }\r\n\r\n let customerAttributes: CustomerAttribute[] | undefined = [];\r\n\r\n if (context.requestContext.user.isAuthenticated) {\r\n const { apiSettings, user: { customerAccountNumber } } = context.requestContext;\r\n const customer = await getOrganizationCustomer(new GetOrganizationCustomerInput(apiSettings, customerAccountNumber!), context);\r\n customerAttributes = customer.Attributes;\r\n }\r\n\r\n const attributeRecordIds: string[] = [\r\n context.requestContext.app.config?.tobaccoRefinerRecordId,\r\n context.requestContext.app.config?.cocacolaRefinerRecordId,\r\n context.requestContext.app.config?.bamaRefinerRecordId,\r\n context.requestContext.app.config?.dutyFreeSugarRefinerRecordId,\r\n context.requestContext.app.config?.norturaRefinerRecordId\r\n ];\r\n\r\n for (const attributeRecordId of attributeRecordIds) {\r\n const id = Number(attributeRecordId);\r\n\r\n // Make sure it's a number and above 0\r\n if (!isNaN(id) && id > 0) {\r\n await addAttributeRefiner(context, customerAttributes, searchCriteriaInput, id);\r\n }\r\n }\r\n\r\n const transitRefiner = Number(context.requestContext.app.config?.transitRefinerRecordId);\r\n\r\n if (!isNaN(transitRefiner) && transitRefiner > 0) {\r\n await addAttributeRefinerKeepExisting(context, customerAttributes, searchCriteriaInput, transitRefiner);\r\n }\r\n\r\n const forsvaretRefiner = await getForsvaretRefiner(context, customerAttributes);\r\n\r\n if (forsvaretRefiner) {\r\n searchCriteriaInput.Refinement!.push(forsvaretRefiner);\r\n }\r\n}\r\n\r\nexport async function getAllAttributeRefiners(context: IActionContext) {\r\n const godmode = isGodmodeEnabled(context);\r\n\r\n if (godmode) {\r\n return [];\r\n }\r\n\r\n let customerAttributes: CustomerAttribute[] | undefined = [];\r\n\r\n if (context.requestContext.user.isAuthenticated) {\r\n const { apiSettings, user: { customerAccountNumber } } = context.requestContext;\r\n const customer = await getOrganizationCustomer(new GetOrganizationCustomerInput(apiSettings, customerAccountNumber!), context);\r\n customerAttributes = customer.Attributes;\r\n }\r\n\r\n const attributeRecordIds: string[] = [\r\n context.requestContext.app.config?.transitRefinerRecordId,\r\n context.requestContext.app.config?.tobaccoRefinerRecordId,\r\n context.requestContext.app.config?.cocacolaRefinerRecordId,\r\n context.requestContext.app.config?.bamaRefinerRecordId,\r\n context.requestContext.app.config?.dutyFreeSugarRefinerRecordId,\r\n context.requestContext.app.config?.norturaRefinerRecordId\r\n ];\r\n\r\n const result: ProductRefinerValue[] = [];\r\n\r\n for (const attributeRecordId of attributeRecordIds) {\r\n const id = Number(attributeRecordId);\r\n\r\n // Make sure it's a number and above 0\r\n if (!isNaN(id) && id > 0) {\r\n const refiners = await getAttributeRefiners(context, customerAttributes, id);\r\n result.push(...refiners);\r\n }\r\n }\r\n\r\n const forsvaretRefiner = await getForsvaretRefiner(context, customerAttributes);\r\n\r\n if (forsvaretRefiner) {\r\n result.push(forsvaretRefiner);\r\n }\r\n\r\n return result;\r\n}","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\n/* eslint-disable no-duplicate-imports */\nimport { Autosuggestions } from '@msdyn365-commerce/commerce-entities';\nimport {\n CacheType,\n createObservableDataAction,\n getCatalogId,\n IAction,\n IActionContext,\n IActionInput,\n ICreateActionContext\n} from '@msdyn365-commerce/core';\nimport { SearchSuggestion, SearchSuggestionCriteria } from '@msdyn365-commerce/retail-proxy';\nimport { getSearchSuggestionsAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/StoreOperationsDataActions.g';\nimport { generateImageUrl } from '@msdyn365-commerce-modules/retail-actions';\nimport { addAlcoholRefiner, addAllAttributeRefiners, addOrUpdateZeroPriceRefiner, shouldFilterAlcohol } from '../../dlvry-search-result-container/actions/refiner-utils';\n\nexport enum SuggestionType {\n Category = 'ScopedCategory',\n Keyword = 'Keyword',\n Product = 'Product',\n None = 'None'\n}\n\n/**\n * Input class for auto suggest search input.\n */\nexport class AutoSuggestInput implements IActionInput {\n public searchQuery?: string;\n\n public topResultsCount?: number;\n\n public suggestionType?: string;\n\n public hitPrefix?: string;\n\n public hitSuffix?: string;\n\n public constructor(searchText?: string, top?: number, suggestionType?: string, hitPrefix?: string, hitSuffix?: string) {\n this.searchQuery = searchText;\n this.topResultsCount = top;\n this.suggestionType = suggestionType;\n this.hitPrefix = hitPrefix;\n this.hitSuffix = hitSuffix;\n }\n\n public getCacheKey = () => 'AutoSuggestSearchSuggestions';\n\n public getCacheObjectType = () => 'AutoSuggestSearchSuggestions';\n\n public dataCacheType = (): CacheType => 'none';\n}\n\nconst createInput = (inputData: ICreateActionContext) => {\n return new AutoSuggestInput();\n};\n\n/**\n * Calls the Retail API and returns a auto-suggest suggestions.\n * @param input\n * @param ctx\n */\nexport async function getSearchSuggestionsAction(input: AutoSuggestInput, ctx: IActionContext): Promise {\n // If no input is provided fail out\n if (!input || !input.searchQuery) {\n throw new Error('[getSearchSuggestionsAction]No valid Input was provided, failing');\n }\n\n const autosuggest: Autosuggestions = {};\n\n const autoSuggestPromises = [_getAutoSuggest(input, autosuggest, ctx)];\n return Promise.all(autoSuggestPromises).then(() => {\n return autosuggest;\n });\n}\n\nasync function _getAutoSuggest(input: AutoSuggestInput, autosuggest: Autosuggestions, ctx: IActionContext): Promise {\n const catalogId = getCatalogId(ctx.requestContext);\n const searchCriteria: SearchSuggestionCriteria = {\n ProductSearchCriteria: {\n SearchCondition: input.searchQuery && input.searchQuery.length > 0 ? input.searchQuery : '',\n Context: {\n ChannelId: +ctx.requestContext.apiSettings.channelId,\n CatalogId: catalogId\n }\n },\n HitPrefix: input.hitPrefix,\n HitSuffix: input.hitSuffix,\n SuggestionType: input.suggestionType\n };\n\n searchCriteria.ProductSearchCriteria!.Refinement = addOrUpdateZeroPriceRefiner(ctx, searchCriteria.ProductSearchCriteria?.Refinement);\n\n if (shouldFilterAlcohol(ctx)) {\n await addAlcoholRefiner(ctx, searchCriteria.ProductSearchCriteria!);\n }\n\n await addAllAttributeRefiners(ctx, searchCriteria.ProductSearchCriteria!);\n\n const searchSuggestions = await getSearchSuggestionsAsync(\n { callerContext: ctx, queryResultSettings: { Paging: { Top: input.topResultsCount } } },\n searchCriteria\n );\n\n if (searchSuggestions && searchSuggestions.length > 0) {\n searchSuggestions.map((item: SearchSuggestion) => {\n // Generate image url\n item.ImageUrl = item.ImageUrl ? generateImageUrl(item.ImageUrl, ctx.requestContext.apiSettings) : '';\n\n // Hide price. Active price will be retrieved later\n if (item.Value3?.Value?.DecimalValue) {\n item.Value3.Value.DecimalValue = undefined;\n }\n });\n\n autosuggest.AllSearchResults = searchSuggestions;\n } else {\n ctx.telemetry.error(\n `[getSearchSuggestionsAction] unable to get availabilites for search with suggestion type ${searchCriteria.SuggestionType}`\n );\n }\n}\n\nexport const getSearchSuggestionsActionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/search/get-auto-suggest-suggestions',\n action: >getSearchSuggestionsAction,\n input: createInput\n});\n\nexport default getSearchSuggestionsActionDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\n/* eslint-disable no-duplicate-imports */\n/* eslint-disable security/detect-non-literal-regexp */\nimport MsDyn365, { getRichTextHtml } from '@msdyn365-commerce/core';\nimport { ProductRefiner, ProductRefinerSource, ProductRefinerValue, SearchSuggestion } from '@msdyn365-commerce/retail-proxy';\nimport { format, getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IDlvrySearchData } from '../dlvry-search.data';\nimport { IDlvrySearchProps } from '../dlvry-search.props.autogenerated';\nimport { formatString } from '../../../shared-utils/string-utils';\n\nexport interface ISearchCategorySuggestProps {\n searchCategorySuggestClass: string;\n searchPageURL: string;\n searchQsp: string | undefined;\n hitPrefix: string;\n hitSuffix: string;\n autoSuggestProps: IDlvrySearchProps;\n searchText: string;\n searchRefiners: ProductRefiner[] | undefined;\n suggestions: SearchSuggestion[] | undefined;\n telemetryContent?: ITelemetryContent;\n shouldShowFullPath?: boolean;\n searchTermCompleted: string | undefined;\n categorySuggestionProductCount: string;\n categorySuggestionProductCountPlural: string;\n categorySuggestionJoinerText: string;\n}\n\nexport interface ISearchCategoryViewProps {\n title: React.ReactNode;\n text: React.ReactNode[];\n}\n\nlet payLoad: IPayLoad;\n\n/**\n * CategorySuggestionsComponent.\n * @param props\n */\nexport const CategorySuggestionsComponent = (props: ISearchCategorySuggestProps): ISearchCategoryViewProps | undefined => {\n const {\n suggestions,\n searchText,\n autoSuggestProps: {\n resources: { categorySuggestionHeading }\n }\n } = props;\n\n const reactNodes: React.ReactNode[] = [];\n payLoad = getPayloadObject('click', props.telemetryContent!, '');\n\n suggestions?.map(item => {\n reactNodes.push(_assembleNode(item, props));\n });\n\n // @ts-ignore\n const titleNode = _renderTitle(categorySuggestionHeading, searchText);\n\n return { title: null, text: reactNodes };\n};\n\nconst _renderTitle = (categorySuggestionHeading: string, searchText: string) => {\n const categoryAutoSuggestionHeading = categorySuggestionHeading\n ? format(categorySuggestionHeading, searchText)\n : `Search \"${searchText}\" in categories`;\n\n return
  • {categoryAutoSuggestionHeading}
  • ;\n};\n\nconst _assembleNode = (item: SearchSuggestion, props: ISearchCategorySuggestProps) => {\n const { searchText, hitPrefix, hitSuffix, shouldShowFullPath } = props;\n\n const splitValue = shouldShowFullPath ? item.Value : item.Value && item.Value.split('|').pop();\n const ariaLabel = splitValue\n ? splitValue.replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '')\n : item.Value && item.Value.replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n const fullText = `${props.searchTermCompleted?.toUpperCase()} ${props.categorySuggestionJoinerText} ${ariaLabel}`;\n payLoad.contentAction.etext = item.Value;\n const attribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n const count = item.Value3?.Value?.IntegerValue;\n const productCountLabel = count === 1\n ? props.categorySuggestionProductCount\n : props.categorySuggestionProductCountPlural;\n return (\n
  • \n \n \n {props.searchTermCompleted?.toUpperCase()}\n   {props.categorySuggestionJoinerText}  \n {_generateLink(item, searchText, props) && _getHighlightedText(splitValue ? splitValue : '', hitPrefix, hitSuffix)}\n \n
    ({formatString(productCountLabel, item.Value3?.Value?.IntegerValue)})
    \n
    \n
  • \n );\n};\n\nconst _generateLink = (suggestion: SearchSuggestion, searchText: string, props: ISearchCategorySuggestProps): string => {\n return suggestion && suggestion.Id ? _getCategoryLink(suggestion.Id, searchText, props) : '';\n};\n\nconst _getCategoryLink = (id: string, searchText: string, props: ISearchCategorySuggestProps): string => {\n const { searchPageURL, searchQsp, searchRefiners } = props;\n\n if (!MsDyn365.isBrowser) {\n return '';\n }\n\n const queryUrl = new URL(searchPageURL, window.location.href);\n\n if (searchQsp && searchText) {\n queryUrl.searchParams.set(searchQsp, searchText);\n }\n\n const categoryRefiners = searchRefiners?.find(refiners => {\n return refiners.SourceValue === ProductRefinerSource.Category;\n });\n const refiner = categoryRefiners?.Values?.find(item => {\n return item.RefinerRecordId === Number.parseInt(id, 10);\n });\n\n const encodedRefiner = refiner && JSON.stringify(compressRefiners([refiner]));\n if (encodedRefiner) {\n queryUrl.searchParams.set('refiners', encodedRefiner);\n }\n\n return queryUrl.href;\n};\n\nconst _getHighlightedText = (suggestion: string, hitPrefix: string, hitSuffix: string): JSX.Element => {\n const formattedText = suggestion\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '')\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n\n // eslint-disable-next-line react/no-danger\n return ;\n};\n\n// TODO: This code is currently duplicated in categoryautosuggest need to either remove one of these files\n// or move this code to a common place\nconst compressedRefinerKeys = [\n 'DataTypeValue',\n 'LeftValueBoundString',\n 'RefinerRecordId',\n 'RefinerSourceValue',\n 'RightValueBoundString',\n 'UnitText'\n];\n\n/**\n * Compressed a list of refiners for use in URLs.\n * @param refiners The uncompressed refiners.\n */\nconst 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","/*!\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 { Button } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\nimport classnames from 'classnames';\r\n\r\nexport interface ISearchFormProps {\r\n hideSearchLabel: boolean | undefined;\r\n isSearchFormExpanded?: boolean | undefined;\r\n disableSubmitSearch: boolean | undefined;\r\n searchTextInput: React.RefObject;\r\n maxChars: number;\r\n searchQsp: string;\r\n searchPlaceholder: string;\r\n query: string;\r\n ariaLabelCancel: string;\r\n ariaLabelSearch: string;\r\n ariaLabelSubmit: string;\r\n handleCancelSearchChange(): void;\r\n handleInputChange(query: string): void;\r\n}\r\n\r\nexport interface ISearchFormViewProps {\r\n input: React.ReactNode;\r\n submitBtn: React.ReactNode;\r\n cancelBtn: React.ReactNode;\r\n}\r\n\r\n/**\r\n * On Input Change functionality.\r\n * @param handleInputChange -Input change function.\r\n * @returns Set updated input value.\r\n */\r\nconst onInputChangeFunction = (handleInputChange: (query: string) => void) => (event: React.ChangeEvent) => {\r\n handleInputChange(event.target.value || '');\r\n};\r\nexport const FormComponent = (props: ISearchFormProps): ISearchFormViewProps => {\r\n const {\r\n searchQsp,\r\n searchPlaceholder,\r\n hideSearchLabel,\r\n searchTextInput,\r\n handleInputChange,\r\n maxChars,\r\n disableSubmitSearch,\r\n handleCancelSearchChange,\r\n query,\r\n ariaLabelCancel,\r\n ariaLabelSearch,\r\n ariaLabelSubmit\r\n } = props;\r\n\r\n const onInputChange = onInputChangeFunction(handleInputChange);\r\n\r\n const inputNode = !hideSearchLabel ? (\r\n \r\n ) : (\r\n \r\n );\r\n\r\n const submitBtnNode = !disableSubmitSearch && \n \n );\n};\n","import * as React from 'react';\r\nimport {\r\n format,\r\n Tooltip\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\n\r\nexport interface ICartCountProps {\r\n productId: number;\r\n cart: ICartState;\r\n inCartTooltipText?: string;\r\n}\r\n\r\nconst CartCount = (props: ICartCountProps) => {\r\n const { cart, productId, inCartTooltipText } = props;\r\n const [showCartCountTooltip, setShowCartCountTooltip] = React.useState(false);\r\n\r\n // const cartQuantity = cart?.cart.CartLines?.find(x => x.ProductId === productId)?.Quantity;\r\n const cartQuantity = cart?.cart.CartLines?.filter(x => x.ProductId === productId).reduce((acc, val) => acc + (val.Quantity || 0), 0);\r\n\r\n if (!cartQuantity) {\r\n return null;\r\n }\r\n\r\n const cartCountId = `productResults-item-cart-count-${productId}`;\r\n const tooltipString = inCartTooltipText || '{0} i handlekurven';\r\n const tooltipText = format(tooltipString, cartQuantity);\r\n\r\n return (\r\n setShowCartCountTooltip(true)}\r\n onMouseOut={() => setShowCartCountTooltip(false)}\r\n onTouchStart={() => setShowCartCountTooltip(true)}\r\n >\r\n {cartQuantity}\r\n \r\n {tooltipText}\r\n \r\n \r\n );\r\n};\r\n\r\nexport default CartCount;\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-non-literal-regexp */\r\nimport { PriceComponent } from '@msdyn365-commerce/components';\r\nimport { getRichTextHtml, IActionContext, IImageSettings, Image, ITelemetry } from '@msdyn365-commerce/core';\r\nimport { SearchSuggestion } from '@msdyn365-commerce/retail-proxy';\r\nimport { getProductPageUrlSync } from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n INodeProps,\r\n IPayLoad,\r\n ITelemetryContent,\r\n NodeTag\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport * as React from 'react';\r\n\r\nimport { IDlvrySearchData } from '../dlvry-search.data';\r\nimport { IDlvrySearchProps } from '../dlvry-search.props.autogenerated';\r\nimport CartCount from './cart-count';\r\n\r\n/**\r\n * Search product suggest resources.\r\n */\r\nexport interface ISearchProductSuggestResources {\r\n freePriceText: string;\r\n inCartTooltipText: string;\r\n}\r\n\r\nexport interface ISearchProductSuggestProps {\r\n searchProductSuggestClass: string;\r\n searchPageURL: string;\r\n searchQsp: string | undefined;\r\n hitPrefix: string;\r\n hitSuffix: string;\r\n autoSuggestProps: IDlvrySearchProps;\r\n searchText: string;\r\n suggestions: SearchSuggestion[] | undefined;\r\n telemetry: ITelemetry;\r\n moduleType: string;\r\n moduleId: string;\r\n telemetryContent?: ITelemetryContent;\r\n resources?: ISearchProductSuggestResources;\r\n activePrices: { [key: string]: number };\r\n cart: ICartState | undefined;\r\n}\r\n\r\nexport interface ISearchProductViewProps {\r\n title: React.ReactNode;\r\n items: ISearchProductItemViewProps[];\r\n}\r\n\r\nexport interface ISearchProductItemViewProps {\r\n text: React.ReactNode;\r\n thumbnail: React.ReactNode;\r\n price: React.ReactNode;\r\n cartCount: React.ReactNode;\r\n LiProduct: INodeProps;\r\n AProduct: INodeProps;\r\n id: string | undefined;\r\n}\r\n\r\nlet payLoad: IPayLoad;\r\nlet telemetryContent: ITelemetryContent | undefined;\r\n\r\n/**\r\n * ProductSuggestionsComponent.\r\n * @param props\r\n */\r\nexport const ProductSuggestionsComponent = (props: ISearchProductSuggestProps): ISearchProductViewProps | undefined => {\r\n const {\r\n suggestions,\r\n hitSuffix,\r\n hitPrefix,\r\n autoSuggestProps: {\r\n context: { actionContext },\r\n resources: { productSuggestionHeading }\r\n },\r\n moduleType,\r\n moduleId\r\n } = props;\r\n const reactNodes: ISearchProductItemViewProps[] = [];\r\n telemetryContent = props.telemetryContent;\r\n payLoad = getPayloadObject('click', props.telemetryContent!, '');\r\n\r\n suggestions?.map(item => {\r\n reactNodes.push(_assembleNode(item, hitPrefix, hitSuffix, actionContext, props, moduleType, moduleId));\r\n });\r\n\r\n const titleNode = _renderTitle(productSuggestionHeading);\r\n\r\n return { title: titleNode, items: reactNodes };\r\n};\r\n\r\nconst _renderTitle = (productSuggestionHeading: string) => {\r\n const productAutoSuggestionHeading = productSuggestionHeading ? productSuggestionHeading : 'Go to products';\r\n\r\n return
  • {productAutoSuggestionHeading}
  • ;\r\n};\r\n\r\nconst _assembleNode = (\r\n item: SearchSuggestion,\r\n hitPrefix: string,\r\n hitSuffix: string,\r\n actionContext: IActionContext,\r\n props: ISearchProductSuggestProps,\r\n moduleType: string,\r\n moduleId: string\r\n): ISearchProductItemViewProps => {\r\n const altText =\r\n item.Value && item.Value.replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\r\n\r\n const price = props.activePrices[item.Id!];\r\n return {\r\n text: _getHighlightedText(item.Value ? item.Value : '', hitPrefix, hitSuffix),\r\n thumbnail: _renderThumbnail(item, altText ? altText : '', props),\r\n price: _renderPrice(price, moduleId, moduleType, props),\r\n cartCount: _renderCartCount(item.Id!, props),\r\n LiProduct: _getLiWrapper(),\r\n AProduct: _getAWrapper(item, hitPrefix, hitSuffix, actionContext, props),\r\n id: item.Id\r\n };\r\n};\r\n\r\nconst _getLiWrapper = () => {\r\n return {\r\n className: 'msc-autoSuggest__productResults-item',\r\n tag: 'li' as NodeTag\r\n };\r\n};\r\n\r\nconst _getAWrapper = (\r\n item: SearchSuggestion,\r\n hitPrefix: string,\r\n hitSuffix: string,\r\n actionContext: IActionContext,\r\n props: ISearchProductSuggestProps\r\n) => {\r\n const {\r\n autoSuggestProps: { context }\r\n } = props;\r\n const ariaLabel =\r\n item.Value && item.Value.replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\r\n\r\n payLoad.contentAction.recid = item.Id;\r\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\r\n const productPrice = item.Value3?.Value?.DecimalValue ? context.cultureFormatter.formatCurrency(item.Value3.Value.DecimalValue) : undefined;\r\n\r\n return {\r\n className: 'msc-autoSuggest__productResults-item',\r\n tag: 'a' as NodeTag,\r\n 'aria-label': `${ariaLabel!} ${productPrice || ''}`,\r\n href: _generateLink(item, hitPrefix, hitSuffix, actionContext),\r\n ...attribute\r\n };\r\n};\r\n\r\nconst _generateLink = (suggestion: SearchSuggestion, hitPrefix: string, hitSuffix: string, actionContext: IActionContext) => {\r\n const formattedLink = (suggestion.Value as string)\r\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '')\r\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\r\n return suggestion.Value && suggestion.Id\r\n ? getProductPageUrlSync(formattedLink, (suggestion.Id as unknown) as number, actionContext, undefined)\r\n : '';\r\n};\r\n\r\nconst _getHighlightedText = (suggestion: string, hitPrefix: string, hitSuffix: string): JSX.Element => {\r\n const formattedText = suggestion\r\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '')\r\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\r\n\r\n return (\r\n // eslint-disable-next-line react/no-danger\r\n \r\n );\r\n};\r\n\r\nconst _renderPrice = (\r\n price: number | undefined,\r\n moduleId: string,\r\n moduleType: string,\r\n props: ISearchProductSuggestProps\r\n): JSX.Element | null => {\r\n const {\r\n autoSuggestProps: { context }\r\n } = props;\r\n\r\n if (!price) {\r\n return (\r\n \r\n \r\n ...\r\n \r\n \r\n );\r\n }\r\n\r\n return (\r\n \r\n );\r\n};\r\n\r\nconst _renderCartCount = (itemId: string, props: ISearchProductSuggestProps): JSX.Element | null => {\r\n if (!props.cart) {\r\n return null;\r\n }\r\n\r\n const productId = parseInt(itemId, 10);\r\n\r\n if (isNaN(productId)) {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n );\r\n};\r\n\r\nconst _renderThumbnail = (suggestion: SearchSuggestion, altText: string, props: ISearchProductSuggestProps): JSX.Element | null => {\r\n const {\r\n autoSuggestProps: {\r\n context: {\r\n request: { gridSettings }\r\n },\r\n config: { imageSettings }\r\n }\r\n } = props;\r\n if (imageSettings) {\r\n imageSettings.cropFocalRegion = true;\r\n }\r\n\r\n if (!suggestion || !suggestion.ImageUrl) {\r\n props.telemetry.error('Search suggestion content is empty, module wont render.');\r\n return null;\r\n }\r\n\r\n const defaultImageSettings: IImageSettings = {\r\n viewports: {\r\n lg: { q: 'w=64&h=64&m=0&f=webp', w: 64, h: 64 },\r\n md: { q: 'w=64&h=64&m=0&f=webp', w: 64, h: 64 },\r\n sm: { q: 'w=64&h=64&m=0&f=webp', w: 64, h: 64 },\r\n xl: { q: 'w=64&h=64&m=0&f=webp', w: 64, h: 64 },\r\n xs: { q: 'w=64&h=64&m=0&f=webp', w: 64, h: 64 }\r\n },\r\n lazyload: true,\r\n cropFocalRegion: true\r\n };\r\n\r\n if (imageSettings) {\r\n imageSettings.viewports = defaultImageSettings.viewports;\r\n }\r\n\r\n return (\r\n \r\n );\r\n};\r\n","/**\r\n * Copyright (c) Microsoft Corporation\r\n * All rights reserved. See License.txt in the project root for license information.\r\n * IDlvrySearch contentModule 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\n\r\nexport interface IDlvrySearchConfig extends Msdyn365.IModuleConfig {\r\n suggestionTypeCriterion?: ISuggestionTypeCriterionData[];\r\n topResultsCount?: number;\r\n imageSettings?: Msdyn365.IImageSettings;\r\n hideSearchLabel?: boolean;\r\n disableSubmitSearch?: boolean;\r\n searchplaceholderText?: string;\r\n shouldShowFullCategoryPath?: boolean;\r\n noSearchResultImage?: Msdyn365.IImageData;\r\n className?: string;\r\n clientRender?: boolean;\r\n}\r\n\r\nexport interface IDlvrySearchResources {\r\n searchtext: string;\r\n searchLabelArialLabel: string;\r\n cancelBtnAriaLabel: string;\r\n searchBtnAriaLabel: string;\r\n submitBtnAriaLabel: string;\r\n autoSuggestFoundMessage: string;\r\n noAutoSuggestionMessage: string;\r\n productSuggestionHeading: string;\r\n categorySuggestionHeading: string;\r\n autoSuggestResultLoadingMessage: string;\r\n freePriceText: string;\r\n searchSuggestionHeading: string;\r\n keywordsHeading: string;\r\n noResultText: string;\r\n noResultContentHeadingText: string;\r\n noResultContentParagraphText: string;\r\n clearSearchButtonText: string;\r\n emptyMobileSearchTextHeading: string;\r\n emptyMobileSearchText: string;\r\n categorySuggestionProductCount: string;\r\n categorySuggestionProductCountPlural: string;\r\n categorySuggestionJoinerText: string;\r\n inCartTooltipText: string;\r\n}\r\n\r\nexport const enum SuggestionTypeCriterionSuggestionType {\r\n product = 'product',\r\n keyword = 'keyword',\r\n scopedCategory = 'scopedCategory'\r\n}\r\n\r\nexport interface ISuggestionTypeCriterionData {\r\n SuggestionType?: SuggestionTypeCriterionSuggestionType;\r\n}\r\n\r\nexport interface IDlvrySearchProps extends Msdyn365.IModule {\r\n resources: IDlvrySearchResources;\r\n config: IDlvrySearchConfig;\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 { Autosuggestions } from '@msdyn365-commerce/commerce-entities';\r\nimport MsDyn365, { getCatalogId, getUrlSync } from '@msdyn365-commerce/core';\r\nimport { ProductRefiner, ProductRefinerSource, ProductsDataActions, ProjectionDomain } from '@msdyn365-commerce/retail-proxy';\r\nimport { ArrayExtensions, ObjectExtensions, Random, validateCatalogId } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { createSearchStateInput } from '@msdyn365-commerce-modules/search-utilities';\r\nimport { getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent, KeyCodes } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport { debounce } from 'lodash';\r\nimport { Spinner, SpinnerSize } from 'office-ui-fabric-react';\r\nimport * as React from 'react';\r\n\r\nimport getSearchSuggestionsAction, { AutoSuggestInput, SuggestionType } from './actions/get-auto-suggest-suggestions';\r\nimport {\r\n CategorySuggestionsComponent,\r\n FormComponent,\r\n ISearchCategoryViewProps,\r\n ISearchKeywordViewProps,\r\n ISearchProductViewProps,\r\n KeywordSuggestionsComponent,\r\n LabelComponent,\r\n ProductSuggestionsComponent\r\n} from './components';\r\nimport { IDlvrySearchData } from './dlvry-search.data';\r\nimport { IDlvrySearchProps, ISuggestionTypeCriterionData, SuggestionTypeCriterionSuggestionType } from './dlvry-search.props.autogenerated';\r\nimport { getActivePricesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\n\r\nexport interface ISearchState {\r\n isSearchFormExpanded: boolean;\r\n searchText: string;\r\n searchKeywordSuggestClass: string;\r\n searchProductSuggestClass: string;\r\n searchCategorySuggestClass: string;\r\n suggestions: Autosuggestions | undefined;\r\n searchRefiners?: ProductRefiner[] | undefined;\r\n autoSuggestAriaLabel: string;\r\n isInitialState: boolean;\r\n isLoadingAutoSuggest?: boolean;\r\n searchTermCompleted?: string;\r\n activePrices: { [key: string]: number };\r\n}\r\n\r\nexport interface ISearchViewProps extends IDlvrySearchProps {\r\n Search: IModuleProps;\r\n AutoSuggestAriaLabel: INodeProps;\r\n AutoSuggestAriaLabelText: string;\r\n searchText: string;\r\n AutoSuggest: INodeProps;\r\n KeywordSuggest: INodeProps;\r\n ProductSuggest: INodeProps;\r\n CategorySuggest: INodeProps;\r\n SearchForm: INodeProps;\r\n FormWrapper: INodeProps;\r\n UlKeyword: INodeProps;\r\n UlProduct: INodeProps;\r\n UlCategory: INodeProps;\r\n label: React.ReactNode;\r\n form: React.ReactNode;\r\n autosuggestKeyword?: ISearchKeywordViewProps;\r\n autosuggestProduct?: ISearchProductViewProps;\r\n autosuggestCategory?: ISearchCategoryViewProps;\r\n callbacks: {\r\n handleCancelSearchChange(): void;\r\n handleCancelSearchFocused?(): void;\r\n };\r\n isSearchFormExpanded: boolean;\r\n isLoadingAutoSuggest?: boolean;\r\n isLoadingNode?: React.ReactNode;\r\n searchTermCompleted?: string;\r\n}\r\n\r\n/**\r\n *\r\n * Search module.\r\n * @extends {React.Component, ISearchState>}\r\n */\r\nclass Search extends React.Component, ISearchState> {\r\n private readonly searchTextInput: React.RefObject;\r\n\r\n private readonly searchCollapsedLabel: React.RefObject;\r\n\r\n private readonly formReference: React.RefObject;\r\n\r\n private readonly maxChars: number;\r\n\r\n private readonly topResultsCount?: number;\r\n\r\n private readonly hitPrefix: string = '{';\r\n\r\n private readonly hitSuffix: string = '}';\r\n\r\n private readonly waitTime: number = 500;\r\n\r\n private readonly autoSuggestResultScreenReaderDiv: React.RefObject;\r\n\r\n private readonly autoSuggestResultDiv: React.RefObject;\r\n\r\n private readonly searchFormClass: string;\r\n\r\n private readonly searchLabelClass: string;\r\n\r\n private readonly telemetryContent: ITelemetryContent;\r\n\r\n private loadSuggestionsRequestId?: string;\r\n\r\n private inputSuggestionType: ISuggestionTypeCriterionData[];\r\n\r\n // @ts-expect-error\r\n private cancellabelDebounce: debounce;\r\n\r\n public constructor(props: IDlvrySearchProps) {\r\n super(props);\r\n this.searchTextInput = React.createRef();\r\n this.searchCollapsedLabel = React.createRef();\r\n this.autoSuggestResultScreenReaderDiv = React.createRef();\r\n this.autoSuggestResultDiv = React.createRef();\r\n this.formReference = React.createRef();\r\n this.state = {\r\n isSearchFormExpanded: false,\r\n searchText: '',\r\n searchKeywordSuggestClass: 'ms-search__autoSuggest__keyword',\r\n searchProductSuggestClass: 'ms-search__autoSuggest__product',\r\n searchCategorySuggestClass: 'ms-search__autoSuggest__category',\r\n suggestions: undefined,\r\n searchRefiners: undefined,\r\n autoSuggestAriaLabel: '',\r\n isInitialState: true,\r\n isLoadingAutoSuggest: false,\r\n activePrices: {}\r\n };\r\n this.maxChars =\r\n (this.props.context &&\r\n this.props.context.app &&\r\n this.props.context.app.config &&\r\n this.props.context.app.config.searchInputMaxLength) ||\r\n 50;\r\n\r\n this.inputSuggestionType = [];\r\n this.topResultsCount = this.props.config && this.props.config.topResultsCount ? this.props.config.topResultsCount : 5;\r\n this.searchFormClass = 'ms-search__form';\r\n this.searchLabelClass = 'ms-search__label';\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 this._initSuggestionTypes();\r\n }\r\n\r\n public async componentDidMount(): Promise {\r\n document.body && document.body.addEventListener('mousedown', this._focusOutTarget);\r\n window && window.addEventListener('keyup', this._keyup);\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n document.body && document.body.removeEventListener('mousedown', this._focusOutTarget, false);\r\n window && window.removeEventListener('keyup', this._keyup, false);\r\n }\r\n\r\n public componentDidUpdate(): void {\r\n const {\r\n config: { hideSearchLabel }\r\n } = this.props;\r\n const { isSearchFormExpanded, isInitialState } = this.state;\r\n\r\n if (!this.props.context.request.params.isEditor) {\r\n if (!hideSearchLabel && isSearchFormExpanded) {\r\n this.searchTextInput && this.searchTextInput.current && this.searchTextInput.current.focus();\r\n } else if (!isInitialState) {\r\n this.searchCollapsedLabel && this.searchCollapsedLabel.current && this.searchCollapsedLabel.current.focus();\r\n }\r\n }\r\n\r\n void this._getActivePrices();\r\n }\r\n\r\n public shouldComponentUpdate(nextProps: IDlvrySearchProps, nextState: ISearchState): boolean {\r\n if (this.state === nextState && this.props === nextProps) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n // eslint-disable-next-line complexity -- ignore complexity.\r\n public render(): JSX.Element {\r\n const {\r\n context,\r\n resources: { searchtext, searchLabelArialLabel, cancelBtnAriaLabel, searchBtnAriaLabel, submitBtnAriaLabel },\r\n config: { hideSearchLabel, disableSubmitSearch, searchplaceholderText, shouldShowFullCategoryPath, className = '' }\r\n } = this.props;\r\n\r\n const {\r\n isSearchFormExpanded,\r\n searchText,\r\n searchKeywordSuggestClass,\r\n searchProductSuggestClass,\r\n searchCategorySuggestClass,\r\n suggestions,\r\n searchRefiners,\r\n isLoadingAutoSuggest\r\n } = this.state;\r\n\r\n const searchQsp = (context && context.app && context.app.config && context.app.config.searchQueryStringParameter) || 'q';\r\n const searchPageURL = getUrlSync('search', context && context.actionContext) || '';\r\n const searchURL = this._appendQueryParams(searchPageURL, searchText, searchQsp);\r\n const searchPlaceholder = searchplaceholderText && searchplaceholderText.length > 0 ? searchplaceholderText : 'Search in Fabrikam';\r\n\r\n const keywordSuggestions = suggestions?.AllSearchResults?.filter(\r\n suggestion => suggestion.SuggestionType === SuggestionType.Keyword || suggestion.SuggestionType === SuggestionType.None\r\n );\r\n const productSuggestions = suggestions?.AllSearchResults?.filter(\r\n suggestion => suggestion.SuggestionType === SuggestionType.Product\r\n );\r\n const categoryRefiners = searchRefiners?.find(refiner => {\r\n return refiner.SourceValue === ProductRefinerSource.Category;\r\n });\r\n const categorySuggestions = suggestions?.AllSearchResults?.filter(suggestion => {\r\n if (suggestion.SuggestionType !== SuggestionType.Category) {\r\n return false;\r\n }\r\n const refiner = categoryRefiners?.Values?.find(item => {\r\n return `${item.RefinerRecordId ?? 0}` === suggestion.Id;\r\n });\r\n\r\n return !ObjectExtensions.isNullOrUndefined(refiner);\r\n });\r\n\r\n const viewProps: ISearchViewProps = {\r\n ...(this.props as IDlvrySearchProps),\r\n\r\n Search: {\r\n moduleProps: this.props,\r\n className: `${classnames('ms-search', className)} ${disableSubmitSearch ? 'no-submit' : 'with-submit'}`\r\n },\r\n AutoSuggestAriaLabel: {\r\n tag: 'div',\r\n className: 'msc-autoSuggest__screen-reader',\r\n 'aria-live': 'assertive',\r\n ref: this.autoSuggestResultScreenReaderDiv\r\n },\r\n AutoSuggestAriaLabelText: this.state.autoSuggestAriaLabel,\r\n searchText: this.state.searchText,\r\n AutoSuggest: {\r\n ref: this.autoSuggestResultDiv,\r\n className: classnames('ms-search__autoSuggest', { show: this.state.searchTermCompleted, hide: !this.state.searchTermCompleted })\r\n },\r\n KeywordSuggest: {\r\n className: searchKeywordSuggestClass\r\n },\r\n ProductSuggest: {\r\n className: searchProductSuggestClass\r\n },\r\n CategorySuggest: {\r\n className: searchCategorySuggestClass\r\n },\r\n SearchForm: {\r\n className: `${this.searchFormClass} ${isSearchFormExpanded ? 'bx-show' : 'bx-hide'}`\r\n },\r\n FormWrapper: {\r\n tag: 'form',\r\n ref: this.formReference,\r\n className: 'ms-search__searchForm',\r\n 'aria-label': 'Search',\r\n name: 'searchForm',\r\n role: 'search',\r\n action: searchURL,\r\n autoComplete: 'off',\r\n onSubmit: this._handleSubmit\r\n },\r\n UlKeyword: {\r\n tag: 'ul',\r\n className: classnames('msc-autoSuggest__keywordResults-items', className)\r\n },\r\n UlProduct: {\r\n tag: 'ul',\r\n className: classnames('msc-autoSuggest__productResults-items', className)\r\n },\r\n UlCategory: {\r\n tag: 'ul',\r\n className: classnames('msc-autoSuggest__categoryResults-items', className)\r\n },\r\n label: LabelComponent({\r\n isSearchFormExpanded,\r\n searchLabelClass: `${this.searchLabelClass} ${isSearchFormExpanded ? 'bx-hide' : 'bx-show'}`,\r\n searchtext,\r\n searchLabelArialLabel,\r\n searchCollapsedLabel: this.searchCollapsedLabel,\r\n hideSearchLabel,\r\n handleCancelSearchChange: this._handleCancelSearchChange,\r\n telemetryContent: this.telemetryContent\r\n }),\r\n form: FormComponent({\r\n ariaLabelCancel: cancelBtnAriaLabel,\r\n ariaLabelSearch: searchBtnAriaLabel,\r\n ariaLabelSubmit: submitBtnAriaLabel,\r\n hideSearchLabel,\r\n searchTextInput: this.searchTextInput,\r\n disableSubmitSearch,\r\n handleInputChange: this._handleInputChange,\r\n handleCancelSearchChange: this._handleCancelSearchChange,\r\n maxChars: this.maxChars,\r\n searchQsp,\r\n searchPlaceholder,\r\n query: searchText\r\n }),\r\n autosuggestKeyword:\r\n searchText &&\r\n searchText.length > 0 &&\r\n (isLoadingAutoSuggest || (keywordSuggestions && ArrayExtensions.hasElements(keywordSuggestions)))\r\n ? KeywordSuggestionsComponent({\r\n searchKeywordSuggestClass,\r\n searchPageURL,\r\n searchQsp,\r\n hitPrefix: this.hitPrefix,\r\n hitSuffix: this.hitSuffix,\r\n autoSuggestProps: this.props,\r\n searchText,\r\n searchTermCompleted: this.state.searchTermCompleted,\r\n suggestions: keywordSuggestions,\r\n telemetryContent: this.telemetryContent\r\n })\r\n : undefined,\r\n autosuggestProduct:\r\n searchText &&\r\n searchText.length > 0 &&\r\n (isLoadingAutoSuggest || (productSuggestions && ArrayExtensions.hasElements(productSuggestions)))\r\n ? ProductSuggestionsComponent({\r\n searchProductSuggestClass,\r\n searchPageURL,\r\n searchQsp,\r\n hitPrefix: this.hitPrefix,\r\n hitSuffix: this.hitSuffix,\r\n autoSuggestProps: this.props,\r\n searchText,\r\n suggestions: productSuggestions,\r\n telemetry: this.props.telemetry,\r\n moduleType: this.props.typeName,\r\n moduleId: this.props.id,\r\n telemetryContent: this.telemetryContent,\r\n resources: this.props.resources,\r\n activePrices: this.state.activePrices,\r\n cart: this.props.data.cart.result\r\n })\r\n : undefined,\r\n autosuggestCategory:\r\n searchText &&\r\n searchText.length > 0 &&\r\n (isLoadingAutoSuggest || (categorySuggestions && ArrayExtensions.hasElements(categorySuggestions)))\r\n ? CategorySuggestionsComponent({\r\n searchCategorySuggestClass,\r\n searchPageURL,\r\n searchQsp,\r\n hitPrefix: this.hitPrefix,\r\n hitSuffix: this.hitSuffix,\r\n autoSuggestProps: this.props,\r\n searchText,\r\n suggestions: categorySuggestions,\r\n searchRefiners,\r\n telemetryContent: this.telemetryContent,\r\n shouldShowFullPath: shouldShowFullCategoryPath,\r\n searchTermCompleted: this.state.searchTermCompleted,\r\n categorySuggestionProductCount: this.props.resources.categorySuggestionProductCount,\r\n categorySuggestionProductCountPlural: this.props.resources.categorySuggestionProductCountPlural,\r\n categorySuggestionJoinerText: this.props.resources.categorySuggestionJoinerText\r\n })\r\n : undefined,\r\n callbacks: {\r\n handleCancelSearchChange: this._handleCancelSearchChange,\r\n handleCancelSearchFocused: this._handleCancelSearchFocused\r\n },\r\n isSearchFormExpanded: this.state.isSearchFormExpanded,\r\n isLoadingAutoSuggest,\r\n isLoadingNode: this._isLoadingNode(),\r\n searchTermCompleted: this.state.searchTermCompleted\r\n };\r\n\r\n return this.props.renderView(viewProps) as React.ReactElement;\r\n }\r\n\r\n private _initSuggestionTypes() {\r\n const suggestionTypes = this.props.config.suggestionTypeCriterion;\r\n\r\n const suggestions = ArrayExtensions.unique(ArrayExtensions.validValues(suggestionTypes));\r\n if (!ArrayExtensions.hasElements(suggestions)) {\r\n this.inputSuggestionType = [\r\n { SuggestionType: SuggestionTypeCriterionSuggestionType.keyword },\r\n { SuggestionType: SuggestionTypeCriterionSuggestionType.product },\r\n { SuggestionType: SuggestionTypeCriterionSuggestionType.scopedCategory }\r\n ];\r\n return;\r\n }\r\n\r\n const validSuggestions = suggestions.filter(suggestion => suggestion.SuggestionType);\r\n if (ArrayExtensions.hasElements(validSuggestions)) {\r\n this.inputSuggestionType = validSuggestions;\r\n return;\r\n }\r\n\r\n this.inputSuggestionType = [];\r\n }\r\n\r\n /**\r\n * Function to create the ReactNode for loading Autosuggest result.\r\n * @returns ReachNode for loading Autosuggest result.\r\n */\r\n private readonly _isLoadingNode = (): React.ReactNode => {\r\n const loadingText = this.props.resources.autoSuggestResultLoadingMessage;\r\n return ;\r\n };\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private readonly _focusOutTarget = (e: any): void => {\r\n const { suggestions } = this.state;\r\n\r\n if (suggestions && suggestions.AllSearchResults && e.target.closest('.ms-search') === null) {\r\n this._clearAutoSuggestState();\r\n }\r\n };\r\n\r\n private readonly _keyup = (e: KeyboardEvent): void => {\r\n const { suggestions } = this.state;\r\n\r\n if (suggestions && suggestions.AllSearchResults && e.keyCode === KeyCodes.Escape) {\r\n this._clearAutoSuggestState();\r\n } else if (this.state.isSearchFormExpanded && e.keyCode === KeyCodes.Escape) {\r\n if (this.state.isSearchFormExpanded) {\r\n this.setState({ isSearchFormExpanded: false });\r\n }\r\n }\r\n\r\n if (\r\n !(\r\n (this.formReference.current && this.formReference.current.contains((e.target as unknown) as Node)) ||\r\n (this.autoSuggestResultDiv.current && this.autoSuggestResultDiv.current.contains((e.target as unknown) as Node))\r\n )\r\n ) {\r\n if (suggestions && suggestions.AllSearchResults) {\r\n this._clearAutoSuggestState();\r\n }\r\n\r\n if (this.state.isSearchFormExpanded) {\r\n this.setState({ isSearchFormExpanded: false });\r\n }\r\n }\r\n };\r\n\r\n private readonly _clearAutoSuggestState = (): void => {\r\n const {\r\n context: { actionContext },\r\n data: { searchState }\r\n } = this.props;\r\n\r\n if (this.searchTextInput.current && this.searchTextInput.current.value.length > 0) {\r\n searchState.searchText = '';\r\n searchState.defaultBasicSearchUrl = '';\r\n searchState.searchQueryStringParameter = '';\r\n actionContext ? actionContext.update(createSearchStateInput(searchState), searchState) : null;\r\n this.searchTextInput.current.value = '';\r\n }\r\n\r\n this.setState({ searchText: '', suggestions: undefined, searchRefiners: undefined, searchTermCompleted: '' });\r\n };\r\n\r\n private async _getActivePrices() {\r\n const { context } = this.props;\r\n const missingPrices = this.state.suggestions?.AllSearchResults?.filter(x => x.SuggestionType === 'Product' && !this.state.activePrices[x.Id!]);\r\n const projectDomain: ProjectionDomain = { ChannelId: +context.request.apiSettings.channelId, CatalogId: context.request.apiSettings.catalogId };\r\n\r\n if (!missingPrices || missingPrices.length === 0) {\r\n return;\r\n }\r\n\r\n const prices = await getActivePricesAsync({ callerContext: context.actionContext },\r\n projectDomain,\r\n missingPrices.map(x => +x.Id!),\r\n new Date(),\r\n null,\r\n undefined,\r\n true);\r\n\r\n const newActivePrices = { ...this.state.activePrices };\r\n prices.forEach(x => {\r\n if (x.ProductId && x.CustomerContextualPrice) {\r\n newActivePrices[x.ProductId.toString()] = x.CustomerContextualPrice;\r\n }\r\n });\r\n\r\n this.setState({ activePrices: newActivePrices });\r\n }\r\n\r\n private async _getSearchSuggestions(loadSuggestionsRequestId: string, query: string) {\r\n try {\r\n const searchSuggestions = await getSearchSuggestionsAction(\r\n new AutoSuggestInput(query, this.topResultsCount, this._getSuggestionType(), this.hitPrefix, this.hitSuffix),\r\n this.props.context.actionContext\r\n );\r\n if (loadSuggestionsRequestId !== this.loadSuggestionsRequestId) {\r\n return undefined;\r\n }\r\n return searchSuggestions;\r\n } catch (error) {\r\n if (loadSuggestionsRequestId !== this.loadSuggestionsRequestId) {\r\n return undefined;\r\n }\r\n this.setState({ suggestions: undefined, searchRefiners: undefined, autoSuggestAriaLabel: this._setAutoSuggestResultCount() });\r\n this.props.telemetry.exception(error);\r\n this.props.telemetry.debug('Unable to get auto suggest results');\r\n return undefined;\r\n }\r\n }\r\n\r\n private async _updateSearchRefiners(loadSuggestionsRequestId: string, query: string, suggestions: Autosuggestions | undefined) {\r\n try {\r\n const refiners = await this._getSearchRefiners(query);\r\n if (loadSuggestionsRequestId !== this.loadSuggestionsRequestId) {\r\n return;\r\n }\r\n this.setState({\r\n suggestions,\r\n searchRefiners: refiners,\r\n autoSuggestAriaLabel: this._setAutoSuggestResultCount(suggestions),\r\n isLoadingAutoSuggest: false,\r\n searchTermCompleted: query\r\n });\r\n } catch (error) {\r\n if (loadSuggestionsRequestId !== this.loadSuggestionsRequestId) {\r\n return;\r\n }\r\n this.setState({ suggestions, searchRefiners: undefined, autoSuggestAriaLabel: this._setAutoSuggestResultCount(suggestions) });\r\n this.props.telemetry.exception(error);\r\n this.props.telemetry.debug('Unable to get refiners results');\r\n }\r\n }\r\n\r\n private _loadSuggestions(query: string) {\r\n this.cancellabelDebounce = debounce(async () => {\r\n this.setState({ isLoadingAutoSuggest: true });\r\n const loadSuggestionsRequestId = Random.Guid.generateGuid();\r\n this.loadSuggestionsRequestId = loadSuggestionsRequestId;\r\n const searchSuggestions = await this._getSearchSuggestions(loadSuggestionsRequestId, query);\r\n await this._updateSearchRefiners(loadSuggestionsRequestId, query, searchSuggestions);\r\n }, this.waitTime);\r\n\r\n setTimeout(() => {\r\n this.cancellabelDebounce();\r\n }, 0);\r\n }\r\n\r\n private readonly _handleInputChange = (query: string): void => {\r\n if (!query || query.length <= this.maxChars) {\r\n this.setState({ searchText: query });\r\n }\r\n\r\n if (this.cancellabelDebounce) {\r\n this.cancellabelDebounce.cancel();\r\n }\r\n\r\n const {\r\n context,\r\n data: { searchState }\r\n } = this.props;\r\n\r\n if (context) {\r\n if (query && query.length > 0) {\r\n if (query.length > this.maxChars) {\r\n return;\r\n }\r\n\r\n if (ArrayExtensions.hasElements(this.inputSuggestionType)) {\r\n this._loadSuggestions(query);\r\n }\r\n\r\n searchState.searchText = query;\r\n } else {\r\n this.setState({ suggestions: undefined, searchRefiners: undefined });\r\n searchState.searchText = '';\r\n }\r\n context.actionContext.update(createSearchStateInput(searchState), searchState);\r\n }\r\n };\r\n\r\n private _getSuggestionType(): string {\r\n const distinctSuggestionTypes: string[] = this.inputSuggestionType.map(\r\n suggestionTypeItem => suggestionTypeItem.SuggestionType!.charAt(0).toUpperCase() + suggestionTypeItem.SuggestionType!.slice(1)\r\n );\r\n return distinctSuggestionTypes.join(',');\r\n }\r\n\r\n private async _getSearchRefiners(searchText: string): Promise {\r\n const { actionContext: ctx } = this.props.context;\r\n const catalogId = getCatalogId(ctx.requestContext);\r\n validateCatalogId(catalogId);\r\n return ProductsDataActions.getProductSearchRefinersAsync(\r\n { callerContext: ctx },\r\n {\r\n SearchCondition: searchText,\r\n Context: {\r\n ChannelId: +ctx.requestContext.apiSettings.channelId,\r\n CatalogId: catalogId\r\n }\r\n }\r\n );\r\n }\r\n\r\n private readonly _handleSubmit = (\r\n e: React.MouseEvent | React.KeyboardEvent | React.FormEvent\r\n ): void => {\r\n const {\r\n config: { disableSubmitSearch },\r\n context: {\r\n actionContext,\r\n app: {\r\n config: { searchQueryStringParameter }\r\n }\r\n }\r\n } = this.props;\r\n\r\n const query = this.searchTextInput.current && this.searchTextInput.current.value;\r\n e.preventDefault();\r\n\r\n if (!query || (query && query.length === 0) || disableSubmitSearch) {\r\n this.searchTextInput && this.searchTextInput.current && this.searchTextInput.current.focus();\r\n } else {\r\n const searchQsp = searchQueryStringParameter || 'q';\r\n const searchURL = this._appendQueryParams(getUrlSync('search', actionContext) || '', query, searchQsp);\r\n document.location.href = searchURL;\r\n }\r\n };\r\n\r\n private readonly _handleCancelSearchChange = (): void => {\r\n const { isSearchFormExpanded, suggestions } = this.state;\r\n\r\n if (!isSearchFormExpanded) {\r\n this.setState({\r\n isSearchFormExpanded: true,\r\n searchText: '',\r\n isInitialState: false,\r\n searchTermCompleted: ''\r\n });\r\n } else {\r\n if (suggestions && suggestions.AllSearchResults) {\r\n this._clearAutoSuggestState();\r\n }\r\n this.setState({ isSearchFormExpanded: false });\r\n }\r\n };\r\n\r\n private readonly _handleCancelSearchFocused = (): void => {\r\n const { suggestions } = this.state;\r\n if (!(suggestions && suggestions.AllSearchResults)) {\r\n this._clearAutoSuggestState();\r\n this.setState({ isSearchFormExpanded: false });\r\n }\r\n };\r\n\r\n private readonly _appendQueryParams = (route: string, query: string, qsp: string): string => {\r\n if (!MsDyn365.isBrowser) {\r\n return '';\r\n }\r\n\r\n const queryUrl = new URL(route, window.location.href);\r\n if (qsp && query) {\r\n queryUrl.searchParams.set(qsp, query);\r\n }\r\n\r\n return queryUrl.href;\r\n };\r\n\r\n private readonly _setAutoSuggestResultCount = (result?: Autosuggestions) => {\r\n if (this.autoSuggestResultScreenReaderDiv.current !== null) {\r\n const ariaLiveRegion = this.autoSuggestResultScreenReaderDiv.current;\r\n const suggestResultString = this.props.resources.autoSuggestFoundMessage;\r\n const emptyResultString = this.props.resources.noAutoSuggestionMessage;\r\n ariaLiveRegion.innerText =\r\n result && result.AllSearchResults && result.AllSearchResults.length > 0 ? suggestResultString : emptyResultString;\r\n ariaLiveRegion.setAttribute('aria-live', 'assertive');\r\n return ariaLiveRegion.innerText;\r\n }\r\n return '';\r\n };\r\n}\r\n\r\nexport default Search;\r\n","import * as React from 'react';\r\nimport { ISearchViewProps } from '../dlvry-search';\r\nimport { ISearchFormViewProps } from './dlvry-search.form';\r\n\r\ntype BlackoutOverlayResult = [ boolean, React.CSSProperties, React.Dispatch> ];\r\n\r\nexport const useBlackoutOverlay = (\r\n searchProps: ISearchViewProps,\r\n searchDivRef: React.MutableRefObject,\r\n isMobilePort: boolean,\r\n isSearchText: boolean\r\n): BlackoutOverlayResult => {\r\n const [popupPosition, setPopupPosition] = React.useState({});\r\n const [isInputFocused, setIsInputFocused] = React.useState(false);\r\n\r\n const searchInputRef = ((searchProps.form as ISearchFormViewProps).input as any).ref as React.RefObject;\r\n\r\n const updatePopupPosition = React.useCallback((searchPos: DOMRect, widthOffset: number) => {\r\n setPopupPosition({\r\n top: searchPos.bottom - 2,\r\n left: searchPos.left + 1,\r\n right: 'unset', // bounds.right,\r\n // width: 'unset'\r\n width: searchPos.width + widthOffset\r\n } as React.CSSProperties);\r\n }, [setPopupPosition]);\r\n\r\n React.useEffect(() => {\r\n if (!searchInputRef.current) {\r\n return;\r\n }\r\n\r\n const focus = () => { setIsInputFocused(true); };\r\n const blur = () => { setIsInputFocused(false); };\r\n\r\n searchInputRef.current.addEventListener('focus', focus);\r\n searchInputRef.current.addEventListener('blur', blur);\r\n\r\n return () => {\r\n searchInputRef.current!.removeEventListener('focus', focus);\r\n searchInputRef.current!.removeEventListener('blur', blur);\r\n };\r\n }, [searchInputRef.current]);\r\n\r\n React.useEffect(() => {\r\n // Make sure the search form is expanded when there is text in the input.\r\n // Fixes issue where the search form is collapsed when going from desktop to tablet/mobile view even with text in the input.\r\n if (isInputFocused && !searchProps.searchText && !searchProps.isSearchFormExpanded) {\r\n searchProps.callbacks.handleCancelSearchChange();\r\n }\r\n\r\n // Make sure the search form is collapsed when there is no text in the input.\r\n // Fixes issue where the search form is collapsed when going from desktop to tablet/mobile view even with text in the input.\r\n if (!isInputFocused && !searchProps.searchText && searchProps.isSearchFormExpanded) {\r\n searchProps.callbacks.handleCancelSearchChange();\r\n }\r\n }, [isInputFocused]);\r\n\r\n React.useEffect(() => {\r\n if (!searchDivRef.current) {\r\n return;\r\n }\r\n\r\n const resize = () => {\r\n updatePopupPosition(searchDivRef.current!.getBoundingClientRect(), -1.5);\r\n };\r\n\r\n window.addEventListener('resize', resize);\r\n\r\n return () => {\r\n window.removeEventListener('resize', resize);\r\n };\r\n }, [searchDivRef, searchDivRef.current, setPopupPosition]);\r\n\r\n const shouldShowOverlay = React.useMemo(() =>\r\n isInputFocused || isSearchText || (isMobilePort && searchProps.isSearchFormExpanded),\r\n [isInputFocused, isSearchText, isMobilePort, searchProps.isSearchFormExpanded]\r\n );\r\n\r\n React.useEffect(() => {\r\n if (!shouldShowOverlay) {\r\n return;\r\n }\r\n\r\n document.body.style.position = 'fixed';\r\n document.body.style.top = '0px';\r\n document.body.style.right = '17px';\r\n document.body.style.left = '0px';\r\n document.body.setAttribute('data-popup', 'true');\r\n\r\n updatePopupPosition(searchDivRef.current!.getBoundingClientRect(), -1.5);\r\n\r\n return () => {\r\n document.body.style.position = '';\r\n document.body.style.top = '';\r\n document.body.style.right = '';\r\n document.body.style.left = '';\r\n document.body.removeAttribute('data-popup');\r\n };\r\n }, [shouldShowOverlay, searchDivRef.current]);\r\n\r\n return [ shouldShowOverlay, popupPosition, setIsInputFocused ];\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 { INodeProps, Module, Node, isMobile, VariantType } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { ISearchCategoryViewProps, ISearchFormViewProps, ISearchKeywordViewProps, ISearchProductViewProps } from './components';\r\nimport { ISearchViewProps } from './dlvry-search';\r\nimport { useBlackoutOverlay } from './components/dlvry-search.hooks';\r\n\r\nconst SearchView: React.FC = props => {\r\n const {\r\n context,\r\n Search,\r\n AutoSuggestAriaLabel,\r\n AutoSuggestAriaLabelText,\r\n searchText,\r\n AutoSuggest,\r\n KeywordSuggest,\r\n ProductSuggest,\r\n CategorySuggest,\r\n UlKeyword,\r\n UlProduct,\r\n UlCategory,\r\n form,\r\n autosuggestCategory,\r\n autosuggestKeyword,\r\n autosuggestProduct,\r\n SearchForm,\r\n FormWrapper,\r\n label,\r\n isLoadingAutoSuggest,\r\n isLoadingNode,\r\n isSearchFormExpanded,\r\n searchTermCompleted,\r\n callbacks: { handleCancelSearchFocused }\r\n } = props;\r\n\r\n const [isMobilePort, setIsMobile] = React.useState(false);\r\n const overlayDivRef = React.useRef(null);\r\n const searchDivRef = React.useRef(null);\r\n const [\r\n shouldShowOverlay,\r\n popupPosition,\r\n setIsInputFocused\r\n ] = useBlackoutOverlay(props, searchDivRef, isMobilePort, Boolean(searchText));\r\n\r\n React.useEffect(() => {\r\n const onResize = () => {\r\n const isMobileView = isMobile({ variant: VariantType.Browser, context: context.request }) === 'xs';\r\n setIsMobile(isMobileView);\r\n };\r\n onResize(); // Call to set initial value\r\n\r\n window.addEventListener('resize', onResize);\r\n return () => {\r\n window.removeEventListener('resize', onResize);\r\n };\r\n }, [context]);\r\n\r\n const viewport = isMobile({ variant: VariantType.Browser, context: context.request });\r\n const isMobileView = viewport === 'sm' || viewport === 'xs';\r\n\r\n return (\r\n <>\r\n \r\n {label}\r\n {_renderForm(form as ISearchFormViewProps, SearchForm, FormWrapper, isMobilePort, searchText, searchTermCompleted)}\r\n\r\n {isMobileView && (\r\n \r\n {searchText && searchText.length > 0 ? {AutoSuggestAriaLabelText} : ''}\r\n\r\n {isLoadingAutoSuggest || searchTermCompleted ? (\r\n \r\n {_renderKeywordSuggestions(KeywordSuggest, UlKeyword, autosuggestKeyword, isLoadingAutoSuggest, isLoadingNode)}\r\n {_renderCategorySuggestions(CategorySuggest, UlCategory, autosuggestCategory, isLoadingAutoSuggest, isLoadingNode)}\r\n {_renderProductSuggestions(ProductSuggest, UlProduct, autosuggestProduct, isLoadingAutoSuggest, isLoadingNode)}\r\n \r\n ) : null}\r\n \r\n )}\r\n {!isMobileView && (AutoSuggest.className.includes('show') || isSearchFormExpanded) && (\r\n \r\n {searchText && searchText.length > 0 ? {AutoSuggestAriaLabelText} : ''}\r\n\r\n {searchTermCompleted && (\r\n \r\n {_renderKeywordSuggestions(KeywordSuggest, UlKeyword, autosuggestKeyword, isLoadingAutoSuggest, isLoadingNode)}\r\n {_renderCategorySuggestions(CategorySuggest, UlCategory, autosuggestCategory, isLoadingAutoSuggest, isLoadingNode)}\r\n {_renderProductSuggestions(ProductSuggest, UlProduct, autosuggestProduct, isLoadingAutoSuggest, isLoadingNode)}\r\n \r\n )}\r\n \r\n )}\r\n \r\n {shouldShowOverlay && (\r\n
    {\r\n if (event.target === overlayDivRef.current) {\r\n setIsInputFocused(false);\r\n handleCancelSearchFocused?.();\r\n }\r\n }} />\r\n )}\r\n \r\n );\r\n};\r\n\r\nconst _renderForm = (\r\n form: ISearchFormViewProps,\r\n SearchForm: INodeProps,\r\n FormWrapper: INodeProps,\r\n isMobilePort: boolean,\r\n searchText: string | undefined,\r\n searchTermCompleted: string | undefined\r\n) => {\r\n return (\r\n \r\n \r\n {isMobilePort ? (\r\n <>\r\n {form.input}\r\n {form.cancelBtn}\r\n \r\n ) : (\r\n <>\r\n {!searchText && form.submitBtn}\r\n {form.input}\r\n {searchText && form.cancelBtn}\r\n {searchText && form.submitBtn}\r\n \r\n )}\r\n \r\n \r\n );\r\n};\r\n\r\nconst _renderKeywordSuggestions = (\r\n KeywordSuggest: INodeProps,\r\n UlKeyword: INodeProps,\r\n keywordSuggestions?: ISearchKeywordViewProps,\r\n isLoadingAutoSuggest?: boolean,\r\n isLoadingNode?: React.ReactNode\r\n) => {\r\n return (\r\n keywordSuggestions && (\r\n \r\n \r\n {/* {isLoadingAutoSuggest && isLoadingNode} */}\r\n {!isLoadingAutoSuggest &&\r\n keywordSuggestions.text.map(text => {\r\n return text;\r\n })}\r\n \r\n \r\n )\r\n );\r\n};\r\n\r\nconst _renderProductSuggestions = (\r\n ProductSuggest: INodeProps,\r\n UlProduct: INodeProps,\r\n productSuggestions?: ISearchProductViewProps,\r\n isLoadingAutoSuggest?: boolean,\r\n isLoadingNode?: React.ReactNode\r\n) => {\r\n return (\r\n productSuggestions && (\r\n \r\n \r\n {productSuggestions.title}\r\n {isLoadingAutoSuggest && isLoadingNode}\r\n {!isLoadingAutoSuggest &&\r\n productSuggestions.items.map((item, index) => {\r\n return (\r\n \r\n \r\n {item.thumbnail}\r\n
    \r\n {item.text}\r\n
    \r\n {item.price}\r\n {item.cartCount}\r\n
    \r\n
    \r\n
    \r\n
    \r\n );\r\n })}\r\n
    \r\n
    \r\n )\r\n );\r\n};\r\n\r\nconst _renderCategorySuggestions = (\r\n CategorySuggest: INodeProps,\r\n UlCategory: INodeProps,\r\n categorySuggestions?: ISearchCategoryViewProps,\r\n isLoadingAutoSuggest?: boolean,\r\n isLoadingNode?: React.ReactNode\r\n) => {\r\n return (\r\n categorySuggestions && (\r\n \r\n \r\n {categorySuggestions.title}\r\n {isLoadingAutoSuggest && isLoadingNode}\r\n {!isLoadingAutoSuggest &&\r\n categorySuggestions.text.map(text => {\r\n return text;\r\n })}\r\n \r\n \r\n )\r\n );\r\n};\r\n\r\nexport default SearchView;\r\n","export function formatString(template: string, ...values: any[]): string {\r\n if (!template) {\r\n return '';\r\n }\r\n return template.replace(/{(\\d+)}/g, (match, index) => {\r\n const valueIndex = parseInt(index, 10);\r\n return values[valueIndex] !== undefined ? values[valueIndex] : match;\r\n });\r\n}\r\n","const binding = { modules: {}, dataActions: {} };\n\n const registerActionId = (actionPath) => {\n if (binding.dataActions[actionPath] &&\n binding.dataActions[actionPath].default &&\n binding.dataActions[actionPath].default.prototype &&\n binding.dataActions[actionPath].default.prototype.id) {\n binding.dataActions[binding.dataActions[actionPath].default.prototype.id] = binding.dataActions[actionPath];\n } else {\n Object.keys(binding.dataActions[actionPath] || {}).forEach(exportName => {\n if (binding.dataActions[actionPath][exportName] &&\n binding.dataActions[actionPath][exportName].prototype &&\n binding.dataActions[actionPath][exportName].prototype.Action) {\n binding.dataActions[binding.dataActions[actionPath][exportName].prototype.id] = binding.dataActions[actionPath][exportName];\n }\n })\n }\n };\n\n const registerSanitizedActionPath = (sanitizedActionPath, dataAction) => {\n if (process.env.NODE_ENV === 'development') {\n if (!dataAction.default) {\n throw new Error('Data action path does not have a default export');\n }\n if (!(dataAction.default.prototype.id && binding.dataActions[dataAction.default.prototype.id]) || !binding.dataActions[sanitizedActionPath]) {\n binding.dataActions[sanitizedActionPath] = dataAction;\n }\n } else {\n binding.dataActions[sanitizedActionPath] = dataAction;\n if (!binding.dataActions[sanitizedActionPath].default) {\n throw new Error('Data action path ' + sanitizedActionPath + ' does not have a default export');\n }\n binding.dataActions[sanitizedActionPath].default.prototype.RegistrationId = sanitizedActionPath;\n if (binding.dataActions[sanitizedActionPath].default.prototype.id) {\n binding.dataActions[binding.dataActions[sanitizedActionPath].default.prototype.id] = sanitizedActionPath;\n }\n }\n };\n \n\n (binding.modules['dlvry-search'] = {\n c: () => require('partner/modules/dlvry-search/dlvry-search.tsx'),\n $type: 'contentModule',\n da: [{name:'cart', path:'@msdyn365-commerce/global-state/dist/lib/data-actions/cart-state-data-action', runOn: 0},{name:'searchState', path:'@msdyn365-commerce-modules/search-utilities/dist/lib/search-state-data-action', runOn: 1}],\n \n iNM: false,\n ns: '__local__',\n n: 'dlvry-search',\n p: '__local__',\n \n pdp: '',\n \n \n md: 'src/modules/dlvry-search'\n });\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/search-utilities/dist/lib/search-state-data-action';\n let dataAction = require('@msdyn365-commerce-modules/search-utilities/dist/lib/search-state-data-action');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce/global-state/dist/lib/data-actions/cart-state-data-action';\n let dataAction = require('@msdyn365-commerce/global-state/dist/lib/data-actions/cart-state-data-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|dlvry-search|dlvry-search'] = {\n c: () => require('partner/modules/dlvry-search/dlvry-search.view.tsx'),\n cn: '__local__-__local__-dlvry-search'\n };\nwindow.__bindings__ = window.__bindings__ || {};\nwindow.__bindings__.viewDictionary = {\n ...window.__bindings__.viewDictionary || {},\n ...viewDictionary\n };","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { observable } from 'mobx';\n\n/**\n * State information related to what is needed to succesfully perform a autosuggest.\n */\nexport class SearchState {\n @observable public searchText?: string;\n\n @observable public defaultBasicSearchUrl?: string;\n\n @observable public searchQueryStringParameter?: string;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { createObservableDataAction, IAction, IActionInput, IAny, ICreateActionContext, IGeneric } from '@msdyn365-commerce/core';\nimport { GenericInput, getGenericAction } from '@msdyn365-commerce-modules/retail-actions';\n\nimport { SearchState } from './search-state';\n\nexport function createSearchStateInput(result: SearchState): GenericInput {\n return new GenericInput('searchState', result, 'SearchState');\n}\n\nconst createsearchStateInputInternal = (inputData: ICreateActionContext>): IActionInput => {\n return createSearchStateInput({ searchText: '' });\n};\n\nexport const getGenericActionDataAction = createObservableDataAction({\n action: >getGenericAction,\n input: createsearchStateInputInternal\n});\n\nexport default getGenericActionDataAction;\n","module.exports = React;","module.exports = ReactDOM;"],"names":["GetOrganizationCustomerInput","constructor","apiSettings","user","getDataServiceRequest","this","query","createDataServiceRequestForOperation","Entities","bypassCache","returnEntity","shouldCacheOutput","getCacheKey","getCacheObjectType","dataCacheType","DataServiceQuery","getOrganizationCustomerAction","async","input","ctx","requestContext","isAuthenticated","callActionOrExecute","getOrganizationCustomer","createObservableDataAction","id","action","inputData","_user$customerAccount","customerAccountNumber","AlcoholGroupAttributeId","isGodmodeEnabled","context","_context$requestConte","godmode","url","requestUrl","searchParams","get","toLowerCase","shouldFilterAlcohol","_context$requestConte2","_context$requestConte3","doAlcoholFiltering","alcoholRefinerRecordId","Number","app","config","isNaN","getAlcoholRefiners","_context$requestConte4","alcoholGroupAttributeId","result","alcoholRefiner","DataTypeValue","LeftValueBoundString","RefinerRecordId","RefinerSourceValue","RightValueBoundString","UnitText","push","alcoholLicenseValue","_customer$Attributes","customer","alcoholLicense","Attributes","find","x","RecordId","AttributeValue","StringValue","console","warn","Array","fill","forEach","_","index","_objectSpread","toString","error","addAlcoholRefiner","searchCriteriaInput","_context$requestConte5","Refinement","some","filter","refiners","concat","Promise","resolve","addOrUpdateZeroPriceRefiner","priceRefiner","_context$requestConte6","Count","ExtensionProperties","RowNumber","channel","Currency","getAttributeRefiners","customerAttributes","attributeRecordId","friendlyName","refiner","attributeValue","_customerAttributes$f","attribute","getForsvaretRefiner","_context$requestConte7","forsvaretAttributeId","forsvaretAttributeRecordId","_customerAttributes$f2","IntegerValue","AttributeDataType","Integer","ProductRefinerSource","Attribute","addAttributeRefiner","addAllAttributeRefiners","_context$requestConte8","_context$requestConte9","_context$requestConte10","_context$requestConte11","_context$requestConte12","_context$requestConte13","attributeRecordIds","tobaccoRefinerRecordId","cocacolaRefinerRecordId","bamaRefinerRecordId","dutyFreeSugarRefinerRecordId","norturaRefinerRecordId","transitRefiner","transitRefinerRecordId","addAttributeRefinerKeepExisting","forsvaretRefiner","getAllAttributeRefiners","_context$requestConte14","_context$requestConte15","_context$requestConte16","_context$requestConte17","_context$requestConte18","_context$requestConte19","SuggestionType","AutoSuggestInput","searchText","top","suggestionType","hitPrefix","hitSuffix","searchQuery","topResultsCount","_getAutoSuggest","autosuggest","_searchCriteria$Produ","catalogId","getCatalogId","searchCriteria","ProductSearchCriteria","SearchCondition","length","Context","ChannelId","channelId","CatalogId","HitPrefix","HitSuffix","searchSuggestions","getSearchSuggestionsAsync","callerContext","queryResultSettings","Paging","Top","map","item","_item$Value","ImageUrl","generateImageUrl","Value3","Value","DecimalValue","undefined","AllSearchResults","telemetry","Error","autoSuggestPromises","all","then","payLoad","CategorySuggestionsComponent","props","suggestions","autoSuggestProps","resources","categorySuggestionHeading","reactNodes","getPayloadObject","telemetryContent","_assembleNode","_renderTitle","title","text","categoryAutoSuggestionHeading","format","React","className","_props$searchTermComp","_props$searchTermComp2","_item$Value2","shouldShowFullPath","splitValue","split","pop","ariaLabel","replace","RegExp","fullText","searchTermCompleted","toUpperCase","categorySuggestionJoinerText","contentAction","etext","getTelemetryAttributes","productCountLabel","categorySuggestionProductCount","categorySuggestionProductCountPlural","key","Id","Object","assign","href","_generateLink","_getHighlightedText","formatString","suggestion","_getCategoryLink","_categoryRefiners$Val","searchPageURL","searchQsp","searchRefiners","MsDyn365","isBrowser","queryUrl","URL","window","location","set","categoryRefiners","SourceValue","Category","Values","parseInt","encodedRefiner","JSON","stringify","compressRefiners","formattedText","dangerouslySetInnerHTML","getRichTextHtml","compressedRefinerKeys","compressedRefiners","compressedRefiner","refinerKey","FormComponent","searchPlaceholder","hideSearchLabel","searchTextInput","handleInputChange","maxChars","disableSubmitSearch","handleCancelSearchChange","ariaLabelCancel","ariaLabelSearch","ariaLabelSubmit","onInputChange","event","target","value","onInputChangeFunction","inputNode","classnames","Boolean","type","name","placeholder","ref","onChange","maxLength","submitBtnNode","Button","cancelBtn","onClick","submitBtn","KeywordSuggestionsComponent","splice","slice","formattedLink","LabelComponent","searchLabelClass","searchLabelArialLabel","isSearchFormExpanded","searchtext","searchCollapsedLabel","attributes","innerRef","_cart$cart$CartLines","cart","productId","inCartTooltipText","showCartCountTooltip","setShowCartCountTooltip","cartQuantity","CartLines","ProductId","reduce","acc","val","Quantity","cartCountId","tooltipString","tooltipText","onMouseOver","onMouseOut","onTouchStart","Tooltip","isOpen","ProductSuggestionsComponent","actionContext","productSuggestionHeading","moduleType","moduleId","items","productAutoSuggestionHeading","altText","price","activePrices","thumbnail","_renderThumbnail","_renderPrice","cartCount","_renderCartCount","LiProduct","_getLiWrapper","AProduct","_getAWrapper","tag","recid","cultureFormatter","formatCurrency","getProductPageUrlSync","_props$resources","PriceComponent","typeName","data","CustomerContextualPrice","freePriceText","itemId","_props$resources2","CartCount","request","gridSettings","imageSettings","cropFocalRegion","defaultImageSettings","viewports","lg","q","w","h","md","sm","xl","xs","lazyload","Image","src","loadFailureBehavior","SuggestionTypeCriterionSuggestionType","Search","super","waitTime","_isLoadingNode","loadingText","autoSuggestResultLoadingMessage","Spinner","label","size","SpinnerSize","medium","labelPosition","_focusOutTarget","e","state","closest","_clearAutoSuggestState","_keyup","keyCode","KeyCodes","Escape","setState","formReference","current","contains","autoSuggestResultDiv","searchState","defaultBasicSearchUrl","searchQueryStringParameter","update","createSearchStateInput","_handleInputChange","cancellabelDebounce","cancel","ArrayExtensions","hasElements","inputSuggestionType","_loadSuggestions","_handleSubmit","preventDefault","focus","searchURL","_appendQueryParams","getUrlSync","document","_handleCancelSearchChange","isInitialState","_handleCancelSearchFocused","route","qsp","_setAutoSuggestResultCount","autoSuggestResultScreenReaderDiv","ariaLiveRegion","suggestResultString","autoSuggestFoundMessage","emptyResultString","noAutoSuggestionMessage","innerText","setAttribute","searchKeywordSuggestClass","searchProductSuggestClass","searchCategorySuggestClass","autoSuggestAriaLabel","isLoadingAutoSuggest","searchInputMaxLength","searchFormClass","getTelemetryObject","telemetryPageName","_initSuggestionTypes","body","addEventListener","componentWillUnmount","removeEventListener","componentDidUpdate","params","isEditor","_getActivePrices","shouldComponentUpdate","nextProps","nextState","render","_suggestions$AllSearc","_suggestions$AllSearc2","_suggestions$AllSearc3","cancelBtnAriaLabel","searchBtnAriaLabel","submitBtnAriaLabel","searchplaceholderText","shouldShowFullCategoryPath","keywordSuggestions","Keyword","None","productSuggestions","Product","categorySuggestions","_item$RefinerRecordId","ObjectExtensions","isNullOrUndefined","viewProps","moduleProps","AutoSuggestAriaLabel","AutoSuggestAriaLabelText","AutoSuggest","show","hide","KeywordSuggest","ProductSuggest","CategorySuggest","SearchForm","FormWrapper","role","autoComplete","onSubmit","UlKeyword","UlProduct","UlCategory","form","autosuggestKeyword","autosuggestProduct","autosuggestCategory","callbacks","handleCancelSearchFocused","isLoadingNode","renderView","suggestionTypes","suggestionTypeCriterion","unique","validValues","keyword","product","scopedCategory","validSuggestions","_this$state$suggestio","missingPrices","projectDomain","prices","getActivePricesAsync","Date","newActivePrices","loadSuggestionsRequestId","getSearchSuggestionsAction","_getSuggestionType","exception","debug","_getSearchRefiners","_debounce","Random","Guid","generateGuid","_getSearchSuggestions","_updateSearchRefiners","setTimeout","suggestionTypeItem","charAt","join","validateCatalogId","ProductsDataActions","_renderForm","isMobilePort","Node","_renderKeywordSuggestions","_renderProductSuggestions","_renderCategorySuggestions","setIsMobile","overlayDivRef","searchDivRef","shouldShowOverlay","popupPosition","setIsInputFocused","useBlackoutOverlay","searchProps","isSearchText","setPopupPosition","isInputFocused","searchInputRef","updatePopupPosition","searchPos","widthOffset","bottom","left","right","width","blur","resize","getBoundingClientRect","style","position","removeAttribute","onResize","isMobileView","isMobile","variant","VariantType","Browser","viewport","Module","includes","template","_len","arguments","values","_key","match","valueIndex","binding","modules","dataActions","registerSanitizedActionPath","sanitizedActionPath","dataAction","default","prototype","RegistrationId","c","require","$type","da","path","runOn","iNM","ns","n","p","pdp","__bindings__","viewDictionary","cn","SearchState","__decorate","observable","GenericInput","getGenericActionDataAction","getGenericAction","module","exports","ReactDOM"],"sourceRoot":""}