UNPKG

ems-web-app-messages

Version:

This angular.io module includes a component and service that can be used to render "Growl" or "Snackbar" style in-app messages.

206 lines (198 loc) 13.1 kB
import * as i0 from '@angular/core'; import { Injectable, Component, HostBinding, Input, HostListener, NgModule } from '@angular/core'; import { BehaviorSubject } from 'rxjs'; import { __awaiter } from 'tslib'; import * as i2 from '@angular/platform-browser'; import * as i3 from '@angular/common'; import { CommonModule } from '@angular/common'; class MessagesService { constructor() { this.currentMessageSource = new BehaviorSubject(undefined); this.currentMessage = this.currentMessageSource.asObservable(); } setCurrentMessage(message) { this.currentMessageSource.next(message); } } MessagesService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: MessagesService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); MessagesService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: MessagesService, providedIn: 'root' }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: MessagesService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }], ctorParameters: function () { return []; } }); var MessageType; (function (MessageType) { MessageType["Growl"] = "growl"; MessageType["Snackbar"] = "snackbar"; })(MessageType || (MessageType = {})); var MessagePosition; (function (MessagePosition) { MessagePosition["TopLeft"] = "top left"; MessagePosition["TopCenter"] = "top center"; MessagePosition["TopRight"] = "top right"; MessagePosition["BottomLeft"] = "bottom left"; MessagePosition["BottomCenter"] = "bottom center"; MessagePosition["BottomRight"] = "bottom right"; })(MessagePosition || (MessagePosition = {})); class MessagesComponent { constructor(service, sanitizer) { this.service = service; this.sanitizer = sanitizer; this.render = false; this.classes = ""; this.background = "rgba(0,0,0,0.75)"; this.color = "#fff"; this.zIndex = 1000; this.speed = 0.5; this.queue = []; this.timeout = 0; this.onContainerClick = (element) => { this.processMessageQueue(true); }; } ngOnInit() { this.service.currentMessage.subscribe(message => { if (!message && !this.currentMessage) return; if (!message) this.processMessageQueue(true); if (!this.validateMessage(message)) return; this.queue.push(message); this.processMessageQueue(); }); } initializeStyles() { var _a; if (!this.currentMessage) return; const duration = (_a = this.currentMessage.duration) !== null && _a !== void 0 ? _a : 1; const output = `messages { background: ${this.background}; color: ${this.color}; transition-duration: ${this.speed}s; z-index: ${this.zIndex}; } messages.render { transition-duration: ${this.speed}s; }`; this.styles = this.sanitizer.bypassSecurityTrustHtml(`<style>${output}</style>`); } processMessageQueue(force = false) { var _a, _b, _c, _d; return __awaiter(this, void 0, void 0, function* () { if (this.currentMessage && !force) return; yield this.removeCurrentMessage(); this.currentMessage = this.queue.shift(); this.classes = `${(_a = this.currentMessage) === null || _a === void 0 ? void 0 : _a.position} ${(_b = this.currentMessage) === null || _b === void 0 ? void 0 : _b.type} ${(_d = (_c = this.currentMessage) === null || _c === void 0 ? void 0 : _c.classes) !== null && _d !== void 0 ? _d : ''}`; yield this.tick(); this.initializeStyles(); this.showNextMessage(); }); } removeCurrentMessage() { clearTimeout(this.timeout); return new Promise((resolve) => { if (!this.currentMessage) { setTimeout(() => resolve()); } else { this.render = false; setTimeout(() => resolve(), this.speed * 1000); } }); } tick() { return new Promise((resolve) => { setTimeout(() => resolve(), this.speed * 1000); }); } showNextMessage() { if (!this.currentMessage) return; setTimeout(() => this.render = true); this.timeout = window.setTimeout(() => this.processMessageQueue(true), this.currentMessage.duration * 1000); } validateMessage(message) { const growlPositions = [MessagePosition.BottomLeft, MessagePosition.BottomRight, MessagePosition.TopLeft, MessagePosition.TopRight]; const snackbarPositions = [MessagePosition.TopCenter, MessagePosition.BottomCenter]; if (!message) return false; if (message.type === MessageType.Growl && growlPositions.indexOf(message.position) === -1) { throw new Error("Growl messages must use one of the following positions: MessagePosition.BottomLeft, MessagePosition.BottomRight, MessagePosition.TopLeft, MessagePosition.TopRight"); return false; } if (message.type === MessageType.Snackbar && snackbarPositions.indexOf(message.position) === -1) { throw new Error("Snackbar messages must use one of the following positions: MessagePosition.TopCenter, MessagePosition.BottomCenter"); return false; } return true; } } MessagesComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: MessagesComponent, deps: [{ token: MessagesService }, { token: i2.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component }); MessagesComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: MessagesComponent, selector: "messages", inputs: { background: "background", color: "color", zIndex: ["z-index", "zIndex"], speed: ["transition-speed", "speed"] }, host: { listeners: { "click": "onContainerClick($event.target)" }, properties: { "class.render": "this.render", "class": "this.classes" } }, ngImport: i0, template: ` <ng-container *ngTemplateOutlet="currentMessage?.template ?? null"></ng-container> <div *ngIf="!currentMessage?.template" [attr.role]="currentMessage ? 'alert':'generic'" class="message-text" [innerHtml]="sanitizer.bypassSecurityTrustHtml(currentMessage?.message || ' ')"></div> <div class="style-container" [innerHtml]="styles"></div> `, isInline: true, styles: [":host{position:fixed;transition-property:all;border-radius:.5rem;box-sizing:border-box;padding:1rem;opacity:0;pointer-events:none}:host.growl{width:20rem}:host.snackbar{width:20rem}@media only screen and (min-width: 768px){:host.snackbar{width:40rem}}:host.growl.top.right{top:2rem;right:2rem;box-sizing:border-box;transform:translate(calc(100% + 2rem))}:host.growl.top.right.render{opacity:1;transform:translate(0);pointer-events:auto}:host.growl.top.left{top:2rem;left:2rem;box-sizing:border-box;transform:translate(calc(-100% - 2rem));opacity:0}:host.growl.top.left.render{opacity:1;transform:translate(0);pointer-events:auto}:host.growl.bottom.left{bottom:2rem;left:2rem;box-sizing:border-box;transform:translate(calc(-100% - 2rem));opacity:0}:host.growl.bottom.left.render{opacity:1;transform:translate(0);pointer-events:auto}:host.growl.bottom.right{bottom:2rem;right:2rem;box-sizing:border-box;transform:translate(calc(100% + 2rem));opacity:0}:host.growl.bottom.right.render{opacity:1;transform:translate(0);pointer-events:auto}:host.snackbar.top.center{top:2rem;box-sizing:border-box;transform:translateY(calc(-100% - 2rem));opacity:0;border-radius:1rem;left:calc(50% - 10rem)}@media only screen and (min-width: 768px){:host.snackbar.top.center{left:calc(50% - 20rem)}}:host.snackbar.top.center.render{opacity:1;transform:translate(0);pointer-events:auto}:host.snackbar.bottom.center{bottom:2rem;box-sizing:border-box;transform:translateY(calc(100% + 2rem));opacity:0;border-radius:1rem;left:calc(50% - 10rem)}@media only screen and (min-width: 768px){:host.snackbar.bottom.center{left:calc(50% - 20rem)}}:host.snackbar.bottom.center.render{opacity:1;transform:translate(0);pointer-events:auto}\n"], directives: [{ type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: MessagesComponent, decorators: [{ type: Component, args: [{ selector: 'messages', template: ` <ng-container *ngTemplateOutlet="currentMessage?.template ?? null"></ng-container> <div *ngIf="!currentMessage?.template" [attr.role]="currentMessage ? 'alert':'generic'" class="message-text" [innerHtml]="sanitizer.bypassSecurityTrustHtml(currentMessage?.message || ' ')"></div> <div class="style-container" [innerHtml]="styles"></div> `, styles: [":host{position:fixed;transition-property:all;border-radius:.5rem;box-sizing:border-box;padding:1rem;opacity:0;pointer-events:none}:host.growl{width:20rem}:host.snackbar{width:20rem}@media only screen and (min-width: 768px){:host.snackbar{width:40rem}}:host.growl.top.right{top:2rem;right:2rem;box-sizing:border-box;transform:translate(calc(100% + 2rem))}:host.growl.top.right.render{opacity:1;transform:translate(0);pointer-events:auto}:host.growl.top.left{top:2rem;left:2rem;box-sizing:border-box;transform:translate(calc(-100% - 2rem));opacity:0}:host.growl.top.left.render{opacity:1;transform:translate(0);pointer-events:auto}:host.growl.bottom.left{bottom:2rem;left:2rem;box-sizing:border-box;transform:translate(calc(-100% - 2rem));opacity:0}:host.growl.bottom.left.render{opacity:1;transform:translate(0);pointer-events:auto}:host.growl.bottom.right{bottom:2rem;right:2rem;box-sizing:border-box;transform:translate(calc(100% + 2rem));opacity:0}:host.growl.bottom.right.render{opacity:1;transform:translate(0);pointer-events:auto}:host.snackbar.top.center{top:2rem;box-sizing:border-box;transform:translateY(calc(-100% - 2rem));opacity:0;border-radius:1rem;left:calc(50% - 10rem)}@media only screen and (min-width: 768px){:host.snackbar.top.center{left:calc(50% - 20rem)}}:host.snackbar.top.center.render{opacity:1;transform:translate(0);pointer-events:auto}:host.snackbar.bottom.center{bottom:2rem;box-sizing:border-box;transform:translateY(calc(100% + 2rem));opacity:0;border-radius:1rem;left:calc(50% - 10rem)}@media only screen and (min-width: 768px){:host.snackbar.bottom.center{left:calc(50% - 20rem)}}:host.snackbar.bottom.center.render{opacity:1;transform:translate(0);pointer-events:auto}\n"] }] }], ctorParameters: function () { return [{ type: MessagesService }, { type: i2.DomSanitizer }]; }, propDecorators: { render: [{ type: HostBinding, args: ['class.render'] }], classes: [{ type: HostBinding, args: ['class'] }], background: [{ type: Input, args: ["background"] }], color: [{ type: Input, args: ["color"] }], zIndex: [{ type: Input, args: ["z-index"] }], speed: [{ type: Input, args: ["transition-speed"] }], onContainerClick: [{ type: HostListener, args: ['click', ['$event.target']] }] } }); class MessagesModule { } MessagesModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: MessagesModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); MessagesModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: MessagesModule, declarations: [MessagesComponent], imports: [CommonModule], exports: [MessagesComponent] }); MessagesModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: MessagesModule, imports: [[ CommonModule ]] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: MessagesModule, decorators: [{ type: NgModule, args: [{ declarations: [ MessagesComponent ], imports: [ CommonModule ], exports: [ MessagesComponent ] }] }] }); /* * Public API Surface of messages */ /** * Generated bundle index. Do not edit. */ export { MessagePosition, MessageType, MessagesComponent, MessagesModule, MessagesService }; //# sourceMappingURL=ems-web-app-messages.mjs.map