UNPKG

@doku-dev/doku-fragment

Version:

A new Angular UI library that moving away from Bootstrap and built from scratch.

109 lines 14.4 kB
import { DOCUMENT } from '@angular/common'; import { Inject, Injectable, Injector, createComponent, } from '@angular/core'; import { DokuActiveToast, DokuToastRef } from './toast-ref'; import { DokuToast } from './toast.component'; import { TOAST_CONTAINER_CLASS } from './toast.constant'; import * as i0 from "@angular/core"; export class DokuToastElementService { constructor(envInjector, appRef, document) { this.envInjector = envInjector; this.appRef = appRef; this.document = document; this.toastRefs = []; } openToast(data) { const activeToast = new DokuActiveToast(); const toastComponentRef = this.createToastComponent(activeToast, data); const toastRef = new DokuToastRef(toastComponentRef, this, data); activeToast.dismiss = () => { toastRef.dismiss(); }; this.registerToastRef(toastRef); toastComponentRef.changeDetectorRef.detach(); toastComponentRef.changeDetectorRef.detectChanges(); toastComponentRef.changeDetectorRef.markForCheck(); this.attachToastContainer(); this.attachToastInContainer(toastComponentRef); toastRef['startAutoDismiss'](); return toastRef; } dismissAll() { this.toastRefs.forEach((toast) => toast.dismiss()); } removeContainerElement() { const container = this.getToastContainerElement(); if (!container) return; const hasChild = container.hasChildNodes(); if (hasChild) return; container.remove(); } createToastComponent(activeToast, data) { const elementInjector = Injector.create({ providers: [{ provide: DokuActiveToast, useValue: activeToast }], }); let projectableNodes; if (data.text) { projectableNodes = [[this.document.createTextNode(data.text)]]; } if (data.template) { const context = { $implicit: activeToast }; const viewRef = data.template.createEmbeddedView(context); this.appRef.attachView(viewRef); projectableNodes = [viewRef.rootNodes]; } const component = createComponent(DokuToast, { environmentInjector: this.envInjector, elementInjector, projectableNodes, }); component.instance.state = data.state || 'neutral'; component.instance.dismissible = !!data.dismissible; this.appRef.attachView(component.hostView); return component; } attachToastContainer() { const containerExists = !!this.getToastContainerElement(); if (!containerExists) { const el = this.createToastContainerElement(); this.document.body.appendChild(el); } } attachToastInContainer(toastComponent) { const containerEl = this.getToastContainerElement(); if (containerEl) { containerEl.appendChild(toastComponent.location.nativeElement); } } createToastContainerElement() { const divEl = this.document.createElement('div'); divEl.classList.add(TOAST_CONTAINER_CLASS); return divEl; } getToastContainerElement() { return this.document.body.querySelector(`div.${TOAST_CONTAINER_CLASS}`); } registerToastRef(ref) { const unregister = () => { const index = this.toastRefs.indexOf(ref); if (index > -1) { this.toastRefs.splice(index, 1); } }; this.toastRefs.push(ref); ref['result'].then(unregister); } } DokuToastElementService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DokuToastElementService, deps: [{ token: i0.EnvironmentInjector }, { token: i0.ApplicationRef }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable }); DokuToastElementService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DokuToastElementService, providedIn: 'root' }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DokuToastElementService, decorators: [{ type: Injectable, args: [{ providedIn: 'root', }] }], ctorParameters: function () { return [{ type: i0.EnvironmentInjector }, { type: i0.ApplicationRef }, { type: Document, decorators: [{ type: Inject, args: [DOCUMENT] }] }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9hc3QtZWxlbWVudC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZG9rdS1mcmFnbWVudC9zcmMvbGliL3RvYXN0L3RvYXN0LWVsZW1lbnQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUlMLE1BQU0sRUFDTixVQUFVLEVBQ1YsUUFBUSxFQUNSLGVBQWUsR0FDaEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDNUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDOztBQU16RCxNQUFNLE9BQU8sdUJBQXVCO0lBR2xDLFlBQ1UsV0FBZ0MsRUFDaEMsTUFBc0IsRUFDSixRQUFrQjtRQUZwQyxnQkFBVyxHQUFYLFdBQVcsQ0FBcUI7UUFDaEMsV0FBTSxHQUFOLE1BQU0sQ0FBZ0I7UUFDSixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBTDlDLGNBQVMsR0FBbUIsRUFBRSxDQUFDO0lBTTVCLENBQUM7SUFFSixTQUFTLENBQUMsSUFBbUI7UUFDM0IsTUFBTSxXQUFXLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQztRQUMxQyxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDdkUsTUFBTSxRQUFRLEdBQUcsSUFBSSxZQUFZLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRWpFLFdBQVcsQ0FBQyxPQUFPLEdBQUcsR0FBRyxFQUFFO1lBQ3pCLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNyQixDQUFDLENB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ZW50IjpbImltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIEFwcGxpY2F0aW9uUmVmLFxuICBDb21wb25lbnRSZWYsXG4gIEVudmlyb25tZW50SW5qZWN0b3IsXG4gIEluamVjdCxcbiAgSW5qZWN0YWJsZSxcbiAgSW5qZWN0b3IsXG4gIGNyZWF0ZUNvbXBvbmVudCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEb2t1QWN0aXZlVG9hc3QsIERva3VUb2FzdFJlZiB9IGZyb20gJy4vdG9hc3QtcmVmJztcbmltcG9ydCB7IERva3VUb2FzdCB9IGZyb20gJy4vdG9hc3QuY29tcG9uZW50JztcbmltcG9ydCB7IFRPQVNUX0NPTlRBSU5FUl9DTEFTUyB9IGZyb20gJy4vdG9hc3QuY29uc3RhbnQnO1xuaW1wb3J0IHsgRG9rdVRvYXN0SXRlbSB9IGZyb20gJy4vdG9hc3QuaW50ZXJmYWNlJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIERva3VUb2FzdEVsZW1lbnRTZXJ2aWNlIHtcbiAgdG9hc3RSZWZzOiBEb2t1VG9hc3RSZWZbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZW52SW5qZWN0b3I6IEVudmlyb25tZW50SW5qZWN0b3IsXG4gICAgcHJpdmF0ZSBhcHBSZWY6IEFwcGxpY2F0aW9uUmVmLFxuICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgZG9jdW1lbnQ6IERvY3VtZW50XG4gICkge31cblxuICBvcGVuVG9hc3QoZGF0YTogRG9rdVRvYXN0SXRlbSkge1xuICAgIGNvbnN0IGFjdGl2ZVRvYXN0ID0gbmV3IERva3VBY3RpdmVUb2FzdCgpO1xuICAgIGNvbnN0IHRvYXN0Q29tcG9uZW50UmVmID0gdGhpcy5jcmVhdGVUb2FzdENvbXBvbmVudChhY3RpdmVUb2FzdCwgZGF0YSk7XG4gICAgY29uc3QgdG9hc3RSZWYgPSBuZXcgRG9rdVRvYXN0UmVmKHRvYXN0Q29tcG9uZW50UmVmLCB0aGlzLCBkYXRhKTtcblxuICAgIGFjdGl2ZVRvYXN0LmRpc21pc3MgPSAoKSA9PiB7XG4gICAgICB0b2FzdFJlZi5kaXNtaXNzKCk7XG4gICAgfTtcblxuICAgIHRoaXMucmVnaXN0ZXJUb2FzdFJlZih0b2FzdFJlZik7XG4gICAgdG9hc3RDb21wb25lbnRSZWYuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0YWNoKCk7XG4gICAgdG9hc3RDb21wb25lbnRSZWYuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIHRvYXN0Q29tcG9uZW50UmVmLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuXG4gICAgdGhpcy5hdHRhY2hUb2FzdENvbnRhaW5lcigpO1xuICAgIHRoaXMuYXR0YWNoVG9hc3RJbkNvbnRhaW5lcih0b2FzdENvbXBvbmVudFJlZik7XG5cbiAgICB0b2FzdFJlZlsnc3RhcnRBdXRvRGlzbWlzcyddKCk7XG4gICAgcmV0dXJuIHRvYXN0UmVmO1xuICB9XG5cbiAgZGlzbWlzc0FsbCgpIHtcbiAgICB0aGlzLnRvYXN0UmVmcy5mb3JFYWNoKCh0b2FzdCkgPT4gdG9hc3QuZGlzbWlzcygpKTtcbiAgfVxuXG4gIHJlbW92ZUNvbnRhaW5lckVsZW1lbnQoKSB7XG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5nZXRUb2FzdENvbnRhaW5lckVsZW1lbnQoKTtcbiAgICBpZiAoIWNvbnRhaW5lcikgcmV0dXJuO1xuICAgIGNvbnN0IGhhc0NoaWxkID0gY29udGFpbmVyLmhhc0NoaWxkTm9kZXMoKTtcbiAgICBpZiAoaGFzQ2hpbGQpIHJldHVybjtcbiAgICBjb250YWluZXIucmVtb3ZlKCk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVRvYXN0Q29tcG9uZW50KGFjdGl2ZVRvYXN0OiBEb2t1QWN0aXZlVG9hc3QsIGRhdGE6IERva3VUb2FzdEl0ZW0pIHtcbiAgICBjb25zdCBlbGVtZW50SW5qZWN0b3IgPSBJbmplY3Rvci5jcmVhdGUoe1xuICAgICAgcHJvdmlkZXJzOiBbeyBwcm92aWRlOiBEb2t1QWN0aXZlVG9hc3QsIHVzZVZhbHVlOiBhY3RpdmVUb2FzdCB9XSxcbiAgICB9KTtcblxuICAgIGxldCBwcm9qZWN0YWJsZU5vZGVzITogTm9kZVtdW107XG5cbiAgICBpZiAoZGF0YS50ZXh0KSB7XG4gICAgICBwcm9qZWN0YWJsZU5vZGVzID0gW1t0aGlzLmRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGRhdGEudGV4dCldXTtcbiAgICB9XG5cbiAgICBpZiAoZGF0YS50ZW1wbGF0ZSkge1xuICAgICAgY29uc3QgY29udGV4dCA9IHsgJGltcGxpY2l0OiBhY3RpdmVUb2FzdCB9O1xuICAgICAgY29uc3Qgdmlld1JlZiA9IGRhdGEudGVtcGxhdGUuY3JlYXRlRW1iZWRkZWRWaWV3KGNvbnRleHQpO1xuICAgICAgdGhpcy5hcHBSZWYuYXR0YWNoVmlldyh2aWV3UmVmKTtcbiAgICAgIHByb2plY3RhYmxlTm9kZXMgPSBbdmlld1JlZi5yb290Tm9kZXNdO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbXBvbmVudCA9IGNyZWF0ZUNvbXBvbmVudChEb2t1VG9hc3QsIHtcbiAgICAgIGVudmlyb25tZW50SW5qZWN0b3I6IHRoaXMuZW52SW5qZWN0b3IsXG4gICAgICBlbGVtZW50SW5qZWN0b3IsXG4gICAgICBwcm9qZWN0YWJsZU5vZGVzLFxuICAgIH0pO1xuICAgIGNvbXBvbmVudC5pbnN0YW5jZS5zdGF0ZSA9IGRhdGEuc3RhdGUgfHwgJ25ldXRyYWwnO1xuICAgIGNvbXBvbmVudC5pbnN0YW5jZS5kaXNtaXNzaWJsZSA9ICEhZGF0YS5kaXNtaXNzaWJsZTtcbiAgICB0aGlzLmFwcFJlZi5hdHRhY2hWaWV3KGNvbXBvbmVudC5ob3N0Vmlldyk7XG4gICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgfVxuXG4gIHByaXZhdGUgYXR0YWNoVG9hc3RDb250YWluZXIoKSB7XG4gICAgY29uc3QgY29udGFpbmVyRXhpc3RzID0gISF0aGlzLmdldFRvYXN0Q29udGFpbmVyRWxlbWVudCgpO1xuICAgIGlmICghY29udGFpbmVyRXhpc3RzKSB7XG4gICAgICBjb25zdCBlbCA9IHRoaXMuY3JlYXRlVG9hc3RDb250YWluZXJFbGVtZW50KCk7XG4gICAgICB0aGlzLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZWwpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXR0YWNoVG9hc3RJbkNvbnRhaW5lcih0b2FzdENvbXBvbmVudDogQ29tcG9uZW50UmVmPERva3VUb2FzdD4pIHtcbiAgICBjb25zdCBjb250YWluZXJFbCA9IHRoaXMuZ2V0VG9hc3RDb250YWluZXJFbGVtZW50KCk7XG4gICAgaWYgKGNvbnRhaW5lckVsKSB7XG4gICAgICBjb250YWluZXJFbC5hcHBlbmRDaGlsZCh0b2FzdENvbXBvbmVudC5sb2NhdGlvbi5uYXRpdmVFbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVRvYXN0Q29udGFpbmVyRWxlbWVudCgpIHtcbiAgICBjb25zdCBkaXZFbCA9IHRoaXMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZGl2RWwuY2xhc3NMaXN0LmFkZChUT0FTVF9DT05UQUlORVJfQ0xBU1MpO1xuICAgIHJldHVybiBkaXZFbDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VG9hc3RDb250YWluZXJFbGVtZW50KCkge1xuICAgIHJldHVybiB0aGlzLmRvY3VtZW50LmJvZHkucXVlcnlTZWxlY3RvcihgZGl2LiR7VE9BU1RfQ09OVEFJTkVSX0NMQVNTfWApO1xuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3RlclRvYXN0UmVmKHJlZjogRG9rdVRvYXN0UmVmKSB7XG4gICAgY29uc3QgdW5yZWdpc3RlciA9ICgpID0+IHtcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy50b2FzdFJlZnMuaW5kZXhPZihyZWYpO1xuICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgdGhpcy50b2FzdFJlZnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMudG9hc3RSZWZzLnB1c2gocmVmKTtcbiAgICByZWZbJ3Jlc3VsdCddLnRoZW4odW5yZWdpc3Rlcik7XG4gIH1cbn1cbiJdfQ==