{"version":3,"sources":["webpack:///./lib/search/module-registration.js?f197","webpack:///./src/themes/newsunshine-b2c/views/components/search.categorysuggest.tsx?9785","webpack:///./src/themes/newsunshine-b2c/views/components/search.mobile.empty.tsx?ac29","webpack:///./src/themes/newsunshine-b2c/views/components/search.form.tsx?3b72","webpack:///./src/themes/newsunshine-b2c/views/components/search.productsuggest.tsx?e36b","webpack:///./src/themes/newsunshine-b2c/views/search.view.tsx?9fee","webpack:///src/modules/adventureworks/views/components/search.categorysuggest.tsx?5c98","webpack:///src/modules/adventureworks/views/components/search.mobile.empty.tsx?16ff","webpack:///src/modules/adventureworks/views/components/search.form.tsx?f934","webpack:///src/modules/adventureworks/views/components/search.keywordsuggest.tsx?34ae","webpack:///src/modules/adventureworks/views/components/search.productsuggest.tsx?1992","webpack:///src/modules/adventureworks/views/search.view.tsx?4e21","webpack:///./src/themes/newsunshine-dev-b2c/views/components/search.categorysuggest.tsx?f985","webpack:///./src/themes/newsunshine-dev-b2c/views/components/search.mobile.empty.tsx?ac29","webpack:///./src/themes/newsunshine-dev-b2c/views/components/search.form.tsx?197a","webpack:///./src/themes/newsunshine-dev-b2c/views/components/search.productsuggest.tsx?68c2","webpack:///./src/themes/newsunshine-dev-b2c/views/search.view.tsx?81c2","webpack:///external \"React\"?c481","webpack:///src/modules/search/search.view.tsx?e62d","webpack:///external \"ReactDOM\"?4b2d","webpack:///src/search-state-data-action.ts?8823","webpack:///./src/themes/newsunshine-dev/views/components/search.categorysuggest.tsx?82ce","webpack:///./src/themes/newsunshine-dev/views/components/search.mobile.empty.tsx?6901","webpack:///./src/themes/newsunshine-dev/views/components/search.form.tsx?6a54","webpack:///./src/themes/newsunshine-dev/views/components/search.productsuggest.tsx?3901","webpack:///./src/themes/newsunshine-dev/views/search.view.tsx?e8a3","webpack:///src/search-state.ts?b5d7","webpack:///src/modules/search/actions/get-auto-suggest-suggestions.ts?6ade","webpack:///src/modules/search/components/search.categorysuggest.tsx?3bc4","webpack:///src/modules/search/components/search.form.tsx?3c4b","webpack:///src/modules/search/components/search.keywordsuggest.tsx?59ca","webpack:///src/modules/search/components/search.label.tsx?91cb","webpack:///src/modules/search/components/search.productsuggest.tsx?d6fa","webpack:///src/modules/search/search.tsx?3f45","webpack:///./src/themes/newsunshine/views/components/search.categorysuggest.tsx?4a8d","webpack:///./src/themes/newsunshine/views/components/search.mobile.empty.tsx?fdd9","webpack:///./src/themes/newsunshine/views/components/search.form.tsx?c37b","webpack:///./src/themes/newsunshine/views/components/search.productsuggest.tsx?bbde","webpack:///./src/themes/newsunshine/views/search.view.tsx?fbe3"],"names":["binding","modules","dataActions","c","require","$type","da","name","path","runOn","iNM","ns","n","p","pdp","md","registerSanitizedActionPath","sanitizedActionPath","dataAction","default","Error","prototype","RegistrationId","id","window","__bindings__","_objectSpread","viewDictionary","cn","renderCategorySuggestionsTitle","inCategoriesHeading","React","createElement","className","CategorySuggestionsComponent","noResultText","props","isLoadingAutoSuggest","isLoadingNode","autosuggestCategory","Node","Object","assign","CategorySuggest","UlCategory","text","map","MobileAutoSuggestEmptyComponent","noSearchResultImage","config","src","Image","altText","gridSettings","context","request","requestContext","imageSettings","lazyload","viewports","xs","w","h","q","renderProductNotFoundResultsImage","resources","emptyMobileSearchTextHeading","emptyMobileSearchText","FormComponent","form","searchForm","formWrapper","isMobile","clearSearchButtonText","isSearchText","clearSearch","cancelBtn","input","renderClearButton","Button","title","onClick","submitBtn","renderProductSuggestionsTitle","productSuggestionsHeading","productAutoSuggestionHeading","renderProductNotFoundResults","noResultContentHeadingText","noResultContentParagraphText","ProductSuggestionsComponent","productSuggest","ulProduct","productSuggestions","productSuggestionHeading","items","item","index","_item$id","LiProduct","key","AProduct","thumbnail","price","tag","renderTitle","searchSuggestionHeading","searchText","searchTextString","concat","searchAutoSuggestionHeading","format","SearchView","Search","AutoSuggestAriaLabel","AutoSuggestAriaLabelText","AutoSuggest","ProductSuggest","UlProduct","autosuggestProduct","SearchForm","FormWrapper","label","callbacks","handleCancelSearchFocused","handleCancelSearchChange","categorySuggestionHeading","setSearchTextString","useState","isMobilePort","setIsMobile","searchRef","useRef","useEffect","document","addEventListener","event","showBtn","querySelector","hideBtn","target","checkMatchParent","current","removeEventListener","element","parentNode","propsFormInput","propsFormInputCurrent","ref","value","action","isMobileViewport","useCallback","isMobileView","variant","VariantType","Browser","viewport","StringExtensions","isNullOrEmpty","Module","Fragment","cancelBtnAriaLabel","onBlur","type","isSearchFormExpanded","categoryAutoSuggestionHeading","cancelButtonNode","renderKeywordSuggestionsTitle","keywordsHeading","KeywordSuggestionsComponent","keywordSuggest","ulKeyword","keywordSuggestions","KeywordSuggest","UlKeyword","autosuggestKeyword","module","exports","_renderForm","_renderKeywordSuggestions","_renderProductSuggestions","_renderCategorySuggestions","categorySuggestions","length","ReactDOM","createSearchStateInput","result","GenericInput","getGenericActionDataAction","createObservableDataAction","getGenericAction","inputData","SearchState","__decorate","observable","SuggestionType","AutoSuggestInput","constructor","top","suggestionType","hitPrefix","hitSuffix","getCacheKey","getCacheObjectType","dataCacheType","this","searchQuery","topResultsCount","async","_getAutoSuggest","autosuggest","ctx","catalogId","getCatalogId","searchCriteria","ProductSearchCriteria","SearchCondition","Context","ChannelId","apiSettings","channelId","CatalogId","HitPrefix","HitSuffix","searchSuggestions","getSearchSuggestionsAsync","callerContext","queryResultSettings","Paging","Top","ImageUrl","generateImageUrl","AllSearchResults","telemetry","error","getSearchSuggestionsActionDataAction","autoSuggestPromises","Promise","all","then","payLoad","suggestions","autoSuggestProps","reactNodes","getPayloadObject","telemetryContent","push","_assembleNode","_renderTitle","shouldShowFullPath","splitValue","Value","split","pop","ariaLabel","replace","RegExp","contentAction","etext","attribute","getTelemetryAttributes","Id","href","_generateLink","_getHighlightedText","suggestion","_getCategoryLink","_categoryRefiners$Val","searchPageURL","searchQsp","searchRefiners","MsDyn365","isBrowser","queryUrl","URL","location","searchParams","set","categoryRefiners","find","refiners","SourceValue","ProductRefinerSource","Category","refiner","Values","RefinerRecordId","Number","parseInt","encodedRefiner","JSON","stringify","compressRefiners","formattedText","dangerouslySetInnerHTML","getRichTextHtml","compressedRefinerKeys","compressedRefiners","forEach","compressedRefiner","refinerKey","searchPlaceholder","hideSearchLabel","searchTextInput","handleInputChange","maxChars","disableSubmitSearch","query","ariaLabelCancel","ariaLabelSearch","ariaLabelSubmit","onInputChange","onInputChangeFunction","inputNode","placeholder","onChange","maxLength","submitBtnNode","formattedLink","LabelComponent","searchLabelClass","searchLabelArialLabel","searchtext","searchCollapsedLabel","attributes","innerRef","actionContext","moduleType","moduleId","_item$Value","Value3","DecimalValue","_renderThumbnail","ObjectExtensions","isNullOrUndefined","_renderPrice","_getLiWrapper","_getAWrapper","recid","cultureFormatter","formatCurrency","getProductPageUrlSync","undefined","adjustedPrice","basePrice","_props$resources","PriceComponent","typeName","data","CustomerContextualPrice","BasePrice","freePriceText","cropFocalRegion","lg","xl","loadFailureBehavior","super","waitTime","_isLoadingNode","loadingText","autoSuggestResultLoadingMessage","Spinner","size","SpinnerSize","medium","labelPosition","_focusOutTarget","e","state","closest","_clearAutoSuggestState","_keyup","keyCode","KeyCodes","Escape","setState","formReference","contains","autoSuggestResultDiv","searchState","defaultBasicSearchUrl","searchQueryStringParameter","update","_handleInputChange","cancellabelDebounce","cancel","ArrayExtensions","hasElements","inputSuggestionType","_loadSuggestions","_handleSubmit","app","preventDefault","focus","searchURL","_appendQueryParams","getUrlSync","_handleCancelSearchChange","isInitialState","_handleCancelSearchFocused","route","qsp","_setAutoSuggestResultCount","autoSuggestResultScreenReaderDiv","ariaLiveRegion","suggestResultString","autoSuggestFoundMessage","emptyResultString","noAutoSuggestionMessage","innerText","setAttribute","searchKeywordSuggestClass","searchProductSuggestClass","searchCategorySuggestClass","autoSuggestAriaLabel","searchInputMaxLength","searchFormClass","getTelemetryObject","telemetryPageName","friendlyName","_initSuggestionTypes","body","componentWillUnmount","componentDidUpdate","params","isEditor","shouldComponentUpdate","nextProps","nextState","render","_suggestions$AllSearc","_suggestions$AllSearc2","_suggestions$AllSearc3","searchBtnAriaLabel","submitBtnAriaLabel","searchplaceholderText","shouldShowFullCategoryPath","filter","Keyword","None","Product","_item$RefinerRecordId","viewProps","moduleProps","classnames","role","autoComplete","onSubmit","renderView","suggestionTypes","suggestionTypeCriterion","unique","validValues","validSuggestions","loadSuggestionsRequestId","getSearchSuggestionsAction","_getSuggestionType","exception","debug","_getSearchRefiners","_debounce","Random","Guid","generateGuid","_getSearchSuggestions","_updateSearchRefiners","setTimeout","suggestionTypeItem","charAt","toUpperCase","slice","join","validateCatalogId","ProductsDataActions","getProductSearchRefinersAsync"],"mappings":"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","file":"static/js/142.810fd419f4648665396f.chunk.js","sourcesContent":["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('@msdyn365-commerce-modules/search/dist/lib/modules/search/search'),\n $type: 'contentModule',\n da: [{name:'searchState', path:'@msdyn365-commerce-modules/search-utilities/dist/lib/search-state-data-action', runOn: 1}],\n \n iNM: true,\n ns: '@msdyn365-commerce-modules',\n n: 'search',\n p: 'search',\n \n pdp: '',\n \n \n md: 'node_modules/@msdyn365-commerce-modules/search/dist/lib/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__|themes|newsunshine-b2c|views|search'] = {\n c: () => require('partner/themes/newsunshine-b2c/views/search.view.tsx'),\n cn: '__local__-__local__-search'\n };\nviewDictionary['__local__|__local__|themes|newsunshine-dev-b2c|views|search'] = {\n c: () => require('partner/themes/newsunshine-dev-b2c/views/search.view.tsx'),\n cn: '__local__-__local__-search'\n };\nviewDictionary['__local__|__local__|themes|newsunshine-dev|views|search'] = {\n c: () => require('partner/themes/newsunshine-dev/views/search.view.tsx'),\n cn: '__local__-__local__-search'\n };\nviewDictionary['__local__|__local__|themes|newsunshine|views|search'] = {\n c: () => require('partner/themes/newsunshine/views/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 };","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\nimport { ISearchData, ISearchViewProps } from '@msdyn365-commerce-modules/search';\r\nimport { Node } from '@msdyn365-commerce-modules/utilities';\r\nimport React from 'react';\r\n\r\nimport { ISearchProps } from '../../definition-extensions/search.ext.props.autogenerated';\r\n\r\n/**\r\n * Render Categories heading.\r\n * @param inCategoriesHeading - The Keywords result heading.\r\n * @returns The JSX Element.\r\n */\r\nconst renderCategorySuggestionsTitle = (inCategoriesHeading: string): JSX.Element => {\r\n const categoryAutoSuggestionHeading = 'Search in categories';\r\n\r\n return
{categoryAutoSuggestionHeading}
;\r\n};\r\n\r\n/**\r\n * Render Categories suggestion result.\r\n * @param inCategoriesHeading - The Categories result heading.\r\n * @param noResultText - The \"No Result\" text.\r\n * @param props - The Categories suggestion result.\r\n * @param isLoadingAutoSuggest - The autosuggestion loading flag.\r\n * @param isLoadingNode - The autosuggestion loading node.\r\n * @returns The JSX Element.\r\n */\r\nexport const CategorySuggestionsComponent = (\r\n inCategoriesHeading: string,\r\n noResultText: string,\r\n props: ISearchViewProps & ISearchProps,\r\n isLoadingAutoSuggest?: boolean,\r\n isLoadingNode?: React.ReactNode\r\n): JSX.Element => {\r\n return props.autosuggestCategory ? (\r\n \r\n {renderCategorySuggestionsTitle(inCategoriesHeading)}\r\n \r\n {isLoadingAutoSuggest && isLoadingNode}\r\n {!isLoadingAutoSuggest &&\r\n props.autosuggestCategory.text.map(text => {\r\n return text;\r\n })}\r\n \r\n \r\n ) : (\r\n \r\n {renderCategorySuggestionsTitle(inCategoriesHeading)}\r\n \r\n
  • {noResultText}
  • \r\n
    \r\n
    \r\n );\r\n};\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\nimport { IImageData, Image } from '@msdyn365-commerce/core';\r\nimport { ISearchData } from '@msdyn365-commerce-modules/search';\r\nimport { Node } from '@msdyn365-commerce-modules/utilities';\r\nimport React from 'react';\r\n\r\nimport { ISearchProps } from '../../definition-extensions/search.ext.props.autogenerated';\r\n\r\n/**\r\n * Render Products Suggestion result heading.\r\n * @param props -The props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderProductNotFoundResultsImage = (props: ISearchProps): JSX.Element | null => {\r\n const noSearchResultImage: IImageData | undefined = props.config.noSearchResultImage;\r\n if (!noSearchResultImage || !noSearchResultImage.src) {\r\n return null;\r\n }\r\n const imageSettings = {\r\n lazyload: true,\r\n viewports: {\r\n xs: { w: 100, h: 100, q: 'w=100&h=100&q=60&m=6' }\r\n }\r\n };\r\n return (\r\n \r\n );\r\n};\r\n\r\n/**\r\n * Render Product suggestion result.\r\n * @param props -The props.\r\n * @returns The JSX Element.\r\n */\r\nexport const MobileAutoSuggestEmptyComponent = (props: ISearchProps): JSX.Element => {\r\n return (\r\n \r\n
    {renderProductNotFoundResultsImage(props)}
    \r\n
    \r\n
    {props.resources.emptyMobileSearchTextHeading}
    \r\n
    {props.resources.emptyMobileSearchText}
    \r\n
    \r\n
    \r\n );\r\n};\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\nimport { ISearchData, ISearchFormViewProps } from '@msdyn365-commerce-modules/search';\r\nimport { Button, INodeProps, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport React from 'react';\r\n\r\nimport { ISearchProps } from '../../definition-extensions/search.ext.props.autogenerated';\r\nimport { MobileAutoSuggestEmptyComponent } from './search.mobile.empty';\r\n\r\n/**\r\n * Render Clear button for mobile viewport.\r\n * @param clearSearchButtonText -The Clear button text.\r\n * @param clearSearch -Clear Search callback.\r\n * @returns -The JSX Element.\r\n */\r\nconst renderClearButton = (clearSearchButtonText: string, clearSearch: () => void): JSX.Element => {\r\n return (\r\n \r\n );\r\n};\r\n\r\n/**\r\n * Render Search form.\r\n * @param form -Form view props.\r\n * @param searchForm -Search Form props.\r\n * @param formWrapper -Form Wrapper props.\r\n * @param isMobile -Is mobile viewport flag.\r\n * @param clearSearchButtonText -The Clear button text.\r\n * @param props -The props for resource.\r\n * @param isSearchText -Is SearchText flag for input text.\r\n * @param clearSearch -Clear Search callback.\r\n * @returns -The JSX Element.\r\n */\r\nexport const FormComponent = (\r\n form: ISearchFormViewProps,\r\n searchForm: INodeProps,\r\n formWrapper: INodeProps,\r\n isMobile: boolean,\r\n clearSearchButtonText: string,\r\n props: ISearchProps,\r\n isSearchText: boolean,\r\n clearSearch: () => void\r\n): JSX.Element => {\r\n // const cancelButtonNode = (\r\n // \r\n // );\r\n\r\n return isMobile ? (\r\n \r\n {form.cancelBtn}\r\n \r\n {form.input}\r\n {isSearchText && renderClearButton(clearSearchButtonText, clearSearch)}\r\n {!isSearchText ? MobileAutoSuggestEmptyComponent(props) : null}\r\n \r\n \r\n ) : (\r\n \r\n \r\n {form.submitBtn}\r\n {form.input}\r\n {/* {isSearchText && cancelButtonNode} */}\r\n \r\n \r\n );\r\n};\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\nimport { IImageData, Image } from '@msdyn365-commerce/core';\r\nimport { ISearchData, ISearchProductViewProps } from '@msdyn365-commerce-modules/search';\r\nimport { INodeProps, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport React from 'react';\r\n\r\nimport { ISearchProps } from '../../definition-extensions/search.ext.props.autogenerated';\r\n\r\n/**\r\n * Render Products Suggestion result heading.\r\n * @param productSuggestionsHeading -The products suggestion result heading.\r\n * @returns The JSX Element.\r\n */\r\nconst renderProductSuggestionsTitle = (productSuggestionsHeading: string): JSX.Element => {\r\n const productAutoSuggestionHeading = productSuggestionsHeading ? productSuggestionsHeading : 'Products';\r\n\r\n return
    {productAutoSuggestionHeading}
    ;\r\n};\r\n\r\n/**\r\n * Render Products Suggestion result heading.\r\n * @param props -The props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderProductNotFoundResultsImage = (props: ISearchProps): JSX.Element | null => {\r\n const noSearchResultImage: IImageData | undefined = props.config.noSearchResultImage;\r\n if (!noSearchResultImage || !noSearchResultImage.src) {\r\n return null;\r\n }\r\n return (\r\n \r\n );\r\n};\r\n\r\n/**\r\n * Render Products No result section.\r\n * @param props -The props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderProductNotFoundResults = (props: ISearchProps): JSX.Element => {\r\n return (\r\n \r\n
    {renderProductNotFoundResultsImage(props)}
    \r\n
    {props.resources.noResultContentHeadingText}
    \r\n
    \r\n {props.resources.noResultContentParagraphText}\r\n
    \r\n
    \r\n );\r\n};\r\n\r\n/**\r\n * Render Product suggestion result.\r\n * @param productSuggest -The product suggest Node props.\r\n * @param ulProduct -The List Node props.\r\n * @param props -The props.\r\n * @param productSuggestions -The Product suggestion result.\r\n * @param isLoadingAutoSuggest - The autosuggestion loading flag.\r\n * @param isLoadingNode - The autosuggestion loading node.\r\n * @returns The JSX Element.\r\n */\r\nexport const ProductSuggestionsComponent = (\r\n productSuggest: INodeProps,\r\n ulProduct: INodeProps,\r\n props: ISearchProps,\r\n productSuggestions?: ISearchProductViewProps,\r\n isLoadingAutoSuggest?: boolean,\r\n isLoadingNode?: React.ReactNode\r\n): JSX.Element => {\r\n const liProduct: INodeProps = {\r\n tag: 'li',\r\n className: 'msc-no-result-content'\r\n };\r\n return productSuggestions ? (\r\n \r\n {renderProductSuggestionsTitle(props.resources.productSuggestionHeading)}\r\n \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 {item.text}\r\n {item.price}\r\n \r\n \r\n );\r\n })}\r\n \r\n \r\n ) : (\r\n \r\n {renderProductSuggestionsTitle(props.resources.productSuggestionHeading)}\r\n \r\n {renderProductNotFoundResults(props)}\r\n \r\n \r\n );\r\n};\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\nimport { StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { ISearchData, ISearchFormViewProps, ISearchViewProps } from '@msdyn365-commerce-modules/search';\r\nimport { Button, format, isMobile, Module, Node, VariantType } from '@msdyn365-commerce-modules/utilities';\r\nimport React, { useCallback, useEffect, useState } from 'react';\r\n\r\nimport { ISearchProps } from '../definition-extensions/search.ext.props.autogenerated';\r\nimport { CategorySuggestionsComponent } from './components/search.categorysuggest';\r\nimport { FormComponent } from './components/search.form';\r\n// import { KeywordSuggestionsComponent } from './components/search.keywordsuggest';\r\nimport { ProductSuggestionsComponent } from './components/search.productsuggest';\r\n\r\n/**\r\n * Render Title for AutoSuggest.\r\n * @param searchSuggestionHeading -The heading resource string.\r\n * @param searchText -The search string.\r\n * @returns -The JSX Element.\r\n */\r\nconst renderTitle = (searchSuggestionHeading: string, searchText: string): JSX.Element => {\r\n const searchTextString = '\"'.concat(searchText.concat('\"'));\r\n const searchAutoSuggestionHeading = searchSuggestionHeading\r\n ? format(searchSuggestionHeading, searchTextString)\r\n : `Search for ${searchTextString}`;\r\n\r\n return {searchAutoSuggestionHeading};\r\n};\r\n\r\n/**\r\n * Search View.\r\n * @param props - The view props.\r\n * @returns The JSX Element.\r\n */\r\nconst SearchView: React.FC> = (\r\n props: ISearchViewProps & ISearchProps\r\n): JSX.Element => {\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 // UlKeyword,\r\n UlProduct,\r\n form,\r\n // autosuggestKeyword,\r\n autosuggestProduct,\r\n SearchForm,\r\n FormWrapper,\r\n label,\r\n context,\r\n isLoadingAutoSuggest,\r\n isLoadingNode,\r\n callbacks: { handleCancelSearchFocused, handleCancelSearchChange }\r\n } = props;\r\n\r\n const {\r\n searchSuggestionHeading,\r\n categorySuggestionHeading,\r\n // keywordsHeading,\r\n noResultText,\r\n clearSearchButtonText\r\n } = props.resources;\r\n\r\n const [searchTextString, setSearchTextString] = useState();\r\n const [isMobilePort, setIsMobile] = useState(false);\r\n const searchRef = React.useRef();\r\n\r\n useEffect(() => {\r\n setSearchTextString(searchText);\r\n }, [searchText]);\r\n\r\n useEffect(() => {\r\n document.addEventListener('click', event => {\r\n const showBtn = document.querySelector('.ms-search__label.bx-show');\r\n const hideBtn = document.querySelector('.ms-search__label.bx-hide');\r\n const target = event.target as HTMLElement;\r\n if (checkMatchParent(target, showBtn as HTMLElement)) {\r\n clearSearch();\r\n }\r\n if (searchRef && hideBtn && !checkMatchParent(target as Node, searchRef.current)) {\r\n handleCancelSearchChange();\r\n clearSearch();\r\n }\r\n });\r\n\r\n return () => {\r\n document.removeEventListener('click', () => {});\r\n };\r\n }, []);\r\n\r\n const checkMatchParent = (target: Node | null, element?: HTMLElement): boolean => {\r\n if (!target) {\r\n return false;\r\n }\r\n if (target && target === element) {\r\n return true;\r\n }\r\n return checkMatchParent(target?.parentNode, element);\r\n };\r\n\r\n /**\r\n * ClearSearch callback method to clear search string.\r\n */\r\n const clearSearch = (): void => {\r\n setSearchTextString('');\r\n\r\n const propsForm = props.form as ISearchFormViewProps;\r\n const propsFormInput = propsForm.input as React.DetailedHTMLProps, HTMLInputElement>;\r\n const propsFormInputCurrent = (propsFormInput.ref as React.RefObject).current;\r\n\r\n if (propsFormInputCurrent) {\r\n propsFormInputCurrent.value = '';\r\n }\r\n\r\n propsFormInput.value = '';\r\n props.searchText = '';\r\n props.FormWrapper.action = '';\r\n };\r\n\r\n const isMobileViewport = useCallback(() => {\r\n const isMobileView = isMobile({ variant: VariantType.Browser, context: context.request }) === 'xs';\r\n setIsMobile(isMobileView);\r\n }, [context]);\r\n\r\n useEffect(() => {\r\n window.addEventListener('resize', isMobileViewport);\r\n isMobileViewport();\r\n }, [isMobileViewport]);\r\n\r\n const viewport = isMobile({ variant: VariantType.Browser, context: context.request });\r\n\r\n const isMobileView = viewport === 'sm' || viewport === 'xs';\r\n\r\n AutoSuggest.className = !StringExtensions.isNullOrEmpty(searchTextString)\r\n ? `${AutoSuggest.className} show`\r\n : `${AutoSuggest.className} hide`;\r\n const isSearchText: boolean = !StringExtensions.isNullOrEmpty(searchTextString);\r\n\r\n return (\r\n \r\n {label}\r\n {FormComponent(\r\n form as ISearchFormViewProps,\r\n SearchForm,\r\n FormWrapper,\r\n isMobilePort,\r\n clearSearchButtonText,\r\n props,\r\n isSearchText,\r\n clearSearch\r\n )}\r\n {!isMobileView && (\r\n \r\n {!StringExtensions.isNullOrEmpty(searchTextString) ? (\r\n {AutoSuggestAriaLabelText}\r\n ) : (\r\n ''\r\n )}\r\n {!StringExtensions.isNullOrEmpty(searchTextString) ? (\r\n <>\r\n \r\n \r\n {renderTitle(searchSuggestionHeading, searchText)}\r\n \r\n \r\n \r\n {CategorySuggestionsComponent(\r\n categorySuggestionHeading,\r\n noResultText,\r\n props,\r\n isLoadingAutoSuggest,\r\n isLoadingNode\r\n )}\r\n {/* {KeywordSuggestionsComponent(\r\n KeywordSuggest,\r\n UlKeyword,\r\n keywordsHeading,\r\n noResultText,\r\n autosuggestKeyword,\r\n isLoadingAutoSuggest,\r\n isLoadingNode\r\n )} */}\r\n \r\n {ProductSuggestionsComponent(\r\n ProductSuggest,\r\n UlProduct,\r\n props,\r\n autosuggestProduct,\r\n isLoadingAutoSuggest,\r\n isLoadingNode\r\n )}\r\n \r\n \r\n ) : null}\r\n \r\n )}\r\n {isMobileView && props.isSearchFormExpanded && (\r\n \r\n {!StringExtensions.isNullOrEmpty(searchTextString) ? (\r\n {AutoSuggestAriaLabelText}\r\n ) : (\r\n ''\r\n )}\r\n {!StringExtensions.isNullOrEmpty(searchTextString) ? (\r\n <>\r\n \r\n {(form as ISearchFormViewProps).cancelBtn}\r\n {renderTitle(searchSuggestionHeading, searchText)}\r\n \r\n \r\n \r\n {CategorySuggestionsComponent(\r\n categorySuggestionHeading,\r\n noResultText,\r\n props,\r\n isLoadingAutoSuggest,\r\n isLoadingNode\r\n )}\r\n {/* {KeywordSuggestionsComponent(\r\n KeywordSuggest,\r\n UlKeyword,\r\n keywordsHeading,\r\n noResultText,\r\n autosuggestKeyword,\r\n isLoadingAutoSuggest,\r\n isLoadingNode\r\n )} */}\r\n \r\n {ProductSuggestionsComponent(\r\n ProductSuggest,\r\n UlProduct,\r\n props,\r\n autosuggestProduct,\r\n isLoadingAutoSuggest,\r\n isLoadingNode\r\n )}\r\n \r\n \r\n ) : null}\r\n \r\n )}\r\n \r\n );\r\n};\r\nexport default SearchView;\r\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","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\nimport { ISearchData, ISearchViewProps } from '@msdyn365-commerce-modules/search';\r\nimport { Node } from '@msdyn365-commerce-modules/utilities';\r\nimport React from 'react';\r\n\r\nimport { ISearchProps } from '../../definition-extensions/search.ext.props.autogenerated';\r\n\r\n/**\r\n * Render Categories heading.\r\n * @param inCategoriesHeading - The Keywords result heading.\r\n * @returns The JSX Element.\r\n */\r\nconst renderCategorySuggestionsTitle = (inCategoriesHeading: string): JSX.Element => {\r\n const categoryAutoSuggestionHeading = 'Search in categories';\r\n\r\n return
    {categoryAutoSuggestionHeading}
    ;\r\n};\r\n\r\n/**\r\n * Render Categories suggestion result.\r\n * @param inCategoriesHeading - The Categories result heading.\r\n * @param noResultText - The \"No Result\" text.\r\n * @param props - The Categories suggestion result.\r\n * @param isLoadingAutoSuggest - The autosuggestion loading flag.\r\n * @param isLoadingNode - The autosuggestion loading node.\r\n * @returns The JSX Element.\r\n */\r\nexport const CategorySuggestionsComponent = (\r\n inCategoriesHeading: string,\r\n noResultText: string,\r\n props: ISearchViewProps & ISearchProps,\r\n isLoadingAutoSuggest?: boolean,\r\n isLoadingNode?: React.ReactNode\r\n): JSX.Element => {\r\n return props.autosuggestCategory ? (\r\n \r\n {renderCategorySuggestionsTitle(inCategoriesHeading)}\r\n \r\n {isLoadingAutoSuggest && isLoadingNode}\r\n {!isLoadingAutoSuggest &&\r\n props.autosuggestCategory.text.map(text => {\r\n return text;\r\n })}\r\n \r\n \r\n ) : (\r\n \r\n {renderCategorySuggestionsTitle(inCategoriesHeading)}\r\n \r\n
  • {noResultText}
  • \r\n
    \r\n
    \r\n );\r\n};\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\nimport { IImageData, Image } from '@msdyn365-commerce/core';\r\nimport { ISearchData } from '@msdyn365-commerce-modules/search';\r\nimport { Node } from '@msdyn365-commerce-modules/utilities';\r\nimport React from 'react';\r\n\r\nimport { ISearchProps } from '../../definition-extensions/search.ext.props.autogenerated';\r\n\r\n/**\r\n * Render Products Suggestion result heading.\r\n * @param props -The props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderProductNotFoundResultsImage = (props: ISearchProps): JSX.Element | null => {\r\n const noSearchResultImage: IImageData | undefined = props.config.noSearchResultImage;\r\n if (!noSearchResultImage || !noSearchResultImage.src) {\r\n return null;\r\n }\r\n const imageSettings = {\r\n lazyload: true,\r\n viewports: {\r\n xs: { w: 100, h: 100, q: 'w=100&h=100&q=60&m=6' }\r\n }\r\n };\r\n return (\r\n \r\n );\r\n};\r\n\r\n/**\r\n * Render Product suggestion result.\r\n * @param props -The props.\r\n * @returns The JSX Element.\r\n */\r\nexport const MobileAutoSuggestEmptyComponent = (props: ISearchProps): JSX.Element => {\r\n return (\r\n \r\n
    {renderProductNotFoundResultsImage(props)}
    \r\n
    \r\n
    {props.resources.emptyMobileSearchTextHeading}
    \r\n
    {props.resources.emptyMobileSearchText}
    \r\n
    \r\n
    \r\n );\r\n};\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\nimport { ISearchData, ISearchFormViewProps } from '@msdyn365-commerce-modules/search';\r\nimport { Button, INodeProps, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport React from 'react';\r\n\r\nimport { ISearchProps } from '../../definition-extensions/search.ext.props.autogenerated';\r\nimport { MobileAutoSuggestEmptyComponent } from './search.mobile.empty';\r\n\r\n/**\r\n * Render Clear button for mobile viewport.\r\n * @param clearSearchButtonText -The Clear button text.\r\n * @param clearSearch -Clear Search callback.\r\n * @returns -The JSX Element.\r\n */\r\nconst renderClearButton = (clearSearchButtonText: string, clearSearch: () => void): JSX.Element => {\r\n return (\r\n \r\n );\r\n};\r\n\r\n/**\r\n * Render Search form.\r\n * @param form -Form view props.\r\n * @param searchForm -Search Form props.\r\n * @param formWrapper -Form Wrapper props.\r\n * @param isMobile -Is mobile viewport flag.\r\n * @param clearSearchButtonText -The Clear button text.\r\n * @param props -The props for resource.\r\n * @param isSearchText -Is SearchText flag for input text.\r\n * @param clearSearch -Clear Search callback.\r\n * @returns -The JSX Element.\r\n */\r\nexport const FormComponent = (\r\n form: ISearchFormViewProps,\r\n searchForm: INodeProps,\r\n formWrapper: INodeProps,\r\n isMobile: boolean,\r\n clearSearchButtonText: string,\r\n props: ISearchProps,\r\n isSearchText: boolean,\r\n clearSearch: () => void\r\n): JSX.Element => {\r\n // const cancelButtonNode = (\r\n // \r\n // );\r\n\r\n return isMobile ? (\r\n \r\n {form.cancelBtn}\r\n \r\n {form.input}\r\n {isSearchText && renderClearButton(clearSearchButtonText, clearSearch)}\r\n {!isSearchText ? MobileAutoSuggestEmptyComponent(props) : null}\r\n \r\n \r\n ) : (\r\n \r\n \r\n {form.submitBtn}\r\n {form.input}\r\n {/* {isSearchText && cancelButtonNode} */}\r\n \r\n \r\n );\r\n};\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\nimport { IImageData, Image } from '@msdyn365-commerce/core';\r\nimport { ISearchData, ISearchProductViewProps } from '@msdyn365-commerce-modules/search';\r\nimport { INodeProps, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport React from 'react';\r\n\r\nimport { ISearchProps } from '../../definition-extensions/search.ext.props.autogenerated';\r\n\r\n/**\r\n * Render Products Suggestion result heading.\r\n * @param productSuggestionsHeading -The products suggestion result heading.\r\n * @returns The JSX Element.\r\n */\r\nconst renderProductSuggestionsTitle = (productSuggestionsHeading: string): JSX.Element => {\r\n const productAutoSuggestionHeading = productSuggestionsHeading ? productSuggestionsHeading : 'Products';\r\n\r\n return
    {productAutoSuggestionHeading}
    ;\r\n};\r\n\r\n/**\r\n * Render Products Suggestion result heading.\r\n * @param props -The props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderProductNotFoundResultsImage = (props: ISearchProps): JSX.Element | null => {\r\n const noSearchResultImage: IImageData | undefined = props.config.noSearchResultImage;\r\n if (!noSearchResultImage || !noSearchResultImage.src) {\r\n return null;\r\n }\r\n return (\r\n \r\n );\r\n};\r\n\r\n/**\r\n * Render Products No result section.\r\n * @param props -The props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderProductNotFoundResults = (props: ISearchProps): JSX.Element => {\r\n return (\r\n \r\n
    {renderProductNotFoundResultsImage(props)}
    \r\n
    {props.resources.noResultContentHeadingText}
    \r\n
    \r\n {props.resources.noResultContentParagraphText}\r\n
    \r\n
    \r\n );\r\n};\r\n\r\n/**\r\n * Render Product suggestion result.\r\n * @param productSuggest -The product suggest Node props.\r\n * @param ulProduct -The List Node props.\r\n * @param props -The props.\r\n * @param productSuggestions -The Product suggestion result.\r\n * @param isLoadingAutoSuggest - The autosuggestion loading flag.\r\n * @param isLoadingNode - The autosuggestion loading node.\r\n * @returns The JSX Element.\r\n */\r\nexport const ProductSuggestionsComponent = (\r\n productSuggest: INodeProps,\r\n ulProduct: INodeProps,\r\n props: ISearchProps,\r\n productSuggestions?: ISearchProductViewProps,\r\n isLoadingAutoSuggest?: boolean,\r\n isLoadingNode?: React.ReactNode\r\n): JSX.Element => {\r\n const liProduct: INodeProps = {\r\n tag: 'li',\r\n className: 'msc-no-result-content'\r\n };\r\n return productSuggestions ? (\r\n \r\n {renderProductSuggestionsTitle(props.resources.productSuggestionHeading)}\r\n \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 {item.text}\r\n {item.price}\r\n \r\n \r\n );\r\n })}\r\n \r\n \r\n ) : (\r\n \r\n {renderProductSuggestionsTitle(props.resources.productSuggestionHeading)}\r\n \r\n {renderProductNotFoundResults(props)}\r\n \r\n \r\n );\r\n};\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\nimport { StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { ISearchData, ISearchFormViewProps, ISearchViewProps } from '@msdyn365-commerce-modules/search';\r\nimport { Button, format, isMobile, Module, Node, VariantType } from '@msdyn365-commerce-modules/utilities';\r\nimport React, { useCallback, useEffect, useState } from 'react';\r\n\r\nimport { ISearchProps } from '../definition-extensions/search.ext.props.autogenerated';\r\nimport { CategorySuggestionsComponent } from './components/search.categorysuggest';\r\nimport { FormComponent } from './components/search.form';\r\n// import { KeywordSuggestionsComponent } from './components/search.keywordsuggest';\r\nimport { ProductSuggestionsComponent } from './components/search.productsuggest';\r\n\r\n/**\r\n * Render Title for AutoSuggest.\r\n * @param searchSuggestionHeading -The heading resource string.\r\n * @param searchText -The search string.\r\n * @returns -The JSX Element.\r\n */\r\nconst renderTitle = (searchSuggestionHeading: string, searchText: string): JSX.Element => {\r\n const searchTextString = '\"'.concat(searchText.concat('\"'));\r\n const searchAutoSuggestionHeading = searchSuggestionHeading\r\n ? format(searchSuggestionHeading, searchTextString)\r\n : `Search for ${searchTextString}`;\r\n\r\n return {searchAutoSuggestionHeading};\r\n};\r\n\r\n/**\r\n * Search View.\r\n * @param props - The view props.\r\n * @returns The JSX Element.\r\n */\r\nconst SearchView: React.FC> = (\r\n props: ISearchViewProps & ISearchProps\r\n): JSX.Element => {\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 // UlKeyword,\r\n UlProduct,\r\n form,\r\n // autosuggestKeyword,\r\n autosuggestProduct,\r\n SearchForm,\r\n FormWrapper,\r\n label,\r\n context,\r\n isLoadingAutoSuggest,\r\n isLoadingNode,\r\n callbacks: { handleCancelSearchFocused, handleCancelSearchChange }\r\n } = props;\r\n\r\n const {\r\n searchSuggestionHeading,\r\n categorySuggestionHeading,\r\n // keywordsHeading,\r\n noResultText,\r\n clearSearchButtonText\r\n } = props.resources;\r\n\r\n const [searchTextString, setSearchTextString] = useState();\r\n const [isMobilePort, setIsMobile] = useState(false);\r\n const searchRef = React.useRef();\r\n\r\n useEffect(() => {\r\n setSearchTextString(searchText);\r\n }, [searchText]);\r\n\r\n useEffect(() => {\r\n document.addEventListener('click', event => {\r\n const showBtn = document.querySelector('.ms-search__label.bx-show');\r\n const hideBtn = document.querySelector('.ms-search__label.bx-hide');\r\n const target = event.target as HTMLElement;\r\n if (checkMatchParent(target, showBtn as HTMLElement)) {\r\n clearSearch();\r\n }\r\n if (searchRef && hideBtn && !checkMatchParent(target as Node, searchRef.current)) {\r\n handleCancelSearchChange();\r\n clearSearch();\r\n }\r\n });\r\n\r\n return () => {\r\n document.removeEventListener('click', () => {});\r\n };\r\n }, []);\r\n\r\n const checkMatchParent = (target: Node | null, element?: HTMLElement): boolean => {\r\n if (!target) {\r\n return false;\r\n }\r\n if (target && target === element) {\r\n return true;\r\n }\r\n return checkMatchParent(target?.parentNode, element);\r\n };\r\n\r\n /**\r\n * ClearSearch callback method to clear search string.\r\n */\r\n const clearSearch = (): void => {\r\n setSearchTextString('');\r\n\r\n const propsForm = props.form as ISearchFormViewProps;\r\n const propsFormInput = propsForm.input as React.DetailedHTMLProps, HTMLInputElement>;\r\n const propsFormInputCurrent = (propsFormInput.ref as React.RefObject).current;\r\n\r\n if (propsFormInputCurrent) {\r\n propsFormInputCurrent.value = '';\r\n }\r\n\r\n propsFormInput.value = '';\r\n props.searchText = '';\r\n props.FormWrapper.action = '';\r\n };\r\n\r\n const isMobileViewport = useCallback(() => {\r\n const isMobileView = isMobile({ variant: VariantType.Browser, context: context.request }) === 'xs';\r\n setIsMobile(isMobileView);\r\n }, [context]);\r\n\r\n useEffect(() => {\r\n window.addEventListener('resize', isMobileViewport);\r\n isMobileViewport();\r\n }, [isMobileViewport]);\r\n\r\n const viewport = isMobile({ variant: VariantType.Browser, context: context.request });\r\n\r\n const isMobileView = viewport === 'sm' || viewport === 'xs';\r\n\r\n AutoSuggest.className = !StringExtensions.isNullOrEmpty(searchTextString)\r\n ? `${AutoSuggest.className} show`\r\n : `${AutoSuggest.className} hide`;\r\n const isSearchText: boolean = !StringExtensions.isNullOrEmpty(searchTextString);\r\n\r\n return (\r\n \r\n {label}\r\n {FormComponent(\r\n form as ISearchFormViewProps,\r\n SearchForm,\r\n FormWrapper,\r\n isMobilePort,\r\n clearSearchButtonText,\r\n props,\r\n isSearchText,\r\n clearSearch\r\n )}\r\n {!isMobileView && (\r\n \r\n {!StringExtensions.isNullOrEmpty(searchTextString) ? (\r\n {AutoSuggestAriaLabelText}\r\n ) : (\r\n ''\r\n )}\r\n {!StringExtensions.isNullOrEmpty(searchTextString) ? (\r\n <>\r\n \r\n \r\n {renderTitle(searchSuggestionHeading, searchText)}\r\n \r\n \r\n \r\n {CategorySuggestionsComponent(\r\n categorySuggestionHeading,\r\n noResultText,\r\n props,\r\n isLoadingAutoSuggest,\r\n isLoadingNode\r\n )}\r\n {/* {KeywordSuggestionsComponent(\r\n KeywordSuggest,\r\n UlKeyword,\r\n keywordsHeading,\r\n noResultText,\r\n autosuggestKeyword,\r\n isLoadingAutoSuggest,\r\n isLoadingNode\r\n )} */}\r\n \r\n {ProductSuggestionsComponent(\r\n ProductSuggest,\r\n UlProduct,\r\n props,\r\n autosuggestProduct,\r\n isLoadingAutoSuggest,\r\n isLoadingNode\r\n )}\r\n \r\n \r\n ) : null}\r\n \r\n )}\r\n {isMobileView && props.isSearchFormExpanded && (\r\n \r\n {!StringExtensions.isNullOrEmpty(searchTextString) ? (\r\n {AutoSuggestAriaLabelText}\r\n ) : (\r\n ''\r\n )}\r\n {!StringExtensions.isNullOrEmpty(searchTextString) ? (\r\n <>\r\n \r\n {(form as ISearchFormViewProps).cancelBtn}\r\n {renderTitle(searchSuggestionHeading, searchText)}\r\n \r\n \r\n \r\n {CategorySuggestionsComponent(\r\n categorySuggestionHeading,\r\n noResultText,\r\n props,\r\n isLoadingAutoSuggest,\r\n isLoadingNode\r\n )}\r\n {/* {KeywordSuggestionsComponent(\r\n KeywordSuggest,\r\n UlKeyword,\r\n keywordsHeading,\r\n noResultText,\r\n autosuggestKeyword,\r\n isLoadingAutoSuggest,\r\n isLoadingNode\r\n )} */}\r\n \r\n {ProductSuggestionsComponent(\r\n ProductSuggest,\r\n UlProduct,\r\n props,\r\n autosuggestProduct,\r\n isLoadingAutoSuggest,\r\n isLoadingNode\r\n )}\r\n \r\n \r\n ) : null}\r\n \r\n )}\r\n \r\n );\r\n};\r\nexport default SearchView;\r\n","module.exports = React;","/*!\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","module.exports = ReactDOM;","/*!\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","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\nimport { ISearchData, ISearchViewProps } from '@msdyn365-commerce-modules/search';\r\nimport { Node } from '@msdyn365-commerce-modules/utilities';\r\nimport React from 'react';\r\n\r\nimport { ISearchProps } from '../../definition-extensions/search.ext.props.autogenerated';\r\n\r\n/**\r\n * Render Categories heading.\r\n * @param inCategoriesHeading - The Keywords result heading.\r\n * @returns The JSX Element.\r\n */\r\nconst renderCategorySuggestionsTitle = (inCategoriesHeading: string): JSX.Element => {\r\n const categoryAutoSuggestionHeading = 'Search in categories';\r\n\r\n return
    {categoryAutoSuggestionHeading}
    ;\r\n};\r\n\r\n/**\r\n * Render Categories suggestion result.\r\n * @param inCategoriesHeading - The Categories result heading.\r\n * @param noResultText - The \"No Result\" text.\r\n * @param props - The Categories suggestion result.\r\n * @param isLoadingAutoSuggest - The autosuggestion loading flag.\r\n * @param isLoadingNode - The autosuggestion loading node.\r\n * @returns The JSX Element.\r\n */\r\nexport const CategorySuggestionsComponent = (\r\n inCategoriesHeading: string,\r\n noResultText: string,\r\n props: ISearchViewProps & ISearchProps,\r\n isLoadingAutoSuggest?: boolean,\r\n isLoadingNode?: React.ReactNode\r\n): JSX.Element => {\r\n return props.autosuggestCategory ? (\r\n \r\n {renderCategorySuggestionsTitle(inCategoriesHeading)}\r\n \r\n {isLoadingAutoSuggest && isLoadingNode}\r\n {!isLoadingAutoSuggest &&\r\n props.autosuggestCategory.text.map(text => {\r\n return text;\r\n })}\r\n \r\n \r\n ) : (\r\n \r\n {renderCategorySuggestionsTitle(inCategoriesHeading)}\r\n \r\n
  • {noResultText}
  • \r\n
    \r\n
    \r\n );\r\n};\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\nimport { IImageData, Image } from '@msdyn365-commerce/core';\r\nimport { ISearchData } from '@msdyn365-commerce-modules/search';\r\nimport { Node } from '@msdyn365-commerce-modules/utilities';\r\nimport React from 'react';\r\n\r\nimport { ISearchProps } from '../../definition-extensions/search.ext.props.autogenerated';\r\n\r\n/**\r\n * Render Products Suggestion result heading.\r\n * @param props -The props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderProductNotFoundResultsImage = (props: ISearchProps): JSX.Element | null => {\r\n const noSearchResultImage: IImageData | undefined = props.config.noSearchResultImage;\r\n if (!noSearchResultImage || !noSearchResultImage.src) {\r\n return null;\r\n }\r\n const imageSettings = {\r\n lazyload: true,\r\n viewports: {\r\n xs: { w: 100, h: 100, q: 'w=100&h=100&q=60&m=6' }\r\n }\r\n };\r\n return (\r\n \r\n );\r\n};\r\n\r\n/**\r\n * Render Product suggestion result.\r\n * @param props -The props.\r\n * @returns The JSX Element.\r\n */\r\nexport const MobileAutoSuggestEmptyComponent = (props: ISearchProps): JSX.Element => {\r\n return (\r\n \r\n
    {renderProductNotFoundResultsImage(props)}
    \r\n
    \r\n
    {props.resources.emptyMobileSearchTextHeading}
    \r\n
    {props.resources.emptyMobileSearchText}
    \r\n
    \r\n
    \r\n );\r\n};\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\nimport { ISearchData, ISearchFormViewProps } from '@msdyn365-commerce-modules/search';\r\nimport { Button, INodeProps, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport React from 'react';\r\n\r\nimport { ISearchProps } from '../../definition-extensions/search.ext.props.autogenerated';\r\nimport { MobileAutoSuggestEmptyComponent } from './search.mobile.empty';\r\n\r\n/**\r\n * Render Clear button for mobile viewport.\r\n * @param clearSearchButtonText -The Clear button text.\r\n * @param clearSearch -Clear Search callback.\r\n * @returns -The JSX Element.\r\n */\r\nconst renderClearButton = (clearSearchButtonText: string, clearSearch: () => void): JSX.Element => {\r\n return (\r\n \r\n );\r\n};\r\n\r\n/**\r\n * Render Search form.\r\n * @param form -Form view props.\r\n * @param searchForm -Search Form props.\r\n * @param formWrapper -Form Wrapper props.\r\n * @param isMobile -Is mobile viewport flag.\r\n * @param clearSearchButtonText -The Clear button text.\r\n * @param props -The props for resource.\r\n * @param isSearchText -Is SearchText flag for input text.\r\n * @param clearSearch -Clear Search callback.\r\n * @returns -The JSX Element.\r\n */\r\nexport const FormComponent = (\r\n form: ISearchFormViewProps,\r\n searchForm: INodeProps,\r\n formWrapper: INodeProps,\r\n isMobile: boolean,\r\n clearSearchButtonText: string,\r\n props: ISearchProps,\r\n isSearchText: boolean,\r\n clearSearch: () => void\r\n): JSX.Element => {\r\n // const cancelButtonNode = (\r\n // \r\n // );\r\n\r\n return isMobile ? (\r\n \r\n {form.cancelBtn}\r\n \r\n {form.input}\r\n {isSearchText && renderClearButton(clearSearchButtonText, clearSearch)}\r\n {!isSearchText ? MobileAutoSuggestEmptyComponent(props) : null}\r\n \r\n \r\n ) : (\r\n \r\n \r\n {form.submitBtn}\r\n {form.input}\r\n {/* {isSearchText && cancelButtonNode} */}\r\n \r\n \r\n );\r\n};\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\nimport { IImageData, Image } from '@msdyn365-commerce/core';\r\nimport { ISearchData, ISearchProductViewProps } from '@msdyn365-commerce-modules/search';\r\nimport { INodeProps, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport React from 'react';\r\n\r\nimport { ISearchProps } from '../../definition-extensions/search.ext.props.autogenerated';\r\n\r\n/**\r\n * Render Products Suggestion result heading.\r\n * @param productSuggestionsHeading -The products suggestion result heading.\r\n * @returns The JSX Element.\r\n */\r\nconst renderProductSuggestionsTitle = (productSuggestionsHeading: string): JSX.Element => {\r\n const productAutoSuggestionHeading = productSuggestionsHeading ? productSuggestionsHeading : 'Products';\r\n\r\n return
    {productAutoSuggestionHeading}
    ;\r\n};\r\n\r\n/**\r\n * Render Products Suggestion result heading.\r\n * @param props -The props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderProductNotFoundResultsImage = (props: ISearchProps): JSX.Element | null => {\r\n const noSearchResultImage: IImageData | undefined = props.config.noSearchResultImage;\r\n if (!noSearchResultImage || !noSearchResultImage.src) {\r\n return null;\r\n }\r\n return (\r\n \r\n );\r\n};\r\n\r\n/**\r\n * Render Products No result section.\r\n * @param props -The props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderProductNotFoundResults = (props: ISearchProps): JSX.Element => {\r\n return (\r\n \r\n
    {renderProductNotFoundResultsImage(props)}
    \r\n
    {props.resources.noResultContentHeadingText}
    \r\n
    \r\n {props.resources.noResultContentParagraphText}\r\n
    \r\n
    \r\n );\r\n};\r\n\r\n/**\r\n * Render Product suggestion result.\r\n * @param productSuggest -The product suggest Node props.\r\n * @param ulProduct -The List Node props.\r\n * @param props -The props.\r\n * @param productSuggestions -The Product suggestion result.\r\n * @param isLoadingAutoSuggest - The autosuggestion loading flag.\r\n * @param isLoadingNode - The autosuggestion loading node.\r\n * @returns The JSX Element.\r\n */\r\nexport const ProductSuggestionsComponent = (\r\n productSuggest: INodeProps,\r\n ulProduct: INodeProps,\r\n props: ISearchProps,\r\n productSuggestions?: ISearchProductViewProps,\r\n isLoadingAutoSuggest?: boolean,\r\n isLoadingNode?: React.ReactNode\r\n): JSX.Element => {\r\n const liProduct: INodeProps = {\r\n tag: 'li',\r\n className: 'msc-no-result-content'\r\n };\r\n return productSuggestions ? (\r\n \r\n {renderProductSuggestionsTitle(props.resources.productSuggestionHeading)}\r\n \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 {item.text}\r\n {item.price}\r\n \r\n \r\n );\r\n })}\r\n \r\n \r\n ) : (\r\n \r\n {renderProductSuggestionsTitle(props.resources.productSuggestionHeading)}\r\n \r\n {renderProductNotFoundResults(props)}\r\n \r\n \r\n );\r\n};\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\nimport { StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { ISearchData, ISearchFormViewProps, ISearchViewProps } from '@msdyn365-commerce-modules/search';\r\nimport { Button, format, isMobile, Module, Node, VariantType } from '@msdyn365-commerce-modules/utilities';\r\nimport React, { useCallback, useEffect, useState } from 'react';\r\n\r\nimport { ISearchProps } from '../definition-extensions/search.ext.props.autogenerated';\r\nimport { CategorySuggestionsComponent } from './components/search.categorysuggest';\r\nimport { FormComponent } from './components/search.form';\r\n// import { KeywordSuggestionsComponent } from './components/search.keywordsuggest';\r\nimport { ProductSuggestionsComponent } from './components/search.productsuggest';\r\n\r\n/**\r\n * Render Title for AutoSuggest.\r\n * @param searchSuggestionHeading -The heading resource string.\r\n * @param searchText -The search string.\r\n * @returns -The JSX Element.\r\n */\r\nconst renderTitle = (searchSuggestionHeading: string, searchText: string): JSX.Element => {\r\n const searchTextString = '\"'.concat(searchText.concat('\"'));\r\n const searchAutoSuggestionHeading = searchSuggestionHeading\r\n ? format(searchSuggestionHeading, searchTextString)\r\n : `Search for ${searchTextString}`;\r\n\r\n return {searchAutoSuggestionHeading};\r\n};\r\n\r\n/**\r\n * Search View.\r\n * @param props - The view props.\r\n * @returns The JSX Element.\r\n */\r\nconst SearchView: React.FC> = (\r\n props: ISearchViewProps & ISearchProps\r\n): JSX.Element => {\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 // UlKeyword,\r\n UlProduct,\r\n form,\r\n // autosuggestKeyword,\r\n autosuggestProduct,\r\n SearchForm,\r\n FormWrapper,\r\n label,\r\n context,\r\n isLoadingAutoSuggest,\r\n isLoadingNode,\r\n callbacks: { handleCancelSearchFocused, handleCancelSearchChange }\r\n } = props;\r\n\r\n const {\r\n searchSuggestionHeading,\r\n categorySuggestionHeading,\r\n // keywordsHeading,\r\n noResultText,\r\n clearSearchButtonText\r\n } = props.resources;\r\n\r\n const [searchTextString, setSearchTextString] = useState();\r\n const [isMobilePort, setIsMobile] = useState(false);\r\n const searchRef = React.useRef();\r\n\r\n useEffect(() => {\r\n setSearchTextString(searchText);\r\n }, [searchText]);\r\n\r\n useEffect(() => {\r\n document.addEventListener('click', event => {\r\n const showBtn = document.querySelector('.ms-search__label.bx-show');\r\n const hideBtn = document.querySelector('.ms-search__label.bx-hide');\r\n const target = event.target as HTMLElement;\r\n if (checkMatchParent(target, showBtn as HTMLElement)) {\r\n clearSearch();\r\n }\r\n if (searchRef && hideBtn && !checkMatchParent(target as Node, searchRef.current)) {\r\n handleCancelSearchChange();\r\n clearSearch();\r\n }\r\n });\r\n\r\n return () => {\r\n document.removeEventListener('click', () => {});\r\n };\r\n }, []);\r\n\r\n const checkMatchParent = (target: Node | null, element?: HTMLElement): boolean => {\r\n if (!target) {\r\n return false;\r\n }\r\n if (target && target === element) {\r\n return true;\r\n }\r\n return checkMatchParent(target?.parentNode, element);\r\n };\r\n\r\n /**\r\n * ClearSearch callback method to clear search string.\r\n */\r\n const clearSearch = (): void => {\r\n setSearchTextString('');\r\n\r\n const propsForm = props.form as ISearchFormViewProps;\r\n const propsFormInput = propsForm.input as React.DetailedHTMLProps, HTMLInputElement>;\r\n const propsFormInputCurrent = (propsFormInput.ref as React.RefObject).current;\r\n\r\n if (propsFormInputCurrent) {\r\n propsFormInputCurrent.value = '';\r\n }\r\n\r\n propsFormInput.value = '';\r\n props.searchText = '';\r\n props.FormWrapper.action = '';\r\n };\r\n\r\n const isMobileViewport = useCallback(() => {\r\n const isMobileView = isMobile({ variant: VariantType.Browser, context: context.request }) === 'xs';\r\n setIsMobile(isMobileView);\r\n }, [context]);\r\n\r\n useEffect(() => {\r\n window.addEventListener('resize', isMobileViewport);\r\n isMobileViewport();\r\n }, [isMobileViewport]);\r\n\r\n const viewport = isMobile({ variant: VariantType.Browser, context: context.request });\r\n\r\n const isMobileView = viewport === 'sm' || viewport === 'xs';\r\n\r\n AutoSuggest.className = !StringExtensions.isNullOrEmpty(searchTextString)\r\n ? `${AutoSuggest.className} show`\r\n : `${AutoSuggest.className} hide`;\r\n const isSearchText: boolean = !StringExtensions.isNullOrEmpty(searchTextString);\r\n\r\n return (\r\n \r\n {label}\r\n {FormComponent(\r\n form as ISearchFormViewProps,\r\n SearchForm,\r\n FormWrapper,\r\n isMobilePort,\r\n clearSearchButtonText,\r\n props,\r\n isSearchText,\r\n clearSearch\r\n )}\r\n {!isMobileView && (\r\n \r\n {!StringExtensions.isNullOrEmpty(searchTextString) ? (\r\n {AutoSuggestAriaLabelText}\r\n ) : (\r\n ''\r\n )}\r\n {!StringExtensions.isNullOrEmpty(searchTextString) ? (\r\n <>\r\n \r\n \r\n {renderTitle(searchSuggestionHeading, searchText)}\r\n \r\n \r\n \r\n {CategorySuggestionsComponent(\r\n categorySuggestionHeading,\r\n noResultText,\r\n props,\r\n isLoadingAutoSuggest,\r\n isLoadingNode\r\n )}\r\n {/* {KeywordSuggestionsComponent(\r\n KeywordSuggest,\r\n UlKeyword,\r\n keywordsHeading,\r\n noResultText,\r\n autosuggestKeyword,\r\n isLoadingAutoSuggest,\r\n isLoadingNode\r\n )} */}\r\n \r\n {ProductSuggestionsComponent(\r\n ProductSuggest,\r\n UlProduct,\r\n props,\r\n autosuggestProduct,\r\n isLoadingAutoSuggest,\r\n isLoadingNode\r\n )}\r\n \r\n \r\n ) : null}\r\n \r\n )}\r\n {isMobileView && props.isSearchFormExpanded && (\r\n \r\n {!StringExtensions.isNullOrEmpty(searchTextString) ? (\r\n {AutoSuggestAriaLabelText}\r\n ) : (\r\n ''\r\n )}\r\n {!StringExtensions.isNullOrEmpty(searchTextString) ? (\r\n <>\r\n \r\n {(form as ISearchFormViewProps).cancelBtn}\r\n {renderTitle(searchSuggestionHeading, searchText)}\r\n \r\n \r\n \r\n {CategorySuggestionsComponent(\r\n categorySuggestionHeading,\r\n noResultText,\r\n props,\r\n isLoadingAutoSuggest,\r\n isLoadingNode\r\n )}\r\n {/* {KeywordSuggestionsComponent(\r\n KeywordSuggest,\r\n UlKeyword,\r\n keywordsHeading,\r\n noResultText,\r\n autosuggestKeyword,\r\n isLoadingAutoSuggest,\r\n isLoadingNode\r\n )} */}\r\n \r\n {ProductSuggestionsComponent(\r\n ProductSuggest,\r\n UlProduct,\r\n props,\r\n autosuggestProduct,\r\n isLoadingAutoSuggest,\r\n isLoadingNode\r\n )}\r\n \r\n \r\n ) : null}\r\n \r\n )}\r\n \r\n );\r\n};\r\nexport default SearchView;\r\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 { 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';\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 const searchSuggestions = await getSearchSuggestionsAsync(\n { callerContext: ctx, queryResultSettings: { Paging: { Top: input.topResultsCount } } },\n searchCriteria\n );\n\n if (searchSuggestions && searchSuggestions.length > 0) {\n // Generate image url\n searchSuggestions.map(\n (item: SearchSuggestion) =>\n (item.ImageUrl = item.ImageUrl ? generateImageUrl(item.ImageUrl, ctx.requestContext.apiSettings) : '')\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\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 { ISearchData } from '../search.data';\nimport { ISearchProps } from '../search.props.autogenerated';\n\nexport interface ISearchCategorySuggestProps {\n searchCategorySuggestClass: string;\n searchPageURL: string;\n searchQsp: string | undefined;\n hitPrefix: string;\n hitSuffix: string;\n autoSuggestProps: ISearchProps;\n searchText: string;\n searchRefiners: ProductRefiner[] | undefined;\n suggestions: SearchSuggestion[] | undefined;\n telemetryContent?: ITelemetryContent;\n shouldShowFullPath?: boolean;\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 const titleNode = _renderTitle(categorySuggestionHeading, searchText);\n\n return { title: titleNode, 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 payLoad.contentAction.etext = item.Value;\n const attribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n return (\n
  • \n \n {_generateLink(item, searchText, props) && _getHighlightedText(splitValue ? splitValue : '', hitPrefix, hitSuffix)}\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","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Button } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface ISearchFormProps {\n hideSearchLabel: boolean | undefined;\n isSearchFormExpanded?: boolean | undefined;\n disableSubmitSearch: boolean | undefined;\n searchTextInput: React.RefObject;\n maxChars: number;\n searchQsp: string;\n searchPlaceholder: string;\n query: string;\n ariaLabelCancel: string;\n ariaLabelSearch: string;\n ariaLabelSubmit: string;\n handleCancelSearchChange(): void;\n handleInputChange(query: string): void;\n}\n\nexport interface ISearchFormViewProps {\n input: React.ReactNode;\n submitBtn: React.ReactNode;\n cancelBtn: React.ReactNode;\n}\n\n/**\n * On Input Change functionality.\n * @param handleInputChange -Input change function.\n * @returns Set updated input value.\n */\nconst onInputChangeFunction = (handleInputChange: (query: string) => void) => (event: React.ChangeEvent) => {\n handleInputChange(event.target.value || '');\n};\nexport const FormComponent = (props: ISearchFormProps): ISearchFormViewProps => {\n const {\n searchQsp,\n searchPlaceholder,\n hideSearchLabel,\n searchTextInput,\n handleInputChange,\n maxChars,\n disableSubmitSearch,\n handleCancelSearchChange,\n query,\n ariaLabelCancel,\n ariaLabelSearch,\n ariaLabelSubmit\n } = props;\n\n const onInputChange = onInputChangeFunction(handleInputChange);\n\n const inputNode = !hideSearchLabel ? (\n \n ) : (\n \n );\n\n const submitBtnNode = !disableSubmitSearch && \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 { PriceComponent } from '@msdyn365-commerce/components';\nimport { getRichTextHtml, IActionContext, IImageSettings, Image, ITelemetry } from '@msdyn365-commerce/core';\nimport { SearchSuggestion } from '@msdyn365-commerce/retail-proxy';\nimport { getProductPageUrlSync, ObjectExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n getPayloadObject,\n getTelemetryAttributes,\n INodeProps,\n IPayLoad,\n ITelemetryContent,\n NodeTag\n} from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISearchData } from '../search.data';\nimport { ISearchProps } from '../search.props.autogenerated';\n\n/**\n * Search product suggest resources.\n */\nexport interface ISearchProductSuggestResources {\n freePriceText: string;\n}\n\nexport interface ISearchProductSuggestProps {\n searchProductSuggestClass: string;\n searchPageURL: string;\n searchQsp: string | undefined;\n hitPrefix: string;\n hitSuffix: string;\n autoSuggestProps: ISearchProps;\n searchText: string;\n suggestions: SearchSuggestion[] | undefined;\n telemetry: ITelemetry;\n moduleType: string;\n moduleId: string;\n telemetryContent?: ITelemetryContent;\n resources?: ISearchProductSuggestResources;\n}\n\nexport interface ISearchProductViewProps {\n title: React.ReactNode;\n items: ISearchProductItemViewProps[];\n}\n\nexport interface ISearchProductItemViewProps {\n text: React.ReactNode;\n thumbnail: React.ReactNode;\n price: React.ReactNode;\n LiProduct: INodeProps;\n AProduct: INodeProps;\n id: string | undefined;\n}\n\nlet payLoad: IPayLoad;\nlet telemetryContent: ITelemetryContent | undefined;\n\n/**\n * ProductSuggestionsComponent.\n * @param props\n */\nexport const ProductSuggestionsComponent = (props: ISearchProductSuggestProps): ISearchProductViewProps | undefined => {\n const {\n suggestions,\n hitSuffix,\n hitPrefix,\n autoSuggestProps: {\n context: { actionContext },\n resources: { productSuggestionHeading }\n },\n moduleType,\n moduleId\n } = props;\n const reactNodes: ISearchProductItemViewProps[] = [];\n telemetryContent = props.telemetryContent;\n payLoad = getPayloadObject('click', props.telemetryContent!, '');\n\n suggestions?.map(item => {\n reactNodes.push(_assembleNode(item, hitPrefix, hitSuffix, actionContext, props, moduleType, moduleId));\n });\n\n const titleNode = _renderTitle(productSuggestionHeading);\n\n return { title: titleNode, items: reactNodes };\n};\n\nconst _renderTitle = (productSuggestionHeading: string) => {\n const productAutoSuggestionHeading = productSuggestionHeading ? productSuggestionHeading : 'Go to products';\n\n return
  • {productAutoSuggestionHeading}
  • ;\n};\n\nconst _assembleNode = (\n item: SearchSuggestion,\n hitPrefix: string,\n hitSuffix: string,\n actionContext: IActionContext,\n props: ISearchProductSuggestProps,\n moduleType: string,\n moduleId: string\n): ISearchProductItemViewProps => {\n const altText =\n item.Value && item.Value.replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n\n const price = item.Value3?.Value?.DecimalValue;\n return {\n text: _getHighlightedText(item.Value ? item.Value : '', hitPrefix, hitSuffix),\n thumbnail: _renderThumbnail(item, altText ? altText : '', props),\n price: !ObjectExtensions.isNullOrUndefined(price) && _renderPrice(price, price, moduleId, moduleType, props),\n LiProduct: _getLiWrapper(),\n AProduct: _getAWrapper(item, hitPrefix, hitSuffix, actionContext, props),\n id: item.Id\n };\n};\n\nconst _getLiWrapper = () => {\n return {\n className: 'msc-autoSuggest__productResults-item',\n tag: 'li' as NodeTag\n };\n};\n\nconst _getAWrapper = (\n item: SearchSuggestion,\n hitPrefix: string,\n hitSuffix: string,\n actionContext: IActionContext,\n props: ISearchProductSuggestProps\n) => {\n const {\n autoSuggestProps: { context }\n } = props;\n const ariaLabel =\n item.Value && item.Value.replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n\n payLoad.contentAction.recid = item.Id;\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\n const productPrice = context.cultureFormatter.formatCurrency(item.Value3!.Value!.DecimalValue!);\n\n return {\n className: 'msc-autoSuggest__productResults-item',\n tag: 'a' as NodeTag,\n 'aria-label': `${ariaLabel!} ${productPrice}`,\n href: _generateLink(item, hitPrefix, hitSuffix, actionContext),\n ...attribute\n };\n};\n\nconst _generateLink = (suggestion: SearchSuggestion, hitPrefix: string, hitSuffix: string, actionContext: IActionContext) => {\n const formattedLink = (suggestion.Value as string)\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '')\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n return suggestion.Value && suggestion.Id\n ? getProductPageUrlSync(formattedLink, (suggestion.Id as unknown) as number, actionContext, undefined)\n : '';\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 return (\n // eslint-disable-next-line react/no-danger\n \n );\n};\n\nconst _renderPrice = (\n adjustedPrice: number,\n basePrice: number,\n moduleId: string,\n moduleType: string,\n props: ISearchProductSuggestProps\n): JSX.Element | null => {\n const {\n autoSuggestProps: { context }\n } = props;\n\n return (\n \n );\n};\n\nconst _renderThumbnail = (suggestion: SearchSuggestion, altText: string, props: ISearchProductSuggestProps): JSX.Element | null => {\n const {\n autoSuggestProps: {\n context: {\n request: { gridSettings }\n },\n config: { imageSettings }\n }\n } = props;\n if (imageSettings) {\n imageSettings.cropFocalRegion = true;\n }\n\n if (!suggestion || !suggestion.ImageUrl) {\n props.telemetry.error('Search suggestion content is empty, module wont render.');\n return null;\n }\n\n const defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=40&h=40&m=6', w: 0, h: 0 },\n lg: { q: 'w=40&h=40&m=6', w: 0, h: 0 },\n xl: { q: 'w=40&h=40&m=6', w: 0, h: 0 }\n },\n lazyload: true,\n cropFocalRegion: true\n };\n\n return (\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 { Autosuggestions } from '@msdyn365-commerce/commerce-entities';\nimport MsDyn365, { getCatalogId, getUrlSync } from '@msdyn365-commerce/core';\nimport { ProductRefiner, ProductRefinerSource, ProductsDataActions } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions, ObjectExtensions, Random, validateCatalogId } from '@msdyn365-commerce-modules/retail-actions';\nimport { createSearchStateInput } from '@msdyn365-commerce-modules/search-utilities';\nimport { getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent, KeyCodes } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { debounce } from 'lodash';\nimport { Spinner, SpinnerSize } from 'office-ui-fabric-react';\nimport * as React from 'react';\n\nimport getSearchSuggestionsAction, { AutoSuggestInput, SuggestionType } from './actions/get-auto-suggest-suggestions';\nimport {\n CategorySuggestionsComponent,\n FormComponent,\n ISearchCategoryViewProps,\n ISearchKeywordViewProps,\n ISearchProductViewProps,\n KeywordSuggestionsComponent,\n LabelComponent,\n ProductSuggestionsComponent\n} from './components';\nimport { ISearchData } from './search.data';\nimport { ISearchProps, ISuggestionTypeCriterionData, SuggestionTypeCriterionSuggestionType } from './search.props.autogenerated';\n\nexport interface ISearchState {\n isSearchFormExpanded: boolean;\n searchText: string;\n searchKeywordSuggestClass: string;\n searchProductSuggestClass: string;\n searchCategorySuggestClass: string;\n suggestions: Autosuggestions | undefined;\n searchRefiners?: ProductRefiner[] | undefined;\n autoSuggestAriaLabel: string;\n isInitialState: boolean;\n isLoadingAutoSuggest?: boolean;\n}\n\nexport interface ISearchViewProps extends ISearchProps {\n Search: IModuleProps;\n AutoSuggestAriaLabel: INodeProps;\n AutoSuggestAriaLabelText: string;\n searchText: string;\n AutoSuggest: INodeProps;\n KeywordSuggest: INodeProps;\n ProductSuggest: INodeProps;\n CategorySuggest: INodeProps;\n SearchForm: INodeProps;\n FormWrapper: INodeProps;\n UlKeyword: INodeProps;\n UlProduct: INodeProps;\n UlCategory: INodeProps;\n label: React.ReactNode;\n form: React.ReactNode;\n autosuggestKeyword?: ISearchKeywordViewProps;\n autosuggestProduct?: ISearchProductViewProps;\n autosuggestCategory?: ISearchCategoryViewProps;\n callbacks: {\n handleCancelSearchChange(): void;\n handleCancelSearchFocused?(): void;\n };\n isSearchFormExpanded: boolean;\n isLoadingAutoSuggest?: boolean;\n isLoadingNode?: React.ReactNode;\n}\n\n/**\n *\n * Search module.\n * @extends {React.Component, ISearchState>}\n */\nclass Search extends React.Component, ISearchState> {\n private readonly searchTextInput: React.RefObject;\n\n private readonly searchCollapsedLabel: React.RefObject;\n\n private readonly formReference: React.RefObject;\n\n private readonly maxChars: number;\n\n private readonly topResultsCount?: number;\n\n private readonly hitPrefix: string = '{';\n\n private readonly hitSuffix: string = '}';\n\n private readonly waitTime: number = 500;\n\n private readonly autoSuggestResultScreenReaderDiv: React.RefObject;\n\n private readonly autoSuggestResultDiv: React.RefObject;\n\n private readonly searchFormClass: string;\n\n private readonly searchLabelClass: string;\n\n private readonly telemetryContent: ITelemetryContent;\n\n private loadSuggestionsRequestId?: string;\n\n private inputSuggestionType: ISuggestionTypeCriterionData[];\n\n // @ts-expect-error\n private cancellabelDebounce: debounce;\n\n public constructor(props: ISearchProps) {\n super(props);\n this.searchTextInput = React.createRef();\n this.searchCollapsedLabel = React.createRef();\n this.autoSuggestResultScreenReaderDiv = React.createRef();\n this.autoSuggestResultDiv = React.createRef();\n this.formReference = React.createRef();\n this.state = {\n isSearchFormExpanded: false,\n searchText: '',\n searchKeywordSuggestClass: 'ms-search__autoSuggest__keyword',\n searchProductSuggestClass: 'ms-search__autoSuggest__product',\n searchCategorySuggestClass: 'ms-search__autoSuggest__category',\n suggestions: undefined,\n searchRefiners: undefined,\n autoSuggestAriaLabel: '',\n isInitialState: true,\n isLoadingAutoSuggest: false\n };\n this.maxChars =\n (this.props.context &&\n this.props.context.app &&\n this.props.context.app.config &&\n this.props.context.app.config.searchInputMaxLength) ||\n 50;\n\n this.inputSuggestionType = [];\n this.topResultsCount = this.props.config && this.props.config.topResultsCount ? this.props.config.topResultsCount : 5;\n this.searchFormClass = 'ms-search__form';\n this.searchLabelClass = 'ms-search__label';\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n\n this._initSuggestionTypes();\n }\n\n public async componentDidMount(): Promise {\n document.body && document.body.addEventListener('mousedown', this._focusOutTarget);\n window && window.addEventListener('keyup', this._keyup);\n }\n\n public componentWillUnmount(): void {\n document.body && document.body.removeEventListener('mousedown', this._focusOutTarget, false);\n window && window.removeEventListener('keyup', this._keyup, false);\n }\n\n public componentDidUpdate(): void {\n const {\n config: { hideSearchLabel }\n } = this.props;\n const { isSearchFormExpanded, isInitialState } = this.state;\n\n if (!this.props.context.request.params.isEditor) {\n if (!hideSearchLabel && isSearchFormExpanded) {\n this.searchTextInput && this.searchTextInput.current && this.searchTextInput.current.focus();\n } else if (!isInitialState) {\n this.searchCollapsedLabel && this.searchCollapsedLabel.current && this.searchCollapsedLabel.current.focus();\n }\n }\n }\n\n public shouldComponentUpdate(nextProps: ISearchProps, nextState: ISearchState): boolean {\n if (this.state === nextState && this.props === nextProps) {\n return false;\n }\n return true;\n }\n\n // eslint-disable-next-line complexity -- ignore complexity.\n public render(): JSX.Element {\n const {\n context,\n resources: { searchtext, searchLabelArialLabel, cancelBtnAriaLabel, searchBtnAriaLabel, submitBtnAriaLabel },\n config: { hideSearchLabel, disableSubmitSearch, searchplaceholderText, shouldShowFullCategoryPath, className = '' }\n } = this.props;\n\n const {\n isSearchFormExpanded,\n searchText,\n searchKeywordSuggestClass,\n searchProductSuggestClass,\n searchCategorySuggestClass,\n suggestions,\n searchRefiners,\n isLoadingAutoSuggest\n } = this.state;\n\n const searchQsp = (context && context.app && context.app.config && context.app.config.searchQueryStringParameter) || 'q';\n const searchPageURL = getUrlSync('search', context && context.actionContext) || '';\n const searchURL = this._appendQueryParams(searchPageURL, searchText, searchQsp);\n const searchPlaceholder = searchplaceholderText && searchplaceholderText.length > 0 ? searchplaceholderText : 'Search in Fabrikam';\n\n const keywordSuggestions = suggestions?.AllSearchResults?.filter(\n suggestion => suggestion.SuggestionType === SuggestionType.Keyword || suggestion.SuggestionType === SuggestionType.None\n );\n const productSuggestions = suggestions?.AllSearchResults?.filter(\n suggestion => suggestion.SuggestionType === SuggestionType.Product\n );\n const categoryRefiners = searchRefiners?.find(refiner => {\n return refiner.SourceValue === ProductRefinerSource.Category;\n });\n const categorySuggestions = suggestions?.AllSearchResults?.filter(suggestion => {\n if (suggestion.SuggestionType !== SuggestionType.Category) {\n return false;\n }\n const refiner = categoryRefiners?.Values?.find(item => {\n return `${item.RefinerRecordId ?? 0}` === suggestion.Id;\n });\n\n return !ObjectExtensions.isNullOrUndefined(refiner);\n });\n\n const viewProps: ISearchViewProps = {\n ...(this.props as ISearchProps),\n\n Search: {\n moduleProps: this.props,\n className: `${classnames('ms-search', className)} ${disableSubmitSearch ? 'no-submit' : 'with-submit'}`\n },\n AutoSuggestAriaLabel: {\n tag: 'div',\n className: 'msc-autoSuggest__screen-reader',\n 'aria-live': 'assertive',\n ref: this.autoSuggestResultScreenReaderDiv\n },\n AutoSuggestAriaLabelText: this.state.autoSuggestAriaLabel,\n searchText: this.state.searchText,\n AutoSuggest: {\n ref: this.autoSuggestResultDiv,\n className: 'ms-search__autoSuggest'\n },\n KeywordSuggest: {\n className: searchKeywordSuggestClass\n },\n ProductSuggest: {\n className: searchProductSuggestClass\n },\n CategorySuggest: {\n className: searchCategorySuggestClass\n },\n SearchForm: {\n className: `${this.searchFormClass} ${isSearchFormExpanded ? 'bx-show' : 'bx-hide'}`\n },\n FormWrapper: {\n tag: 'form',\n ref: this.formReference,\n className: 'ms-search__searchForm',\n 'aria-label': 'Search',\n name: 'searchForm',\n role: 'search',\n action: searchURL,\n autoComplete: 'off',\n onSubmit: this._handleSubmit\n },\n UlKeyword: {\n tag: 'ul',\n className: classnames('msc-autoSuggest__keywordResults-items', className)\n },\n UlProduct: {\n tag: 'ul',\n className: classnames('msc-autoSuggest__productResults-items', className)\n },\n UlCategory: {\n tag: 'ul',\n className: classnames('msc-autoSuggest__categoryResults-items', className)\n },\n label: LabelComponent({\n isSearchFormExpanded,\n searchLabelClass: `${this.searchLabelClass} ${isSearchFormExpanded ? 'bx-hide' : 'bx-show'}`,\n searchtext,\n searchLabelArialLabel,\n searchCollapsedLabel: this.searchCollapsedLabel,\n hideSearchLabel,\n handleCancelSearchChange: this._handleCancelSearchChange,\n telemetryContent: this.telemetryContent\n }),\n form: FormComponent({\n ariaLabelCancel: cancelBtnAriaLabel,\n ariaLabelSearch: searchBtnAriaLabel,\n ariaLabelSubmit: submitBtnAriaLabel,\n hideSearchLabel,\n searchTextInput: this.searchTextInput,\n disableSubmitSearch,\n handleInputChange: this._handleInputChange,\n handleCancelSearchChange: this._handleCancelSearchChange,\n maxChars: this.maxChars,\n searchQsp,\n searchPlaceholder,\n query: searchText\n }),\n autosuggestKeyword:\n searchText &&\n searchText.length > 0 &&\n (isLoadingAutoSuggest || (keywordSuggestions && ArrayExtensions.hasElements(keywordSuggestions)))\n ? KeywordSuggestionsComponent({\n searchKeywordSuggestClass,\n searchPageURL,\n searchQsp,\n hitPrefix: this.hitPrefix,\n hitSuffix: this.hitSuffix,\n autoSuggestProps: this.props,\n searchText,\n suggestions: keywordSuggestions,\n telemetryContent: this.telemetryContent\n })\n : undefined,\n autosuggestProduct:\n searchText &&\n searchText.length > 0 &&\n (isLoadingAutoSuggest || (productSuggestions && ArrayExtensions.hasElements(productSuggestions)))\n ? ProductSuggestionsComponent({\n searchProductSuggestClass,\n searchPageURL,\n searchQsp,\n hitPrefix: this.hitPrefix,\n hitSuffix: this.hitSuffix,\n autoSuggestProps: this.props,\n searchText,\n suggestions: productSuggestions,\n telemetry: this.props.telemetry,\n moduleType: this.props.typeName,\n moduleId: this.props.id,\n telemetryContent: this.telemetryContent,\n resources: this.props.resources\n })\n : undefined,\n autosuggestCategory:\n searchText &&\n searchText.length > 0 &&\n (isLoadingAutoSuggest || (categorySuggestions && ArrayExtensions.hasElements(categorySuggestions)))\n ? CategorySuggestionsComponent({\n searchCategorySuggestClass,\n searchPageURL,\n searchQsp,\n hitPrefix: this.hitPrefix,\n hitSuffix: this.hitSuffix,\n autoSuggestProps: this.props,\n searchText,\n suggestions: categorySuggestions,\n searchRefiners,\n telemetryContent: this.telemetryContent,\n shouldShowFullPath: shouldShowFullCategoryPath\n })\n : undefined,\n callbacks: {\n handleCancelSearchChange: this._handleCancelSearchChange,\n handleCancelSearchFocused: this._handleCancelSearchFocused\n },\n isSearchFormExpanded: this.state.isSearchFormExpanded,\n isLoadingAutoSuggest,\n isLoadingNode: this._isLoadingNode()\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n private _initSuggestionTypes() {\n const suggestionTypes = this.props.config.suggestionTypeCriterion;\n\n const suggestions = ArrayExtensions.unique(ArrayExtensions.validValues(suggestionTypes));\n if (!ArrayExtensions.hasElements(suggestions)) {\n this.inputSuggestionType = [\n { SuggestionType: SuggestionTypeCriterionSuggestionType.keyword },\n { SuggestionType: SuggestionTypeCriterionSuggestionType.product },\n { SuggestionType: SuggestionTypeCriterionSuggestionType.scopedCategory }\n ];\n return;\n }\n\n const validSuggestions = suggestions.filter(suggestion => suggestion.SuggestionType);\n if (ArrayExtensions.hasElements(validSuggestions)) {\n this.inputSuggestionType = validSuggestions;\n return;\n }\n\n this.inputSuggestionType = [];\n }\n\n /**\n * Function to create the ReactNode for loading Autosuggest result.\n * @returns ReachNode for loading Autosuggest result.\n */\n private readonly _isLoadingNode = (): React.ReactNode => {\n const loadingText = this.props.resources.autoSuggestResultLoadingMessage;\n return ;\n };\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private readonly _focusOutTarget = (e: any): void => {\n const { suggestions } = this.state;\n\n if (suggestions && suggestions.AllSearchResults && e.target.closest('.ms-search') === null) {\n this._clearAutoSuggestState();\n }\n };\n\n private readonly _keyup = (e: KeyboardEvent): void => {\n const { suggestions } = this.state;\n\n if (suggestions && suggestions.AllSearchResults && e.keyCode === KeyCodes.Escape) {\n this._clearAutoSuggestState();\n } else if (this.state.isSearchFormExpanded && e.keyCode === KeyCodes.Escape) {\n if (this.state.isSearchFormExpanded) {\n this.setState({ isSearchFormExpanded: false });\n }\n }\n\n if (\n !(\n (this.formReference.current && this.formReference.current.contains((e.target as unknown) as Node)) ||\n (this.autoSuggestResultDiv.current && this.autoSuggestResultDiv.current.contains((e.target as unknown) as Node))\n )\n ) {\n if (suggestions && suggestions.AllSearchResults) {\n this._clearAutoSuggestState();\n }\n\n if (this.state.isSearchFormExpanded) {\n this.setState({ isSearchFormExpanded: false });\n }\n }\n };\n\n private readonly _clearAutoSuggestState = (): void => {\n const {\n context: { actionContext },\n data: { searchState }\n } = this.props;\n\n if (this.searchTextInput.current && this.searchTextInput.current.value.length > 0) {\n searchState.searchText = '';\n searchState.defaultBasicSearchUrl = '';\n searchState.searchQueryStringParameter = '';\n actionContext ? actionContext.update(createSearchStateInput(searchState), searchState) : null;\n this.searchTextInput.current.value = '';\n }\n\n this.setState({ searchText: '', suggestions: undefined, searchRefiners: undefined });\n };\n\n private async _getSearchSuggestions(loadSuggestionsRequestId: string, query: string) {\n try {\n const searchSuggestions = await getSearchSuggestionsAction(\n new AutoSuggestInput(query, this.topResultsCount, this._getSuggestionType(), this.hitPrefix, this.hitSuffix),\n this.props.context.actionContext\n );\n if (loadSuggestionsRequestId !== this.loadSuggestionsRequestId) {\n return undefined;\n }\n return searchSuggestions;\n } catch (error) {\n if (loadSuggestionsRequestId !== this.loadSuggestionsRequestId) {\n return undefined;\n }\n this.setState({ suggestions: undefined, searchRefiners: undefined, autoSuggestAriaLabel: this._setAutoSuggestResultCount() });\n this.props.telemetry.exception(error);\n this.props.telemetry.debug('Unable to get auto suggest results');\n return undefined;\n }\n }\n\n private async _updateSearchRefiners(loadSuggestionsRequestId: string, query: string, suggestions: Autosuggestions | undefined) {\n try {\n const refiners = await this._getSearchRefiners(query);\n if (loadSuggestionsRequestId !== this.loadSuggestionsRequestId) {\n return;\n }\n this.setState({\n suggestions,\n searchRefiners: refiners,\n autoSuggestAriaLabel: this._setAutoSuggestResultCount(suggestions),\n isLoadingAutoSuggest: false\n });\n } catch (error) {\n if (loadSuggestionsRequestId !== this.loadSuggestionsRequestId) {\n return;\n }\n this.setState({ suggestions, searchRefiners: undefined, autoSuggestAriaLabel: this._setAutoSuggestResultCount(suggestions) });\n this.props.telemetry.exception(error);\n this.props.telemetry.debug('Unable to get refiners results');\n }\n }\n\n private _loadSuggestions(query: string) {\n this.cancellabelDebounce = debounce(async () => {\n this.setState({ isLoadingAutoSuggest: true });\n const loadSuggestionsRequestId = Random.Guid.generateGuid();\n this.loadSuggestionsRequestId = loadSuggestionsRequestId;\n const searchSuggestions = await this._getSearchSuggestions(loadSuggestionsRequestId, query);\n await this._updateSearchRefiners(loadSuggestionsRequestId, query, searchSuggestions);\n }, this.waitTime);\n\n setTimeout(() => {\n this.cancellabelDebounce();\n }, 0);\n }\n\n private readonly _handleInputChange = (query: string): void => {\n if (!query || query.length <= this.maxChars) {\n this.setState({ searchText: query });\n }\n\n if (this.cancellabelDebounce) {\n this.cancellabelDebounce.cancel();\n }\n\n const {\n context,\n data: { searchState }\n } = this.props;\n\n if (context) {\n if (query && query.length > 0) {\n if (query.length > this.maxChars) {\n return;\n }\n\n if (ArrayExtensions.hasElements(this.inputSuggestionType)) {\n this._loadSuggestions(query);\n }\n\n searchState.searchText = query;\n } else {\n this.setState({ suggestions: undefined, searchRefiners: undefined });\n searchState.searchText = '';\n }\n context.actionContext.update(createSearchStateInput(searchState), searchState);\n }\n };\n\n private _getSuggestionType(): string {\n const distinctSuggestionTypes: string[] = this.inputSuggestionType.map(\n suggestionTypeItem => suggestionTypeItem.SuggestionType!.charAt(0).toUpperCase() + suggestionTypeItem.SuggestionType!.slice(1)\n );\n return distinctSuggestionTypes.join(',');\n }\n\n private async _getSearchRefiners(searchText: string): Promise {\n const { actionContext: ctx } = this.props.context;\n const catalogId = getCatalogId(ctx.requestContext);\n validateCatalogId(catalogId);\n return ProductsDataActions.getProductSearchRefinersAsync(\n { callerContext: ctx },\n {\n SearchCondition: searchText,\n Context: {\n ChannelId: +ctx.requestContext.apiSettings.channelId,\n CatalogId: catalogId\n }\n }\n );\n }\n\n private readonly _handleSubmit = (\n e: React.MouseEvent | React.KeyboardEvent | React.FormEvent\n ): void => {\n const {\n config: { disableSubmitSearch },\n context: {\n actionContext,\n app: {\n config: { searchQueryStringParameter }\n }\n }\n } = this.props;\n\n const query = this.searchTextInput.current && this.searchTextInput.current.value;\n e.preventDefault();\n\n if (!query || (query && query.length === 0) || disableSubmitSearch) {\n this.searchTextInput && this.searchTextInput.current && this.searchTextInput.current.focus();\n } else {\n const searchQsp = searchQueryStringParameter || 'q';\n const searchURL = this._appendQueryParams(getUrlSync('search', actionContext) || '', query, searchQsp);\n document.location.href = searchURL;\n }\n };\n\n private readonly _handleCancelSearchChange = (): void => {\n const { isSearchFormExpanded, suggestions } = this.state;\n\n if (!isSearchFormExpanded) {\n this.setState({\n isSearchFormExpanded: true,\n searchText: '',\n isInitialState: false\n });\n } else {\n if (suggestions && suggestions.AllSearchResults) {\n this._clearAutoSuggestState();\n }\n this.setState({ isSearchFormExpanded: false });\n }\n };\n\n private readonly _handleCancelSearchFocused = (): void => {\n const { suggestions } = this.state;\n if (!(suggestions && suggestions.AllSearchResults)) {\n this._clearAutoSuggestState();\n this.setState({ isSearchFormExpanded: false });\n }\n };\n\n private readonly _appendQueryParams = (route: string, query: string, qsp: string): string => {\n if (!MsDyn365.isBrowser) {\n return '';\n }\n\n const queryUrl = new URL(route, window.location.href);\n if (qsp && query) {\n queryUrl.searchParams.set(qsp, query);\n }\n\n return queryUrl.href;\n };\n\n private readonly _setAutoSuggestResultCount = (result?: Autosuggestions) => {\n if (this.autoSuggestResultScreenReaderDiv.current !== null) {\n const ariaLiveRegion = this.autoSuggestResultScreenReaderDiv.current;\n const suggestResultString = this.props.resources.autoSuggestFoundMessage;\n const emptyResultString = this.props.resources.noAutoSuggestionMessage;\n ariaLiveRegion.innerText =\n result && result.AllSearchResults && result.AllSearchResults.length > 0 ? suggestResultString : emptyResultString;\n ariaLiveRegion.setAttribute('aria-live', 'assertive');\n return ariaLiveRegion.innerText;\n }\n return '';\n };\n}\n\nexport default Search;\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\nimport { ISearchData, ISearchViewProps } from '@msdyn365-commerce-modules/search';\r\nimport { Node } from '@msdyn365-commerce-modules/utilities';\r\nimport React from 'react';\r\n\r\nimport { ISearchProps } from '../../definition-extensions/search.ext.props.autogenerated';\r\n\r\n/**\r\n * Render Categories heading.\r\n * @param inCategoriesHeading - The Keywords result heading.\r\n * @returns The JSX Element.\r\n */\r\nconst renderCategorySuggestionsTitle = (inCategoriesHeading: string): JSX.Element => {\r\n const categoryAutoSuggestionHeading = 'Search in categories';\r\n\r\n return
    {categoryAutoSuggestionHeading}
    ;\r\n};\r\n\r\n/**\r\n * Render Categories suggestion result.\r\n * @param inCategoriesHeading - The Categories result heading.\r\n * @param noResultText - The \"No Result\" text.\r\n * @param props - The Categories suggestion result.\r\n * @param isLoadingAutoSuggest - The autosuggestion loading flag.\r\n * @param isLoadingNode - The autosuggestion loading node.\r\n * @returns The JSX Element.\r\n */\r\nexport const CategorySuggestionsComponent = (\r\n inCategoriesHeading: string,\r\n noResultText: string,\r\n props: ISearchViewProps & ISearchProps,\r\n isLoadingAutoSuggest?: boolean,\r\n isLoadingNode?: React.ReactNode\r\n): JSX.Element => {\r\n return props.autosuggestCategory ? (\r\n \r\n {renderCategorySuggestionsTitle(inCategoriesHeading)}\r\n \r\n {isLoadingAutoSuggest && isLoadingNode}\r\n {!isLoadingAutoSuggest &&\r\n props.autosuggestCategory.text.map(text => {\r\n return text;\r\n })}\r\n \r\n \r\n ) : (\r\n \r\n {renderCategorySuggestionsTitle(inCategoriesHeading)}\r\n \r\n
  • {noResultText}
  • \r\n
    \r\n
    \r\n );\r\n};\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\nimport { IImageData, Image } from '@msdyn365-commerce/core';\r\nimport { ISearchData } from '@msdyn365-commerce-modules/search';\r\nimport { Node } from '@msdyn365-commerce-modules/utilities';\r\nimport React from 'react';\r\n\r\nimport { ISearchProps } from '../../definition-extensions/search.ext.props.autogenerated';\r\n\r\n/**\r\n * Render Products Suggestion result heading.\r\n * @param props -The props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderProductNotFoundResultsImage = (props: ISearchProps): JSX.Element | null => {\r\n const noSearchResultImage: IImageData | undefined = props.config.noSearchResultImage;\r\n if (!noSearchResultImage || !noSearchResultImage.src) {\r\n return null;\r\n }\r\n const imageSettings = {\r\n lazyload: true,\r\n viewports: {\r\n xs: { w: 100, h: 100, q: 'w=100&h=100&q=60&m=6' }\r\n }\r\n };\r\n return (\r\n \r\n );\r\n};\r\n\r\n/**\r\n * Render Product suggestion result.\r\n * @param props -The props.\r\n * @returns The JSX Element.\r\n */\r\nexport const MobileAutoSuggestEmptyComponent = (props: ISearchProps): JSX.Element => {\r\n return (\r\n \r\n
    {renderProductNotFoundResultsImage(props)}
    \r\n
    \r\n
    {props.resources.emptyMobileSearchTextHeading}
    \r\n
    {props.resources.emptyMobileSearchText}
    \r\n
    \r\n
    \r\n );\r\n};\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\nimport { ISearchData, ISearchFormViewProps } from '@msdyn365-commerce-modules/search';\r\nimport { Button, INodeProps, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport React from 'react';\r\n\r\nimport { ISearchProps } from '../../definition-extensions/search.ext.props.autogenerated';\r\nimport { MobileAutoSuggestEmptyComponent } from './search.mobile.empty';\r\n\r\n/**\r\n * Render Clear button for mobile viewport.\r\n * @param clearSearchButtonText -The Clear button text.\r\n * @param clearSearch -Clear Search callback.\r\n * @returns -The JSX Element.\r\n */\r\nconst renderClearButton = (clearSearchButtonText: string, clearSearch: () => void): JSX.Element => {\r\n return (\r\n \r\n );\r\n};\r\n\r\n/**\r\n * Render Search form.\r\n * @param form -Form view props.\r\n * @param searchForm -Search Form props.\r\n * @param formWrapper -Form Wrapper props.\r\n * @param isMobile -Is mobile viewport flag.\r\n * @param clearSearchButtonText -The Clear button text.\r\n * @param props -The props for resource.\r\n * @param isSearchText -Is SearchText flag for input text.\r\n * @param clearSearch -Clear Search callback.\r\n * @returns -The JSX Element.\r\n */\r\nexport const FormComponent = (\r\n form: ISearchFormViewProps,\r\n searchForm: INodeProps,\r\n formWrapper: INodeProps,\r\n isMobile: boolean,\r\n clearSearchButtonText: string,\r\n props: ISearchProps,\r\n isSearchText: boolean,\r\n clearSearch: () => void\r\n): JSX.Element => {\r\n // const cancelButtonNode = (\r\n // \r\n // );\r\n\r\n return isMobile ? (\r\n \r\n {form.cancelBtn}\r\n \r\n {form.input}\r\n {isSearchText && renderClearButton(clearSearchButtonText, clearSearch)}\r\n {!isSearchText ? MobileAutoSuggestEmptyComponent(props) : null}\r\n \r\n \r\n ) : (\r\n \r\n \r\n {form.submitBtn}\r\n {form.input}\r\n {/* {isSearchText && cancelButtonNode} */}\r\n \r\n \r\n );\r\n};\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\nimport { IImageData, Image } from '@msdyn365-commerce/core';\r\nimport { ISearchData, ISearchProductViewProps } from '@msdyn365-commerce-modules/search';\r\nimport { INodeProps, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport React from 'react';\r\n\r\nimport { ISearchProps } from '../../definition-extensions/search.ext.props.autogenerated';\r\n\r\n/**\r\n * Render Products Suggestion result heading.\r\n * @param productSuggestionsHeading -The products suggestion result heading.\r\n * @returns The JSX Element.\r\n */\r\nconst renderProductSuggestionsTitle = (productSuggestionsHeading: string): JSX.Element => {\r\n const productAutoSuggestionHeading = productSuggestionsHeading ? productSuggestionsHeading : 'Products';\r\n\r\n return
    {productAutoSuggestionHeading}
    ;\r\n};\r\n\r\n/**\r\n * Render Products Suggestion result heading.\r\n * @param props -The props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderProductNotFoundResultsImage = (props: ISearchProps): JSX.Element | null => {\r\n const noSearchResultImage: IImageData | undefined = props.config.noSearchResultImage;\r\n if (!noSearchResultImage || !noSearchResultImage.src) {\r\n return null;\r\n }\r\n return (\r\n \r\n );\r\n};\r\n\r\n/**\r\n * Render Products No result section.\r\n * @param props -The props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderProductNotFoundResults = (props: ISearchProps): JSX.Element => {\r\n return (\r\n \r\n
    {renderProductNotFoundResultsImage(props)}
    \r\n
    {props.resources.noResultContentHeadingText}
    \r\n
    \r\n {props.resources.noResultContentParagraphText}\r\n
    \r\n
    \r\n );\r\n};\r\n\r\n/**\r\n * Render Product suggestion result.\r\n * @param productSuggest -The product suggest Node props.\r\n * @param ulProduct -The List Node props.\r\n * @param props -The props.\r\n * @param productSuggestions -The Product suggestion result.\r\n * @param isLoadingAutoSuggest - The autosuggestion loading flag.\r\n * @param isLoadingNode - The autosuggestion loading node.\r\n * @returns The JSX Element.\r\n */\r\nexport const ProductSuggestionsComponent = (\r\n productSuggest: INodeProps,\r\n ulProduct: INodeProps,\r\n props: ISearchProps,\r\n productSuggestions?: ISearchProductViewProps,\r\n isLoadingAutoSuggest?: boolean,\r\n isLoadingNode?: React.ReactNode\r\n): JSX.Element => {\r\n const liProduct: INodeProps = {\r\n tag: 'li',\r\n className: 'msc-no-result-content'\r\n };\r\n return productSuggestions ? (\r\n \r\n {renderProductSuggestionsTitle(props.resources.productSuggestionHeading)}\r\n \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 {item.text}\r\n {item.price}\r\n \r\n \r\n );\r\n })}\r\n \r\n \r\n ) : (\r\n \r\n {renderProductSuggestionsTitle(props.resources.productSuggestionHeading)}\r\n \r\n {renderProductNotFoundResults(props)}\r\n \r\n \r\n );\r\n};\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\nimport { StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { ISearchData, ISearchFormViewProps, ISearchViewProps } from '@msdyn365-commerce-modules/search';\r\nimport { Button, format, isMobile, Module, Node, VariantType } from '@msdyn365-commerce-modules/utilities';\r\nimport React, { useCallback, useEffect, useState } from 'react';\r\n\r\nimport { ISearchProps } from '../definition-extensions/search.ext.props.autogenerated';\r\nimport { CategorySuggestionsComponent } from './components/search.categorysuggest';\r\nimport { FormComponent } from './components/search.form';\r\n// import { KeywordSuggestionsComponent } from './components/search.keywordsuggest';\r\nimport { ProductSuggestionsComponent } from './components/search.productsuggest';\r\n\r\n/**\r\n * Render Title for AutoSuggest.\r\n * @param searchSuggestionHeading -The heading resource string.\r\n * @param searchText -The search string.\r\n * @returns -The JSX Element.\r\n */\r\nconst renderTitle = (searchSuggestionHeading: string, searchText: string): JSX.Element => {\r\n const searchTextString = '\"'.concat(searchText.concat('\"'));\r\n const searchAutoSuggestionHeading = searchSuggestionHeading\r\n ? format(searchSuggestionHeading, searchTextString)\r\n : `Search for ${searchTextString}`;\r\n\r\n return {searchAutoSuggestionHeading};\r\n};\r\n\r\n/**\r\n * Search View.\r\n * @param props - The view props.\r\n * @returns The JSX Element.\r\n */\r\nconst SearchView: React.FC> = (\r\n props: ISearchViewProps & ISearchProps\r\n): JSX.Element => {\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 // UlKeyword,\r\n UlProduct,\r\n form,\r\n // autosuggestKeyword,\r\n autosuggestProduct,\r\n SearchForm,\r\n FormWrapper,\r\n label,\r\n context,\r\n isLoadingAutoSuggest,\r\n isLoadingNode,\r\n callbacks: { handleCancelSearchFocused, handleCancelSearchChange }\r\n } = props;\r\n\r\n const {\r\n searchSuggestionHeading,\r\n categorySuggestionHeading,\r\n // keywordsHeading,\r\n noResultText,\r\n clearSearchButtonText\r\n } = props.resources;\r\n\r\n const [searchTextString, setSearchTextString] = useState();\r\n const [isMobilePort, setIsMobile] = useState(false);\r\n const searchRef = React.useRef();\r\n\r\n useEffect(() => {\r\n setSearchTextString(searchText);\r\n }, [searchText]);\r\n\r\n useEffect(() => {\r\n document.addEventListener('click', event => {\r\n const showBtn = document.querySelector('.ms-search__label.bx-show');\r\n const hideBtn = document.querySelector('.ms-search__label.bx-hide');\r\n const target = event.target as HTMLElement;\r\n if (checkMatchParent(target, showBtn as HTMLElement)) {\r\n clearSearch();\r\n }\r\n if (searchRef && hideBtn && !checkMatchParent(target as Node, searchRef.current)) {\r\n handleCancelSearchChange();\r\n clearSearch();\r\n }\r\n });\r\n\r\n return () => {\r\n document.removeEventListener('click', () => {});\r\n };\r\n }, []);\r\n\r\n const checkMatchParent = (target: Node | null, element?: HTMLElement): boolean => {\r\n if (!target) {\r\n return false;\r\n }\r\n if (target && target === element) {\r\n return true;\r\n }\r\n return checkMatchParent(target?.parentNode, element);\r\n };\r\n\r\n /**\r\n * ClearSearch callback method to clear search string.\r\n */\r\n const clearSearch = (): void => {\r\n setSearchTextString('');\r\n\r\n const propsForm = props.form as ISearchFormViewProps;\r\n const propsFormInput = propsForm.input as React.DetailedHTMLProps, HTMLInputElement>;\r\n const propsFormInputCurrent = (propsFormInput.ref as React.RefObject).current;\r\n\r\n if (propsFormInputCurrent) {\r\n propsFormInputCurrent.value = '';\r\n }\r\n\r\n propsFormInput.value = '';\r\n props.searchText = '';\r\n props.FormWrapper.action = '';\r\n };\r\n\r\n const isMobileViewport = useCallback(() => {\r\n const isMobileView = isMobile({ variant: VariantType.Browser, context: context.request }) === 'xs';\r\n setIsMobile(isMobileView);\r\n }, [context]);\r\n\r\n useEffect(() => {\r\n window.addEventListener('resize', isMobileViewport);\r\n isMobileViewport();\r\n }, [isMobileViewport]);\r\n\r\n const viewport = isMobile({ variant: VariantType.Browser, context: context.request });\r\n\r\n const isMobileView = viewport === 'sm' || viewport === 'xs';\r\n\r\n AutoSuggest.className = !StringExtensions.isNullOrEmpty(searchTextString)\r\n ? `${AutoSuggest.className} show`\r\n : `${AutoSuggest.className} hide`;\r\n const isSearchText: boolean = !StringExtensions.isNullOrEmpty(searchTextString);\r\n\r\n return (\r\n \r\n {label}\r\n {FormComponent(\r\n form as ISearchFormViewProps,\r\n SearchForm,\r\n FormWrapper,\r\n isMobilePort,\r\n clearSearchButtonText,\r\n props,\r\n isSearchText,\r\n clearSearch\r\n )}\r\n {!isMobileView && (\r\n \r\n {!StringExtensions.isNullOrEmpty(searchTextString) ? (\r\n {AutoSuggestAriaLabelText}\r\n ) : (\r\n ''\r\n )}\r\n {!StringExtensions.isNullOrEmpty(searchTextString) ? (\r\n <>\r\n \r\n \r\n {renderTitle(searchSuggestionHeading, searchText)}\r\n \r\n \r\n \r\n {CategorySuggestionsComponent(\r\n categorySuggestionHeading,\r\n noResultText,\r\n props,\r\n isLoadingAutoSuggest,\r\n isLoadingNode\r\n )}\r\n {/* {KeywordSuggestionsComponent(\r\n KeywordSuggest,\r\n UlKeyword,\r\n keywordsHeading,\r\n noResultText,\r\n autosuggestKeyword,\r\n isLoadingAutoSuggest,\r\n isLoadingNode\r\n )} */}\r\n \r\n {ProductSuggestionsComponent(\r\n ProductSuggest,\r\n UlProduct,\r\n props,\r\n autosuggestProduct,\r\n isLoadingAutoSuggest,\r\n isLoadingNode\r\n )}\r\n \r\n \r\n ) : null}\r\n \r\n )}\r\n {isMobileView && props.isSearchFormExpanded && (\r\n \r\n {!StringExtensions.isNullOrEmpty(searchTextString) ? (\r\n {AutoSuggestAriaLabelText}\r\n ) : (\r\n ''\r\n )}\r\n {!StringExtensions.isNullOrEmpty(searchTextString) ? (\r\n <>\r\n \r\n {(form as ISearchFormViewProps).cancelBtn}\r\n {renderTitle(searchSuggestionHeading, searchText)}\r\n \r\n \r\n \r\n {CategorySuggestionsComponent(\r\n categorySuggestionHeading,\r\n noResultText,\r\n props,\r\n isLoadingAutoSuggest,\r\n isLoadingNode\r\n )}\r\n {/* {KeywordSuggestionsComponent(\r\n KeywordSuggest,\r\n UlKeyword,\r\n keywordsHeading,\r\n noResultText,\r\n autosuggestKeyword,\r\n isLoadingAutoSuggest,\r\n isLoadingNode\r\n )} */}\r\n \r\n {ProductSuggestionsComponent(\r\n ProductSuggest,\r\n UlProduct,\r\n props,\r\n autosuggestProduct,\r\n isLoadingAutoSuggest,\r\n isLoadingNode\r\n )}\r\n \r\n \r\n ) : null}\r\n \r\n )}\r\n \r\n );\r\n};\r\nexport default SearchView;\r\n"],"sourceRoot":""}