{"version":3,"file":"ipi-soft-ng-components-snackbar.mjs","sources":["../../../../projects/ipi-soft/ng-components/snackbar/src/snackbar.component.ts","../../../../projects/ipi-soft/ng-components/snackbar/src/snackbar.component.html","../../../../projects/ipi-soft/ng-components/snackbar/src/snackbar.service.ts","../../../../projects/ipi-soft/ng-components/snackbar/ipi-soft-ng-components-snackbar.ts"],"sourcesContent":["import { NgClass } from '@angular/common';\nimport { Component, Input, Output, EventEmitter } from '@angular/core';\n\nimport { IpiImageComponent } from '@ipi-soft/ng-components/image';\n\nexport enum verticalPosition {\n  Bottom,\n  Top\n}\n\nexport enum horizontalPosition {\n  Left,\n  Center,\n  Right\n}\n\nexport interface IpiSnackbarOptions {\n  title?: string;\n  icon?: string;\n  error?: boolean;\n  animationDuration: number;\n  backgroundColor?: string;\n  errorBackgroundColor?: string;\n  placeholderTextColor?: string;\n  messageTextColor?: string;\n  progressColor?: string;\n  xIconColor?: string;\n}\n\nexport interface SnackbarPosition {\n  horizontalPosition?: horizontalPosition;\n  verticalPosition?: verticalPosition;\n}\n\n@Component({\n  selector: 'ipi-snackbar',\n  templateUrl: './snackbar.component.html',\n  styleUrls: ['./snackbar.component.css'],\n  imports: [\n    NgClass,\n    IpiImageComponent,\n  ]\n})\n\nexport class IpiSnackbarComponent {\n  @Input() message!: String;\n  @Input() options!: IpiSnackbarOptions;\n\n  @Input() positionOptions!: SnackbarPosition;\n\n  @Output() closed = new EventEmitter<void>();\n}\n","<div\n    class=\"custom-snackbar\"\n    [class.error]=\"options.error\"\n    [ngClass]=\"[ 'horizontal-' + positionOptions.horizontalPosition, 'vertical-' + positionOptions.verticalPosition]\"\n    [style.ipi-snackbar-animation-duration]=\"options.animationDuration + 's'\">\n\n    <div class=\"placeholder-wrapper\">\n        @if (options.icon) {\n            <ipi-img [src]=\"'assets/img/' + options.icon\" [ariaLabel]=\"'Snackbar prefix icon'\"></ipi-img>\n        }\n\n        <div class=\"placeholder\">{{ options.title ?? (options.error ? 'Error' : 'Success') }}</div>\n\n        <div class=\"x-icon\" (click)=\"closed.emit()\"></div>\n    </div>\n\n    <div class=\"message-wrapper\" [ngClass]=\"{ 'no-padding' : !options.icon }\">\n        <div class=\"message\">{{ message }}</div>\n    </div>\n\n    <div class=\"progress\" [style.animation-duration]=\"options.animationDuration + 's'\"></div>\n</div>\n","import { Injectable, ComponentRef, ApplicationRef, EmbeddedViewRef, createComponent } from '@angular/core';\n\nimport { OverlayService } from '@ipi-soft/ng-components/services';\n\nimport { IpiSnackbarComponent, IpiSnackbarOptions, SnackbarPosition, verticalPosition, horizontalPosition } from './snackbar.component';\n\n@Injectable({\n  providedIn: 'root'\n})\n\nexport class IpiSnackbarService {\n\n  constructor(\n    private appRef: ApplicationRef,\n    private overlayService: OverlayService) { }\n\n  private maxSnackbars = 5;\n  private fixedContainer!: HTMLElement;\n\n  private defaultSnackbarOptions: IpiSnackbarOptions = {\n    error: false,\n    animationDuration: 10,\n    backgroundColor: '#14BD6C',\n    placeholderTextColor: '#FFFFFF',\n    messageTextColor: '#FFFFFF',\n    progressColor: '#FFFFFF',\n    xIconColor: '#FFFFFF',\n    errorBackgroundColor: '#F96138'\n  };\n\n  private positionOptions: SnackbarPosition = {\n    verticalPosition: verticalPosition.Bottom,\n    horizontalPosition: horizontalPosition.Center\n  };\n\n  private snackbarsArray: ComponentRef<IpiSnackbarComponent>[] = [];\n\n  public open(message: string, options?: Partial<IpiSnackbarOptions>): void {\n    this.createFixedComponent();\n\n    const snackbarOptions = {\n      ...this.defaultSnackbarOptions,\n      ...options\n    };\n\n    const snackbarRef = this.createAndAppendSnackbar(snackbarOptions);\n\n    snackbarRef.instance.message = message;\n\n    this.closeIfMaxSnackbar();\n\n    this.snackbarsArray.push(snackbarRef);\n\n    this.subscribeToClosingEvents(snackbarRef);\n  }\n  \n  public setPosition(options: SnackbarPosition): void {\n    this.positionOptions = options;\n  }\n\n  public setMaxSnackbars(length: number): void {\n    this.maxSnackbars = length;\n  }\n\n  public updateDefaultOptions(options: Partial<IpiSnackbarOptions>): void {\n    this.defaultSnackbarOptions = { ...this.defaultSnackbarOptions, ...options };\n  }\n\n  private createFixedComponent(): void {\n    if (!this.fixedContainer || this.fixedContainer.children.length === 0) {\n      this.fixedContainer = document.createElement('div');\n\n      this.setFixedComponentStyling();\n\n      this.overlayService.appendToOverlay(this.fixedContainer, false);\n    }\n  }\n\n  private createAndAppendSnackbar(options: IpiSnackbarOptions): ComponentRef<IpiSnackbarComponent> {\n    const componentRef = createComponent(IpiSnackbarComponent, { environmentInjector: this.appRef.injector });\n\n    componentRef.instance.options = options;\n    componentRef.instance.positionOptions = this.positionOptions;\n\n    this.appRef.attachView(componentRef.hostView);\n\n    const snackbarElement = (componentRef.hostView as EmbeddedViewRef<any>).rootNodes[0] as HTMLElement;\n\n    this.applyCustomStyles(snackbarElement, options);\n\n    this.fixedContainer.appendChild(snackbarElement);\n\n    setTimeout(() => {\n      componentRef.destroy();\n      this.close(this.snackbarsArray.indexOf(componentRef));\n\n      if (this.snackbarsArray.length === 0) {\n        this.overlayService.removeFromOverlay(this.fixedContainer);\n      }\n    }, options.animationDuration * 1000);\n\n    return componentRef;\n  }\n\n  private applyCustomStyles(snackbarElement: HTMLElement, options: IpiSnackbarOptions): void {\n    const styles = {\n      '--ipi-snackbar-background-color': options.backgroundColor,\n      '--ipi-snackbar-placeholder-text-color': options.placeholderTextColor,\n      '--ipi-snackbar-message-text-color': options.messageTextColor,\n      '--ipi-snackbar-progress-color': options.progressColor,\n      '--ipi-snackbar-x-icon-color': options.xIconColor,\n      '--ipi-snackbar-animation-duration': options.animationDuration ? `${options.animationDuration}s` : undefined\n    };\n  \n    for (const [cssVar, value] of Object.entries(styles)) {\n      if (value) {\n        snackbarElement.style.setProperty(cssVar, value);\n      }\n    }\n  }\n\n  private closeIfMaxSnackbar(): void {\n    if (this.snackbarsArray.length === this.maxSnackbars) {\n      this.close(0);\n    }\n  }\n\n  private subscribeToClosingEvents(snackbarRef: ComponentRef<IpiSnackbarComponent>): void {\n    snackbarRef.instance.closed.subscribe(() => {\n      this.close(this.snackbarsArray.indexOf(snackbarRef));\n\n      if (this.snackbarsArray.length === 0) {\n        this.overlayService.removeFromOverlay(this.fixedContainer);\n      }\n    });\n\n    snackbarRef.onDestroy(() => {\n      snackbarRef.instance.closed.unsubscribe();\n    });\n  }\n\n  private setFixedComponentStyling(): void {\n    this.fixedContainer.style.display = 'flex';\n    this.fixedContainer.style.flexDirection = 'column';\n    this.fixedContainer.style.alignItems = 'flex-end';\n    this.fixedContainer.style.bottom = '0px';\n    this.fixedContainer.style.left = '50%';\n    this.fixedContainer.style.transform = 'translateX(-50%)';\n\n    if (this.positionOptions.horizontalPosition === horizontalPosition.Left) {\n      this.fixedContainer.style.left = '0px';\n      this.fixedContainer.style.transform = 'translateX(0%)';\n    } else if (this.positionOptions.horizontalPosition === horizontalPosition.Right) {\n      this.fixedContainer.style.left = '';\n      this.fixedContainer.style.right = '0px';\n      this.fixedContainer.style.transform = 'translateX(0%)';\n    }\n\n    if (this.positionOptions.verticalPosition === verticalPosition.Top) {\n      this.fixedContainer.style.bottom = '';\n      this.fixedContainer.style.top = '0px';\n    }\n\n    this.fixedContainer.style.position = 'fixed';\n    this.fixedContainer.style.zIndex = '1000';\n  }\n\n  private close(index: number): void {\n    if (this.snackbarsArray[index]) {\n      this.snackbarsArray[index].destroy();\n      this.snackbarsArray.splice(index, 1);\n    }\n  }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}