ng-toast-stack
Version:
Beautiful & easy to use toast stack messages, having auto close, pause, resume functionality and customization.
1 lines • 14.6 kB
Source Map (JSON)
{"version":3,"file":"ng-toast-stack.mjs","sources":["../../../projects/ng-toast-stack/src/lib/ng-toast-stack.service.ts","../../../projects/ng-toast-stack/src/lib/svg-icon/svg-icon.component.ts","../../../projects/ng-toast-stack/src/lib/svg-icon/svg-icon.component.html","../../../projects/ng-toast-stack/src/lib/ng-toast-stack.component.ts","../../../projects/ng-toast-stack/src/lib/ng-toast-stack.component.html","../../../projects/ng-toast-stack/src/lib/ng-toast-stack.module.ts","../../../projects/ng-toast-stack/src/public-api.ts","../../../projects/ng-toast-stack/src/ng-toast-stack.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class NgToastStackService {\n id: number = 0;\n toastsBag: Array<NgToastStackType> = []\n\n constructor() { }\n\n push(data: NgToastStackType | string) {\n if (typeof data === 'string') data = <NgToastStackType>{ msg: data }\n data.id = ++this.id;\n const toast = new NgToastStack(data)\n this.toastsBag.push(toast);\n\n if (toast.autoClose) {\n toast.timerRef = new Timer(() => {\n this.pop(toast.id);\n }, toast.autoCloseTimer);\n\n let index = this.toastsBag.findIndex((n) => n.id === toast.id);\n this.toastsBag.splice(index, 1, toast);\n }\n }\n\n pop(id?: number) {\n if (!id) return;\n let index = this.toastsBag.findIndex((n) => n.id == id);\n this.toastsBag.splice(index, 1);\n }\n\n // Sugared methods\n\n static(data: NgToastStackType | string) {\n if (typeof data === 'string') {\n data = <NgToastStackType>{ msg: data, autoClose: false }\n this.push(data)\n } else {\n this.push({ ...data, autoClose: false })\n }\n }\n\n success(data: NgToastStackType | string) {\n if (typeof data === 'string') {\n data = <NgToastStackType>{ msg: data, type: 'success' }\n this.push(data)\n } else {\n this.push({ ...data, type: 'success' })\n }\n }\n\n error(data: NgToastStackType | string) {\n if (typeof data === 'string') {\n data = <NgToastStackType>{ msg: data, type: 'error' }\n this.push(data)\n } else {\n this.push({ ...data, type: 'error' })\n }\n }\n\n}\n\nexport interface NgToastStackType {\n id?: number;\n type?: string;\n title?: string;\n msg: string;\n autoClose?: boolean;\n autoCloseTimer?: number;\n timerRef?: any;\n timerWidth?: any;\n icon?: string | boolean;\n pauseOnHover?: boolean;\n}\n\nexport class NgToastStack {\n id: number\n type: string\n title: string\n msg: string\n autoClose: boolean\n autoCloseTimer: number\n timerRef?: any\n icon?: string | boolean\n pauseOnHover?: boolean\n\n constructor(data: NgToastStackType) {\n this.id = data.id || 5000\n this.type = data.type || 'success'\n this.title = this.getTitle(data)\n this.msg = data.msg\n this.autoClose = (data.hasOwnProperty('autoClose') && data.autoClose !== undefined) ? data.autoClose : true\n this.autoCloseTimer = data.autoCloseTimer || 5000\n this.icon = (data.hasOwnProperty('icon') && data.icon !== undefined) ? data.icon : true\n this.pauseOnHover = (data.hasOwnProperty('pauseOnHover') && data.pauseOnHover !== undefined) ? data.pauseOnHover : true\n }\n\n getTitle(data: NgToastStackType) {\n if (!data.title && data.type == 'error') return 'Error';\n if (!data.title && (!data.type || data.type == 'success')) return 'Success';\n return data.title || 'Message';\n }\n}\n\n// Custom Timer with resume/pause\nexport class Timer {\n timeoutId: number | undefined\n intervalId: number | undefined\n delay: number = 0\n start: number = 0\n remaining: number = 0\n remainingPercentage: number = 100\n callback: any\n\n constructor(callback: any, delay: number) {\n this.delay = delay\n this.remaining = delay\n this.callback = callback\n this.resume()\n }\n\n pause() {\n window.clearTimeout(this.timeoutId)\n this.timeoutId = undefined\n window.clearInterval(this.intervalId)\n this.intervalId = undefined\n }\n\n resume() {\n if (this.timeoutId && this.intervalId) {\n return;\n }\n\n this.start = Date.now();\n this.timeoutId = window.setTimeout(this.callback, this.remaining);\n this.intervalId = window.setInterval(() => {\n if (this.remaining <= 0) window.clearInterval(this.intervalId)\n this.remaining -= 10;\n this.remainingPercentage = (this.remaining * 100) / this.delay\n }, 10)\n }\n}","import { Component, Input, OnInit } from '@angular/core';\n\n@Component({\n selector: 'app-svg-icon',\n templateUrl: './svg-icon.component.html',\n styleUrls: ['./svg-icon.component.css']\n})\nexport class SvgIconComponent implements OnInit {\n\n @Input() type?: string;\n constructor() { }\n\n ngOnInit() {\n }\n\n}\n","<div class=\"ngx-svg-icon-container\">\n <svg viewBox=\"0 0 100 100\" class=\"ngx-svg-icon-animate\" *ngIf=\"type == 'success'\">\n <filter id=\"dropshadow\" height=\"100%\">\n <feGaussianBlur in=\"SourceAlpha\" stdDeviation=\"3\" result=\"blur\" />\n <feFlood flood-color=\"rgba(76, 175, 80, 1)\" flood-opacity=\"0.5\" result=\"color\" />\n <feComposite in=\"color\" in2=\"blur\" operator=\"in\" result=\"blur\" />\n <feMerge>\n <feMergeNode />\n <feMergeNode in=\"SourceGraphic\" />\n </feMerge>\n </filter>\n <circle cx=\"50\" cy=\"50\" r=\"46.5\" fill=\"none\" stroke=\"rgba(76, 175, 80, 0.5)\" stroke-width=\"5\" />\n <path d=\"M67,93 A46.5,46.5 0,1,0 7,32 L43,67 L88,19\" fill=\"none\" stroke=\"rgba(76, 175, 80, 1)\" stroke-width=\"5\"\n stroke-linecap=\"round\" stroke-dasharray=\"80 1000\" stroke-dashoffset=\"-220\" style=\"filter: url(#dropshadow)\" />\n </svg>\n\n <svg *ngIf=\"type == 'error'\" class=\"ngx-svg-icon-error ngx-svg-icon-animate-pulse\" fill=\"none\" stroke=\"currentColor\"\n viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\"\n d=\"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"></path>\n </svg>\n</div>","import {\n trigger,\n transition,\n style,\n animate,\n query,\n stagger,\n} from '@angular/animations';\nimport { Component, OnInit } from '@angular/core';\nimport { NgToastStackService } from './ng-toast-stack.service';\n\nconst listAnimation = trigger('listAnimation', [\n transition('* <=> *', [\n query(\n ':enter',\n [\n style({ opacity: 0, transform: 'translateX(32px)' }),\n stagger(\n '300ms',\n animate(\n '300ms ease',\n style({ opacity: 1, transform: 'translateX(0px)' })\n )\n ),\n ],\n { optional: true }\n ),\n query(\n ':leave',\n animate(\n '200ms ease-in-out',\n style({ opacity: 0, transform: 'translateY(32px)' })\n ),\n {\n optional: true,\n }\n ),\n ]),\n]);\n\n@Component({\n selector: 'ng-toast-stack',\n templateUrl: './ng-toast-stack.component.html',\n styleUrls: ['./ng-toast-stack.component.css'],\n animations: [listAnimation],\n})\nexport class NgToastStackComponent implements OnInit {\n constructor(public ns: NgToastStackService) { }\n\n ngOnInit(): void { }\n}\n","<div class=\"ng-toast-stack-container\" [style]=\"ns.toastsBag.length == 0 ? 'display:none' : ''\">\n <div class=\"ng-toast-stack-list\" [@listAnimation]=\"ns.toastsBag.length\">\n <div class=\"ng-toast-stack\" *ngFor=\"let toast of ns.toastsBag.reverse()\" (click)=\"ns.pop(toast.id)\"\n (mouseover)=\"toast.pauseOnHover? toast.timerRef?.pause():''\"\n (mouseout)=\"toast.pauseOnHover? toast.timerRef?.resume():''\">\n <div class=\"ng-toast-stack-content-container-outer\">\n <div class=\"ng-toast-stack-content-container-inner\">\n <div class=\"ng-toast-stack-icon\" *ngIf=\"toast.icon\">\n <app-svg-icon [type]=\"toast.type\"></app-svg-icon>\n </div>\n\n <div class=\"ng-toast-stack-content\" [ngStyle]=\"{'margin-left': toast.icon?'12px':''}\">\n <h5 class=\"ng-toast-stack-title\">\n {{ toast?.title }}\n </h5>\n <p class=\"ng-toast-stack-message\">\n {{ toast.msg }}\n </p>\n </div>\n <div class=\"ng-toast-stack-icon-close\">\n <svg class=\"ng-toast-stack-icon-close-size\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\"></path>\n </svg>\n </div>\n </div>\n </div>\n <div *ngIf=\"toast.autoClose\" class=\"ng-toast-stack-timer\">\n <div class=\"ng-toast-stack-timer-bar\" [ngStyle]=\"{'width': (toast.timerRef.remainingPercentage)+'%'}\">\n </div>\n </div>\n </div>\n </div>\n</div>","import { CommonModule } from '@angular/common';\n\nimport { NgModule } from '@angular/core';\nimport { NgToastStackComponent } from './ng-toast-stack.component';\nimport { SvgIconComponent } from './svg-icon/svg-icon.component';\n\n\n\n@NgModule({\n declarations: [\n NgToastStackComponent,\n SvgIconComponent\n ],\n imports: [\n CommonModule\n ],\n exports: [\n NgToastStackComponent\n ]\n})\nexport class NgToastStackModule { }\n","/*\n * Public API Surface of ng-toast-stack\n */\n\nexport * from './lib/ng-toast-stack.service';\nexport * from './lib/ng-toast-stack.component';\nexport * from './lib/ng-toast-stack.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}