{"version":3,"file":"tableau-ui-angular-snack.mjs","sources":["../../../projects/component-library/snack/src/snack.ref.ts","../../../projects/component-library/snack/src/data.ref.ts","../../../projects/component-library/snack/src/snack.component.ts","../../../projects/component-library/snack/src/snack.service.ts","../../../projects/component-library/snack/src/tableau-ui-snack.module.ts","../../../projects/component-library/snack/src/tableau-ui-angular-snack.ts"],"sourcesContent":["import { inject, InjectionToken } from '@angular/core';\nimport type { Observable } from 'rxjs';\nimport { Subject } from 'rxjs';\n\nexport const TAB_SNACK_REF = new InjectionToken<SnackRef>('TAB_SNACK_REF');\nexport function injectSnackRef<T>(): SnackRef<T> {\n  return inject(TAB_SNACK_REF) as SnackRef<T>;\n}\nexport interface ISnackRef {\n  closed$: Observable<unknown | undefined>;\n  close: () => void;\n}\nexport class SnackRef<T = unknown> implements ISnackRef {\n  private readonly _closed$ = new Subject<T | undefined>();\n  readonly closed$: Observable<T | undefined> = this._closed$.asObservable();\n\n  private _result: T | undefined = undefined;\n  close(result?: T): void {\n    this._closed$.next(result ?? this._result);\n    this._closed$.complete();\n  }\n\n  /**\n   * Sets the result of the dialog without closing it.\n   * This is useful for cases where you want to update the result\n   * but keep the dialog open, such as in a form submission.\n   * If the close() function is called with a non-undefined result, it will overwrite this value\n   * @param result The result to set.\n   */\n  setResultWithoutClosing(result?: T): void {\n    this._result = result;\n  }\n}\n","import { inject, InjectionToken } from '@angular/core';\n\nexport const TAB_SNACK_DATA_REF = new InjectionToken<unknown>('TAB_SANCK_DATA_REF');\nexport function injectSnackData<T>(): T {\n  return inject(TAB_SNACK_DATA_REF) as T;\n}\n","import type { TemplateRef } from '@angular/core';\nimport { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport type { SnackRef } from './snack.ref';\nimport { injectSnackRef } from './snack.ref';\nimport { TAB_SNACK_DATA_REF } from './data.ref';\n@Component({\n  selector: 'tab-snack',\n  standalone: false,\n  template: `\n    <div class=\"snack-content\" [ngClass]=\"data.type\">\n      <div class=\"content\">\n        <tab-icon class=\"icon\" [value]=\"data.type === 'success' ? 'check' : data.type\" />\n        @if (data.contentTemplate) {\n          <div>\n            <ng-container [ngTemplateOutlet]=\"data.contentTemplate!\" [ngTemplateOutletContext]=\"data.contentTemplateContext\" />\n          </div>\n        } @else {\n          <div class=\"text\">\n            {{ data.message }}\n            @if (data.actionLink && data.action) {\n              <a [routerLink]=\"[]\" (click)=\"data.action(snackRef)\">{{ data.actionLink }}</a>\n            }\n          </div>\n        }\n\n        <tab-icon class=\"close\" tabindex=\"0\" value=\"close\" (click)=\"snackRef.close(true)\" (keydown.enter)=\"snackRef.close(true)\" (keydown.space)=\"snackRef.close(true)\" />\n      </div>\n    </div>\n  `,\n  styles: `\n    .snack-content {\n      padding: 10px 16px 10px 8px;\n    }\n    .icon {\n      font-size: 1.5em;\n    }\n    .info .icon {\n      color: var(--twc-color-primary);\n    }\n    .error .icon {\n      color: var(--twc-color-error);\n    }\n    .success .icon {\n      color: var(--twc-color-success);\n    }\n    .content {\n      display: flex;\n      line-height: 1.5;\n    }\n    .content div {\n      border-right: 1px solid transparent;\n      padding: 0 8px;\n    }\n    .content div.text {\n      display: flex;\n      align-items: center;\n      gap: 0.5rem;\n    }\n    .info .content div {\n      border-color: #90d0fe;\n    }\n    .error .content div {\n      border-color: #ffa1a1;\n    }\n    .success .content div {\n      border-color: rgb(147, 206, 147);\n    }\n    .close {\n      font-size: 1.5em;\n      margin-left: 0.25em;\n      color: var(--twc-color-border-dark);\n      cursor: pointer;\n    }\n    .close:hover {\n      background-color: var(--twc-color-border-dark-disabled);\n    }\n  `,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SnackComponent<TContext> {\n  protected readonly data = inject<SnackComponentData<TContext>>(TAB_SNACK_DATA_REF);\n  protected readonly snackRef = injectSnackRef<boolean>();\n}\nexport interface SnackComponentData<TContext> {\n  type: 'error' | 'info' | 'success';\n  message: string | undefined;\n  actionLink?: string | undefined;\n  action?: ((s: SnackRef<boolean>) => void) | undefined;\n  contentTemplate: TemplateRef<TContext> | undefined;\n  contentTemplateContext: TContext | undefined;\n}\n","import type { ComponentRef, EmbeddedViewRef, TemplateRef, Type, ViewRef } from '@angular/core';\nimport { ApplicationRef, createComponent, EnvironmentInjector, inject, Injectable, Injector } from '@angular/core';\nimport { SnackRef, TAB_SNACK_REF } from './snack.ref';\nimport type { SnackComponentData } from './snack.component';\nimport { SnackComponent } from './snack.component';\nimport { TAB_SNACK_DATA_REF } from './data.ref';\n\n// Styles for the snack container are in _snack.service.scss in the styles folder\n@Injectable({\n  providedIn: 'any', // new instance for each injection -> also lazy loaded\n})\nexport class SnackService {\n  private readonly injector = inject(Injector);\n  private readonly appRef = inject(ApplicationRef);\n  private readonly environmentInjector = inject(EnvironmentInjector);\n\n  openSnack(message: string, duration: number | undefined = 5000, type: 'error' | 'info' | 'success' = 'info', location: 'bottom' | 'top' = 'top'): SnackRef<boolean> {\n    return this.openSnackComponent<SnackComponent<unknown>, SnackComponentData<unknown>, boolean>(\n      SnackComponent,\n      {\n        type,\n        message,\n        contentTemplate: undefined,\n        contentTemplateContext: undefined,\n      },\n      duration,\n      type,\n      location,\n    );\n  }\n\n  openSnackWithAction(\n    message: string,\n    actionLabel: string,\n    action: (s: SnackRef<boolean>) => void,\n    duration: number | undefined = 5000,\n    type: 'error' | 'info' | 'success' = 'info',\n    location: 'bottom' | 'top' = 'top',\n  ): SnackRef<boolean> {\n    return this.openSnackComponent<SnackComponent<unknown>, SnackComponentData<unknown>, boolean>(\n      SnackComponent,\n      {\n        type,\n        message,\n        actionLink: actionLabel,\n        action: action,\n        contentTemplate: undefined,\n        contentTemplateContext: undefined,\n      },\n      duration,\n      type,\n      location,\n    );\n  }\n  openSnackFromTemplate<TContext>(\n    template: TemplateRef<TContext>,\n    templateContext?: TContext,\n    duration: number | undefined = 5000,\n    type: 'error' | 'info' | 'success' = 'info',\n    location: 'bottom' | 'top' = 'top',\n  ) {\n    return this.openSnackComponent<SnackComponent<TContext>, SnackComponentData<TContext>, boolean>(\n      SnackComponent,\n      {\n        type,\n        message: undefined,\n        contentTemplate: template,\n        contentTemplateContext: templateContext,\n      },\n      duration,\n      type,\n      location,\n    );\n  }\n\n  openSnackComponent<TComponent, TData, TResult>(\n    component: Type<TComponent>,\n    data: TData,\n    duration: number | undefined = 5000,\n    type: 'error' | 'info' | 'success' = 'info',\n    location: 'bottom' | 'top' = 'top',\n  ): SnackRef<TResult> {\n    // check if snack container exists\n    let container = document.querySelector(`.tab-snacks.${location} .snack-container`);\n    if (!container) {\n      const tabSnacks = document.createElement('div');\n      tabSnacks.classList.add('tab-snacks', location);\n      container = document.createElement('div');\n      container.classList.add('snack-container');\n      tabSnacks.appendChild(container);\n      document.body.appendChild(tabSnacks);\n    }\n\n    // create the snack wrapper\n    const snackWrapper = document.createElement('div');\n    snackWrapper.classList.add('snack-wrapper', type);\n\n    const snackRef = new SnackRef<TResult>();\n    // Create an injector that provides the SnackRef\n    const injector = Injector.create({\n      providers: [\n        { provide: TAB_SNACK_REF, useValue: snackRef },\n        { provide: TAB_SNACK_DATA_REF, useValue: data },\n      ],\n      parent: this.injector,\n    });\n\n    // Create the component view\n    const componentView = this.createView(component, injector);\n    // Attach component to the application\n    this.appRef.attachView(componentView);\n\n    const componentElement = (componentView as EmbeddedViewRef<unknown>).rootNodes[0] as HTMLElement;\n    snackWrapper.appendChild(componentElement);\n    // add timer if needed\n    let timer: HTMLElement | undefined;\n    if (duration > 0) {\n      timer = document.createElement('div');\n      timer.classList.add('timer');\n      timer.style.transitionDuration = `${duration}ms`;\n      snackWrapper.appendChild(timer);\n    }\n    if (location === 'top') {\n      container.appendChild(snackWrapper);\n    } else {\n      container.insertBefore(snackWrapper, container.firstChild);\n    }\n\n    const getMargin = () => {\n      const height = snackWrapper.offsetHeight + 3;\n      if (location === 'top') {\n        return `-${height}px 0 3px 0`;\n      } else {\n        return `3px 0 -${height}px 0`;\n      }\n    };\n    snackWrapper.style.margin = getMargin();\n\n    setTimeout(() => {\n      if (timer) {\n        timer.style.width = '0';\n      }\n      snackWrapper.style.transition = 'margin 200ms ease-in-out, opacity 200ms ease-in-out';\n      if (location === 'top') {\n        snackWrapper.style.marginTop = '0';\n      } else {\n        snackWrapper.style.marginBottom = '0';\n      }\n      snackWrapper.style.opacity = '1';\n    }, 1);\n\n    // Remove snack after duration\n    if (duration > 0) {\n      setTimeout(() => {\n        snackRef.close(undefined);\n      }, duration);\n    }\n\n    snackRef.closed$.subscribe(() => {\n      snackWrapper.style.margin = getMargin();\n      snackWrapper.style.opacity = '0';\n      setTimeout(() => {\n        snackWrapper.remove();\n        this.appRef.detachView(componentView);\n      }, 200);\n    });\n\n    return snackRef;\n  }\n\n  private createView<TComponent>(component: Type<TComponent>, injector: Injector): ViewRef {\n    const componentRef: ComponentRef<TComponent> = createComponent(component, {\n      environmentInjector: this.environmentInjector,\n      elementInjector: injector,\n    });\n    return componentRef.hostView;\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { SnackComponent } from './snack.component';\nimport { RouterModule } from '@angular/router';\nimport { TableauUiIconModule } from 'tableau-ui-angular/icon';\nimport { SnackService } from './snack.service';\n\n@NgModule({\n  imports: [CommonModule, TableauUiIconModule, RouterModule],\n  declarations: [SnackComponent],\n  providers: [SnackService],\n  exports: [],\n})\nexport class TableauUiSnackModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}