{"version":3,"sources":["webpack:///./src/modules/dobbies-search/actions/get-auto-suggest-suggestions.ts?1037","webpack:///./src/modules/dobbies-search/components/dobbies-search.categorysuggest.tsx?da36","webpack:///./src/modules/dobbies-search/components/dobbies-search.form.tsx?5bf9","webpack:///./src/modules/dobbies-search/components/dobbies-search.keywordsuggest.tsx?2631","webpack:///./src/modules/dobbies-search/components/dobbies-search.label.tsx?6d1a","webpack:///./src/modules/dobbies-search/components/dobbies-search.productsuggest.tsx?c9e9","webpack:///./src/modules/dobbies-search/dobbies-search.tsx?8a83","webpack:///src/search-state.ts?b5d7","webpack:///./src/modules/dobbies-search/dobbies-search.view.tsx?7799","webpack:///external \"React\"?c481","webpack:///external \"ReactDOM\"?4b2d","webpack:///./lib/dobbies-search/module-registration.js?aa1d","webpack:///src/search-state-data-action.ts?8823"],"names":["SuggestionType","AutoSuggestInput","constructor","searchText","top","suggestionType","hitPrefix","hitSuffix","getCacheKey","getCacheObjectType","dataCacheType","this","searchQuery","topResultsCount","async","_getAutoSuggest","input","autosuggest","ctx","searchCriteria","ProductSearchCriteria","SearchCondition","length","Context","ChannelId","requestContext","apiSettings","channelId","CatalogId","catalogId","HitPrefix","HitSuffix","searchSuggestions","getSearchSuggestionsAsync","callerContext","queryResultSettings","Paging","Top","map","item","ImageUrl","generateImageUrl","AllSearchResults","telemetry","error","getSearchSuggestionsActionDataAction","createObservableDataAction","id","action","Error","autoSuggestPromises","Promise","all","then","inputData","payLoad","CategorySuggestionsComponent","props","suggestions","autoSuggestProps","resources","categorySuggestionHeading","reactNodes","getPayloadObject","telemetryContent","push","_assembleNode","title","_renderTitle","text","categoryAutoSuggestionHeading","format","React","className","shouldShowFullPath","splitValue","Value","split","pop","ariaLabel","replace","RegExp","contentAction","etext","attribute","getTelemetryAttributes","key","Id","href","_generateLink","_getHighlightedText","suggestion","_getCategoryLink","searchPageURL","searchQsp","searchRefiners","MsDyn365","isBrowser","queryUrl","URL","window","location","searchParams","set","categoryRefiners","find","refiners","KeyName","refiner","Values","RefinerRecordId","Number","parseInt","encodedRefiner","JSON","stringify","compressRefiners","formattedText","dangerouslySetInnerHTML","getRichTextHtml","compressedRefinerKeys","compressedRefiners","forEach","compressedRefiner","refinerKey","FormComponent","searchPlaceholder","hideSearchLabel","searchTextInput","handleInputChange","maxChars","disableSubmitSearch","handleCancelSearchChange","query","ariaLabelCancel","ariaLabelSearch","ariaLabelSubmit","onInputChange","event","target","value","onInputChangeFunction","inputNode","type","name","placeholder","ref","onChange","maxLength","submitBtnNode","Button","cancelBtn","onClick","submitBtn","KeywordSuggestionsComponent","formattedLink","LabelComponent","searchLabelClass","searchLabelArialLabel","isSearchFormExpanded","searchtext","searchCollapsedLabel","attributes","Object","innerRef","ProductSuggestionsComponent","context","actionContext","productSuggestionHeading","moduleType","moduleId","items","productAutoSuggestionHeading","altText","thumbnail","_renderThumbnail","price","Value3","DecimalValue","_renderPrice","LiProduct","_getLiWrapper","AProduct","_getAWrapper","tag","recid","productPrice","cultureFormatter","formatCurrency","getProductPageUrlSync","undefined","adjustedPrice","basePrice","PriceComponent","typeName","data","CustomerContextualPrice","BasePrice","request","gridSettings","config","imageSettings","cropFocalRegion","Image","src","viewports","xs","q","w","h","lg","xl","lazyload","loadFailureBehavior","Search","super","waitTime","_isLoadingNode","loadingText","autoSuggestResultLoadingMessage","Spinner","label","size","SpinnerSize","medium","labelPosition","_focusOutTarget","e","state","closest","_clearAutoSuggestState","_keyup","keyCode","KeyCodes","Escape","setState","formReference","current","contains","autoSuggestResultDiv","searchState","defaultBasicSearchUrl","searchQueryStringParameter","update","createSearchStateInput","_handleInputChange","cancellabelDebounce","cancel","isLoadingAutoSuggest","getSearchSuggestionsAction","_getSuggestionType","inputSuggestionType","results","_getSearchRefiners","autoSuggestAriaLabel","_setAutoSuggestResultCount","catch","exception","debug","setTimeout","suggestionTypes","distinctSuggestionTypes","suggestionTypeItem","index","charAt","toUpperCase","slice","join","_handleSubmit","app","preventDefault","focus","searchURL","_appendQueryParams","getUrlSync","document","_handleCancelSearchChange","isInitialState","route","qsp","result","autoSuggestResultScreenReaderDiv","ariaLiveRegion","suggestResultString","autoSuggestFoundMessage","emptyResultString","noAutoSuggestionMessage","innerText","setAttribute","searchKeywordSuggestClass","searchProductSuggestClass","searchCategorySuggestClass","searchInputMaxLength","suggestionTypeCriterion","searchFormClass","getTelemetryObject","telemetryPageName","friendlyName","body","addEventListener","componentWillUnmount","removeEventListener","componentDidUpdate","shouldComponentUpdate","nextProps","nextState","render","cancelBtnAriaLabel","searchBtnAriaLabel","submitBtnAriaLabel","searchplaceholderText","shouldShowFullCategoryPath","keywordSuggestions","filter","Keyword","None","productSuggestions","Product","categorySuggestions","Category","ObjectExtensions","isNullOrUndefined","viewProps","cancelSearch","moduleProps","classnames","AutoSuggestAriaLabel","AutoSuggestAriaLabelText","AutoSuggest","KeywordSuggest","ProductSuggest","CategorySuggest","SearchForm","FormWrapper","role","autoComplete","onSubmit","UlKeyword","UlProduct","UlCategory","form","autosuggestKeyword","ArrayExtensions","hasElements","autosuggestProduct","autosuggestCategory","callbacks","isLoadingNode","renderView","getProductSearchRefinersAsync","SearchState","__decorate","observable","_renderForm","Node","_renderKeywordSuggestions","_renderProductSuggestions","_renderCategorySuggestions","SearchView","Module","module","exports","ReactDOM","binding","modules","dataActions","c","require","$type","da","path","runOn","iNM","ns","n","p","pdp","md","sanitizedActionPath","dataAction","default","prototype","RegistrationId","registerSanitizedActionPath","__bindings__","viewDictionary","cn","GenericInput","getGenericActionDataAction","getGenericAction"],"mappings":"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","file":"static/js/117.fb1482c4cd6f8974642b.chunk.js","sourcesContent":["/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { Autosuggestions } from '@msdyn365-commerce/commerce-entities';\r\nimport {\r\n CacheType,\r\n createObservableDataAction,\r\n IAction,\r\n IActionContext,\r\n IActionInput,\r\n ICreateActionContext\r\n} from '@msdyn365-commerce/core';\r\nimport { SearchSuggestion, SearchSuggestionCriteria } from '@msdyn365-commerce/retail-proxy';\r\nimport { getSearchSuggestionsAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/StoreOperationsDataActions.g';\r\nimport { generateImageUrl } from '@msdyn365-commerce-modules/retail-actions';\r\n\r\nexport enum SuggestionType {\r\n Category = 'ScopedCategory',\r\n Keyword = 'Keyword',\r\n Product = 'Product',\r\n None = 'None'\r\n}\r\n\r\n/**\r\n * Input class for auto suggest search input.\r\n */\r\nexport class AutoSuggestInput implements IActionInput {\r\n public searchQuery?: string;\r\n\r\n public topResultsCount?: number;\r\n\r\n public suggestionType?: string;\r\n\r\n public hitPrefix?: string;\r\n\r\n public hitSuffix?: string;\r\n\r\n constructor(searchText?: string, top?: number, suggestionType?: string, hitPrefix?: string, hitSuffix?: string) {\r\n this.searchQuery = searchText;\r\n this.topResultsCount = top;\r\n this.suggestionType = suggestionType;\r\n this.hitPrefix = hitPrefix;\r\n this.hitSuffix = hitSuffix;\r\n }\r\n\r\n public getCacheKey = () => 'AutoSuggestSearchSuggestions';\r\n\r\n public getCacheObjectType = () => 'AutoSuggestSearchSuggestions';\r\n\r\n public dataCacheType = (): CacheType => 'none';\r\n}\r\n\r\nconst createInput = (inputData: ICreateActionContext) => {\r\n return new AutoSuggestInput();\r\n};\r\n\r\n/**\r\n * Calls the Retail API and returns a auto-suggest suggestions.\r\n * @param input\r\n * @param ctx\r\n */\r\nexport async function getSearchSuggestionsAction(input: AutoSuggestInput, ctx: IActionContext): Promise {\r\n // If no input is provided fail out\r\n if (!input || !input.searchQuery) {\r\n throw new Error('[getSearchSuggestionsAction]No valid Input was provided, failing');\r\n }\r\n\r\n const autosuggest: Autosuggestions = {};\r\n\r\n const autoSuggestPromises = [_getAutoSuggest(input, autosuggest, ctx)];\r\n return Promise.all(autoSuggestPromises).then(() => {\r\n return autosuggest;\r\n });\r\n}\r\n\r\nasync function _getAutoSuggest(input: AutoSuggestInput, autosuggest: Autosuggestions, ctx: IActionContext): Promise {\r\n const searchCriteria: SearchSuggestionCriteria = {\r\n ProductSearchCriteria: {\r\n SearchCondition: input.searchQuery && input.searchQuery.length > 0 ? input.searchQuery : '',\r\n Context: {\r\n ChannelId: +ctx.requestContext.apiSettings.channelId,\r\n CatalogId: +ctx.requestContext.apiSettings.catalogId\r\n }\r\n },\r\n HitPrefix: input.hitPrefix,\r\n HitSuffix: input.hitSuffix,\r\n SuggestionType: input.suggestionType\r\n };\r\n\r\n const searchSuggestions = await getSearchSuggestionsAsync(\r\n { callerContext: ctx, queryResultSettings: { Paging: { Top: input.topResultsCount } } },\r\n searchCriteria\r\n );\r\n\r\n if (searchSuggestions && searchSuggestions.length > 0) {\r\n // Generate image url\r\n searchSuggestions.map(\r\n (item: SearchSuggestion) =>\r\n (item.ImageUrl = item.ImageUrl ? generateImageUrl(item.ImageUrl, ctx.requestContext.apiSettings) : '')\r\n );\r\n\r\n autosuggest.AllSearchResults = searchSuggestions;\r\n } else {\r\n ctx.telemetry.error(\r\n `[getSearchSuggestionsAction] unable to get availabilites for search with suggestion type ${searchCriteria.SuggestionType}`\r\n );\r\n }\r\n}\r\n\r\nexport const getSearchSuggestionsActionDataAction = createObservableDataAction({\r\n id: '@msdyn365-commerce-modules/search/get-auto-suggest-suggestions',\r\n action: >getSearchSuggestionsAction,\r\n input: createInput\r\n});\r\n\r\nexport default getSearchSuggestionsActionDataAction;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport MsDyn365, { getRichTextHtml } from '@msdyn365-commerce/core';\r\nimport { ProductRefiner, ProductRefinerValue, SearchSuggestion } from '@msdyn365-commerce/retail-proxy';\r\nimport { format, getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { IDobbiesSearchData } from '../dobbies-search.data';\r\nimport { IDobbiesSearchProps } from '../dobbies-search.props.autogenerated';\r\n\r\nexport interface ISearchCategorySuggestProps {\r\n searchCategorySuggestClass: string;\r\n searchPageURL: string;\r\n searchQsp: string | undefined;\r\n hitPrefix: string;\r\n hitSuffix: string;\r\n autoSuggestProps: IDobbiesSearchProps;\r\n searchText: string;\r\n searchRefiners: ProductRefiner[] | undefined;\r\n suggestions: SearchSuggestion[] | undefined;\r\n telemetryContent?: ITelemetryContent;\r\n shouldShowFullPath?: boolean;\r\n}\r\n\r\nexport interface ISearchCategoryViewProps {\r\n title: React.ReactNode;\r\n text: React.ReactNode[];\r\n}\r\n\r\nlet payLoad: IPayLoad;\r\n\r\n/**\r\n * CategorySuggestionsComponent.\r\n * @param props\r\n */\r\nexport const CategorySuggestionsComponent = (props: ISearchCategorySuggestProps): ISearchCategoryViewProps | undefined => {\r\n const {\r\n suggestions,\r\n searchText,\r\n autoSuggestProps: {\r\n resources: { categorySuggestionHeading }\r\n }\r\n } = props;\r\n\r\n const reactNodes: React.ReactNode[] = [];\r\n payLoad = getPayloadObject('click', props.telemetryContent!, '');\r\n\r\n suggestions?.map(item => {\r\n reactNodes.push(_assembleNode(item, props));\r\n });\r\n\r\n const titleNode = _renderTitle(categorySuggestionHeading, searchText);\r\n\r\n return { title: titleNode, text: reactNodes };\r\n};\r\n\r\nconst _renderTitle = (categorySuggestionHeading: string, searchText: string) => {\r\n const categoryAutoSuggestionHeading = categorySuggestionHeading\r\n ? format(categorySuggestionHeading, searchText)\r\n : `Search \"${searchText}\" in categories`;\r\n\r\n return
  • {categoryAutoSuggestionHeading}
  • ;\r\n};\r\n\r\nconst _assembleNode = (item: SearchSuggestion, props: ISearchCategorySuggestProps) => {\r\n const { searchText, hitPrefix, hitSuffix, shouldShowFullPath } = props;\r\n\r\n const splitValue = shouldShowFullPath ? item.Value : item.Value && item.Value.split('|').pop();\r\n const ariaLabel = splitValue\r\n ? splitValue.replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '')\r\n : item.Value && item.Value.replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\r\n payLoad.contentAction.etext = item.Value;\r\n const attribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\r\n return (\r\n
  • \r\n \r\n {_generateLink(item, searchText, props) && _getHighlightedText(splitValue ? splitValue : '', hitPrefix, hitSuffix)}\r\n \r\n
  • \r\n );\r\n};\r\n\r\nconst _generateLink = (suggestion: SearchSuggestion, searchText: string, props: ISearchCategorySuggestProps): string => {\r\n return suggestion && suggestion.Id ? _getCategoryLink(suggestion.Id, searchText, props) : '';\r\n};\r\n\r\nconst _getCategoryLink = (id: string, searchText: string, props: ISearchCategorySuggestProps): string => {\r\n const { searchPageURL, searchQsp, searchRefiners } = props;\r\n\r\n if (!MsDyn365.isBrowser) {\r\n return '';\r\n }\r\n\r\n const queryUrl = new URL(searchPageURL, window.location.href);\r\n\r\n if (searchQsp && searchText) {\r\n queryUrl.searchParams.set(searchQsp, searchText);\r\n }\r\n\r\n const categoryRefiners = searchRefiners?.find(refiners => {\r\n return refiners.KeyName === 'Category';\r\n });\r\n const refiner = categoryRefiners?.Values?.find(item => {\r\n return item.RefinerRecordId === Number.parseInt(id, 10);\r\n });\r\n\r\n const encodedRefiner = refiner && JSON.stringify(compressRefiners([refiner]));\r\n if (encodedRefiner) {\r\n queryUrl.searchParams.set('refiners', encodedRefiner);\r\n }\r\n\r\n return queryUrl.href;\r\n};\r\n\r\nconst _getHighlightedText = (suggestion: string, hitPrefix: string, hitSuffix: string): JSX.Element => {\r\n const formattedText = suggestion\r\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '')\r\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\r\n\r\n return ;\r\n};\r\n\r\n// TODO: This code is currently duplicated in categoryautosuggest need to either remove one of these files\r\n// or move this code to a common place\r\nconst compressedRefinerKeys = [\r\n 'DataTypeValue',\r\n 'LeftValueBoundString',\r\n 'RefinerRecordId',\r\n 'RefinerSourceValue',\r\n 'RightValueBoundString',\r\n 'UnitText'\r\n];\r\n\r\n/**\r\n * Compressed a list of refiners for use in URLs.\r\n * @param refiners The uncompressed refiners.\r\n */\r\nconst compressRefiners = (refiners: ProductRefinerValue[]) => {\r\n const compressedRefiners: (string | number)[][] = [];\r\n\r\n refiners.forEach(refiner => {\r\n const compressedRefiner: (string | number)[] = [];\r\n compressedRefinerKeys.forEach(refinerKey => {\r\n compressedRefiner.push(refiner[refinerKey]);\r\n });\r\n compressedRefiners.push(compressedRefiner);\r\n });\r\n\r\n return compressedRefiners;\r\n};\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { Button } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nexport interface ISearchFormProps {\r\n hideSearchLabel: boolean | undefined;\r\n isSearchFormExpanded?: boolean | undefined;\r\n disableSubmitSearch: boolean | undefined;\r\n searchTextInput: React.RefObject;\r\n maxChars: number;\r\n searchQsp: string;\r\n searchPlaceholder: string;\r\n query: string;\r\n ariaLabelCancel: string;\r\n ariaLabelSearch: string;\r\n ariaLabelSubmit: string;\r\n handleCancelSearchChange(): void;\r\n handleInputChange(query: string): void;\r\n}\r\n\r\nexport interface ISearchFormViewProps {\r\n input: React.ReactNode;\r\n submitBtn: React.ReactNode;\r\n cancelBtn: React.ReactNode;\r\n\r\n}\r\n\r\n/**\r\n * On Input Change functionality.\r\n * @param handleInputChange -Input change function.\r\n * @returns Set updated input value.\r\n */\r\nconst onInputChangeFunction = (handleInputChange: (query: string) => void) => (event: React.ChangeEvent) => {\r\n handleInputChange(event.target.value || '');\r\n};\r\nexport const FormComponent = (props: ISearchFormProps): ISearchFormViewProps => {\r\n const {\r\n searchQsp,\r\n searchPlaceholder,\r\n hideSearchLabel,\r\n searchTextInput,\r\n handleInputChange,\r\n maxChars,\r\n disableSubmitSearch,\r\n handleCancelSearchChange,\r\n query,\r\n ariaLabelCancel,\r\n ariaLabelSearch,\r\n ariaLabelSubmit\r\n } = props;\r\n\r\n const onInputChange = onInputChangeFunction(handleInputChange);\r\n\r\n const inputNode = !hideSearchLabel ? (\r\n \r\n ) : (\r\n \r\n );\r\n\r\n const submitBtnNode = !disableSubmitSearch && (\r\n \r\n \r\n );\r\n};\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { PriceComponent } from '@msdyn365-commerce/components';\r\nimport { getRichTextHtml, IActionContext, IImageSettings, Image, ITelemetry } from '@msdyn365-commerce/core';\r\nimport { SearchSuggestion } from '@msdyn365-commerce/retail-proxy';\r\nimport { getProductPageUrlSync } from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n INodeProps,\r\n IPayLoad,\r\n ITelemetryContent,\r\n NodeTag\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { IDobbiesSearchData } from '../dobbies-search.data';\r\nimport { IDobbiesSearchProps } from '../dobbies-search.props.autogenerated';\r\n\r\nexport interface ISearchProductSuggestProps {\r\n searchProductSuggestClass: string;\r\n searchPageURL: string;\r\n searchQsp: string | undefined;\r\n hitPrefix: string;\r\n hitSuffix: string;\r\n autoSuggestProps: IDobbiesSearchProps;\r\n searchText: string;\r\n suggestions: SearchSuggestion[] | undefined;\r\n telemetry: ITelemetry;\r\n moduleType: string;\r\n moduleId: string;\r\n telemetryContent?: ITelemetryContent;\r\n}\r\n\r\nexport interface ISearchProductViewProps {\r\n title: React.ReactNode;\r\n items: ISearchProductItemViewProps[];\r\n}\r\n\r\nexport interface ISearchProductItemViewProps {\r\n text: React.ReactNode;\r\n thumbnail: React.ReactNode;\r\n price: React.ReactNode;\r\n LiProduct: INodeProps;\r\n AProduct: INodeProps;\r\n id: string | undefined;\r\n}\r\n\r\nlet payLoad: IPayLoad;\r\nlet telemetryContent: ITelemetryContent | undefined;\r\n\r\n/**\r\n * ProductSuggestionsComponent.\r\n * @param props\r\n */\r\nexport const ProductSuggestionsComponent = (props: ISearchProductSuggestProps): ISearchProductViewProps | undefined => {\r\n const {\r\n suggestions,\r\n hitSuffix,\r\n hitPrefix,\r\n autoSuggestProps: {\r\n context: { actionContext },\r\n resources: { productSuggestionHeading }\r\n },\r\n moduleType,\r\n moduleId\r\n } = props;\r\n const reactNodes: ISearchProductItemViewProps[] = [];\r\n telemetryContent = props.telemetryContent;\r\n payLoad = getPayloadObject('click', props.telemetryContent!, '');\r\n\r\n suggestions?.map(item => {\r\n reactNodes.push(_assembleNode(item, hitPrefix, hitSuffix, actionContext, props, moduleType, moduleId));\r\n });\r\n\r\n const titleNode = _renderTitle(productSuggestionHeading);\r\n\r\n return { title: titleNode, items: reactNodes };\r\n};\r\n\r\nconst _renderTitle = (productSuggestionHeading: string) => {\r\n const productAutoSuggestionHeading = productSuggestionHeading ? productSuggestionHeading : 'Go to products';\r\n\r\n return
  • {productAutoSuggestionHeading}
  • ;\r\n};\r\n\r\nconst _assembleNode = (\r\n item: SearchSuggestion,\r\n hitPrefix: string,\r\n hitSuffix: string,\r\n actionContext: IActionContext,\r\n props: ISearchProductSuggestProps,\r\n moduleType: string,\r\n moduleId: string\r\n): ISearchProductItemViewProps => {\r\n const altText =\r\n item.Value && item.Value.replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\r\n\r\n return {\r\n text: _getHighlightedText(item.Value ? item.Value : '', hitPrefix, hitSuffix),\r\n thumbnail: _renderThumbnail(item, altText ? altText : '', props),\r\n price:\r\n item.Id &&\r\n item.Value3 &&\r\n item.Value3.Value &&\r\n item.Value3.Value.DecimalValue &&\r\n _renderPrice(item.Value3.Value.DecimalValue, item.Value3.Value.DecimalValue, moduleId, moduleType, props),\r\n LiProduct: _getLiWrapper(),\r\n AProduct: _getAWrapper(item, hitPrefix, hitSuffix, actionContext, props),\r\n id: item.Id\r\n };\r\n};\r\n\r\nconst _getLiWrapper = () => {\r\n return {\r\n className: 'msc-autoSuggest__productResults-item',\r\n tag: 'li' as NodeTag\r\n };\r\n};\r\n\r\nconst _getAWrapper = (\r\n item: SearchSuggestion,\r\n hitPrefix: string,\r\n hitSuffix: string,\r\n actionContext: IActionContext,\r\n props: ISearchProductSuggestProps\r\n) => {\r\n const {\r\n autoSuggestProps: { context }\r\n } = props;\r\n const ariaLabel =\r\n item.Value && item.Value.replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\r\n\r\n payLoad.contentAction.recid = item.Id;\r\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\r\n const productPrice = context.cultureFormatter.formatCurrency(item.Value3!.Value!.DecimalValue!);\r\n\r\n return {\r\n className: 'msc-autoSuggest__productResults-item',\r\n tag: 'a' as NodeTag,\r\n 'aria-label': `${ariaLabel!} ${productPrice}`,\r\n href: _generateLink(item, hitPrefix, hitSuffix, actionContext),\r\n ...attribute\r\n };\r\n};\r\n\r\nconst _generateLink = (suggestion: SearchSuggestion, hitPrefix: string, hitSuffix: string, actionContext: IActionContext) => {\r\n const formattedLink = (suggestion.Value as string)\r\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '')\r\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\r\n return suggestion.Value && suggestion.Id\r\n ? getProductPageUrlSync(formattedLink, (suggestion.Id as unknown) as number, actionContext, undefined)\r\n : '';\r\n};\r\n\r\nconst _getHighlightedText = (suggestion: string, hitPrefix: string, hitSuffix: string): JSX.Element => {\r\n const formattedText = suggestion\r\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '')\r\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\r\n\r\n return (\r\n \r\n );\r\n};\r\n\r\nconst _renderPrice = (\r\n adjustedPrice: number,\r\n basePrice: number,\r\n moduleId: string,\r\n moduleType: string,\r\n props: ISearchProductSuggestProps\r\n): JSX.Element | null => {\r\n const {\r\n autoSuggestProps: { context }\r\n } = props;\r\n\r\n return (\r\n \r\n );\r\n};\r\n\r\nconst _renderThumbnail = (suggestion: SearchSuggestion, altText: string, props: ISearchProductSuggestProps): JSX.Element | null => {\r\n const {\r\n autoSuggestProps: {\r\n context: {\r\n request: { gridSettings }\r\n },\r\n config: { imageSettings }\r\n }\r\n } = props;\r\n if (imageSettings) {\r\n imageSettings.cropFocalRegion = true;\r\n }\r\n\r\n if (!suggestion || !suggestion.ImageUrl) {\r\n props.telemetry.error('Search suggestion content is empty, module wont render.');\r\n return null;\r\n }\r\n\r\n const defaultImageSettings: IImageSettings = {\r\n viewports: {\r\n xs: { q: 'w=40&h=40&m=6', w: 0, h: 0 },\r\n lg: { q: 'w=40&h=40&m=6', w: 0, h: 0 },\r\n xl: { q: 'w=40&h=40&m=6', w: 0, h: 0 }\r\n },\r\n lazyload: true,\r\n cropFocalRegion: true\r\n };\r\n\r\n return (\r\n \r\n );\r\n};\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { Autosuggestions } from '@msdyn365-commerce/commerce-entities';\r\nimport MsDyn365, { getUrlSync } from '@msdyn365-commerce/core';\r\nimport { ProductRefiner } from '@msdyn365-commerce/retail-proxy';\r\nimport { getProductSearchRefinersAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\nimport { ArrayExtensions, ObjectExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { createSearchStateInput } from '@msdyn365-commerce-modules/search-utilities';\r\nimport { getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent, KeyCodes } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport { debounce } from 'lodash';\r\nimport { Spinner, SpinnerSize } from 'office-ui-fabric-react';\r\nimport * as React from 'react';\r\n\r\nimport getSearchSuggestionsAction, { AutoSuggestInput, SuggestionType } from './actions/get-auto-suggest-suggestions';\r\nimport {\r\n CategorySuggestionsComponent,\r\n FormComponent,\r\n ISearchCategoryViewProps,\r\n ISearchKeywordViewProps,\r\n ISearchProductViewProps,\r\n KeywordSuggestionsComponent,\r\n LabelComponent,\r\n ProductSuggestionsComponent\r\n} from './components';\r\nimport { IDobbiesSearchData } from './dobbies-search.data';\r\nimport { IDobbiesSearchProps, ISuggestionTypeCriterionData } from './dobbies-search.props.autogenerated';\r\n\r\nexport interface ISearchState {\r\n isSearchFormExpanded: boolean;\r\n searchText: string;\r\n searchKeywordSuggestClass: string;\r\n searchProductSuggestClass: string;\r\n searchCategorySuggestClass: string;\r\n suggestions: Autosuggestions | undefined;\r\n searchRefiners?: ProductRefiner[] | undefined;\r\n autoSuggestAriaLabel: string;\r\n isInitialState: boolean;\r\n isLoadingAutoSuggest?: boolean;\r\n}\r\n\r\nexport interface ISearchViewProps extends IDobbiesSearchProps {\r\n Search: IModuleProps;\r\n AutoSuggestAriaLabel: INodeProps;\r\n AutoSuggestAriaLabelText: string;\r\n searchText: string;\r\n AutoSuggest: INodeProps;\r\n KeywordSuggest: INodeProps;\r\n ProductSuggest: INodeProps;\r\n CategorySuggest: INodeProps;\r\n SearchForm: INodeProps;\r\n FormWrapper: INodeProps;\r\n UlKeyword: INodeProps;\r\n UlProduct: INodeProps;\r\n UlCategory: INodeProps;\r\n label: React.ReactNode;\r\n form: React.ReactNode;\r\n autosuggestKeyword?: ISearchKeywordViewProps;\r\n autosuggestProduct?: ISearchProductViewProps;\r\n autosuggestCategory?: ISearchCategoryViewProps;\r\n callbacks: {\r\n handleCancelSearchChange(): void;\r\n };\r\n isSearchFormExpanded: boolean;\r\n isLoadingAutoSuggest?: boolean;\r\n isLoadingNode?: React.ReactNode;\r\n cancelSearch: () => void;\r\n}\r\n\r\n/**\r\n *\r\n * Search module.\r\n * @extends {React.Component, ISearchState>}\r\n */\r\nclass Search extends React.Component, ISearchState> {\r\n private readonly searchTextInput: React.RefObject;\r\n\r\n private readonly searchCollapsedLabel: React.RefObject;\r\n\r\n private readonly formReference: React.RefObject;\r\n\r\n private readonly maxChars: number;\r\n\r\n private readonly inputSuggestionType?: ISuggestionTypeCriterionData[];\r\n\r\n private readonly topResultsCount?: number;\r\n\r\n private readonly hitPrefix: string = '{';\r\n\r\n private readonly hitSuffix: string = '}';\r\n\r\n private readonly waitTime: number = 500;\r\n\r\n private readonly autoSuggestResultScreenReaderDiv: React.RefObject;\r\n\r\n private readonly autoSuggestResultDiv: React.RefObject;\r\n\r\n private readonly searchFormClass: string;\r\n\r\n private readonly searchLabelClass: string;\r\n\r\n private readonly telemetryContent: ITelemetryContent;\r\n\r\n // @ts-expect-error\r\n private cancellabelDebounce: debounce;\r\n\r\n constructor(props: IDobbiesSearchProps) {\r\n super(props);\r\n this.searchTextInput = React.createRef();\r\n this.searchCollapsedLabel = React.createRef();\r\n this.autoSuggestResultScreenReaderDiv = React.createRef();\r\n this.autoSuggestResultDiv = React.createRef();\r\n this.formReference = React.createRef();\r\n this.state = {\r\n isSearchFormExpanded: false,\r\n searchText: '',\r\n searchKeywordSuggestClass: 'ms-search__autoSuggest__keyword',\r\n searchProductSuggestClass: 'ms-search__autoSuggest__product',\r\n searchCategorySuggestClass: 'ms-search__autoSuggest__category',\r\n suggestions: undefined,\r\n searchRefiners: undefined,\r\n autoSuggestAriaLabel: '',\r\n isInitialState: true,\r\n isLoadingAutoSuggest: false\r\n };\r\n this.maxChars =\r\n (this.props.context &&\r\n this.props.context.app &&\r\n this.props.context.app.config &&\r\n this.props.context.app.config.searchInputMaxLength) ||\r\n 50;\r\n this.inputSuggestionType = this.props.config && this.props.config.suggestionTypeCriterion;\r\n this.topResultsCount = this.props.config && this.props.config.topResultsCount ? this.props.config.topResultsCount : 5;\r\n this.searchFormClass = 'ms-search__form';\r\n this.searchLabelClass = 'ms-search__label';\r\n this.telemetryContent = getTelemetryObject(\r\n this.props.context.request.telemetryPageName!,\r\n this.props.friendlyName,\r\n this.props.telemetry\r\n );\r\n }\r\n\r\n public async componentDidMount(): Promise {\r\n document.body && document.body.addEventListener('mousedown', this._focusOutTarget);\r\n window && window.addEventListener('keyup', this._keyup);\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n document.body && document.body.removeEventListener('mousedown', this._focusOutTarget, false);\r\n window && window.removeEventListener('keyup', this._keyup, false);\r\n }\r\n\r\n public componentDidUpdate(): void {\r\n // const {\r\n // \tconfig: { hideSearchLabel }\r\n // } = this.props;\r\n // const { isSearchFormExpanded, isInitialState } = this.state;\r\n\r\n // if (!this.props.context.request.params.isEditor) {\r\n // \tif (!hideSearchLabel && isSearchFormExpanded) {\r\n // \t\tthis.searchTextInput && this.searchTextInput.current && this.searchTextInput.current.focus();\r\n // \t} else if (!isInitialState) {\r\n // \t\tthis.searchCollapsedLabel && this.searchCollapsedLabel.current && this.searchCollapsedLabel.current.focus();\r\n // \t}\r\n // }\r\n this.state.isSearchFormExpanded && this.searchTextInput.current?.focus();\r\n }\r\n\r\n public shouldComponentUpdate(nextProps: IDobbiesSearchProps, nextState: ISearchState): boolean {\r\n if (this.state === nextState && this.props === nextProps) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n // eslint-disable-next-line complexity -- ignore complexity.\r\n public render(): JSX.Element {\r\n const {\r\n context,\r\n resources: { searchtext, searchLabelArialLabel, cancelBtnAriaLabel, searchBtnAriaLabel, submitBtnAriaLabel },\r\n config: { hideSearchLabel, disableSubmitSearch, searchplaceholderText, shouldShowFullCategoryPath, className = '' }\r\n } = this.props;\r\n\r\n const {\r\n isSearchFormExpanded,\r\n searchText,\r\n searchKeywordSuggestClass,\r\n searchProductSuggestClass,\r\n searchCategorySuggestClass,\r\n suggestions,\r\n searchRefiners,\r\n isLoadingAutoSuggest\r\n } = this.state;\r\n\r\n const searchQsp = (context && context.app && context.app.config && context.app.config.searchQueryStringParameter) || 'q';\r\n const searchPageURL = getUrlSync('search', context && context.actionContext) || '';\r\n const searchURL = this._appendQueryParams(searchPageURL, searchText, searchQsp);\r\n const searchPlaceholder = searchplaceholderText && searchplaceholderText.length > 0 ? searchplaceholderText : 'Search in Fabrikam';\r\n\r\n const keywordSuggestions = suggestions?.AllSearchResults?.filter(\r\n suggestion => suggestion.SuggestionType === SuggestionType.Keyword || suggestion.SuggestionType === SuggestionType.None\r\n );\r\n const productSuggestions = suggestions?.AllSearchResults?.filter(\r\n suggestion => suggestion.SuggestionType === SuggestionType.Product\r\n );\r\n const categoryRefiners = searchRefiners?.find(refiner => {\r\n return refiner.KeyName === 'Category';\r\n });\r\n const categorySuggestions = suggestions?.AllSearchResults?.filter(suggestion => {\r\n if (suggestion.SuggestionType !== SuggestionType.Category) {\r\n return false;\r\n }\r\n const refiner = categoryRefiners?.Values?.find(item => {\r\n return `${item.RefinerRecordId ?? 0}` === suggestion.Id;\r\n });\r\n\r\n return !ObjectExtensions.isNullOrUndefined(refiner);\r\n });\r\n\r\n const viewProps: ISearchViewProps = {\r\n ...(this.props as IDobbiesSearchProps),\r\n cancelSearch: this._handleCancelSearchChange,\r\n Search: {\r\n moduleProps: this.props,\r\n className: `${classnames('ms-search', className)} ${disableSubmitSearch ? 'no-submit' : 'with-submit'}`\r\n },\r\n AutoSuggestAriaLabel: {\r\n tag: 'div',\r\n className: 'msc-autoSuggest__screen-reader',\r\n 'aria-live': 'assertive',\r\n ref: this.autoSuggestResultScreenReaderDiv\r\n },\r\n AutoSuggestAriaLabelText: this.state.autoSuggestAriaLabel,\r\n searchText: this.state.searchText,\r\n AutoSuggest: {\r\n ref: this.autoSuggestResultDiv,\r\n className: 'ms-search__autoSuggest'\r\n },\r\n KeywordSuggest: {\r\n className: searchKeywordSuggestClass\r\n },\r\n ProductSuggest: {\r\n className: searchProductSuggestClass\r\n },\r\n CategorySuggest: {\r\n className: searchCategorySuggestClass\r\n },\r\n SearchForm: {\r\n className: `${this.searchFormClass} ${isSearchFormExpanded ? 'bx-show' : 'bx-hide'}`\r\n },\r\n FormWrapper: {\r\n tag: 'form',\r\n ref: this.formReference,\r\n className: 'ms-search__searchForm',\r\n 'aria-label': 'Search',\r\n name: 'searchForm',\r\n role: 'search',\r\n action: searchURL,\r\n autoComplete: 'off',\r\n onSubmit: this._handleSubmit\r\n },\r\n UlKeyword: {\r\n tag: 'ul',\r\n className: classnames('msc-autoSuggest__keywordResults-items', className)\r\n },\r\n UlProduct: {\r\n tag: 'ul',\r\n className: classnames('msc-autoSuggest__productResults-items', className)\r\n },\r\n UlCategory: {\r\n tag: 'ul',\r\n className: classnames('msc-autoSuggest__categoryResults-items', className)\r\n },\r\n label: LabelComponent({\r\n isSearchFormExpanded,\r\n searchLabelClass: `${this.searchLabelClass} ${isSearchFormExpanded ? 'bx-hide' : 'bx-show'}`,\r\n searchtext,\r\n searchLabelArialLabel,\r\n searchCollapsedLabel: this.searchCollapsedLabel,\r\n hideSearchLabel,\r\n handleCancelSearchChange: this._handleCancelSearchChange,\r\n telemetryContent: this.telemetryContent\r\n }),\r\n form: FormComponent({\r\n ariaLabelCancel: cancelBtnAriaLabel,\r\n ariaLabelSearch: searchBtnAriaLabel,\r\n ariaLabelSubmit: submitBtnAriaLabel,\r\n hideSearchLabel,\r\n searchTextInput: this.searchTextInput,\r\n disableSubmitSearch,\r\n handleInputChange: this._handleInputChange,\r\n handleCancelSearchChange: this._handleCancelSearchChange,\r\n maxChars: this.maxChars,\r\n searchQsp,\r\n searchPlaceholder,\r\n query: searchText\r\n }),\r\n autosuggestKeyword:\r\n searchText &&\r\n searchText.length > 0 &&\r\n (isLoadingAutoSuggest || (keywordSuggestions && ArrayExtensions.hasElements(keywordSuggestions)))\r\n ? KeywordSuggestionsComponent({\r\n searchKeywordSuggestClass,\r\n searchPageURL,\r\n searchQsp,\r\n hitPrefix: this.hitPrefix,\r\n hitSuffix: this.hitSuffix,\r\n autoSuggestProps: this.props,\r\n searchText,\r\n suggestions: keywordSuggestions,\r\n telemetryContent: this.telemetryContent\r\n })\r\n : undefined,\r\n autosuggestProduct:\r\n searchText &&\r\n searchText.length > 0 &&\r\n (isLoadingAutoSuggest || (productSuggestions && ArrayExtensions.hasElements(productSuggestions)))\r\n ? ProductSuggestionsComponent({\r\n searchProductSuggestClass,\r\n searchPageURL,\r\n searchQsp,\r\n hitPrefix: this.hitPrefix,\r\n hitSuffix: this.hitSuffix,\r\n autoSuggestProps: this.props,\r\n searchText,\r\n suggestions: productSuggestions,\r\n telemetry: this.props.telemetry,\r\n moduleType: this.props.typeName,\r\n moduleId: this.props.id,\r\n telemetryContent: this.telemetryContent\r\n })\r\n : undefined,\r\n autosuggestCategory:\r\n searchText &&\r\n searchText.length > 0 &&\r\n (isLoadingAutoSuggest || (categorySuggestions && ArrayExtensions.hasElements(categorySuggestions)))\r\n ? CategorySuggestionsComponent({\r\n searchCategorySuggestClass,\r\n searchPageURL,\r\n searchQsp,\r\n hitPrefix: this.hitPrefix,\r\n hitSuffix: this.hitSuffix,\r\n autoSuggestProps: this.props,\r\n searchText,\r\n suggestions: categorySuggestions,\r\n searchRefiners,\r\n telemetryContent: this.telemetryContent,\r\n shouldShowFullPath: shouldShowFullCategoryPath\r\n })\r\n : undefined,\r\n callbacks: {\r\n handleCancelSearchChange: this._handleCancelSearchChange\r\n },\r\n isSearchFormExpanded: this.state.isSearchFormExpanded,\r\n isLoadingAutoSuggest,\r\n isLoadingNode: this._isLoadingNode()\r\n };\r\n\r\n return this.props.renderView(viewProps) as React.ReactElement;\r\n }\r\n\r\n /**\r\n * Function to create the ReactNode for loading Autosuggest result.\r\n * @returns ReachNode for loading Autosuggest result.\r\n */\r\n private readonly _isLoadingNode = (): React.ReactNode => {\r\n const loadingText = this.props.resources.autoSuggestResultLoadingMessage;\r\n return ;\r\n };\r\n\r\n private readonly _focusOutTarget = (e: any): void => {\r\n const { suggestions } = this.state;\r\n\r\n if (suggestions && suggestions.AllSearchResults && e.target.closest('.ms-search') === null) {\r\n this._clearAutoSuggestState();\r\n }\r\n };\r\n\r\n private readonly _keyup = (e: KeyboardEvent): void => {\r\n const { suggestions } = this.state;\r\n\r\n if (suggestions && suggestions.AllSearchResults && e.keyCode === KeyCodes.Escape) {\r\n this._clearAutoSuggestState();\r\n } else if (this.state.isSearchFormExpanded && e.keyCode === KeyCodes.Escape) {\r\n if (this.state.isSearchFormExpanded) {\r\n this.setState({ isSearchFormExpanded: false });\r\n }\r\n }\r\n\r\n if (\r\n !(\r\n (this.formReference.current && this.formReference.current.contains((e.target as unknown) as Node)) ||\r\n (this.autoSuggestResultDiv.current && this.autoSuggestResultDiv.current.contains((e.target as unknown) as Node))\r\n )\r\n ) {\r\n if (suggestions && suggestions.AllSearchResults) {\r\n this._clearAutoSuggestState();\r\n }\r\n\r\n if (this.state.isSearchFormExpanded) {\r\n this.setState({ isSearchFormExpanded: false });\r\n }\r\n }\r\n };\r\n\r\n private readonly _clearAutoSuggestState = (): void => {\r\n const {\r\n context: { actionContext },\r\n data: { searchState }\r\n } = this.props;\r\n\r\n if (this.searchTextInput.current && this.searchTextInput.current.value.length > 0) {\r\n searchState.searchText = '';\r\n searchState.defaultBasicSearchUrl = '';\r\n searchState.searchQueryStringParameter = '';\r\n actionContext ? actionContext.update(createSearchStateInput(searchState), searchState) : null;\r\n this.searchTextInput.current.value = '';\r\n }\r\n\r\n this.setState({ searchText: '', suggestions: undefined, searchRefiners: undefined });\r\n };\r\n\r\n private readonly _handleInputChange = (query: string): void => {\r\n if (!query || query.length <= this.maxChars) {\r\n this.setState({ searchText: query });\r\n }\r\n\r\n if (this.cancellabelDebounce) {\r\n this.cancellabelDebounce.cancel();\r\n }\r\n\r\n const {\r\n telemetry,\r\n context,\r\n data: { searchState }\r\n } = this.props;\r\n\r\n if (context) {\r\n if (query && query.length > 0) {\r\n if (query.length > this.maxChars) {\r\n return;\r\n }\r\n\r\n this.cancellabelDebounce = debounce(() => {\r\n this.setState({ isLoadingAutoSuggest: true });\r\n getSearchSuggestionsAction(\r\n new AutoSuggestInput(\r\n query,\r\n this.topResultsCount,\r\n this._getSuggestionType(this.inputSuggestionType),\r\n this.hitPrefix,\r\n this.hitSuffix\r\n ),\r\n context.actionContext\r\n )\r\n .then(results => {\r\n this._getSearchRefiners(query)\r\n .then(refiners => {\r\n this.setState({\r\n suggestions: results,\r\n searchRefiners: refiners,\r\n autoSuggestAriaLabel: this._setAutoSuggestResultCount(results),\r\n isLoadingAutoSuggest: false\r\n });\r\n })\r\n .catch(error => {\r\n this.setState({\r\n suggestions: results,\r\n searchRefiners: undefined,\r\n autoSuggestAriaLabel: this._setAutoSuggestResultCount(results)\r\n });\r\n telemetry.exception(error);\r\n telemetry.debug('Unable to get refiners results');\r\n });\r\n })\r\n .catch(error => {\r\n this.setState({\r\n suggestions: undefined,\r\n searchRefiners: undefined,\r\n autoSuggestAriaLabel: this._setAutoSuggestResultCount()\r\n });\r\n telemetry.exception(error);\r\n telemetry.debug('Unable to get auto suggest results');\r\n });\r\n }, this.waitTime);\r\n\r\n setTimeout(() => {\r\n this.cancellabelDebounce();\r\n }, 0);\r\n\r\n searchState.searchText = query;\r\n } else {\r\n this.setState({ suggestions: undefined, searchRefiners: undefined });\r\n searchState.searchText = '';\r\n }\r\n context.actionContext.update(createSearchStateInput(searchState), searchState);\r\n }\r\n };\r\n\r\n private readonly _getSuggestionType = (suggestionTypes?: ISuggestionTypeCriterionData[]): string => {\r\n if (suggestionTypes && suggestionTypes.length > 0) {\r\n const distinctSuggestionTypes: string[] = [];\r\n suggestionTypes &&\r\n suggestionTypes.forEach((suggestionTypeItem, index) => {\r\n suggestionTypeItem.SuggestionType &&\r\n distinctSuggestionTypes.push(\r\n suggestionTypeItem.SuggestionType.charAt(0).toUpperCase() + suggestionTypeItem.SuggestionType.slice(1)\r\n );\r\n });\r\n return distinctSuggestionTypes.join(',');\r\n }\r\n return 'Keyword, Product, ScopedCategory';\r\n };\r\n\r\n private async _getSearchRefiners(searchText: string): Promise {\r\n const { actionContext: ctx } = this.props.context;\r\n return getProductSearchRefinersAsync(\r\n { callerContext: ctx },\r\n {\r\n SearchCondition: searchText,\r\n Context: {\r\n ChannelId: +ctx.requestContext.apiSettings.channelId,\r\n CatalogId: +ctx.requestContext.apiSettings.catalogId\r\n }\r\n }\r\n );\r\n }\r\n\r\n private readonly _handleSubmit = (\r\n e: React.MouseEvent | React.KeyboardEvent | React.FormEvent\r\n ): void => {\r\n const {\r\n config: { disableSubmitSearch },\r\n context: {\r\n actionContext,\r\n app: {\r\n config: { searchQueryStringParameter }\r\n }\r\n }\r\n } = this.props;\r\n\r\n const query = this.searchTextInput.current && this.searchTextInput.current.value;\r\n e.preventDefault();\r\n\r\n if (!query || (query && query.length === 0) || disableSubmitSearch) {\r\n this.searchTextInput && this.searchTextInput.current && this.searchTextInput.current.focus();\r\n } else {\r\n const searchQsp = searchQueryStringParameter || 'q';\r\n const searchURL = this._appendQueryParams(getUrlSync('search', actionContext) || '', query, searchQsp);\r\n document.location.href = searchURL;\r\n }\r\n };\r\n\r\n private readonly _handleCancelSearchChange = (): void => {\r\n const { isSearchFormExpanded, suggestions } = this.state;\r\n\r\n if (!isSearchFormExpanded) {\r\n this.setState({\r\n isSearchFormExpanded: true,\r\n searchText: '',\r\n isInitialState: false\r\n });\r\n } else {\r\n if (suggestions && suggestions.AllSearchResults) {\r\n this._clearAutoSuggestState();\r\n }\r\n\r\n this.setState({ isSearchFormExpanded: false });\r\n }\r\n };\r\n\r\n private readonly _appendQueryParams = (route: string, query: string, qsp: string): string => {\r\n if (!MsDyn365.isBrowser) {\r\n return '';\r\n }\r\n\r\n const queryUrl = new URL(route, window.location.href);\r\n if (qsp && query) {\r\n queryUrl.searchParams.set(qsp, query);\r\n }\r\n\r\n return queryUrl.href;\r\n };\r\n\r\n private readonly _setAutoSuggestResultCount = (result?: Autosuggestions) => {\r\n if (this.autoSuggestResultScreenReaderDiv.current !== null) {\r\n const ariaLiveRegion = this.autoSuggestResultScreenReaderDiv.current;\r\n const suggestResultString = this.props.resources.autoSuggestFoundMessage;\r\n const emptyResultString = this.props.resources.noAutoSuggestionMessage;\r\n ariaLiveRegion.innerText =\r\n result && result.AllSearchResults && result.AllSearchResults.length > 0 ? suggestResultString : emptyResultString;\r\n ariaLiveRegion.setAttribute('aria-live', 'assertive');\r\n return ariaLiveRegion.innerText;\r\n }\r\n return '';\r\n };\r\n}\r\n\r\nexport default Search;\r\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { observable } from 'mobx';\n\n/**\n * State information related to what is needed to succesfully perform a autosuggest.\n */\nexport class SearchState {\n @observable public searchText?: string;\n\n @observable public defaultBasicSearchUrl?: string;\n\n @observable public searchQueryStringParameter?: string;\n}\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { INodeProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { ISearchCategoryViewProps, ISearchFormViewProps, ISearchKeywordViewProps, ISearchProductViewProps } from './components';\r\nimport { ISearchViewProps } from './dobbies-search';\r\n\r\nconst SearchView: React.FC = props => {\r\n const {\r\n Search,\r\n AutoSuggestAriaLabel,\r\n AutoSuggestAriaLabelText,\r\n searchText,\r\n AutoSuggest,\r\n KeywordSuggest,\r\n ProductSuggest,\r\n CategorySuggest,\r\n UlKeyword,\r\n UlProduct,\r\n UlCategory,\r\n form,\r\n autosuggestCategory,\r\n autosuggestKeyword,\r\n autosuggestProduct,\r\n SearchForm,\r\n FormWrapper,\r\n label,\r\n isLoadingAutoSuggest,\r\n isLoadingNode,\r\n isSearchFormExpanded,\r\n cancelSearch\r\n } = props;\r\n\r\n return (\r\n \r\n {label}\r\n {
    }\r\n {_renderForm(form as ISearchFormViewProps, SearchForm, FormWrapper)}\r\n \r\n {searchText && searchText.length > 0 ? {AutoSuggestAriaLabelText} : ''}\r\n {_renderKeywordSuggestions(KeywordSuggest, UlKeyword, autosuggestKeyword, isLoadingAutoSuggest, isLoadingNode)}\r\n {_renderProductSuggestions(ProductSuggest, UlProduct, autosuggestProduct, isLoadingAutoSuggest, isLoadingNode)}\r\n {_renderCategorySuggestions(CategorySuggest, UlCategory, autosuggestCategory, isLoadingAutoSuggest, isLoadingNode)}\r\n \r\n \r\n );\r\n};\r\n\r\nconst _renderForm = (form: ISearchFormViewProps, SearchForm: INodeProps, FormWrapper: INodeProps) => {\r\n return (\r\n \r\n \r\n {form.input}\r\n {form.cancelBtn}\r\n {form.submitBtn}\r\n \r\n \r\n );\r\n};\r\n\r\nconst _renderKeywordSuggestions = (\r\n KeywordSuggest: INodeProps,\r\n UlKeyword: INodeProps,\r\n keywordSuggestions?: ISearchKeywordViewProps,\r\n isLoadingAutoSuggest?: boolean,\r\n isLoadingNode?: React.ReactNode\r\n) => {\r\n return (\r\n keywordSuggestions && (\r\n \r\n \r\n {isLoadingAutoSuggest && isLoadingNode}\r\n {!isLoadingAutoSuggest &&\r\n keywordSuggestions.text.map(text => {\r\n return text;\r\n })}\r\n \r\n \r\n )\r\n );\r\n};\r\n\r\nconst _renderProductSuggestions = (\r\n ProductSuggest: INodeProps,\r\n UlProduct: INodeProps,\r\n productSuggestions?: ISearchProductViewProps,\r\n isLoadingAutoSuggest?: boolean,\r\n isLoadingNode?: React.ReactNode\r\n) => {\r\n return (\r\n productSuggestions && (\r\n \r\n \r\n {productSuggestions.title}\r\n {isLoadingAutoSuggest && isLoadingNode}\r\n {!isLoadingAutoSuggest &&\r\n productSuggestions.items.map((item, index) => {\r\n return (\r\n \r\n \r\n {item.thumbnail}\r\n {item.text}\r\n {item.price}\r\n \r\n \r\n );\r\n })}\r\n \r\n \r\n )\r\n );\r\n};\r\n\r\nconst _renderCategorySuggestions = (\r\n CategorySuggest: INodeProps,\r\n UlCategory: INodeProps,\r\n categorySuggestions?: ISearchCategoryViewProps,\r\n isLoadingAutoSuggest?: boolean,\r\n isLoadingNode?: React.ReactNode\r\n) => {\r\n return (\r\n categorySuggestions && (\r\n \r\n \r\n {categorySuggestions.title}\r\n {isLoadingAutoSuggest && isLoadingNode}\r\n {!isLoadingAutoSuggest &&\r\n categorySuggestions.text.map(text => {\r\n return text;\r\n })}\r\n \r\n \r\n )\r\n );\r\n};\r\n\r\nexport default SearchView;\r\n","module.exports = React;","module.exports = ReactDOM;","const binding = { modules: {}, dataActions: {} };\n\n const registerActionId = (actionPath) => {\n if (binding.dataActions[actionPath] &&\n binding.dataActions[actionPath].default &&\n binding.dataActions[actionPath].default.prototype &&\n binding.dataActions[actionPath].default.prototype.id) {\n binding.dataActions[binding.dataActions[actionPath].default.prototype.id] = binding.dataActions[actionPath];\n } else {\n Object.keys(binding.dataActions[actionPath] || {}).forEach(exportName => {\n if (binding.dataActions[actionPath][exportName] &&\n binding.dataActions[actionPath][exportName].prototype &&\n binding.dataActions[actionPath][exportName].prototype.Action) {\n binding.dataActions[binding.dataActions[actionPath][exportName].prototype.id] = binding.dataActions[actionPath][exportName];\n }\n })\n }\n };\n\n const registerSanitizedActionPath = (sanitizedActionPath, dataAction) => {\n if (process.env.NODE_ENV === 'development') {\n if (!dataAction.default) {\n throw new Error('Data action path does not have a default export');\n }\n if (!(dataAction.default.prototype.id && binding.dataActions[dataAction.default.prototype.id]) || !binding.dataActions[sanitizedActionPath]) {\n binding.dataActions[sanitizedActionPath] = dataAction;\n }\n } else {\n binding.dataActions[sanitizedActionPath] = dataAction;\n if (!binding.dataActions[sanitizedActionPath].default) {\n throw new Error('Data action path ' + sanitizedActionPath + ' does not have a default export');\n }\n binding.dataActions[sanitizedActionPath].default.prototype.RegistrationId = sanitizedActionPath;\n if (binding.dataActions[sanitizedActionPath].default.prototype.id) {\n binding.dataActions[binding.dataActions[sanitizedActionPath].default.prototype.id] = sanitizedActionPath;\n }\n }\n };\n \n\n (binding.modules['dobbies-search'] = {\n c: () => require('partner/modules/dobbies-search/dobbies-search.tsx'),\n $type: 'contentModule',\n da: [{name:'searchState', path:'@msdyn365-commerce-modules/search-utilities/dist/lib/search-state-data-action', runOn: 1}],\n \n iNM: false,\n ns: '__local__',\n n: 'dobbies-search',\n p: '__local__',\n \n pdp: '',\n \n \n md: 'src/modules/dobbies-search'\n });\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/search-utilities/dist/lib/search-state-data-action';\n let dataAction = require('@msdyn365-commerce-modules/search-utilities/dist/lib/search-state-data-action');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n \n window.__bindings__ = window.__bindings__ || {};\n window.__bindings__.modules = {\n ...window.__bindings__.modules || {},\n ...binding.modules\n };\n \n window.__bindings__.dataActions = {\n ...window.__bindings__.dataActions || {},\n ...binding.dataActions\n };\n export const viewDictionary = {};\n viewDictionary['__local__|__local__|modules|dobbies-search|dobbies-search'] = {\n c: () => require('partner/modules/dobbies-search/dobbies-search.view.tsx'),\n cn: '__local__-__local__-dobbies-search'\n };\nwindow.__bindings__ = window.__bindings__ || {};\nwindow.__bindings__.viewDictionary = {\n ...window.__bindings__.viewDictionary || {},\n ...viewDictionary\n };","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt 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"],"sourceRoot":""}