{"version":3,"file":"ng-doc-ui-kit-classes-overlay-ref.mjs","sources":["../../../../libs/ui-kit/classes/overlay-ref/overlay-ref.ts","../../../../libs/ui-kit/classes/overlay-ref/ng-doc-ui-kit-classes-overlay-ref.ts"],"sourcesContent":["import {\n  ConnectedOverlayPositionChange,\n  FlexibleConnectedPositionStrategy,\n  OverlayRef,\n} from '@angular/cdk/overlay';\nimport { Location } from '@angular/common';\nimport { NgZone } from '@angular/core';\nimport { Event, NavigationEnd, Router } from '@angular/router';\nimport { isPresent } from '@ng-doc/core';\nimport { toElement } from '@ng-doc/ui-kit/helpers';\nimport { NgDocOverlayConfig, NgDocOverlayContainer } from '@ng-doc/ui-kit/interfaces';\nimport { fromSubscribe, ngDocZoneDetach, ngDocZoneOptimize } from '@ng-doc/ui-kit/observables';\nimport { NgDocOverlayAnimationEvent } from '@ng-doc/ui-kit/types';\nimport { fromEvent, merge, NEVER, Observable } from 'rxjs';\nimport { debounceTime, filter, map, pairwise, switchMap, take, takeUntil } from 'rxjs/operators';\n\nexport class NgDocOverlayRef<T = unknown> {\n  private overlayResult: T | null = null;\n  private opened: boolean = true;\n\n  constructor(\n    readonly overlayRef: OverlayRef,\n    private readonly overlayConfig: NgDocOverlayConfig,\n    readonly overlayContainer: NgDocOverlayContainer,\n    private readonly ngZone: NgZone,\n    private readonly router?: Router,\n    private readonly location?: Location,\n  ) {\n    /* Closes overlay when it was outside click */\n    this.afterOpen()\n      .pipe(\n        switchMap(() =>\n          this.ngZone.runOutsideAngular(() => this.overlayRef.outsidePointerEvents()),\n        ),\n        filter(\n          (event: MouseEvent) =>\n            !!this.overlayConfig.closeIfOutsideClick && this.outsideClickChecker(event),\n        ),\n        ngDocZoneOptimize(this.ngZone),\n      )\n      .subscribe(() => this.close());\n\n    /* Closes overlay when it was inner click */\n    fromEvent(this.overlayRef.overlayElement, 'click')\n      .pipe(\n        filter(() => !!this.overlayConfig.closeIfInnerClick),\n        takeUntil(this.overlayRef.detachments()),\n        ngDocZoneOptimize(this.ngZone),\n      )\n      .subscribe(() => this.close());\n\n    /* Closes overlay if route was changed */\n    if (this.router && this.overlayConfig.disposeOnRouteNavigation) {\n      this.router.events\n        .pipe(\n          filter((event: Event) => event instanceof NavigationEnd),\n          ngDocZoneOptimize(this.ngZone),\n          takeUntil(this.overlayRef.detachments()),\n        )\n        .subscribe(() => this.close());\n    }\n\n    if (this.location && this.overlayConfig.disposeOnNavigation) {\n      fromSubscribe(this.location)\n        .pipe(takeUntil(this.overlayRef.detachments()))\n        .subscribe(() => this.close());\n    }\n\n    if (!this.overlayConfig.disableClose) {\n      merge(\n        this.overlayRef.backdropClick(),\n        this.overlayRef.keydownEvents().pipe(filter((e: KeyboardEvent) => e.code === 'Escape')),\n      )\n        .pipe(take(1), takeUntil(this.overlayRef.detachments()))\n        .subscribe(() => this.close());\n    }\n\n    /* Update position if origin changes its position */\n    const origin: unknown = toElement(this.overlayConfig.origin);\n\n    if (origin instanceof HTMLElement) {\n      this.ngZone.onStable\n        .pipe(\n          debounceTime(10),\n          map(() => origin.getBoundingClientRect()),\n          pairwise(),\n          filter(\n            ([a, b]: [DOMRect, DOMRect]) =>\n              isPresent(a) &&\n              isPresent(b) &&\n              (a.x !== b.x || a.y !== b.y || a.width !== b.width || a.height !== b.height),\n          ),\n          ngDocZoneDetach(this.ngZone),\n          takeUntil(this.overlayRef.detachments()),\n        )\n        .subscribe(() => this.overlayRef.updatePosition());\n    }\n  }\n\n  /** Sets focus to overlay */\n  focus(): void {\n    this.overlayContainer.focus();\n  }\n\n  /** Overlay has focus */\n  get isFocused(): boolean {\n    return this.overlayContainer.isFocused;\n  }\n\n  /** Overlay is opened */\n  get isOpened(): boolean {\n    return this.opened;\n  }\n\n  /** Overlay has attached */\n  get hasAttached(): boolean {\n    return this.overlayRef.hasAttached();\n  }\n\n  /**\n   * Closes overlay\n   * @param closeResult\n   */\n  close(closeResult?: T): void {\n    this.overlayResult = isPresent(closeResult) ? closeResult : null;\n    this.afterClose().subscribe(() => void this.overlayRef.detach());\n    this.overlayContainer.close();\n    this.overlayRef.detachBackdrop();\n    this.opened = false;\n  }\n\n  beforeOpen(): Observable<void> {\n    return this.overlayContainer.animationEvent.pipe(\n      filter((event: NgDocOverlayAnimationEvent) => event === 'beforeOpen'),\n      take(1),\n      map(() => void 0),\n    );\n  }\n\n  afterOpen(): Observable<void> {\n    return this.overlayContainer.animationEvent.pipe(\n      filter((event: NgDocOverlayAnimationEvent) => event === 'afterOpen'),\n      take(1),\n      map(() => void 0),\n    );\n  }\n\n  beforeClose(): Observable<T | null> {\n    return merge(\n      this.overlayContainer.animationEvent.pipe(\n        filter((event: NgDocOverlayAnimationEvent) => event === 'beforeClose'),\n      ),\n      this.overlayRef.detachments(),\n    ).pipe(\n      take(1),\n      map(() => this.overlayResult),\n    );\n  }\n\n  afterClose(): Observable<T | null> {\n    return merge(\n      this.overlayContainer.animationEvent.pipe(\n        filter((event: NgDocOverlayAnimationEvent) => event === 'afterClose'),\n      ),\n      this.overlayRef.detachments(),\n    ).pipe(\n      take(1),\n      map(() => this.overlayResult),\n    );\n  }\n\n  positionChanges(): Observable<ConnectedOverlayPositionChange> {\n    return this.overlayConfig.positionStrategy instanceof FlexibleConnectedPositionStrategy\n      ? this.overlayConfig.positionStrategy.positionChanges\n      : NEVER;\n  }\n\n  private outsideClickChecker(event: MouseEvent): boolean {\n    const target: EventTarget | null = event.target;\n    if (target instanceof Element) {\n      const origin: unknown = toElement(this.overlayConfig.origin);\n      if (origin instanceof HTMLElement) {\n        return !origin.contains(target);\n      }\n    }\n    return true;\n  }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}