{"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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"}