{"version":3,"file":"toolbox-dialog.mjs","sources":["../../../projects/toolbox/dialog/dialog-config.ts","../../../projects/toolbox/dialog/dialog-ref.ts","../../../projects/toolbox/dialog/insertion.directive.ts","../../../projects/toolbox/dialog/dialog.component.ts","../../../projects/toolbox/dialog/dialog.component.html","../../../projects/toolbox/dialog/dialog-injector.ts","../../../projects/toolbox/dialog/dialog.service.ts","../../../projects/toolbox/dialog/toolbox-dialog.ts"],"sourcesContent":["/**\r\n * Configuration for a dialog to open.\r\n */\r\nexport class TbxDialogConfig {\r\n  /** The data to provide to the dialog. */\r\n  public data?: unknown;\r\n\r\n  /**\r\n   * Indicates to display a transparent backdrop if true. Alternative,\r\n   * 'static' will display the backdrop and won't close the dialog\r\n   * on click.\r\n   */\r\n  public backdrop?: boolean | \"static\" = true;\r\n}\r\n","import { Observable, Subject } from \"rxjs\";\r\n\r\n/**\r\n * A reference to the dialog component instance.\r\n */\r\nexport class TbxDialogRef {\r\n  /**\r\n   * An event raised after the component has been closed. If you subscribe\r\n   * to this observable, it's completed after emit, so there's no need\r\n   * to unsubscribe.\r\n   */\r\n  public closed: Observable<unknown>;\r\n\r\n  private readonly closedInternal;\r\n\r\n  public constructor() {\r\n    this.closedInternal = new Subject<unknown>();\r\n    this.closed = this.closedInternal.asObservable();\r\n  }\r\n\r\n  /**\r\n   * Closes the component passing an optional result and closes the stream.\r\n   * @param result An optional result to send back after closing.\r\n   */\r\n  public close( result?: unknown ): void {\r\n    this.closedInternal.next( result );\r\n    this.closedInternal.complete();\r\n  }\r\n}\r\n","import { Directive, ViewContainerRef } from \"@angular/core\";\r\n\r\n@Directive( {\r\n  selector: \"[tbxInsertion]\",\r\n  standalone: true\r\n} )\r\nexport class TbxInsertionDirective {\r\n  public constructor( public viewContainerRef: ViewContainerRef ) {\r\n  }\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport {\r\n  Component,\r\n  Type,\r\n  ViewChild,\r\n  OnDestroy,\r\n  ComponentRef,\r\n  AfterViewInit,\r\n  ChangeDetectorRef,\r\n  EmbeddedViewRef\r\n} from \"@angular/core\";\r\n\r\nimport { Observable, Subject } from \"rxjs\";\r\n\r\nimport { TbxInsertionDirective } from \"./insertion.directive\";\r\nimport { TbxDialogRef } from \"./dialog-ref\";\r\nimport { TbxDialogConfig } from \"./dialog-config\";\r\n\r\n@Component( {\r\n  selector: \"tbx-dialog\",\r\n  templateUrl: \"./dialog.component.html\",\r\n  styleUrls: [\"./dialog.component.css\"],\r\n  imports: [TbxInsertionDirective]\r\n} )\r\nexport class TbxDialogComponent implements AfterViewInit, OnDestroy {\r\n\r\n  @ViewChild( TbxInsertionDirective )\r\n  public insertionPoint!: TbxInsertionDirective;\r\n\r\n  public componentRef?: ComponentRef<any>;\r\n  public childComponentType!: Type<any>;\r\n  public closed: Observable<any>;\r\n  public showBackdrop = true;\r\n\r\n  private readonly closeInternal = new Subject<any>();\r\n\r\n  public constructor(\r\n    private readonly cd: ChangeDetectorRef,\r\n    private readonly dialogRef: TbxDialogRef,\r\n    private readonly dialogConfig: TbxDialogConfig\r\n  ) {\r\n    this.closed = this.closeInternal.asObservable();\r\n\r\n    this.showBackdrop =\r\n      this.dialogConfig.backdrop === undefined\r\n      ? true\r\n      : this.dialogConfig.backdrop === \"static\"\r\n        ? true\r\n        : this.dialogConfig.backdrop;\r\n  }\r\n\r\n  public ngAfterViewInit(): void {\r\n    this.loadChildComponent( this.childComponentType );\r\n    this.cd.detectChanges();\r\n\r\n    const viewRef = (\r\n      this.componentRef?.hostView as EmbeddedViewRef<any>\r\n    );\r\n    const domElem = viewRef.rootNodes[0] as HTMLElement;\r\n\r\n    const els = domElem.querySelectorAll( \"[autofocus], [tbxAutoFocus]\" );\r\n\r\n    if( els.length > 0 ) {\r\n      const el = els[0] as HTMLElement;\r\n\r\n      setTimeout( () => el?.focus(), 100 );\r\n    }\r\n  }\r\n\r\n  public onOverlayClicked( _: MouseEvent ): void {\r\n    if( this.dialogConfig.backdrop !== \"static\" ) {\r\n      this.dialogRef.close();\r\n    }\r\n  }\r\n\r\n  public onDialogClicked( evt: any ): void {\r\n    const pEl = (\r\n      evt.target?.parentElement as HTMLElement\r\n    );\r\n    if( pEl?.id === \"tbx-modal\" && this.dialogConfig.backdrop !== \"static\" ) {\r\n      this.dialogRef.close();\r\n    }\r\n\r\n    evt.stopPropagation();\r\n  }\r\n\r\n  public loadChildComponent( componentType: Type<any> ): void {\r\n    const viewContainerRef = this.insertionPoint.viewContainerRef;\r\n    viewContainerRef.clear();\r\n\r\n    this.componentRef = viewContainerRef.createComponent( componentType );\r\n  }\r\n\r\n  public ngOnDestroy(): void {\r\n    this.componentRef?.destroy();\r\n  }\r\n\r\n  public close( value: any ): void {\r\n    this.closeInternal.next( value );\r\n    this.closeInternal.complete();\r\n  }\r\n}\r\n","<div class=\"modal fade show\"\r\n     (click)=\"onDialogClicked($event)\"\r\n     style=\"display: block;\"\r\n     id=\"tbx-modal\">\r\n  <ng-template tbxInsertion></ng-template>\r\n</div>\r\n\r\n<div class=\"modal-backdrop fade\"\r\n     inert\r\n     tabindex=\"-1\"\r\n     [class.show]=\"showBackdrop\"\r\n     (click)=\"onOverlayClicked($event)\">\r\n</div>\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport {\r\n  Injector,\r\n  Type,\r\n  InjectionToken,\r\n  InjectOptions\r\n} from \"@angular/core\";\r\n\r\nexport class TbxDialogInjector implements Injector {\r\n  public constructor(\r\n    private readonly parentInjector: Injector,\r\n    private readonly additionalTokens: WeakMap<any, any>\r\n  ) {\r\n  }\r\n\r\n  public get<T>(\r\n    token: Type<T> | InjectionToken<T>,\r\n    notFoundValue?: T,\r\n    flags?: InjectOptions\r\n  ): T;\r\n\r\n  public get( token: any, notFoundValue?: any ): any;\r\n\r\n  /**\r\n   * Retrieves an instance from the injector based on the provided token.\r\n   *\r\n   * @param token The token to get.\r\n   * @param notFoundValue The value to return when not found.\r\n   * @param flags Additional flags to the injector.\r\n   * @returns The instance if found, otherwise the not found value.\r\n   */\r\n  public get( token: any, notFoundValue?: any, flags?: InjectOptions ): any {\r\n    const value = this.additionalTokens.get( token );\r\n\r\n    if( value != null ) {\r\n      return value;\r\n    }\r\n\r\n    return this.parentInjector.get<any>( token, notFoundValue, flags );\r\n  }\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport {\r\n  Injectable,\r\n  ComponentFactoryResolver,\r\n  ApplicationRef,\r\n  Injector,\r\n  Type,\r\n  ComponentRef,\r\n  EmbeddedViewRef\r\n} from \"@angular/core\";\r\n\r\nimport { TbxDialogComponent } from \"./dialog.component\";\r\nimport { TbxDialogInjector } from \"./dialog-injector\";\r\nimport { TbxDialogConfig } from \"./dialog-config\";\r\nimport { TbxDialogRef } from \"./dialog-ref\";\r\n\r\n@Injectable( { providedIn: \"root\" } )\r\nexport class TbxDialogService {\r\n  public dialogComponentRef!: ComponentRef<TbxDialogComponent>;\r\n\r\n  public constructor(\r\n    private readonly componentFactoryResolver: ComponentFactoryResolver,\r\n    private readonly appRef: ApplicationRef,\r\n    private readonly injector: Injector\r\n  ) {\r\n  }\r\n\r\n  public open( componentType: Type<any>, config: TbxDialogConfig ): TbxDialogRef {\r\n    const dialogRef = this.appendDialogComponentToBody( config );\r\n\r\n    this.dialogComponentRef.instance.childComponentType = componentType;\r\n\r\n    return dialogRef;\r\n  }\r\n\r\n  private appendDialogComponentToBody( config: TbxDialogConfig ): TbxDialogRef {\r\n    const map = new WeakMap();\r\n    map.set( TbxDialogConfig, config );\r\n\r\n    const dialogRef = new TbxDialogRef();\r\n    map.set( TbxDialogRef, dialogRef );\r\n\r\n    const sub = dialogRef.closed.subscribe( () => {\r\n      this.removeDialogComponentFromBody();\r\n      sub.unsubscribe();\r\n    } );\r\n\r\n    const componentFactory = this.componentFactoryResolver\r\n                                 .resolveComponentFactory( TbxDialogComponent );\r\n\r\n    const componentRef = componentFactory\r\n      .create( new TbxDialogInjector( this.injector, map ) );\r\n\r\n    this.appRef.attachView( componentRef.hostView );\r\n\r\n    const viewRef = componentRef.hostView as EmbeddedViewRef<never>;\r\n    const domElem = viewRef.rootNodes[0] as HTMLElement;\r\n\r\n    document.body.appendChild( domElem );\r\n    this.dialogComponentRef = componentRef;\r\n\r\n    this.dialogComponentRef.instance.closed.subscribe( () => {\r\n      this.removeDialogComponentFromBody();\r\n    } );\r\n\r\n    return dialogRef;\r\n  }\r\n\r\n  private removeDialogComponentFromBody(): void {\r\n    this.appRef.detachView( this.dialogComponentRef.hostView );\r\n    this.dialogComponentRef.destroy();\r\n  }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.TbxDialogRef","i2.TbxDialogConfig"],"mappings":"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"}