{"version":3,"file":"static/js/f612c919eecd672a3b20.bundle.js","mappings":"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","sources":["webpack://henrys-ecommerce/./src/search-state.ts?dd10","webpack://henrys-ecommerce/./src/modules/search/actions/get-auto-suggest-suggestions.ts?832b","webpack://henrys-ecommerce/./src/modules/search/components/search.categorysuggest.tsx?9371","webpack://henrys-ecommerce/./src/modules/search/components/search.form.tsx?6310","webpack://henrys-ecommerce/./src/modules/search/components/search.keywordsuggest.tsx?20bc","webpack://henrys-ecommerce/./src/modules/search/components/search.label.tsx?51d1","webpack://henrys-ecommerce/./src/modules/search/components/search.productsuggest.tsx?ebb5","webpack://henrys-ecommerce/./src/modules/search/search.tsx?8bdd","webpack://henrys-ecommerce/./src/modules/search/search.view.tsx?4430","webpack://henrys-ecommerce/./lib/search/module-registration.js?f197","webpack://henrys-ecommerce/./src/search-state-data-action.ts?8223","webpack://henrys-ecommerce/./src/modules/search/search.view.tsx?1505","webpack://henrys-ecommerce/./src/modules/adventureworks/views/components/search.categorysuggest.tsx?6bcf","webpack://henrys-ecommerce/./src/modules/adventureworks/views/components/search.mobile.empty.tsx?ff32","webpack://henrys-ecommerce/./src/modules/adventureworks/views/components/search.form.tsx?d41a","webpack://henrys-ecommerce/./src/modules/adventureworks/views/components/search.keywordsuggest.tsx?2724","webpack://henrys-ecommerce/./src/modules/adventureworks/views/components/search.productsuggest.tsx?6616","webpack://henrys-ecommerce/./src/modules/adventureworks/views/search.view.tsx?bfa7","webpack://henrys-ecommerce/external var \"React\"?0d3b","webpack://henrys-ecommerce/external var \"ReactDOM\"?853b"],"sourcesContent":["/*!\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","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { Autosuggestions } from '@msdyn365-commerce/commerce-entities';\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 { SearchSuggestion, SearchSuggestionCriteria } from '@msdyn365-commerce/retail-proxy';\r\nimport { getSearchSuggestionsAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/StoreOperationsDataActions.g';\r\nimport { generateImageUrl } from '@msdyn365-commerce-modules/retail-actions';\r\n\r\nexport enum SuggestionType {\r\n Category = 'ScopedCategory',\r\n Keyword = 'Keyword',\r\n Product = 'Product',\r\n None = 'None'\r\n}\r\n\r\n/**\r\n * Input class for auto suggest search input.\r\n */\r\nexport class AutoSuggestInput implements IActionInput {\r\n public searchQuery?: string;\r\n\r\n public topResultsCount?: number;\r\n\r\n public suggestionType?: string;\r\n\r\n public hitPrefix?: string;\r\n\r\n public hitSuffix?: string;\r\n\r\n constructor(searchText?: string, top?: number, suggestionType?: string, hitPrefix?: string, hitSuffix?: string) {\r\n this.searchQuery = searchText;\r\n this.topResultsCount = top;\r\n this.suggestionType = suggestionType;\r\n this.hitPrefix = hitPrefix;\r\n this.hitSuffix = hitSuffix;\r\n }\r\n\r\n public getCacheKey = () => 'AutoSuggestSearchSuggestions';\r\n\r\n public getCacheObjectType = () => 'AutoSuggestSearchSuggestions';\r\n\r\n public dataCacheType = (): CacheType => 'none';\r\n}\r\n\r\nconst createInput = (inputData: ICreateActionContext) => {\r\n return new AutoSuggestInput();\r\n};\r\n\r\n/**\r\n * Calls the Retail API and returns a auto-suggest suggestions.\r\n * @param input\r\n * @param ctx\r\n */\r\nexport async function getSearchSuggestionsAction(input: AutoSuggestInput, ctx: IActionContext): Promise {\r\n // If no input is provided fail out\r\n if (!input || !input.searchQuery) {\r\n throw new Error('[getSearchSuggestionsAction]No valid Input was provided, failing');\r\n }\r\n\r\n const autosuggest: Autosuggestions = {};\r\n\r\n const autoSuggestPromises = [_getAutoSuggest(input, autosuggest, ctx)];\r\n return Promise.all(autoSuggestPromises).then(() => {\r\n return autosuggest;\r\n });\r\n}\r\n\r\nasync function _getAutoSuggest(input: AutoSuggestInput, autosuggest: Autosuggestions, ctx: IActionContext): Promise {\r\n const searchCriteria: SearchSuggestionCriteria = {\r\n ProductSearchCriteria: {\r\n SearchCondition: input.searchQuery && input.searchQuery.length > 0 ? input.searchQuery : '',\r\n Context: {\r\n ChannelId: +ctx.requestContext.apiSettings.channelId,\r\n CatalogId: +ctx.requestContext.apiSettings.catalogId\r\n }\r\n },\r\n HitPrefix: input.hitPrefix,\r\n HitSuffix: input.hitSuffix,\r\n SuggestionType: input.suggestionType\r\n };\r\n\r\n const searchSuggestions = await getSearchSuggestionsAsync(\r\n { callerContext: ctx, queryResultSettings: { Paging: { Top: input.topResultsCount } } },\r\n searchCriteria\r\n );\r\n\r\n if (searchSuggestions && searchSuggestions.length > 0) {\r\n // Generate image url\r\n searchSuggestions.map(\r\n (item: SearchSuggestion) =>\r\n (item.ImageUrl = item.ImageUrl ? generateImageUrl(item.ImageUrl, ctx.requestContext.apiSettings) : '')\r\n );\r\n\r\n autosuggest.AllSearchResults = searchSuggestions;\r\n } else {\r\n ctx.telemetry.error(\r\n `[getSearchSuggestionsAction] unable to get availabilites for search with suggestion type ${searchCriteria.SuggestionType}`\r\n );\r\n }\r\n}\r\n\r\nexport const getSearchSuggestionsActionDataAction = createObservableDataAction({\r\n id: '@msdyn365-commerce-modules/search/get-auto-suggest-suggestions',\r\n action: >getSearchSuggestionsAction,\r\n input: createInput\r\n});\r\n\r\nexport default getSearchSuggestionsActionDataAction;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport MsDyn365, { getRichTextHtml } from '@msdyn365-commerce/core';\r\nimport { ProductRefiner, ProductRefinerValue, SearchSuggestion } from '@msdyn365-commerce/retail-proxy';\r\nimport { format, getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { ISearchData } from '../search.data';\r\nimport { ISearchProps } from '../search.props.autogenerated';\r\n\r\nexport interface ISearchCategorySuggestProps {\r\n searchCategorySuggestClass: string;\r\n searchPageURL: string;\r\n searchQsp: string | undefined;\r\n hitPrefix: string;\r\n hitSuffix: string;\r\n autoSuggestProps: ISearchProps;\r\n searchText: string;\r\n searchRefiners: ProductRefiner[] | undefined;\r\n suggestions: SearchSuggestion[] | undefined;\r\n telemetryContent?: ITelemetryContent;\r\n}\r\n\r\nexport interface ISearchCategoryViewProps {\r\n title: React.ReactNode;\r\n text: React.ReactNode[];\r\n}\r\n\r\nlet payLoad: IPayLoad;\r\n\r\n/**\r\n * CategorySuggestionsComponent.\r\n * @param props\r\n */\r\nexport const CategorySuggestionsComponent = (props: ISearchCategorySuggestProps): ISearchCategoryViewProps | undefined => {\r\n const {\r\n suggestions,\r\n searchText,\r\n autoSuggestProps: {\r\n resources: { categorySuggestionHeading }\r\n }\r\n } = props;\r\n\r\n if (!suggestions) {\r\n return undefined;\r\n }\r\n\r\n const reactNodes: React.ReactNode[] = [];\r\n payLoad = getPayloadObject('click', props.telemetryContent!, '');\r\n\r\n suggestions.map(item => {\r\n reactNodes.push(_assembleNode(item, props));\r\n });\r\n\r\n const titleNode = _renderTitle(categorySuggestionHeading, searchText);\r\n\r\n return { title: titleNode, text: reactNodes };\r\n};\r\n\r\nconst _renderTitle = (categorySuggestionHeading: string, searchText: string) => {\r\n const categoryAutoSuggestionHeading = categorySuggestionHeading\r\n ? format(categorySuggestionHeading, searchText)\r\n : `Search \"${searchText}\" in categories`;\r\n\r\n return
  • {categoryAutoSuggestionHeading}
  • ;\r\n};\r\n\r\nconst _assembleNode = (item: SearchSuggestion, props: ISearchCategorySuggestProps) => {\r\n const { searchText, hitPrefix, hitSuffix } = props;\r\n\r\n const splitValue = item.Value && item.Value.split('|').pop();\r\n const ariaLabel = splitValue\r\n ? splitValue.replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '')\r\n : item.Value && item.Value.replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\r\n payLoad.contentAction.etext = item.Value;\r\n const attribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\r\n return (\r\n
  • \r\n \r\n {_generateLink(item, searchText, props) && _getHighlightedText(item.Value ? item.Value : '', hitPrefix, hitSuffix)}\r\n \r\n
  • \r\n );\r\n};\r\n\r\nconst _generateLink = (suggestion: SearchSuggestion, searchText: string, props: ISearchCategorySuggestProps): string => {\r\n return suggestion && suggestion.Id ? _getCategoryLink(suggestion.Id, searchText, props) : '';\r\n};\r\n\r\nconst _getCategoryLink = (id: string, searchText: string, props: ISearchCategorySuggestProps): string => {\r\n const { searchPageURL, searchQsp, searchRefiners } = props;\r\n\r\n if (!MsDyn365.isBrowser) {\r\n return '';\r\n }\r\n\r\n const queryUrl = new URL(searchPageURL, window.location.href);\r\n\r\n if (searchQsp && searchText) {\r\n queryUrl.searchParams.set(searchQsp, searchText);\r\n }\r\n\r\n const categoryRefiners = searchRefiners?.find(refiners => {\r\n return refiners.KeyName === 'Category';\r\n });\r\n const refiner = categoryRefiners?.Values?.find(item => {\r\n return item.RefinerRecordId === Number.parseInt(id, 10);\r\n });\r\n\r\n const encodedRefiner = refiner && JSON.stringify(compressRefiners([refiner]));\r\n if (encodedRefiner) {\r\n queryUrl.searchParams.set('refiners', encodedRefiner);\r\n }\r\n\r\n return queryUrl.href;\r\n};\r\n\r\nconst _getHighlightedText = (suggestion: string, hitPrefix: string, hitSuffix: string): JSX.Element => {\r\n let formattedText = suggestion\r\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '')\r\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\r\n formattedText = formattedText.split('|').pop() || '';\r\n\r\n return ;\r\n};\r\n\r\n// TODO: This code is currently duplicated in categoryautosuggest need to either remove one of these files\r\n// or move this code to a common place\r\nconst compressedRefinerKeys = [\r\n 'DataTypeValue',\r\n 'LeftValueBoundString',\r\n 'RefinerRecordId',\r\n 'RefinerSourceValue',\r\n 'RightValueBoundString',\r\n 'UnitText'\r\n];\r\n\r\n/**\r\n * Compressed a list of refiners for use in URLs.\r\n * @param refiners The uncompressed refiners.\r\n */\r\nconst compressRefiners = (refiners: ProductRefinerValue[]) => {\r\n const compressedRefiners: (string | number)[][] = [];\r\n\r\n refiners.forEach(refiner => {\r\n const compressedRefiner: (string | number)[] = [];\r\n compressedRefinerKeys.forEach(refinerKey => {\r\n compressedRefiner.push(refiner[refinerKey]);\r\n });\r\n compressedRefiners.push(compressedRefiner);\r\n });\r\n\r\n return compressedRefiners;\r\n};\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { Button } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nexport interface ISearchFormProps {\r\n autoHideSearchTextBox: boolean | undefined;\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 autoHideSearchTextBox,\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 && \r\n \r\n );\r\n};\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { 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 * as React from 'react';\r\n\r\nimport { ISearchData } from '../search.data';\r\nimport { ISearchProps } from '../search.props.autogenerated';\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: ISearchProps;\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}\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 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 if (!suggestions) {\r\n return undefined;\r\n }\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 return {\r\n text: _getHighlightedText(item.Value ? item.Value : '', hitPrefix, hitSuffix),\r\n thumbnail: _renderThumbnail(item, altText ? altText : '', props),\r\n price:\r\n item.Id &&\r\n item.Value3 &&\r\n item.Value3.Value &&\r\n item.Value3.Value.DecimalValue &&\r\n _renderPrice(item.Value3.Value.DecimalValue, item.Value3.Value.DecimalValue, moduleId, moduleType, 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 = context.cultureFormatter.formatCurrency(item.Value3!.Value!.DecimalValue!);\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 \r\n );\r\n};\r\n\r\nconst _renderPrice = (\r\n adjustedPrice: number,\r\n basePrice: number,\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 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 xs: { q: 'w=40&h=40&m=6', w: 0, h: 0 },\r\n lg: { q: 'w=40&h=40&m=6', w: 0, h: 0 },\r\n xl: { q: 'w=40&h=40&m=6', w: 0, h: 0 }\r\n },\r\n lazyload: true,\r\n cropFocalRegion: true\r\n };\r\n\r\n return (\r\n \r\n );\r\n};\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { Autosuggestions } from '@msdyn365-commerce/commerce-entities';\r\nimport MsDyn365, { getUrlSync } from '@msdyn365-commerce/core';\r\nimport { ProductRefiner } from '@msdyn365-commerce/retail-proxy';\r\nimport { getProductSearchRefinersAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\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 * 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 { ISearchData } from './search.data';\r\nimport { ISearchProps, ISuggestionTypeCriterionData } from './search.props.autogenerated';\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}\r\n\r\nexport interface ISearchViewProps extends ISearchProps {\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 };\r\n isSearchFormExpanded: boolean;\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 inputSuggestionType?: ISuggestionTypeCriterionData[];\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 // @ts-expect-error\r\n private cancellabelDebounce: debounce;\r\n\r\n constructor(props: ISearchProps) {\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 };\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 this.inputSuggestionType = this.props.config && this.props.config.suggestionTypeCriterion;\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\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, autoHideSearchTextBox }\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 && autoHideSearchTextBox) {\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\r\n public shouldComponentUpdate(nextProps: ISearchProps, 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 public render(): JSX.Element {\r\n const {\r\n context,\r\n resources: { searchtext, searchLabelArialLabel, cancelBtnAriaLabel, searchBtnAriaLabel, submitBtnAriaLabel },\r\n config: { hideSearchLabel, disableSubmitSearch, searchplaceholderText, className = '', autoHideSearchTextBox }\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 } = 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 =\r\n suggestions &&\r\n suggestions.AllSearchResults &&\r\n suggestions.AllSearchResults.filter(\r\n i => i.SuggestionType === SuggestionType.Keyword || i.SuggestionType === SuggestionType.None\r\n );\r\n const productSuggestions =\r\n suggestions &&\r\n suggestions.AllSearchResults &&\r\n suggestions.AllSearchResults.filter(i => i.SuggestionType === SuggestionType.Product);\r\n const categorySuggestions =\r\n suggestions &&\r\n suggestions.AllSearchResults &&\r\n suggestions.AllSearchResults.filter(i => i.SuggestionType === SuggestionType.Category);\r\n\r\n const viewProps: ISearchViewProps = {\r\n ...(this.props as ISearchProps),\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: 'ms-search__autoSuggest'\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 autoHideSearchTextBox,\r\n query: searchText\r\n }),\r\n autosuggestKeyword:\r\n searchText && searchText.length > 0 && keywordSuggestions && keywordSuggestions.length > 0\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 suggestions: keywordSuggestions,\r\n telemetryContent: this.telemetryContent\r\n })\r\n : undefined,\r\n autosuggestProduct:\r\n searchText && searchText.length > 0 && productSuggestions && productSuggestions.length > 0\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 })\r\n : undefined,\r\n autosuggestCategory:\r\n searchText && searchText.length > 0 && categorySuggestions && categorySuggestions.length > 0\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 })\r\n : undefined,\r\n callbacks: {\r\n handleCancelSearchChange: this._handleCancelSearchChange\r\n },\r\n isSearchFormExpanded: this.state.isSearchFormExpanded\r\n };\r\n\r\n return this.props.renderView(viewProps) as React.ReactElement;\r\n }\r\n\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 });\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 telemetry,\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 this.cancellabelDebounce = debounce(() => {\r\n getSearchSuggestionsAction(\r\n new AutoSuggestInput(\r\n query,\r\n this.topResultsCount,\r\n this._getSuggestionType(this.inputSuggestionType),\r\n this.hitPrefix,\r\n this.hitSuffix\r\n ),\r\n context.actionContext\r\n )\r\n .then(results => {\r\n this._getSearchRefiners(query)\r\n .then(refiners => {\r\n this.setState({\r\n suggestions: results,\r\n searchRefiners: refiners,\r\n autoSuggestAriaLabel: this._setAutoSuggestResultCount(results)\r\n });\r\n })\r\n .catch(error => {\r\n this.setState({\r\n suggestions: results,\r\n searchRefiners: undefined,\r\n autoSuggestAriaLabel: this._setAutoSuggestResultCount(results)\r\n });\r\n telemetry.exception(error);\r\n telemetry.debug('Unable to get refiners results');\r\n });\r\n })\r\n .catch(error => {\r\n this.setState({\r\n suggestions: undefined,\r\n searchRefiners: undefined,\r\n autoSuggestAriaLabel: this._setAutoSuggestResultCount()\r\n });\r\n telemetry.exception(error);\r\n telemetry.debug('Unable to get auto suggest results');\r\n });\r\n }, this.waitTime);\r\n\r\n setTimeout(() => {\r\n this.cancellabelDebounce();\r\n }, 0);\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 readonly _getSuggestionType = (suggestionTypes?: ISuggestionTypeCriterionData[]): string => {\r\n if (suggestionTypes && suggestionTypes.length > 0) {\r\n const distinctSuggestionTypes: string[] = [];\r\n suggestionTypes &&\r\n suggestionTypes.forEach((suggestionTypeItem, index) => {\r\n suggestionTypeItem.SuggestionType &&\r\n distinctSuggestionTypes.push(\r\n suggestionTypeItem.SuggestionType.charAt(0).toUpperCase() + suggestionTypeItem.SuggestionType.slice(1)\r\n );\r\n });\r\n return distinctSuggestionTypes.join(',');\r\n }\r\n return 'Keyword, Product, ScopedCategory';\r\n };\r\n\r\n private async _getSearchRefiners(searchText: string): Promise {\r\n const { actionContext: ctx } = this.props.context;\r\n return getProductSearchRefinersAsync(\r\n { callerContext: ctx },\r\n {\r\n SearchCondition: searchText,\r\n Context: {\r\n ChannelId: +ctx.requestContext.apiSettings.channelId,\r\n CatalogId: +ctx.requestContext.apiSettings.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 });\r\n } else {\r\n if (suggestions && suggestions.AllSearchResults) {\r\n this._clearAutoSuggestState();\r\n }\r\n\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","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { INodeProps, Module, Node } 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 './search';\r\n\r\nconst SearchView: React.FC = props => {\r\n const {\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 } = props;\r\n\r\n return (\r\n \r\n {label}\r\n {_renderForm(form as ISearchFormViewProps, SearchForm, FormWrapper)}\r\n \r\n {searchText && searchText.length > 0 ? {AutoSuggestAriaLabelText} : ''}\r\n {_renderKeywordSuggestions(KeywordSuggest, UlKeyword, autosuggestKeyword)}\r\n {_renderProductSuggestions(ProductSuggest, UlProduct, autosuggestProduct)}\r\n {_renderCategorySuggestions(CategorySuggest, UlCategory, autosuggestCategory)}\r\n \r\n \r\n );\r\n};\r\n\r\nconst _renderForm = (form: ISearchFormViewProps, SearchForm: INodeProps, FormWrapper: INodeProps) => {\r\n return (\r\n \r\n \r\n {form.input}\r\n {form.cancelBtn}\r\n {form.submitBtn}\r\n \r\n \r\n );\r\n};\r\n\r\nconst _renderKeywordSuggestions = (KeywordSuggest: INodeProps, UlKeyword: INodeProps, keywordSuggestions?: ISearchKeywordViewProps) => {\r\n return (\r\n keywordSuggestions && (\r\n \r\n \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 = (ProductSuggest: INodeProps, UlProduct: INodeProps, productSuggestions?: ISearchProductViewProps) => {\r\n return (\r\n productSuggestions && (\r\n \r\n \r\n {productSuggestions.title}\r\n {productSuggestions.items.map((item, index) => {\r\n return (\r\n \r\n \r\n {item.thumbnail}\r\n {item.text}\r\n {item.price}\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) => {\r\n return (\r\n categorySuggestions && (\r\n \r\n \r\n {categorySuggestions.title}\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","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['search'] = {\n c: () => require('partner/modules/search/search.tsx'),\n $type: 'contentModule',\n da: [{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: 'search',\n p: '__local__',\n \n pdp: '',\n \n \n md: 'src/modules/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 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|search|search'] = {\n c: () => require('partner/modules/search/search.view.tsx'),\n cn: '__local__-__local__-search'\n };\nviewDictionary['@msdyn365-commerce-modules|search|modules|search|search'] = {\n c: () => require('@msdyn365-commerce-modules/search/dist/lib/modules/search/search.view.js'),\n cn: '@msdyn365-commerce-modules-search-search'\n };\nviewDictionary['@msdyn365-commerce-theme|adventureworks-theme-kit|modules|adventureworks|views|search'] = {\n c: () => require('@msdyn365-commerce-theme/adventureworks-theme-kit/dist/lib/modules/adventureworks/views/search.view.js'),\n cn: '@msdyn365-commerce-theme-adventureworks-theme-kit-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 { 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","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { INodeProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISearchCategoryViewProps, ISearchFormViewProps, ISearchKeywordViewProps, ISearchProductViewProps } from './components';\nimport { ISearchViewProps } from './search';\n\nconst SearchView: React.FC = props => {\n const {\n Search,\n AutoSuggestAriaLabel,\n AutoSuggestAriaLabelText,\n searchText,\n AutoSuggest,\n KeywordSuggest,\n ProductSuggest,\n CategorySuggest,\n UlKeyword,\n UlProduct,\n UlCategory,\n form,\n autosuggestCategory,\n autosuggestKeyword,\n autosuggestProduct,\n SearchForm,\n FormWrapper,\n label,\n isLoadingAutoSuggest,\n isLoadingNode\n } = props;\n\n return (\n \n {label}\n {_renderForm(form as ISearchFormViewProps, SearchForm, FormWrapper)}\n \n {searchText && searchText.length > 0 ? {AutoSuggestAriaLabelText} : ''}\n {_renderKeywordSuggestions(KeywordSuggest, UlKeyword, autosuggestKeyword, isLoadingAutoSuggest, isLoadingNode)}\n {_renderProductSuggestions(ProductSuggest, UlProduct, autosuggestProduct, isLoadingAutoSuggest, isLoadingNode)}\n {_renderCategorySuggestions(CategorySuggest, UlCategory, autosuggestCategory, isLoadingAutoSuggest, isLoadingNode)}\n \n \n );\n};\n\nconst _renderForm = (form: ISearchFormViewProps, SearchForm: INodeProps, FormWrapper: INodeProps) => {\n return (\n \n \n {form.input}\n {form.cancelBtn}\n {form.submitBtn}\n \n \n );\n};\n\nconst _renderKeywordSuggestions = (\n KeywordSuggest: INodeProps,\n UlKeyword: INodeProps,\n keywordSuggestions?: ISearchKeywordViewProps,\n isLoadingAutoSuggest?: boolean,\n isLoadingNode?: React.ReactNode\n) => {\n return (\n keywordSuggestions && (\n \n \n {isLoadingAutoSuggest && isLoadingNode}\n {!isLoadingAutoSuggest &&\n keywordSuggestions.text.map(text => {\n return text;\n })}\n \n \n )\n );\n};\n\nconst _renderProductSuggestions = (\n ProductSuggest: INodeProps,\n UlProduct: INodeProps,\n productSuggestions?: ISearchProductViewProps,\n isLoadingAutoSuggest?: boolean,\n isLoadingNode?: React.ReactNode\n) => {\n return (\n productSuggestions && (\n \n \n {productSuggestions.title}\n {isLoadingAutoSuggest && isLoadingNode}\n {!isLoadingAutoSuggest &&\n productSuggestions.items.map((item, index) => {\n return (\n \n \n {item.thumbnail}\n {item.text}\n {item.price}\n \n \n );\n })}\n \n \n )\n );\n};\n\nconst _renderCategorySuggestions = (\n CategorySuggest: INodeProps,\n UlCategory: INodeProps,\n categorySuggestions?: ISearchCategoryViewProps,\n isLoadingAutoSuggest?: boolean,\n isLoadingNode?: React.ReactNode\n) => {\n return (\n categorySuggestions && (\n \n \n {categorySuggestions.title}\n {isLoadingAutoSuggest && isLoadingNode}\n {!isLoadingAutoSuggest &&\n categorySuggestions.text.map(text => {\n return text;\n })}\n \n \n )\n );\n};\n\nexport default SearchView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ISearchData, ISearchViewProps } from '@msdyn365-commerce-modules/search';\nimport { Node } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nimport { ISearchProps } from '../../definition-extensions/search.ext.props.autogenerated';\n\n/**\n * Render Categories heading.\n * @param inCategoriesHeading - The Keywords result heading.\n * @returns The JSX Element.\n */\nconst renderCategorySuggestionsTitle = (inCategoriesHeading: string): JSX.Element => {\n const categoryAutoSuggestionHeading = inCategoriesHeading ? inCategoriesHeading : 'In categories';\n\n return
    {categoryAutoSuggestionHeading}
    ;\n};\n\n/**\n * Render Categories suggestion result.\n * @param inCategoriesHeading - The Categories result heading.\n * @param noResultText - The \"No Result\" text.\n * @param props - The Categories suggestion result.\n * @param isLoadingAutoSuggest - The autosuggestion loading flag.\n * @param isLoadingNode - The autosuggestion loading node.\n * @returns The JSX Element.\n */\nexport const CategorySuggestionsComponent = (\n inCategoriesHeading: string,\n noResultText: string,\n props: ISearchViewProps & ISearchProps,\n isLoadingAutoSuggest?: boolean,\n isLoadingNode?: React.ReactNode\n): JSX.Element => {\n return props.autosuggestCategory ? (\n \n {renderCategorySuggestionsTitle(inCategoriesHeading)}\n \n {isLoadingAutoSuggest && isLoadingNode}\n {!isLoadingAutoSuggest &&\n props.autosuggestCategory.text.map(text => {\n return text;\n })}\n \n \n ) : (\n \n {renderCategorySuggestionsTitle(inCategoriesHeading)}\n \n
  • {noResultText}
  • \n
    \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 { IImageData, Image } from '@msdyn365-commerce/core';\nimport { ISearchData } from '@msdyn365-commerce-modules/search';\nimport { Node } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nimport { ISearchProps } from '../../definition-extensions/search.ext.props.autogenerated';\n\n/**\n * Render Products Suggestion result heading.\n * @param props -The props.\n * @returns The JSX Element.\n */\nconst renderProductNotFoundResultsImage = (props: ISearchProps): JSX.Element | null => {\n const noSearchResultImage: IImageData | undefined = props.config.noSearchResultImage;\n if (!noSearchResultImage || !noSearchResultImage.src) {\n return null;\n }\n const imageSettings = {\n lazyload: true,\n viewports: {\n xs: { w: 100, h: 100, q: 'w=100&h=100&q=60&m=6' }\n }\n };\n return (\n \n );\n};\n\n/**\n * Render Product suggestion result.\n * @param props -The props.\n * @returns The JSX Element.\n */\nexport const MobileAutoSuggestEmptyComponent = (props: ISearchProps): JSX.Element => {\n return (\n \n
    {renderProductNotFoundResultsImage(props)}
    \n
    \n
    {props.resources.emptyMobileSearchTextHeading}
    \n
    {props.resources.emptyMobileSearchText}
    \n
    \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 { ISearchData, ISearchFormViewProps } from '@msdyn365-commerce-modules/search';\nimport { Button, INodeProps, Node } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nimport { ISearchProps } from '../../definition-extensions/search.ext.props.autogenerated';\nimport { MobileAutoSuggestEmptyComponent } from './search.mobile.empty';\n\n/**\n * Render Clear button for mobile viewport.\n * @param clearSearchButtonText -The Clear button text.\n * @param clearSearch -Clear Search callback.\n * @returns -The JSX Element.\n */\nconst renderClearButton = (clearSearchButtonText: string, clearSearch: () => void): JSX.Element => {\n return (\n \n );\n};\n\n/**\n * Render Search form.\n * @param form -Form view props.\n * @param searchForm -Search Form props.\n * @param formWrapper -Form Wrapper props.\n * @param isMobile -Is mobile viewport flag.\n * @param clearSearchButtonText -The Clear button text.\n * @param props -The props for resource.\n * @param isSearchText -Is SearchText flag for input text.\n * @param clearSearch -Clear Search callback.\n * @returns -The JSX Element.\n */\nexport const FormComponent = (\n form: ISearchFormViewProps,\n searchForm: INodeProps,\n formWrapper: INodeProps,\n isMobile: boolean,\n clearSearchButtonText: string,\n props: ISearchProps,\n isSearchText: boolean,\n clearSearch: () => void\n): JSX.Element => {\n const cancelButtonNode = (\n \n );\n\n return isMobile ? (\n \n {form.cancelBtn}\n \n {form.input}\n {isSearchText && renderClearButton(clearSearchButtonText, clearSearch)}\n {!isSearchText ? MobileAutoSuggestEmptyComponent(props) : null}\n \n \n ) : (\n \n \n {form.submitBtn}\n {form.input}\n {isSearchText && cancelButtonNode}\n \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 { ISearchKeywordViewProps } from '@msdyn365-commerce-modules/search';\nimport { INodeProps, Node } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\n/**\n * Render keywords heading.\n * @param keywordsHeading -The Keywords result heading.\n * @returns The JSX Element.\n */\nconst renderKeywordSuggestionsTitle = (keywordsHeading: string): JSX.Element => {\n const categoryAutoSuggestionHeading = keywordsHeading ? keywordsHeading : 'Keywords';\n\n return
    {categoryAutoSuggestionHeading}
    ;\n};\n\n/**\n * Render keywords reults.\n * @param keywordSuggest -The Keywords suggest Node props.\n * @param ulKeyword -The List Node props.\n * @param keywordsHeading -The Keywords result heading.\n * @param noResultText -The \"No Result\" text.\n * @param keywordSuggestions -The Keywords suggestion result.\n * @param isLoadingAutoSuggest - The autosuggestion loading flag.\n * @param isLoadingNode - The autosuggestion loading node.\n * @returns -The JSX Element.\n */\nexport const KeywordSuggestionsComponent = (\n keywordSuggest: INodeProps,\n ulKeyword: INodeProps,\n keywordsHeading: string,\n noResultText: string,\n keywordSuggestions?: ISearchKeywordViewProps,\n isLoadingAutoSuggest?: boolean,\n isLoadingNode?: React.ReactNode\n): JSX.Element => {\n return keywordSuggestions ? (\n \n {renderKeywordSuggestionsTitle(keywordsHeading)}\n \n {isLoadingAutoSuggest && isLoadingNode}\n {!isLoadingAutoSuggest &&\n keywordSuggestions.text.map(text => {\n return text;\n })}\n \n \n ) : (\n \n {renderKeywordSuggestionsTitle(keywordsHeading)}\n \n
  • {noResultText}
  • \n
    \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 { IImageData, Image } from '@msdyn365-commerce/core';\nimport { ISearchData, ISearchProductViewProps } from '@msdyn365-commerce-modules/search';\nimport { INodeProps, Node } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nimport { ISearchProps } from '../../definition-extensions/search.ext.props.autogenerated';\n\n/**\n * Render Products Suggestion result heading.\n * @param productSuggestionsHeading -The products suggestion result heading.\n * @returns The JSX Element.\n */\nconst renderProductSuggestionsTitle = (productSuggestionsHeading: string): JSX.Element => {\n const productAutoSuggestionHeading = productSuggestionsHeading ? productSuggestionsHeading : 'Products';\n\n return
    {productAutoSuggestionHeading}
    ;\n};\n\n/**\n * Render Products Suggestion result heading.\n * @param props -The props.\n * @returns The JSX Element.\n */\nconst renderProductNotFoundResultsImage = (props: ISearchProps): JSX.Element | null => {\n const noSearchResultImage: IImageData | undefined = props.config.noSearchResultImage;\n if (!noSearchResultImage || !noSearchResultImage.src) {\n return null;\n }\n return (\n \n );\n};\n\n/**\n * Render Products No result section.\n * @param props -The props.\n * @returns The JSX Element.\n */\nconst renderProductNotFoundResults = (props: ISearchProps): JSX.Element => {\n return (\n \n
    {renderProductNotFoundResultsImage(props)}
    \n
    {props.resources.noResultContentHeadingText}
    \n
    \n {props.resources.noResultContentParagraphText}\n
    \n
    \n );\n};\n\n/**\n * Render Product suggestion result.\n * @param productSuggest -The product suggest Node props.\n * @param ulProduct -The List Node props.\n * @param props -The props.\n * @param productSuggestions -The Product suggestion result.\n * @param isLoadingAutoSuggest - The autosuggestion loading flag.\n * @param isLoadingNode - The autosuggestion loading node.\n * @returns The JSX Element.\n */\nexport const ProductSuggestionsComponent = (\n productSuggest: INodeProps,\n ulProduct: INodeProps,\n props: ISearchProps,\n productSuggestions?: ISearchProductViewProps,\n isLoadingAutoSuggest?: boolean,\n isLoadingNode?: React.ReactNode\n): JSX.Element => {\n const liProduct: INodeProps = {\n tag: 'li',\n className: 'msc-no-result-content'\n };\n return productSuggestions ? (\n \n {renderProductSuggestionsTitle(props.resources.productSuggestionHeading)}\n \n {isLoadingAutoSuggest && isLoadingNode}\n {!isLoadingAutoSuggest &&\n productSuggestions.items.map((item, index) => {\n return (\n \n \n {item.thumbnail}\n {item.text}\n {item.price}\n \n \n );\n })}\n \n \n ) : (\n \n {renderProductSuggestionsTitle(props.resources.productSuggestionHeading)}\n \n {renderProductNotFoundResults(props)}\n \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 { StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { ISearchData, ISearchFormViewProps, ISearchViewProps } from '@msdyn365-commerce-modules/search';\nimport { Button, format, isMobile, Module, Node, VariantType } from '@msdyn365-commerce-modules/utilities';\nimport React, { useCallback, useEffect, useState } from 'react';\n\nimport { ISearchProps } from '../definition-extensions/search.ext.props.autogenerated';\nimport { CategorySuggestionsComponent } from './components/search.categorysuggest';\nimport { FormComponent } from './components/search.form';\nimport { KeywordSuggestionsComponent } from './components/search.keywordsuggest';\nimport { ProductSuggestionsComponent } from './components/search.productsuggest';\n\n/**\n * Render Title for AutoSuggest.\n * @param searchSuggestionHeading -The heading resource string.\n * @param searchText -The search string.\n * @returns -The JSX Element.\n */\nconst renderTitle = (searchSuggestionHeading: string, searchText: string): JSX.Element => {\n const searchTextString = '\"'.concat(searchText.concat('\"'));\n const searchAutoSuggestionHeading = searchSuggestionHeading\n ? format(searchSuggestionHeading, searchTextString)\n : `Search for ${searchTextString}`;\n\n return {searchAutoSuggestionHeading};\n};\n\n/**\n * Search View.\n * @param props - The view props.\n * @returns The JSX Element.\n */\nconst SearchView: React.FC> = (\n props: ISearchViewProps & ISearchProps\n): JSX.Element => {\n const {\n Search,\n AutoSuggestAriaLabel,\n AutoSuggestAriaLabelText,\n searchText,\n AutoSuggest,\n KeywordSuggest,\n ProductSuggest,\n UlKeyword,\n UlProduct,\n form,\n autosuggestKeyword,\n autosuggestProduct,\n SearchForm,\n FormWrapper,\n label,\n context,\n isLoadingAutoSuggest,\n isLoadingNode,\n callbacks: { handleCancelSearchFocused }\n } = props;\n\n const { searchSuggestionHeading, categorySuggestionHeading, keywordsHeading, noResultText, clearSearchButtonText } = props.resources;\n\n const [searchTextString, setSearchTextString] = useState();\n const [isMobilePort, setIsMobile] = useState(false);\n\n useEffect(() => {\n setSearchTextString(searchText);\n }, [searchText]);\n\n /**\n * ClearSearch callback method to clear search string.\n */\n const clearSearch = (): void => {\n setSearchTextString('');\n\n const propsForm = props.form as ISearchFormViewProps;\n const propsFormInput = propsForm.input as React.DetailedHTMLProps, HTMLInputElement>;\n const propsFormInputCurrent = (propsFormInput.ref as React.RefObject).current;\n\n if (propsFormInputCurrent) {\n propsFormInputCurrent.value = '';\n }\n\n propsFormInput.value = '';\n props.searchText = '';\n props.FormWrapper.action = '';\n };\n\n const isMobileViewport = useCallback(() => {\n const isMobileView = isMobile({ variant: VariantType.Browser, context: context.request }) === 'xs';\n setIsMobile(isMobileView);\n }, [context]);\n\n useEffect(() => {\n window.addEventListener('resize', isMobileViewport);\n isMobileViewport();\n }, [isMobileViewport]);\n\n const viewport = isMobile({ variant: VariantType.Browser, context: context.request });\n\n const isMobileView = viewport === 'sm' || viewport === 'xs';\n\n AutoSuggest.className = !StringExtensions.isNullOrEmpty(searchTextString)\n ? `${AutoSuggest.className} show`\n : `${AutoSuggest.className} hide`;\n const isSearchText: boolean = !StringExtensions.isNullOrEmpty(searchTextString);\n\n return (\n \n {label}\n {FormComponent(\n form as ISearchFormViewProps,\n SearchForm,\n FormWrapper,\n isMobilePort,\n clearSearchButtonText,\n props,\n isSearchText,\n clearSearch\n )}\n {!isMobileView && (\n \n {!StringExtensions.isNullOrEmpty(searchTextString) ? (\n {AutoSuggestAriaLabelText}\n ) : (\n ''\n )}\n {!StringExtensions.isNullOrEmpty(searchTextString) ? (\n <>\n \n \n {renderTitle(searchSuggestionHeading, searchText)}\n \n \n \n {CategorySuggestionsComponent(\n categorySuggestionHeading,\n noResultText,\n props,\n isLoadingAutoSuggest,\n isLoadingNode\n )}\n {KeywordSuggestionsComponent(\n KeywordSuggest,\n UlKeyword,\n keywordsHeading,\n noResultText,\n autosuggestKeyword,\n isLoadingAutoSuggest,\n isLoadingNode\n )}\n \n {ProductSuggestionsComponent(\n ProductSuggest,\n UlProduct,\n props,\n autosuggestProduct,\n isLoadingAutoSuggest,\n isLoadingNode\n )}\n \n \n ) : null}\n \n )}\n {isMobileView && props.isSearchFormExpanded && (\n \n {!StringExtensions.isNullOrEmpty(searchTextString) ? (\n {AutoSuggestAriaLabelText}\n ) : (\n ''\n )}\n {!StringExtensions.isNullOrEmpty(searchTextString) ? (\n <>\n \n {(form as ISearchFormViewProps).cancelBtn}\n {renderTitle(searchSuggestionHeading, searchText)}\n \n \n \n {CategorySuggestionsComponent(\n categorySuggestionHeading,\n noResultText,\n props,\n isLoadingAutoSuggest,\n isLoadingNode\n )}\n {KeywordSuggestionsComponent(\n KeywordSuggest,\n UlKeyword,\n keywordsHeading,\n noResultText,\n autosuggestKeyword,\n isLoadingAutoSuggest,\n isLoadingNode\n )}\n \n {ProductSuggestionsComponent(\n ProductSuggest,\n UlProduct,\n props,\n autosuggestProduct,\n isLoadingAutoSuggest,\n isLoadingNode\n )}\n \n \n ) : null}\n \n )}\n \n );\n};\nexport default SearchView;\n","module.exports = React;","module.exports = ReactDOM;"],"names":["SearchState","__decorate","observable","SuggestionType","AutoSuggestInput","constructor","searchText","top","suggestionType","hitPrefix","hitSuffix","getCacheKey","getCacheObjectType","dataCacheType","this","searchQuery","topResultsCount","async","_getAutoSuggest","input","autosuggest","ctx","searchCriteria","ProductSearchCriteria","SearchCondition","length","Context","ChannelId","requestContext","apiSettings","channelId","CatalogId","catalogId","HitPrefix","HitSuffix","searchSuggestions","getSearchSuggestionsAsync","callerContext","queryResultSettings","Paging","Top","map","item","ImageUrl","generateImageUrl","AllSearchResults","telemetry","error","createObservableDataAction","id","action","Error","autoSuggestPromises","Promise","all","then","inputData","payLoad","CategorySuggestionsComponent","props","suggestions","autoSuggestProps","resources","categorySuggestionHeading","reactNodes","getPayloadObject","telemetryContent","push","_assembleNode","title","_renderTitle","text","categoryAutoSuggestionHeading","format","React","className","splitValue","Value","split","pop","ariaLabel","replace","RegExp","contentAction","etext","attribute","getTelemetryAttributes","key","Id","Object","assign","href","_generateLink","_getHighlightedText","suggestion","_getCategoryLink","_categoryRefiners$Val","searchPageURL","searchQsp","searchRefiners","MsDyn365","isBrowser","queryUrl","URL","window","location","searchParams","set","categoryRefiners","find","refiners","KeyName","refiner","Values","RefinerRecordId","Number","parseInt","encodedRefiner","JSON","stringify","compressRefiners","formattedText","dangerouslySetInnerHTML","getRichTextHtml","compressedRefinerKeys","compressedRefiners","forEach","compressedRefiner","refinerKey","FormComponent","autoHideSearchTextBox","searchPlaceholder","hideSearchLabel","searchTextInput","handleInputChange","maxChars","disableSubmitSearch","handleCancelSearchChange","query","ariaLabelCancel","ariaLabelSearch","ariaLabelSubmit","onInputChange","event","target","value","onInputChangeFunction","inputNode","type","name","placeholder","ref","onChange","maxLength","submitBtnNode","Button","cancelBtn","onClick","submitBtn","KeywordSuggestionsComponent","formattedLink","LabelComponent","searchLabelClass","searchLabelArialLabel","isSearchFormExpanded","searchtext","searchCollapsedLabel","attributes","innerRef","ProductSuggestionsComponent","context","actionContext","productSuggestionHeading","moduleType","moduleId","items","productAutoSuggestionHeading","altText","thumbnail","_renderThumbnail","price","Value3","DecimalValue","_renderPrice","LiProduct","_getLiWrapper","AProduct","_getAWrapper","tag","recid","_objectSpread","cultureFormatter","formatCurrency","getProductPageUrlSync","undefined","adjustedPrice","basePrice","PriceComponent","typeName","data","CustomerContextualPrice","BasePrice","request","gridSettings","config","imageSettings","cropFocalRegion","Image","src","viewports","xs","q","w","h","lg","xl","lazyload","loadFailureBehavior","bypassHideOnFailure","Search","super","waitTime","_focusOutTarget","e","state","closest","_clearAutoSuggestState","_keyup","keyCode","KeyCodes","Escape","setState","formReference","current","contains","autoSuggestResultDiv","searchState","defaultBasicSearchUrl","searchQueryStringParameter","update","createSearchStateInput","_handleInputChange","cancellabelDebounce","cancel","_debounce","getSearchSuggestionsAction","_getSuggestionType","inputSuggestionType","results","_getSearchRefiners","autoSuggestAriaLabel","_setAutoSuggestResultCount","catch","exception","debug","setTimeout","suggestionTypes","distinctSuggestionTypes","suggestionTypeItem","index","charAt","toUpperCase","slice","join","_handleSubmit","app","preventDefault","focus","searchURL","_appendQueryParams","getUrlSync","document","_handleCancelSearchChange","isInitialState","route","qsp","result","autoSuggestResultScreenReaderDiv","ariaLiveRegion","suggestResultString","autoSuggestFoundMessage","emptyResultString","noAutoSuggestionMessage","innerText","setAttribute","searchKeywordSuggestClass","searchProductSuggestClass","searchCategorySuggestClass","searchInputMaxLength","suggestionTypeCriterion","searchFormClass","getTelemetryObject","telemetryPageName","friendlyName","body","addEventListener","componentWillUnmount","removeEventListener","componentDidUpdate","params","isEditor","shouldComponentUpdate","nextProps","nextState","render","cancelBtnAriaLabel","searchBtnAriaLabel","submitBtnAriaLabel","searchplaceholderText","keywordSuggestions","filter","i","Keyword","None","productSuggestions","Product","categorySuggestions","Category","viewProps","moduleProps","classnames","AutoSuggestAriaLabel","AutoSuggestAriaLabelText","AutoSuggest","KeywordSuggest","ProductSuggest","CategorySuggest","SearchForm","FormWrapper","role","autoComplete","onSubmit","UlKeyword","UlProduct","UlCategory","label","form","autosuggestKeyword","autosuggestProduct","autosuggestCategory","callbacks","renderView","getProductSearchRefinersAsync","_renderForm","Node","_renderKeywordSuggestions","_renderProductSuggestions","_renderCategorySuggestions","Module","binding","modules","dataActions","c","require","$type","da","path","runOn","iNM","ns","n","p","pdp","md","registerSanitizedActionPath","sanitizedActionPath","dataAction","default","prototype","RegistrationId","__bindings__","viewDictionary","cn","GenericInput","getGenericActionDataAction","getGenericAction","isLoadingAutoSuggest","isLoadingNode","renderCategorySuggestionsTitle","inCategoriesHeading","noResultText","MobileAutoSuggestEmptyComponent","noSearchResultImage","renderProductNotFoundResultsImage","emptyMobileSearchTextHeading","emptyMobileSearchText","searchForm","formWrapper","isMobile","clearSearchButtonText","isSearchText","clearSearch","cancelButtonNode","renderClearButton","renderKeywordSuggestionsTitle","keywordsHeading","keywordSuggest","ulKeyword","renderProductSuggestionsTitle","productSuggestionsHeading","renderProductNotFoundResults","noResultContentHeadingText","noResultContentParagraphText","productSuggest","ulProduct","_item$id","renderTitle","searchSuggestionHeading","searchTextString","concat","searchAutoSuggestionHeading","handleCancelSearchFocused","setSearchTextString","useState","isMobilePort","setIsMobile","useEffect","propsFormInput","propsFormInputCurrent","isMobileViewport","useCallback","isMobileView","variant","VariantType","Browser","viewport","StringExtensions","isNullOrEmpty","onBlur","module","exports","ReactDOM"],"sourceRoot":""}