{"version":3,"file":"angular-cool-loading-button.mjs","sources":["../../../projects/loading-button/src/lib/cool-loading-button.component.ts","../../../projects/loading-button/src/lib/cool-loading-button.component.html","../../../projects/loading-button/src/public-api.ts","../../../projects/loading-button/src/angular-cool-loading-button.ts"],"sourcesContent":["import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, output, signal, } from '@angular/core';\nimport { ThemePalette } from '@angular/material/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { NgTemplateOutlet } from '@angular/common';\n\n@Component({\n  selector: 'cool-loading-button',\n  templateUrl: './cool-loading-button.component.html',\n  styleUrls: ['./cool-loading-button.component.scss'],\n  imports: [\n    MatButtonModule,\n    MatProgressSpinnerModule,\n    NgTemplateOutlet,\n  ],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  standalone: true,\n})\nexport class CoolLoadingButton<T> {\n\n  constructor(\n    private _changeDetector: ChangeDetectorRef,\n  ) {\n  }\n\n  public isLoading = signal<boolean>(false);\n\n  @Input()\n  public color: ThemePalette;\n\n  @Input()\n  public spinnerColor: ThemePalette;\n\n  @Input()\n  public disabled: boolean;\n\n  @Input()\n  public display: 'basic' | 'raised' | 'flat' | 'stroked' = 'raised';\n\n  @Input()\n  public clickHandler: (parameters: T) => Promise<any> | any;\n\n  @Input()\n  public clickParameters: T;\n\n  @Input('class')\n  public innerClass: string = '';\n\n  public loadingChanged = output<boolean>();\n\n  public loadingFinished = output<void>();\n\n  public async onClick() {\n    if (this.disabled || this.isLoading() || !this.clickHandler) {\n      return;\n    }\n\n    try {\n      this._changeIsLoading(true);\n\n      await Promise.resolve(this.clickHandler(this.clickParameters));\n    } finally {\n      this._changeIsLoading(false);\n\n      this.loadingFinished.emit();\n    }\n  }\n\n  private _changeIsLoading(loadingValue: boolean) {\n    this.isLoading.set(loadingValue);\n\n    this.loadingChanged.emit(loadingValue);\n\n    this._changeDetector.markForCheck();\n  }\n}\n","<ng-template #buttonContentTemplate>\n  <div class=\"button-content-container\">\n    @if (isLoading()) {\n      <mat-spinner [color]=\"spinnerColor\" [diameter]=\"20\" class=\"spinner\"/>\n    }\n    <ng-content/>\n  </div>\n</ng-template>\n\n@switch (display) {\n  @case ('basic') {\n    <button mat-button\n            [color]=\"color\"\n            [disabled]=\"disabled || isLoading()\"\n            class=\"{{ innerClass }}\"\n            (click)=\"onClick()\">\n      <ng-container *ngTemplateOutlet=\"buttonContentTemplate\"/>\n    </button>\n  }\n  @case ('flat') {\n    <button mat-flat-button\n            [color]=\"color\"\n            [disabled]=\"disabled || isLoading()\"\n            class=\"{{ innerClass }}\"\n            (click)=\"onClick()\">\n      <ng-container *ngTemplateOutlet=\"buttonContentTemplate\"/>\n    </button>\n  }\n  @case ('stroked') {\n    <button mat-stroked-button\n            [color]=\"color\"\n            [disabled]=\"disabled || isLoading()\"\n            class=\"{{ innerClass }}\"\n            (click)=\"onClick()\">\n      <ng-container *ngTemplateOutlet=\"buttonContentTemplate\"/>\n    </button>\n  }\n  @default {\n    <button mat-raised-button\n            [color]=\"color\"\n            [disabled]=\"disabled || isLoading()\"\n            class=\"{{ innerClass }}\"\n            (click)=\"onClick()\">\n      <ng-container *ngTemplateOutlet=\"buttonContentTemplate\"/>\n    </button>\n  }\n}\n","/*\n * Public API Surface of loading-button\n */\n\nexport * from './lib/cool-loading-button.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}