{"version":3,"sources":["src/components/search/atomic-search-interface/analytics-config.ts","src/components/search/atomic-search-interface/store.ts","src/components/search/atomic-search-interface/atomic-search-interface.pcss?tag=atomic-search-interface&encapsulation=shadow","src/components/search/atomic-search-interface/atomic-search-interface.tsx"],"names":["getAnalyticsConfig","searchEngineConfig","enabled","store","analyticsClientMiddleware","event","payload","augmentAnalytics","defaultConfiguration","augmentAnalyticsConfigWithDocument","analytics","config","result","augmentWithExternalMiddleware","augmentAnalyticsWithAtomicVersion","augmentAnalyticsWithFacetTitles","allFacets","getAllFacets","getAtomicFacetLabelOrOriginalTitle","facetId","originalTitle","label","facetState","map","analyticsFacetState","id","title","customData","facetTitle","createAtomicStore","commonStore","createAtomicCommonStore","loadingFlags","facets","numericFacets","dateFacets","categoryFacets","facetElements","sortOptions","iconAssetsPath","mobileBreakpoint","DEFAULT_MOBILE_BREAKPOINT","fieldsToInclude","currentQuickviewPosition","[object Object]","state","window","matchMedia","makeDesktopQuery","matches","engine","search","response","searchUid","atomicSearchInterfaceCss","FirstSearchExecutedFlag","AtomicSearchInterface","hostRef","this","unsubscribeUrlManager","unsubscribeSearchStatus","initialized","relevanceInspectorIsOpen","i18n","i18next","createInstance","language","reflectStateInUrl","scrollContainer","languageAssetsPath","enableRelevanceInspector","onHashChange","urlManager","synchronize","fragment","initRelevanceInspector","commonInterfaceHelper","CommonAtomicInterfaceHelper","setLoadingFlag","updateMobileBreakpoint","initAriaLive","initFieldsToInclude","updatedProp","newValue","engineIsCreated","updateSearchConfiguration","loadSearchConfigurationActions","dispatch","_a","searchHub","pipeline","onAnalyticsChange","locale","onLanguageChange","set","removeEventListener","onComponentInitializing","scrollContainerElement","document","querySelector","bindings","logger","warn","scrollIntoView","behavior","options","internalInitialization","initEngine","console","mismatchedInterfaceAndEnginePropError","error","host","safeStorage","SafeStorage","standaloneSearchBoxData","getParsedJSON","StorageItems","STANDALONE_SEARCH_BOX_DATA","executeFirstSearch","removeItem","updateQuery","loadQueryActions","value","enableQuerySyntax","q","executeFirstSearchAfterStandaloneSearchBoxRedirect","organizationId","env","getOrganizationEndpointsHeadless","interfaceElement","fields","EcommerceDefaultFieldsToInclude","concat","addFieldsToInclude","loadFieldActions","registerFieldsToInclude","breakpoint","searchConfig","getSearchConfiguration","analyticsConfig","buildSearchEngine","configuration","loggerOptions","level","logLevel","searchConfigFromProps","timezone","location","hash","slice","buildUrlManager","initialState","subscribe","updateHash","addEventListener","Array","from","children","some","element","tagName","prepend","createElement","e","altKey","searchStatus","buildSearchStatus","hasNoResultsAfterInitialSearch","hasResults","firstSearchExecuted","hasError","classList","toggle","hasLoadingFlag","unsetLoadingFlag","newFragment","history","replaceState","info","pushState","onInitialization","initSearchStatus","initUrlManager","h","open","ArrayProp"],"mappings":"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","sourcesContent":["import {\n AnalyticsConfiguration,\n SearchEngineConfiguration,\n} from '@coveo/headless';\nimport {\n AnalyticsPayload,\n augmentAnalyticsWithAtomicVersion,\n augmentWithExternalMiddleware,\n augmentAnalyticsConfigWithDocument,\n} from '../../common/interface/analytics-config';\nimport {createAtomicStore} from './store';\n\nexport function getAnalyticsConfig(\n searchEngineConfig: SearchEngineConfiguration,\n enabled: boolean,\n store: ReturnType\n): AnalyticsConfiguration {\n const analyticsClientMiddleware = (\n event: string,\n payload: AnalyticsPayload\n ) => augmentAnalytics(event, payload, store, searchEngineConfig);\n\n const defaultConfiguration: AnalyticsConfiguration = {\n analyticsClientMiddleware,\n enabled,\n ...augmentAnalyticsConfigWithDocument(),\n };\n\n if (searchEngineConfig.analytics) {\n return {\n ...defaultConfiguration,\n ...searchEngineConfig.analytics,\n analyticsClientMiddleware,\n };\n }\n return defaultConfiguration;\n}\n\nfunction augmentAnalytics(\n event: string,\n payload: AnalyticsPayload,\n store: ReturnType,\n config: SearchEngineConfiguration\n) {\n let result = augmentWithExternalMiddleware(event, payload, config);\n result = augmentAnalyticsWithAtomicVersion(result);\n result = augmentAnalyticsWithFacetTitles(result, store);\n return result;\n}\n\nfunction augmentAnalyticsWithFacetTitles(\n payload: AnalyticsPayload,\n store: ReturnType\n) {\n const allFacets = store.getAllFacets();\n const getAtomicFacetLabelOrOriginalTitle = (\n facetId: string,\n originalTitle: string\n ) => (allFacets[facetId] ? allFacets[facetId].label() : originalTitle);\n\n if (payload.facetState) {\n payload.facetState = payload.facetState.map(\n (analyticsFacetState: {id: string; title: string}) => {\n const {id, title: originalTitle} = analyticsFacetState;\n return {\n ...analyticsFacetState,\n title: getAtomicFacetLabelOrOriginalTitle(id, originalTitle),\n };\n }\n );\n }\n\n if (\n payload.customData &&\n payload.customData.facetTitle &&\n payload.customData.facetId &&\n payload.customData.facetTitle\n ) {\n payload.customData.facetTitle = getAtomicFacetLabelOrOriginalTitle(\n payload.customData.facetId,\n payload.customData.facetTitle\n );\n }\n return payload;\n}\n","import {\n NumericFacetValue,\n DateFacetValue,\n SortCriterion,\n SearchEngine,\n} from '@coveo/headless';\nimport {DEFAULT_MOBILE_BREAKPOINT} from '../../../utils/replace-breakpoint';\nimport {\n FacetInfo,\n FacetStore,\n FacetValueFormat,\n} from '../../common/facets/facet-common-store';\nimport {\n createAtomicCommonStore,\n AtomicCommonStoreData,\n AtomicCommonStore,\n} from '../../common/interface/store';\nimport {makeDesktopQuery} from '../atomic-layout/search-layout';\n\nexport interface SortDropdownOption {\n expression: string;\n criteria: SortCriterion[];\n label: string;\n}\n\nexport interface AtomicStoreData extends AtomicCommonStoreData {\n facets: FacetStore;\n numericFacets: FacetStore>;\n dateFacets: FacetStore>;\n categoryFacets: FacetStore;\n sortOptions: SortDropdownOption[];\n mobileBreakpoint: string;\n currentQuickviewPosition: number;\n}\n\nexport interface AtomicStore extends AtomicCommonStore {\n getAllFacets(): {\n [facetId: string]:\n | FacetInfo\n | (FacetInfo & FacetValueFormat)\n | (FacetInfo & FacetValueFormat);\n };\n\n isMobile(): boolean;\n}\n\nexport function createAtomicStore(): AtomicStore {\n const commonStore = createAtomicCommonStore({\n loadingFlags: [],\n facets: {},\n numericFacets: {},\n dateFacets: {},\n categoryFacets: {},\n facetElements: [],\n sortOptions: [],\n iconAssetsPath: '',\n mobileBreakpoint: DEFAULT_MOBILE_BREAKPOINT,\n fieldsToInclude: [],\n currentQuickviewPosition: -1,\n });\n\n return {\n ...commonStore,\n\n getAllFacets() {\n return {\n ...commonStore.state.facets,\n ...commonStore.state.dateFacets,\n ...commonStore.state.categoryFacets,\n ...commonStore.state.numericFacets,\n };\n },\n\n isMobile() {\n return !window.matchMedia(\n makeDesktopQuery(commonStore.state.mobileBreakpoint)\n ).matches;\n },\n\n getUniqueIDFromEngine(engine: SearchEngine): string {\n return engine.state.search.response.searchUid;\n },\n };\n}\n","@import '../../../global/global.pcss';\n\n:host {\n height: inherit;\n width: inherit;\n & > slot {\n height: inherit;\n }\n}\n","import {\n LogLevel,\n Unsubscribe,\n buildUrlManager,\n UrlManager,\n buildSearchEngine,\n SearchEngine,\n SearchEngineConfiguration,\n SearchStatus,\n buildSearchStatus,\n loadSearchConfigurationActions,\n loadQueryActions,\n EcommerceDefaultFieldsToInclude,\n loadFieldActions,\n getOrganizationEndpoints as getOrganizationEndpointsHeadless,\n PlatformEnvironment,\n} from '@coveo/headless';\nimport {\n Component,\n Prop,\n h,\n Listen,\n Method,\n Watch,\n Element,\n State,\n} from '@stencil/core';\nimport i18next, {i18n} from 'i18next';\nimport {InitializeEvent} from '../../../utils/initialization-utils';\nimport {\n SafeStorage,\n StandaloneSearchBoxData,\n StorageItems,\n} from '../../../utils/local-storage-utils';\nimport {ArrayProp} from '../../../utils/props-utils';\nimport {CommonBindings} from '../../common/interface/bindings';\nimport {\n BaseAtomicInterface,\n CommonAtomicInterfaceHelper,\n mismatchedInterfaceAndEnginePropError,\n} from '../../common/interface/interface-common';\nimport {getAnalyticsConfig} from './analytics-config';\nimport {AtomicStore, createAtomicStore} from './store';\n\nconst FirstSearchExecutedFlag = 'firstSearchExecuted';\nexport type InitializationOptions = SearchEngineConfiguration;\nexport type Bindings = CommonBindings<\n SearchEngine,\n AtomicStore,\n HTMLAtomicSearchInterfaceElement\n>;\n\n/**\n * The `atomic-search-interface` component is the parent to all other atomic components in a search page. It handles the headless search engine and localization configurations.\n */\n@Component({\n tag: 'atomic-search-interface',\n styleUrl: 'atomic-search-interface.pcss',\n shadow: true,\n assetsDirs: ['lang'],\n})\nexport class AtomicSearchInterface\n implements BaseAtomicInterface\n{\n private urlManager!: UrlManager;\n private searchStatus!: SearchStatus;\n private unsubscribeUrlManager: Unsubscribe = () => {};\n private unsubscribeSearchStatus: Unsubscribe = () => {};\n private initialized = false;\n private store = createAtomicStore();\n private commonInterfaceHelper: CommonAtomicInterfaceHelper;\n\n @Element() public host!: HTMLAtomicSearchInterfaceElement;\n\n @State() public error?: Error;\n @State() relevanceInspectorIsOpen = false;\n\n /**\n * A list of non-default fields to include in the query results.\n *\n * Specify the property as an array using a JSON string representation:\n * ```html\n * \n * ```\n */\n @ArrayProp()\n @Prop({mutable: true})\n public fieldsToInclude: string[] | string = '[]';\n\n /**\n * The search interface [query pipeline](https://docs.coveo.com/en/180/).\n *\n * If the search interface is initialized using [`initializeWithSearchEngine`](https://docs.coveo.com/en/atomic/latest/reference/components/atomic-search-interface/#initializewithsearchengine), the query pipeline should instead be configured in the target engine.\n */\n @Prop({reflect: true, mutable: true}) public pipeline?: string;\n\n /**\n * The search interface [search hub](https://docs.coveo.com/en/1342/).\n *\n * If the search interface is initialized using [`initializeWithSearchEngine`](https://docs.coveo.com/en/atomic/latest/reference/components/atomic-search-interface/#initializewithsearchengine, the search hub should instead be configured in the target engine.\n */\n @Prop({reflect: true, mutable: true}) public searchHub?: string;\n\n /**\n * Whether analytics should be enabled.\n */\n @Prop({reflect: true}) public analytics = true;\n\n /**\n * The [tz database](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) identifier of the time zone to use to correctly interpret dates in the query expression, facets, and result items.\n * By default, the timezone will be [guessed](https://day.js.org/docs/en/timezone/guessing-user-timezone).\n *\n * Example: \"America/Montreal\"\n */\n @Prop({reflect: true}) public timezone?: string;\n\n /**\n * The severity level of the messages to log in the console.\n */\n @Prop({reflect: true}) public logLevel?: LogLevel;\n\n /**\n * The search interface i18next instance.\n */\n @Prop() public i18n: i18n = i18next.createInstance();\n\n /**\n * The search interface language.\n */\n @Prop({reflect: true}) public language = 'en';\n\n /**\n * The search interface headless engine.\n */\n @Prop({mutable: true}) public engine?: SearchEngine;\n\n /**\n * Whether the state should be reflected in the URL parameters.\n */\n @Prop({reflect: true}) public reflectStateInUrl = true;\n\n /**\n * The CSS selector for the container where the interface will scroll back to.\n */\n @Prop({reflect: true}) public scrollContainer = 'atomic-search-interface';\n\n /**\n * The language assets path. By default, this will be a relative URL pointing to `./lang`.\n *\n * Example: \"/mypublicpath/languages\"\n *\n */\n @Prop({reflect: true}) public languageAssetsPath = './lang';\n\n /**\n * The icon assets path. By default, this will be a relative URL pointing to `./assets`.\n *\n * Example: \"/mypublicpath/icons\"\n *\n */\n @Prop({reflect: true}) public iconAssetsPath = './assets';\n\n /**\n * Whether the relevance inspector shortcut should be enabled for this interface.\n *\n * The relevance inspector can be opened by holding the Alt key (Option on Mac) while over the interface, and performing a double click.\n *\n * The relevance inspector allows to troubleshoot and debug queries.\n */\n @Prop({reflect: true}) public enableRelevanceInspector = true;\n\n public constructor() {\n this.initRelevanceInspector();\n this.commonInterfaceHelper = new CommonAtomicInterfaceHelper(\n this,\n 'CoveoAtomic'\n );\n }\n\n public connectedCallback() {\n this.store.setLoadingFlag(FirstSearchExecutedFlag);\n this.updateMobileBreakpoint();\n }\n\n componentWillLoad() {\n this.initAriaLive();\n this.initFieldsToInclude();\n }\n\n public updateSearchConfiguration(\n updatedProp: 'searchHub' | 'pipeline',\n newValue: string | undefined\n ) {\n if (!this.commonInterfaceHelper.engineIsCreated(this.engine)) {\n return;\n }\n\n if (this.engine.state[updatedProp] === newValue) {\n return;\n }\n\n const {updateSearchConfiguration} = loadSearchConfigurationActions(\n this.engine\n );\n this.engine.dispatch(\n updateSearchConfiguration({\n [updatedProp]: newValue,\n })\n );\n }\n\n @Watch('searchHub')\n public updateSearchHub() {\n this.updateSearchConfiguration('searchHub', this.searchHub ?? 'default');\n }\n\n @Watch('pipeline')\n public updatePipeline() {\n this.updateSearchConfiguration('pipeline', this.pipeline);\n }\n\n @Watch('analytics')\n public toggleAnalytics() {\n if (!this.commonInterfaceHelper.engineIsCreated(this.engine)) {\n return;\n }\n\n this.commonInterfaceHelper.onAnalyticsChange();\n }\n\n @Watch('language')\n public updateLanguage() {\n if (!this.commonInterfaceHelper.engineIsCreated(this.engine)) {\n return;\n }\n\n const {updateSearchConfiguration} = loadSearchConfigurationActions(\n this.engine\n );\n this.engine.dispatch(\n updateSearchConfiguration({\n locale: this.language,\n })\n );\n this.commonInterfaceHelper.onLanguageChange();\n }\n\n @Watch('iconAssetsPath')\n public updateIconAssetsPath() {\n this.store.set('iconAssetsPath', this.iconAssetsPath);\n }\n\n public disconnectedCallback() {\n this.unsubscribeUrlManager();\n this.unsubscribeSearchStatus();\n window.removeEventListener('hashchange', this.onHashChange);\n }\n\n @Listen('atomic/initializeComponent')\n public handleInitialization(event: InitializeEvent) {\n this.commonInterfaceHelper.onComponentInitializing(event);\n }\n\n @Listen('atomic/scrollToTop')\n public scrollToTop() {\n const scrollContainerElement = document.querySelector(this.scrollContainer);\n if (!scrollContainerElement) {\n this.bindings.engine.logger.warn(\n `Could not find the scroll container with the selector \"${this.scrollContainer}\". This will prevent UX interactions that require a scroll from working correctly. Please check the CSS selector in the scrollContainer option`\n );\n return;\n }\n\n scrollContainerElement.scrollIntoView({behavior: 'smooth'});\n }\n\n @Listen('atomic/relevanceInspector/close')\n public closeRelevanceInspector() {\n this.relevanceInspectorIsOpen = false;\n }\n\n /**\n * Initializes the connection with the headless search engine using options for accessToken (required), organizationId (required), renewAccessToken, organizationEndpoints (recommended), and platformUrl (deprecated).\n */\n @Method() public initialize(options: InitializationOptions) {\n return this.internalInitialization(() => this.initEngine(options));\n }\n\n /**\n * Initializes the connection with an already preconfigured headless search engine, as opposed to the `initialize` method which will internally create a new search engine instance.\n * This bypasses the properties set on the component, such as analytics, searchHub, pipeline, language, timezone & logLevel.\n */\n @Method() public initializeWithSearchEngine(engine: SearchEngine) {\n if (this.pipeline && this.pipeline !== engine.state.pipeline) {\n console.warn(\n mismatchedInterfaceAndEnginePropError('search', 'query pipeline')\n );\n }\n if (this.searchHub && this.searchHub !== engine.state.searchHub) {\n console.warn(\n mismatchedInterfaceAndEnginePropError('search', 'search hub')\n );\n }\n return this.internalInitialization(() => (this.engine = engine));\n }\n\n /**\n *\n * Executes the first search and logs the interface load event to analytics, after initializing connection to the headless search engine.\n */\n @Method() public async executeFirstSearch() {\n if (!this.commonInterfaceHelper.engineIsCreated(this.engine)) {\n return;\n }\n\n if (!this.initialized) {\n console.error(\n 'You have to wait until the \"initialize\" promise is fulfilled before executing a search.',\n this.host\n );\n return;\n }\n\n const safeStorage = new SafeStorage();\n const standaloneSearchBoxData =\n safeStorage.getParsedJSON(\n StorageItems.STANDALONE_SEARCH_BOX_DATA,\n null\n );\n\n if (!standaloneSearchBoxData) {\n this.engine.executeFirstSearch();\n return;\n }\n\n safeStorage.removeItem(StorageItems.STANDALONE_SEARCH_BOX_DATA);\n const {updateQuery} = loadQueryActions(this.engine!);\n const {value, enableQuerySyntax, analytics} = standaloneSearchBoxData;\n this.engine!.dispatch(updateQuery({q: value, enableQuerySyntax}));\n this.engine.executeFirstSearchAfterStandaloneSearchBoxRedirect(analytics);\n }\n\n /**\n * Returns the unique, organization-specific endpoint(s)\n * @param {string} organizationId\n * @param {'prod'|'hipaa'|'staging'|'dev'} [env=Prod]\n */\n @Method() public async getOrganizationEndpoints(\n organizationId: string,\n env: PlatformEnvironment = 'prod'\n ) {\n return getOrganizationEndpointsHeadless(organizationId, env);\n }\n\n public get bindings(): Bindings {\n return {\n engine: this.engine!,\n i18n: this.i18n,\n store: this.store,\n interfaceElement: this.host,\n };\n }\n\n private initFieldsToInclude() {\n const fields = EcommerceDefaultFieldsToInclude.concat(this.fieldsToInclude);\n this.store.addFieldsToInclude(fields);\n }\n\n public registerFieldsToInclude() {\n this.engine?.dispatch(\n loadFieldActions(this.engine!).registerFieldsToInclude(\n this.store.state.fieldsToInclude\n )\n );\n }\n\n private updateMobileBreakpoint() {\n const breakpoint = this.host.querySelector(\n 'atomic-search-layout'\n )?.mobileBreakpoint;\n if (breakpoint) {\n this.store.set('mobileBreakpoint', breakpoint);\n }\n }\n\n private initEngine(options: InitializationOptions) {\n const searchConfig = this.getSearchConfiguration(options);\n const analyticsConfig = getAnalyticsConfig(\n options,\n this.analytics,\n this.store\n );\n try {\n this.engine = buildSearchEngine({\n configuration: {\n ...options,\n search: searchConfig,\n analytics: analyticsConfig,\n },\n loggerOptions: {\n level: this.logLevel,\n },\n });\n } catch (error) {\n this.error = error as Error;\n throw error;\n }\n }\n\n private getSearchConfiguration(options: InitializationOptions) {\n const searchConfigFromProps = {\n searchHub: this.searchHub ?? 'default',\n pipeline: this.pipeline,\n locale: this.language,\n timezone: this.timezone,\n };\n\n if (options.search) {\n return {\n ...searchConfigFromProps,\n ...options.search,\n };\n }\n\n return searchConfigFromProps;\n }\n\n private get fragment() {\n return window.location.hash.slice(1);\n }\n\n private initUrlManager() {\n if (!this.reflectStateInUrl) {\n return;\n }\n\n this.urlManager = buildUrlManager(this.engine!, {\n initialState: {fragment: this.fragment},\n });\n\n this.unsubscribeUrlManager = this.urlManager.subscribe(() =>\n this.updateHash()\n );\n\n window.addEventListener('hashchange', this.onHashChange);\n }\n\n private initAriaLive() {\n if (\n Array.from(this.host.children).some(\n (element) => element.tagName === 'ATOMIC-ARIA-LIVE'\n )\n ) {\n return;\n }\n this.host.prepend(document.createElement('atomic-aria-live'));\n }\n\n private initRelevanceInspector() {\n if (this.enableRelevanceInspector) {\n this.host.addEventListener('dblclick', (e) => {\n if (e.altKey) {\n this.relevanceInspectorIsOpen = !this.relevanceInspectorIsOpen;\n }\n });\n }\n }\n\n private initSearchStatus() {\n this.searchStatus = buildSearchStatus(this.engine!);\n this.unsubscribeSearchStatus = this.searchStatus.subscribe(() => {\n const hasNoResultsAfterInitialSearch =\n !this.searchStatus.state.hasResults &&\n this.searchStatus.state.firstSearchExecuted &&\n !this.searchStatus.state.hasError;\n\n this.host.classList.toggle(\n 'atomic-search-interface-no-results',\n hasNoResultsAfterInitialSearch\n );\n\n this.host.classList.toggle(\n 'atomic-search-interface-error',\n this.searchStatus.state.hasError\n );\n\n this.host.classList.toggle(\n 'atomic-search-interface-search-executed',\n this.searchStatus.state.firstSearchExecuted\n );\n\n if (\n this.searchStatus.state.firstSearchExecuted &&\n this.store.hasLoadingFlag(FirstSearchExecutedFlag)\n ) {\n this.store.unsetLoadingFlag(FirstSearchExecutedFlag);\n }\n });\n }\n\n private updateHash() {\n const newFragment = this.urlManager.state.fragment;\n\n if (!this.searchStatus.state.firstSearchExecuted) {\n history.replaceState(null, document.title, `#${newFragment}`);\n this.bindings.engine.logger.info(`History replaceState #${newFragment}`);\n\n return;\n }\n\n history.pushState(null, document.title, `#${newFragment}`);\n this.bindings.engine.logger.info(`History pushState #${newFragment}`);\n }\n\n private onHashChange = () => {\n this.urlManager.synchronize(this.fragment);\n };\n\n private async internalInitialization(initEngine: () => void) {\n await this.commonInterfaceHelper.onInitialization(initEngine);\n this.pipeline = this.engine!.state.pipeline;\n this.searchHub = this.engine!.state.searchHub;\n this.initSearchStatus();\n this.initUrlManager();\n this.initialized = true;\n }\n\n public render() {\n return [\n this.engine && this.enableRelevanceInspector && (\n \n ),\n ,\n ];\n }\n}\n"]}