{"version":3,"names":["buildDebouncedQueue","options","actions","intervalId","dequeueAction","action","shift","execute","clearInterval","cancelActionIfQueued","id","filter","enqueue","uniqueId","push","setInterval","delay","clear","AtomicAriaLive","this","regions","messagesQueue","randomID","onFindAriaLive","detail","args","element","isInSearchInterface","host","tagName","parentElement","updateMessage","region","message","assertive","updateRegion","registerRegion","disconnectedCallback","render","h","Host","style","position","display","height","overflow","margin","Object","entries","map","regionName","key","role","atomicRelevanceInspectorCss","AtomicRelevanceInspector","open","exportparts","isOpen","close","_a","closeRelevanceInspector","emit","slot","class","Button","onClick","target","href","adminHref","extractEnvironmentFromPlatformURL","platformUrl","bindings","engine","state","configuration","fallbackEnv","platformUrlMatch","match","_b","groups","env","organizationEndpointMatch","_d","_c","organizationId","admin","getOrganizationEndpoints","searchResponseId","search"],"sources":["src/utils/debounce-utils.tsx","src/components/search/atomic-search-interface/atomic-aria-live.tsx","src/components/search/atomic-relevance-inspector/atomic-relevance-inspector.pcss?tag=atomic-relevance-inspector&encapsulation=shadow","src/components/search/atomic-relevance-inspector/atomic-relevance-inspector.tsx"],"sourcesContent":["export interface DebouncedQueueOptions {\n delay: number;\n}\n\nexport interface DebouncedQueue {\n enqueue(execute: () => void, uniqueId?: string): void;\n clear(): void;\n cancelActionIfQueued(id: string): void;\n}\n\ninterface QueuedAction {\n id?: string;\n execute: () => void;\n}\n\nexport function buildDebouncedQueue(\n options: DebouncedQueueOptions\n): DebouncedQueue {\n let actions: QueuedAction[] = [];\n let intervalId: ReturnType<typeof setInterval> | null = null;\n\n function dequeueAction() {\n const action = actions.shift();\n if (action) {\n action.execute();\n } else {\n clearInterval(intervalId!);\n intervalId = null;\n }\n }\n\n function cancelActionIfQueued(id: string) {\n actions = actions.filter((action) => action.id !== id);\n }\n\n return {\n enqueue(execute: () => void, uniqueId?: string) {\n if (uniqueId) {\n cancelActionIfQueued(uniqueId);\n }\n actions.push({id: uniqueId, execute});\n if (intervalId === null) {\n dequeueAction();\n intervalId = setInterval(dequeueAction, options.delay);\n }\n },\n clear() {\n actions = [];\n },\n cancelActionIfQueued,\n };\n}\n","import {\n Component,\n h,\n Host,\n State,\n Element,\n Method,\n Listen,\n} from '@stencil/core';\nimport {FindAriaLiveEventArgs} from '../../../utils/accessibility-utils';\nimport {buildDebouncedQueue} from '../../../utils/debounce-utils';\nimport {randomID} from '../../../utils/utils';\n\ntype Regions = {[regionName: string]: {assertive: boolean; message: string}};\n\n/**\n * The `atomic-aria-live` component notifies screen readers of changes in the search interface.\n */\n@Component({\n tag: 'atomic-aria-live',\n shadow: false,\n})\nexport class AtomicAriaLive {\n @Element() private host!: HTMLAtomicAriaLiveElement;\n @State() private regions: Readonly<Regions> = {};\n\n private messagesQueue = buildDebouncedQueue({delay: 500});\n private id = randomID('aria-live-');\n\n @Listen('atomic/accessibility/findAriaLive', {target: 'document'})\n protected onFindAriaLive({detail: args}: CustomEvent<FindAriaLiveEventArgs>) {\n if (!args.element || !this.isInSearchInterface) {\n args.element = this.host;\n }\n }\n\n private get isInSearchInterface() {\n let element: Element | null = this.host;\n while (element) {\n if (element.tagName === 'ATOMIC-SEARCH-INTERFACE') {\n return true;\n }\n element = element.parentElement;\n }\n return false;\n }\n\n /**\n * @internal\n */\n @Method()\n public async updateMessage(\n region: string,\n message: string,\n assertive: boolean\n ) {\n const updateRegion = () =>\n (this.regions = {...this.regions, [region]: {assertive, message}});\n\n if (message) {\n this.messagesQueue.enqueue(updateRegion, region);\n } else {\n this.messagesQueue.cancelActionIfQueued(region);\n updateRegion();\n }\n }\n\n /**\n * @internal\n */\n @Method()\n public async registerRegion(region: string, assertive: boolean) {\n if (region in this.regions) {\n return;\n }\n this.regions = {...this.regions, [region]: {assertive, message: ''}};\n }\n\n public disconnectedCallback() {\n this.messagesQueue.clear();\n }\n\n public render() {\n return (\n <Host\n style={{\n position: 'absolute',\n display: 'block',\n height: '0',\n overflow: 'hidden',\n margin: '0',\n }}\n >\n {Object.entries(this.regions).map(\n ([regionName, {assertive, message}]) => (\n <div\n key={regionName}\n id={`${this.id}-${regionName}`}\n aria-live={assertive ? 'assertive' : 'polite'}\n role=\"status\"\n >\n {message}\n </div>\n )\n )}\n </Host>\n );\n }\n}\n","@import '../../../global/global.pcss';\n","import {PlatformEnvironment, getOrganizationEndpoints} from '@coveo/headless';\nimport {Component, h, Prop, Event, EventEmitter} from '@stencil/core';\nimport {Button} from '../../common/button';\nimport {Bindings} from '../atomic-search-interface/atomic-search-interface';\n\n/**\n * The `atomic-relevance-inspector` component is used internally to offer insight on search page relevance, as well as information to help troubleshoot issues during development.\n */\n@Component({\n tag: 'atomic-relevance-inspector',\n styleUrl: 'atomic-relevance-inspector.pcss',\n shadow: true,\n})\nexport class AtomicRelevanceInspector {\n /**\n * The Atomic interface bindings, namely the headless search engine and i18n instances.\n */\n @Prop() bindings!: Bindings;\n\n @Prop({reflect: true}) open = false;\n\n @Event({eventName: 'atomic/relevanceInspector/close'})\n closeRelevanceInspector: EventEmitter<null> | undefined;\n\n public render() {\n return (\n <atomic-modal\n exportparts=\"footer\"\n isOpen={this.open}\n close={() => {\n this.closeRelevanceInspector?.emit();\n }}\n >\n <p slot=\"header\">Open the relevance inspector</p>\n <p slot=\"body\">\n The Relevance Inspector will open in the Coveo Administration Console.\n </p>\n <div slot=\"footer\" class=\"w-full flex justify-end items-center\">\n <Button\n style=\"outline-primary\"\n class=\"p-2 mr-2\"\n onClick={() => this.closeRelevanceInspector?.emit()}\n >\n Ignore\n </Button>\n <a\n class=\"btn-primary p-2\"\n target=\"_blank\"\n href={this.adminHref}\n onClick={() => this.closeRelevanceInspector?.emit()}\n >\n Open\n </a>\n </div>\n </atomic-modal>\n );\n }\n\n private extractEnvironmentFromPlatformURL(): PlatformEnvironment {\n const {platformUrl} = this.bindings.engine.state.configuration;\n const fallbackEnv = 'prod';\n\n const platformUrlMatch = platformUrl.match(\n /^https:\\/\\/platform(?<env>dev|stg|hipaa)/\n );\n\n if (platformUrlMatch) {\n return (\n (platformUrlMatch.groups?.env as PlatformEnvironment) ?? fallbackEnv\n );\n }\n\n const organizationEndpointMatch = platformUrl.match(\n /^https:\\/\\/[a-z0-9]+\\.org(?<env>dev|stg|hipaa)/\n );\n\n if (organizationEndpointMatch) {\n return (\n (organizationEndpointMatch.groups?.env as PlatformEnvironment) ??\n fallbackEnv\n );\n }\n\n return fallbackEnv;\n }\n\n private get adminHref() {\n const {organizationId} = this.bindings.engine.state.configuration;\n\n const {admin} = getOrganizationEndpoints(\n organizationId,\n this.extractEnvironmentFromPlatformURL() as PlatformEnvironment\n );\n const {searchResponseId} = this.bindings.engine.state.search;\n return `${admin}/admin/#/${organizationId}/search/relevanceInspector/${searchResponseId}`;\n }\n}\n"],"mappings":"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"}