UNPKG

mk-magic-alerts

Version:
1 lines 27 kB
{"version":3,"file":"mk-magic-alerts.mjs","sources":["../../../projects/mk-magic-alerts/src/lib/alerts/models/alert-state.ts","../../../projects/mk-magic-alerts/src/lib/alerts/state/alerts.store.ts","../../../projects/mk-magic-alerts/src/lib/alerts/pipes/new-line-and-tabs.pipe.ts","../../../projects/mk-magic-alerts/src/lib/alerts/models/alert-entry-animation.ts","../../../projects/mk-magic-alerts/src/lib/alerts/models/alert-appearance.ts","../../../projects/mk-magic-alerts/src/lib/alerts/components/alert/alert.component.ts","../../../projects/mk-magic-alerts/src/lib/alerts/components/alert/alert.component.html","../../../projects/mk-magic-alerts/src/lib/alerts/components/alerts-container/alerts-container.component.ts","../../../projects/mk-magic-alerts/src/lib/alerts/components/alerts-container/alerts-container.component.html","../../../projects/mk-magic-alerts/src/lib/alerts/config/magic-alerts-config.ts","../../../projects/mk-magic-alerts/src/lib/alerts/services/alerts.service.ts","../../../projects/mk-magic-alerts/src/lib/mocks/mock-alerts-service.ts","../../../projects/mk-magic-alerts/src/public-api.ts","../../../projects/mk-magic-alerts/src/mk-magic-alerts.ts"],"sourcesContent":["export const AlertState = {\n DISPLAY: 'display',\n DISMISS: 'dismiss',\n DISMISSED: 'dismissed',\n} as const;\n\nexport type AlertState = typeof AlertState[keyof typeof AlertState];","import { Service } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { BehaviorSubject, Observable, Subject } from 'rxjs';\nimport { AlertState } from '../models/alert-state';\nimport { AlertType } from '../models/alert-type';\nimport { Alert } from '../models/alert.model';\n\n@Service()\n\nexport class AlertsStore {\n\tprivate readonly alertsSubject = new BehaviorSubject<Alert[]>([]);\n\n\tprivate nextAlertId = 1;\n\n\treadonly alerts = toSignal(this.alertsSubject.asObservable(), {\n\t\tinitialValue: [],\n\t\tmanualCleanup: true\n\t});\n\n\tprivate readonly dismissAllSubject = new Subject<void>();\n\n\treadonly dismissAll$: Observable<void> = this.dismissAllSubject.asObservable();\n\n\tdismissAll(): void {\n\t\tthis.dismissAllSubject.next();\n\t}\n\n\taddAlert(text: string, type: AlertType, dismissTimeInMillis: number): void {\n\t\t// Remove alerts that already started or finished their exit animation.\n\t\t// filter() makes a shallow copy of the array (a new array, but pointing to the same objects)\n\t\t const activeAlerts = this.alertsSubject\n\t\t\t.getValue()\n\t\t\t.filter((alert) => alert.state === AlertState.DISPLAY);\n\n\t\t// Create and add new message:\n\t\tthis.alertsSubject.next([\n\t\t\t...activeAlerts,\n\t\t\tthis.createAlert(text, type, dismissTimeInMillis)\n\t\t]);\n\t}\n\n\tprivate createAlert(text: string, type: AlertType, dismissTimeInMillis: number): Alert {\n\t\treturn {\n\t\t\tid: `alert-${this.nextAlertId++}`,\n\t\t\ttext,\n\t\t\ttype,\n\t\t\tdismissTimeInMillis,\n\t\t\tstate: AlertState.DISPLAY\n\t\t};\n\t}\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({ \n\tname: 'newlineAndTabs',\n\tstandalone: true\n })\n\nexport class NewlineAndTabsPipe implements PipeTransform {\n\t\n\ttransform(value: any): any {\n\t\treturn value?.toString().replace(/(?:\\r\\n|\\r|\\n)/g, '<br />').replace(/(?:\\t)/g, '&nbsp;&nbsp;&nbsp;&nbsp;') ?? '';\n\t}\n}\n","export const AlertEntryAnimation = {\n DOT: 'dot',\n BURST: 'burst',\n DROP: 'drop',\n SLIDE_LEFT: 'slide-left',\n SLIDE_RIGHT: 'slide-right',\n UNFOLD: 'unfold'\n} as const;\n\nexport type AlertEntryAnimation = typeof AlertEntryAnimation[keyof typeof AlertEntryAnimation];\n","\nexport const AlertAppearance = {\n\tCLASSIC: 'classic',\n\tGRADIENT: 'gradient'\n} as const;\n\nexport type AlertAppearance = typeof AlertAppearance[keyof typeof AlertAppearance];\n","import { ChangeDetectionStrategy, Component, DestroyRef, ElementRef, OnInit, computed, inject, input, signal, viewChild } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { Observable, fromEvent, race, timer } from 'rxjs';\nimport { repeat, take, takeUntil, tap } from 'rxjs/operators';\nimport { AlertState } from '../../models/alert-state';\nimport { Alert } from '../../models/alert.model';\nimport { NewlineAndTabsPipe } from '../../pipes/new-line-and-tabs.pipe';\nimport { AlertsStore } from '../../state/alerts.store';\nimport { AlertEntryAnimation } from '../../models/alert-entry-animation';\nimport { AlertAppearance } from '../../models/alert-appearance';\n\n@Component({\n selector: 'app-alert',\n templateUrl: './alert.component.html',\n styleUrls: ['./alert.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NewlineAndTabsPipe]\n})\nexport class AlertComponent implements OnInit {\n private readonly elementRef = inject(ElementRef<HTMLElement>);\n private readonly alertsStore = inject(AlertsStore);\n private readonly destroyRef = inject(DestroyRef);\n\n readonly alertParams = input.required<Alert>();\n readonly entryAnimation = input.required<AlertEntryAnimation>();\n readonly alertAppearance = input.required<AlertAppearance>();\n\n readonly container = viewChild<ElementRef<HTMLElement>>('container');\n\n readonly state = signal<AlertState>(AlertState.DISPLAY);\n readonly fixedEntryAnimation = signal<AlertEntryAnimation>(AlertEntryAnimation.DOT);\n readonly fixedAlertAppearance = signal<AlertAppearance>(AlertAppearance.CLASSIC);\n readonly entryAnimationDone = signal(false);\n\n readonly isRendered = computed(() => this.state() !== AlertState.DISMISSED);\n readonly dismissTimeInMillis = computed(() => this.alertParams().dismissTimeInMillis);\n\n readonly enterAnimationClass = computed(() => `alert-enter-${this.fixedEntryAnimation()}`);\n readonly leaveAnimationClass = computed(() => `alert-leave-${this.fixedEntryAnimation()}`);\n readonly animationClass = computed(() =>\n this.state() === AlertState.DISMISS\n ? this.leaveAnimationClass()\n : this.entryAnimationDone()\n ? ''\n : this.enterAnimationClass()\n );\n\n ngOnInit(): void {\n this.fixedEntryAnimation.set(this.entryAnimation());\n this.fixedAlertAppearance.set(this.alertAppearance());\n\n const el = this.elementRef.nativeElement;\n\n const mouseenter$: Observable<Event> = fromEvent(el, 'mouseenter');\n const mouseleave$: Observable<Event> = fromEvent(el, 'mouseleave');\n\n // Observable that allows closing of the alert by user-click:\n const dismissalByUser$: Observable<Event> = fromEvent(el, 'mouseup');\n\n // If dismissal is requested programmatically from alerts-service:\n const dismissalByService$: Observable<void> = this.alertsStore.dismissAll$;\n\n // Observable that closes the alert after a given time,\n // unless user hovers over the alert with a cursor => 'takeUntil()' and 'repeat()'\n const dismissalAfterTimeout$: Observable<0> = timer(this.dismissTimeInMillis()).pipe(\n takeUntil(mouseenter$),\n repeat({ delay: () => mouseleave$ })\n );\n\n race([dismissalByUser$, dismissalByService$, dismissalAfterTimeout$])\n .pipe(\n take(1),\n tap(() => this.setDismissalStart()),\n takeUntilDestroyed(this.destroyRef)\n )\n .subscribe();\n }\n\n /* Triggers the animated disappearing of the alert */\n setDismissalStart(): void {\n if (this.state() !== AlertState.DISMISS) {\n const el = this.container()?.nativeElement;\n\n if (el) {\n // Lock current height via CSS var used by the stylesheet\n el.style.setProperty('--h', `${el.offsetHeight}px`);\n }\n\n this.alertParams().state = AlertState.DISMISS;\n this.state.set(AlertState.DISMISS);\n }\n }\n\n /** After the leave animation finishes, mark as DISMISSED */\n onContainerAnimationEnd(event: AnimationEvent): void {\n if (event.target !== this.container()?.nativeElement) {\n return;\n }\n\n if (this.state() === AlertState.DISMISS) {\n this.alertParams().state = AlertState.DISMISSED;\n this.state.set(AlertState.DISMISSED);\n return;\n }\n\n this.entryAnimationDone.set(true);\n }\n}\n","@if (alertParams(); as params) {\n <div class=\"clickable-area\">\n @if (isRendered()) {\n <div\n #container\n class=\"alert-container alert-{{ params.type }} alert-{{ fixedAlertAppearance() }} {{ animationClass() }}\"\n role=\"alert\"\n (animationend)=\"onContainerAnimationEnd($event)\">\n\n <div class=\"alert-icon\" aria-hidden=\"true\">\n @switch (params.type) {\n @case ('info') {\n <i class=\"fa fa-info-circle\"></i>\n }\n @case ('success') {\n <i class=\"fa fa-check\"></i>\n }\n @case ('warning') {\n <i class=\"fa fa-exclamation-triangle\"></i>\n }\n @case ('error') {\n <i class=\"fa fa-exclamation-triangle\"></i>\n }\n }\n </div>\n\n <div class=\"alert-text\" [innerHtml]=\"params.text | newlineAndTabs\"></div>\n\n <button type=\"button\" class=\"btn-dismiss\" aria-label=\"Alert schliessen\">\n <i class=\"fa fa-times\"></i>\n </button>\n </div>\n }\n </div>\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { AlertComponent } from '../alert/alert.component';\nimport { AlertEntryAnimation } from '../../models/alert-entry-animation';\nimport { AlertAppearance } from '../../models/alert-appearance';\nimport { Alert } from '../../models/alert.model';\n\n@Component({\n selector: 'magic-alerts',\n templateUrl: './alerts-container.component.html',\n styleUrls: ['./alerts-container.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AlertComponent]\n})\nexport class AlertsContainerComponent {\n readonly entryAnimation = input<AlertEntryAnimation>(AlertEntryAnimation.DOT);\n readonly alertAppearance = input<AlertAppearance>(AlertAppearance.CLASSIC);\n readonly alerts = input<Alert[]>([]);\n}\n","<link href=\"https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;500&display=swap\" rel=\"stylesheet\">\n<link href=\"https://use.fontawesome.com/releases/v5.3.1/css/all.css\" rel=\"stylesheet\" integrity=\"sha384-mzrmE5qonljUremFsqc01SB46JvROS7bZs3IO2EmfFsd15uHvIt+Y8vEf7N7fWAU\" crossorigin=\"anonymous\">\n\n<!-- Alerts Container -->\n<div id=\"mk-magic-messages\" class=\"alerts-container\">\n\t@for (alertParams of alerts(); track alertParams.id) {\n\t\t<app-alert\n\t\t\t[alertParams]=\"alertParams\"\n\t\t\t[entryAnimation]=\"entryAnimation()\"\n\t\t\t[alertAppearance]=\"alertAppearance()\">\n\t\t</app-alert>\n\t}\n</div>\n","import { EnvironmentProviders, InjectionToken, makeEnvironmentProviders } from '@angular/core';\nimport { AlertEntryAnimation } from '../models/alert-entry-animation';\nimport { AlertAppearance } from '../models/alert-appearance';\n\nexport interface MagicAlertsConfig {\n entryAnimation: AlertEntryAnimation;\n alertAppearance: AlertAppearance;\n}\n\nexport type MagicAlertsConfigOptions = Partial<MagicAlertsConfig>;\n\nexport const DEFAULT_MAGIC_ALERTS_CONFIG: MagicAlertsConfig = {\n entryAnimation: AlertEntryAnimation.DOT,\n alertAppearance: AlertAppearance.CLASSIC\n};\n\nexport const MAGIC_ALERTS_CONFIG = new InjectionToken<MagicAlertsConfig>('MAGIC_ALERTS_CONFIG', {\n providedIn: 'root',\n factory: () => DEFAULT_MAGIC_ALERTS_CONFIG\n});\n\nexport function provideMagicAlerts(config: MagicAlertsConfigOptions = {}): EnvironmentProviders {\n return makeEnvironmentProviders([\n {\n provide: MAGIC_ALERTS_CONFIG,\n useValue: {\n ...DEFAULT_MAGIC_ALERTS_CONFIG,\n ...config\n }\n }\n ]);\n}\n","import { ApplicationRef, ComponentRef, Injector, Service, createComponent, inject } from '@angular/core';\nimport { AlertsStore } from '../state/alerts.store';\nimport { AlertsContainerComponent } from '../components/alerts-container/alerts-container.component';\nimport { MAGIC_ALERTS_CONFIG } from '../config/magic-alerts-config';\nimport { AlertEntryAnimation } from '../models/alert-entry-animation';\nimport { AlertAppearance } from '../models/alert-appearance';\n\n@Service()\n\nexport class AlertsService {\n\tprivate readonly alertsStore = inject(AlertsStore);\n\tprivate readonly applicationRef = inject(ApplicationRef);\n\tprivate readonly injector = inject(Injector);\n\tprivate readonly config = inject(MAGIC_ALERTS_CONFIG);\n\n\tprivate alertsComponentRef!: ComponentRef<AlertsContainerComponent>;\n\tprivate renderQueued = false;\n\n\tconstructor() {\n\t\tthis.initializeAlertsComponent();\n\t}\n\n\tprivate initializeAlertsComponent(): void {\n\t\t// Create a div element and append it to the document body\n\t\tconst hostElement = document.createElement('div');\n\t\tdocument.body.appendChild(hostElement);\n\n\t\t// Create AlertsContainerComponent and attach it to the DOM\n\t\tthis.alertsComponentRef = createComponent(AlertsContainerComponent, {\n\t\t\thostElement,\n\t\t\tenvironmentInjector: this.applicationRef.injector,\n\t\t\telementInjector: this.injector\n\t\t});\n\t\tthis.alertsComponentRef.setInput('entryAnimation', this.config.entryAnimation);\n\t\tthis.alertsComponentRef.setInput('alertAppearance', this.config.alertAppearance);\n\t\tthis.alertsComponentRef.setInput('alerts', this.alertsStore.alerts());\n\n\t\t// Attach the AlertsContainerComponent to the application\n\t\tthis.applicationRef.attachView(this.alertsComponentRef.hostView);\n\t\tthis.alertsComponentRef.changeDetectorRef.detectChanges();\n\t}\n\n\tshowInfo(text: string, dismissTimeInMillis: number = 10_000) {\n\t\tthis.alertsStore.addAlert(text, 'info', dismissTimeInMillis);\n\t\tthis.syncAlertsToContainer();\n\t\tthis.queueContainerRender();\n\t}\n\n\tshowSuccess(text: string, dismissTimeInMillis: number = 4_000) {\n\t\tthis.alertsStore.addAlert(text, 'success', dismissTimeInMillis);\n\t\tthis.syncAlertsToContainer();\n\t\tthis.queueContainerRender();\n\t}\n\n\tshowWarning(text: string, dismissTimeInMillis: number = 10_000) {\n\t\tthis.alertsStore.addAlert(text, 'warning', dismissTimeInMillis);\n\t\tthis.syncAlertsToContainer();\n\t\tthis.queueContainerRender();\n\t}\n\n\tshowError(text: string, dismissTimeInMillis: number = 2_147_483_647) {\n\t\tthis.alertsStore.addAlert(text, 'error', dismissTimeInMillis);\n\t\tthis.syncAlertsToContainer();\n\t\tthis.queueContainerRender();\n\t}\n\n\tsetEntryAnimation(entryAnimation: AlertEntryAnimation): void {\n\t\tthis.alertsComponentRef.setInput('entryAnimation', entryAnimation);\n\t\tthis.queueContainerRender();\n\t}\n\n\tsetAlertAppearance(alertAppearance: AlertAppearance): void {\n\t\tthis.alertsComponentRef.setInput('alertAppearance', alertAppearance);\n\t\tthis.queueContainerRender();\n\t}\n\n\tclear() {\n\t\tthis.alertsStore.dismissAll();\n\t\tthis.queueContainerRender();\n\t}\n\n\tprivate syncAlertsToContainer(): void {\n\t\tthis.alertsComponentRef.setInput('alerts', this.alertsStore.alerts());\n\t}\n\n\tprivate queueContainerRender(): void {\n\t\t// This container is created outside the normal component tree, so input updates\n\t\t// need an explicit render pass to show reliably in production and zoneless apps.\n\t\tif (this.renderQueued) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.renderQueued = true;\n\n\t\tqueueMicrotask(() => {\n\t\t\tthis.renderQueued = false;\n\t\t\tthis.alertsComponentRef.changeDetectorRef.detectChanges();\n\t\t});\n\t}\n}\n","\nimport { AlertEntryAnimation } from '../alerts/models/alert-entry-animation';\nimport { AlertAppearance } from '../alerts/models/alert-appearance';\n\nexport class MockAlertsService {\n showInfo(text: string, dismissTimeInMillis: number = 10_000): void {}\n showSuccess(text: string, dismissTimeInMillis: number = 4_000): void {}\n showWarning(text: string, dismissTimeInMillis: number = 10_000): void {}\n showError(text: string, dismissTimeInMillis: number = 2_147_483_647): void {}\n setEntryAnimation(entryAnimation: AlertEntryAnimation): void {}\n setAlertAppearance(alertAppearance: AlertAppearance): void {}\n clear(): void {}\n}\n","/*\n * Public API Surface of mk-magic-alerts\n */\n\nexport * from './lib/alerts/services/alerts.service';\nexport * from './lib/alerts/config/magic-alerts-config';\nexport * from './lib/alerts/models/alert-entry-animation';\nexport * from './lib/alerts/models/alert-appearance';\n\n// Export the mocks\nexport * from './lib/mocks/mock-alerts-service';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}