{"version":3,"file":"toolbox-spinner.mjs","sources":["../../../projects/toolbox/spinner/spinner.service.ts","../../../projects/toolbox/spinner/component/spinner.component.ts","../../../projects/toolbox/spinner/component/spinner.component.html","../../../projects/toolbox/spinner/component/loader.component.ts","../../../projects/toolbox/spinner/spinner.config.ts","../../../projects/toolbox/spinner/spinner.interceptor.ts","../../../projects/toolbox/spinner/toolbox-spinner.ts"],"sourcesContent":["import { Injectable } from \"@angular/core\";\r\n\r\nimport { TbxSpinnerComponent } from \"./component/spinner.component\";\r\n\r\n/**\r\n * Maintains a list of spinner components to display on views.\r\n */\r\n@Injectable( { providedIn: \"root\" } )\r\nexport class TbxSpinnerService\r\n{\r\n  /** The cache of registered spinners. */\r\n  private spinnerCache = new Set<TbxSpinnerComponent>();\r\n\r\n  /**\r\n   * Registers the specified spinner component.\r\n   * @param spinner - The spinner to register.\r\n   */\r\n  public register( spinner: TbxSpinnerComponent ): void\r\n  {\r\n    this.spinnerCache.add( spinner );\r\n  }\r\n\r\n  /**\r\n   * Registers the specified spinner component.\r\n   * @param removeSpinner - The spinner to unregister.\r\n   */\r\n  public unregister( removeSpinner: TbxSpinnerComponent ): void\r\n  {\r\n    this.spinnerCache.forEach( spinner =>\r\n    {\r\n      if( spinner === removeSpinner )\r\n      {\r\n        this.spinnerCache.delete( removeSpinner );\r\n      }\r\n    } );\r\n  }\r\n\r\n  /**\r\n   * Un-registers spinner where their group name matches the specified name.\r\n   * @param spinnerGroup - The spinner group to unregister.\r\n   */\r\n  public unregisterGroup( spinnerGroup: string ): void\r\n  {\r\n    this.spinnerCache.forEach( spinner =>\r\n    {\r\n      if( spinner.group() === spinnerGroup )\r\n      {\r\n        this.spinnerCache.delete( spinner );\r\n      }\r\n    } );\r\n  }\r\n\r\n  /** Un-registers/removes all registered spinners. */\r\n  public unregisterAll(): void\r\n  {\r\n    this.spinnerCache.clear();\r\n  }\r\n\r\n  /**\r\n   * Shows (marks as visible) the specified spinner.\r\n   * @param spinnerName - The spinner name to show.\r\n   */\r\n  public show( spinnerName = \"spinner\" ): void\r\n  {\r\n    this.spinnerCache.forEach( spinner =>\r\n    {\r\n      if( spinner.name() === spinnerName )\r\n      {\r\n        spinner.show.set( true );\r\n      }\r\n    } );\r\n  }\r\n\r\n  /**\r\n   * Hides (marks as invisible) the specified spinner.\r\n   * @param spinnerName - The spinner name to hide.\r\n   */\r\n  public hide( spinnerName = \"spinner\" ): void\r\n  {\r\n    this.spinnerCache.forEach( spinner =>\r\n    {\r\n      if( spinner.name() === spinnerName )\r\n      {\r\n        spinner.show.set( false );\r\n      }\r\n    } );\r\n  }\r\n\r\n  /**\r\n   * Shows (marks as visible) the specified spinner group.\r\n   * @param spinnerGroup - The spinner group name to show.\r\n   */\r\n  public showGroup( spinnerGroup: string ): void\r\n  {\r\n    this.spinnerCache.forEach( spinner =>\r\n    {\r\n      if( spinner.group() === spinnerGroup )\r\n      {\r\n        spinner.show.set( true );\r\n      }\r\n    } );\r\n  }\r\n\r\n  /**\r\n   * Hides (marks as invisible) the specified spinner group.\r\n   * @param spinnerGroup - The spinner group name to hide.\r\n   */\r\n  public hideGroup( spinnerGroup: string ): void\r\n  {\r\n    this.spinnerCache.forEach( spinner =>\r\n    {\r\n      if( spinner.group() === spinnerGroup )\r\n      {\r\n        spinner.show.set( false );\r\n      }\r\n    } );\r\n  }\r\n\r\n  /** Shows all registered spinners. */\r\n  public showAll(): void\r\n  {\r\n    this.spinnerCache.forEach( spinner => spinner.show.set( true ) );\r\n  }\r\n\r\n  /** Hides all registered spinners. */\r\n  public hideAll(): void\r\n  {\r\n    this.spinnerCache.forEach( spinner => spinner.show.set( false ) );\r\n  }\r\n\r\n  /**\r\n   * Gets a value indicating whether the specified spinner is showing.\r\n   * @param spinnerName - The spinner name to check.\r\n   * @returns True if the spinner is showing, false otherwise.\r\n   */\r\n  public isShowing( spinnerName: string ): boolean | undefined\r\n  {\r\n    let showing: boolean | undefined;\r\n\r\n    this.spinnerCache.forEach( spinner =>\r\n    {\r\n      if( spinner.name() === spinnerName )\r\n      {\r\n        showing = spinner.show();\r\n      }\r\n    } );\r\n\r\n    return showing;\r\n  }\r\n}\r\n","import {\r\n  Component,\r\n  input,\r\n  output,\r\n  OnDestroy,\r\n  OnInit,\r\n  inject,\r\n  computed,\r\n  model,\r\n  effect\r\n} from \"@angular/core\";\r\n\r\nimport { TbxSpinnerService } from \"../spinner.service\";\r\n\r\n/**\r\n * A spinner components that shows a 'loading' image in the view.\r\n */\r\n@Component( {\r\n  selector: \"tbx-spinner\",\r\n  standalone: true,\r\n  templateUrl: \"./spinner.component.html\",\r\n  styleUrls: [\"./spinner.component.scss\"]\r\n} )\r\nexport class TbxSpinnerComponent implements OnInit, OnDestroy {\r\n  /** A data-bound input property for the spinner name. */\r\n  public readonly name = input( \"spinner\" );\r\n\r\n  /** A data-bound input property for the group name. */\r\n  public readonly group = input( \"\" );\r\n\r\n  /** A data-bound input property for the 'loading' image to load. */\r\n  public readonly loadingImage = input( \"assets/images/ajax-loader.gif\" );\r\n\r\n  /** Sets an event-bound output property for the spinner name. */\r\n  public readonly showChange = output<boolean>();\r\n\r\n  /** The class to apply to the spinner (defaults to 'tbx-spinner'). */\r\n  public readonly class = input( \"tbx-spinner\" );\r\n\r\n  /** A data-bound input property to indicate if the image is showing. */\r\n  public readonly show = model( false );\r\n\r\n  /** Indicates if the spinner is showing. */\r\n  protected isShowing = computed( () => this.show() );\r\n\r\n  protected showEffect = effect( () => this.showChange.emit( this.show() ) );\r\n\r\n  private readonly spinnerService = inject( TbxSpinnerService );\r\n\r\n  protected get spinnerClass(): string {\r\n    return [\r\n      this.class()\r\n    ].filter( Boolean ).join( \" \" );\r\n  }\r\n\r\n  public ngOnInit(): void {\r\n    // Register this component with the service, so it keeps track of it\r\n    this.spinnerService.register( this );\r\n  }\r\n\r\n  public ngOnDestroy(): void {\r\n    // Tell the service we've been destroyed\r\n    this.spinnerService.unregister( this );\r\n  }\r\n}\r\n","@if (isShowing()) {\r\n  <div [class]=\"spinnerClass\">\r\n    @if (loadingImage()) {\r\n      <img [src]=\"loadingImage()\" alt=\"Please wait...\"/>\r\n    }\r\n    <ng-content></ng-content>\r\n  </div>\r\n}\r\n","import { Component, computed, input } from \"@angular/core\";\r\n\r\n/**\r\n * A spinner components that shows a 'loading' image in the view when busy. If\r\n * you want to hide the content while loading, place the content inside the\r\n * <tbx-loader></tbx-loader> element. Otherwise, the loading image will show\r\n * on top of the content.\r\n */\r\n@Component( {\r\n  selector: \"tbx-loader\",\r\n  standalone: true,\r\n  template: `\r\n    @if (busy()) {\r\n      <div [class]=\"loaderClass()\" style=\"position: absolute;\">\r\n        <img [src]=\"loadImage()\" alt=\"loading...\"/>\r\n      </div>\r\n    } @else {\r\n      <ng-content></ng-content>\r\n    }\r\n  `\r\n} )\r\nexport class TbxLoaderComponent {\r\n  public readonly busy = input.required<boolean>();\r\n  public readonly class = input<string>();\r\n  public readonly loadImage = input<string>( \"assets/images/ajax-loader3.gif\" );\r\n\r\n  protected loaderClass = computed( () => [\r\n      \"tbx-loader\",\r\n      this.class()\r\n    ].filter( Boolean )\r\n     .join( \" \" ) );\r\n\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\n\r\n/**\r\n * Provides configuration for the spinner interceptor.\r\n */\r\n@Injectable( { providedIn: \"root\" } )\r\nexport class TbxSpinnerConfig {\r\n  public showSpinner = true;\r\n  public activeRequests = 0;\r\n  public skipUrls: string[] = [];\r\n}\r\n","import { inject } from \"@angular/core\";\r\nimport { HttpInterceptorFn } from \"@angular/common/http\";\r\nimport { finalize } from \"rxjs/operators\";\r\n\r\nimport { TbxSpinnerService } from \"./spinner.service\";\r\nimport { TbxSpinnerConfig } from \"./spinner.config\";\r\n\r\n/**\r\n * Intercepts when an HTTP request is made and displays the default spinner.\r\n */\r\nexport const tbxSpinnerInterceptor: HttpInterceptorFn = ( req, next ) => {\r\n  const spinnerService = inject( TbxSpinnerService );\r\n  const spinnerConfig = inject( TbxSpinnerConfig );\r\n\r\n  let showSpinner = spinnerConfig.showSpinner;\r\n\r\n  for( const skipUrl of spinnerConfig.skipUrls ) {\r\n    if( req.url.includes( skipUrl ) ) {\r\n      showSpinner = false;\r\n      break;\r\n    }\r\n  }\r\n\r\n  if( showSpinner ) {\r\n    if( spinnerConfig.activeRequests === 0 ) {\r\n      spinnerService.show();\r\n    }\r\n\r\n    spinnerConfig.activeRequests++;\r\n\r\n    return next( req )\r\n      .pipe( finalize( () => {\r\n        spinnerConfig.activeRequests--;\r\n\r\n        if( spinnerConfig.activeRequests === 0 ) {\r\n          spinnerService.hide();\r\n        }\r\n      } ) );\r\n  }\r\n  else {\r\n    return next( req );\r\n  }\r\n};\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}