UNPKG

@doku-dev/doku-fragment

Version:

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

133 lines 19.6 kB
import { DOCUMENT } from '@angular/common'; import { Inject, Injectable, } from '@angular/core'; import { NavigationStart } from '@angular/router'; import { ReplaySubject, filter, takeUntil } from 'rxjs'; import { DokuActiveModal, DokuModalRef } from './modal-ref'; import { ViewElement } from './view-element'; import * as i0 from "@angular/core"; import * as i1 from "../backdrop/backdrop.service"; import * as i2 from "@angular/router"; export class DokuModalService { constructor(envInjector, appRef, document, backdropService, injector, router) { this.envInjector = envInjector; this.appRef = appRef; this.document = document; this.backdropService = backdropService; this.injector = injector; this.router = router; this.modalRefs = []; this.destroy$ = new ReplaySubject(); this.router.events .pipe(filter((ev) => ev instanceof NavigationStart), takeUntil(this.destroy$)) .subscribe(() => this.closeAll()); } ngOnDestroy() { this.closeAll(); this.destroy$.next(true); this.destroy$.complete(); } open(componentOrTemplateRef, config) { const activeModal = new DokuActiveModal(); const view = ViewElement.createElement(componentOrTemplateRef, { environmentInjector: this.envInjector, applicationRef: this.appRef, document: this.document, activeModal: activeModal, injector: this.injector, }); // Add portal class (if exists) to the portal element if (config?.portalClass) { view.element.portal.classList.add(config.portalClass); } const componentInstance = view.content.componentRef?.instance || view.content.templateRef?.context; const modalRef = new DokuModalRef(this, componentInstance, view); const normalizedConfig = this.setViewByConfig(view, config); activeModal['_config'] = normalizedConfig; activeModal.close = modalRef.close.bind(modalRef); setTimeout(() => { const { backdropRef } = ViewElement.appendToBody(view, { backdropService: this.backdropService, document: this.document, }); modalRef['backdropRef'] = backdropRef; // Add overflow-hidden class to the document body this.document.body.classList.add('d-body-overflow-hidden'); view.content.componentRef?.changeDetectorRef.detectChanges(); view.content.templateRef?.detectChanges(); // Remove focus on trigger element this.document.activeElement?.blur(); }, 0); this.modalRefs.push(modalRef); return modalRef; } closeAll() { this.modalRefs.forEach((ref) => this.close(ref)); } close(modalRef) { if (!modalRef['view']) return; ViewElement.removeFromBody(modalRef['view'], { backdropService: this.backdropService, document: this.document, backdropRef: modalRef['backdropRef'], }); modalRef['view'] = undefined; this.modalRefs = this.modalRefs.filter((ref) => ref !== modalRef); // Remove overflow-hidden class from document body if all of the modals have been closed. if (!this.modalRefs.length) { this.document.body.classList.remove('d-body-overflow-hidden'); } } /** * @returns Normalized DokuModalConfig */ setViewByConfig(view, config) { const normalizedConfig = { ...config }; if (config?.centered === undefined || config.centered === null) { normalizedConfig.centered = true; } if (!config?.variant) normalizedConfig.variant = 'info'; if (!config?.size) normalizedConfig.size = 'medium'; if (normalizedConfig.variant) { view.element.modal.classList.add(`d-modal-variant-${normalizedConfig.variant}`); if (normalizedConfig.variant === 'form') { view.element.modal.classList.add('d-modal-scrollable-content'); } if (normalizedConfig.variant === 'confirmation') { normalizedConfig.confirmationOptions = { ...normalizedConfig.confirmationOptions }; // Set default size if not set explicitly. if (!config?.size) normalizedConfig.size = 'small'; // Set default icon type if not set explicitly. if (!config?.confirmationOptions?.iconType) { normalizedConfig.confirmationOptions.iconType = 'warning'; } // Set default show icon if not set explicitly. if (!config?.confirmationOptions?.showIcon) { normalizedConfig.confirmationOptions.showIcon = true; } } } if (normalizedConfig.centered) { view.element.modal.classList.add('d-modal-centered'); } if (normalizedConfig.size) { view.element.modal.classList.add(`d-modal-${normalizedConfig.size}`); } return normalizedConfig; } } DokuModalService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DokuModalService, deps: [{ token: i0.EnvironmentInjector }, { token: i0.ApplicationRef }, { token: DOCUMENT }, { token: i1.DokuBackdropService }, { token: i0.Injector }, { token: i2.Router }], target: i0.ɵɵFactoryTarget.Injectable }); DokuModalService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DokuModalService, providedIn: 'root' }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DokuModalService, decorators: [{ type: Injectable, args: [{ providedIn: 'root', }] }], ctorParameters: function () { return [{ type: i0.EnvironmentInjector }, { type: i0.ApplicationRef }, { type: Document, decorators: [{ type: Inject, args: [DOCUMENT] }] }, { type: i1.DokuBackdropService }, { type: i0.Injector }, { type: i2.Router }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rva3UtZnJhZ21lbnQvc3JjL2xpYi9tb2RhbC9tb2RhbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBR0wsTUFBTSxFQUNOLFVBQVUsR0FJWCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZUFBZSxFQUFVLE1BQU0saUJBQWlCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXhELE9BQU8sRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTVELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7OztBQUs3QyxNQUFNLE9BQU8sZ0JBQWdCO0lBSzNCLFlBQ1UsV0FBZ0MsRUFDaEMsTUFBc0IsRUFDSixRQUFrQixFQUNwQyxlQUFvQyxFQUNwQyxRQUFrQixFQUNsQixNQUFjO1FBTGQsZ0JBQVcsR0FBWCxXQUFXLENBQXFCO1FBQ2hDLFdBQU0sR0FBTixNQUFNLENBQWdCO1FBQ0osYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUNwQyxvQkFBZSxHQUFmLGVBQWUsQ0FBcUI7UUFDcEMsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUNsQixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBVmQsY0FBUyxHQUE0QixFQUFFLENBQUM7UUFFMUMsYUFBUSxHQUFHLElBQUksYUFBYSxFQUFFLENBQUM7UUFVckMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNO2FBQ2YsSUFBSSxDQUNILE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxZQUFZLGVBQWUsQ0FBQyxFQUM3QyxTQUFTLENBQUMsSUFBSSxD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Y0FGZixNQUFNOzJGQUVQLGdCQUFnQjtrQkFINUIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7OzBCQVNJLE1BQU07MkJBQUMsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIEFwcGxpY2F0aW9uUmVmLFxuICBFbnZpcm9ubWVudEluamVjdG9yLFxuICBJbmplY3QsXG4gIEluamVjdGFibGUsXG4gIEluamVjdG9yLFxuICBPbkRlc3Ryb3ksXG4gIFRlbXBsYXRlUmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5hdmlnYXRpb25TdGFydCwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IFJlcGxheVN1YmplY3QsIGZpbHRlciwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBEb2t1QmFja2Ryb3BTZXJ2aWNlIH0gZnJvbSAnLi4vYmFja2Ryb3AvYmFja2Ryb3Auc2VydmljZSc7XG5pbXBvcnQgeyBEb2t1QWN0aXZlTW9kYWwsIERva3VNb2RhbFJlZiB9IGZyb20gJy4vbW9kYWwtcmVmJztcbmltcG9ydCB7IENvbXBvbmVudFR5cGUsIERva3VNb2RhbENvbmZpZyB9IGZyb20gJy4vbW9kYWwuaW50ZXJmYWNlJztcbmltcG9ydCB7IFZpZXdFbGVtZW50IH0gZnJvbSAnLi92aWV3LWVsZW1lbnQnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgRG9rdU1vZGFsU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIHByb3RlY3RlZCBtb2RhbFJlZnM6IERva3VNb2RhbFJlZjx1bmtub3duPltdID0gW107XG5cbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBSZXBsYXlTdWJqZWN0KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBlbnZJbmplY3RvcjogRW52aXJvbm1lbnRJbmplY3RvcixcbiAgICBwcml2YXRlIGFwcFJlZjogQXBwbGljYXRpb25SZWYsXG4gICAgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBkb2N1bWVudDogRG9jdW1lbnQsXG4gICAgcHJpdmF0ZSBiYWNrZHJvcFNlcnZpY2U6IERva3VCYWNrZHJvcFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlclxuICApIHtcbiAgICB0aGlzLnJvdXRlci5ldmVudHNcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIoKGV2KSA9PiBldiBpbnN0YW5jZW9mIE5hdmlnYXRpb25TdGFydCksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLmNsb3NlQWxsKCkpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5jbG9zZUFsbCgpO1xuICAgIHRoaXMuZGVzdHJveSQubmV4dCh0cnVlKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBvcGVuPFQ+KFxuICAgIGNvbXBvbmVudE9yVGVtcGxhdGVSZWY6IENvbXBvbmVudFR5cGU8VD4gfCBUZW1wbGF0ZVJlZjxUPixcbiAgICBjb25maWc/OiBEb2t1TW9kYWxDb25maWdcbiAgKTogRG9rdU1vZGFsUmVmPFQ+IHtcbiAgICBjb25zdCBhY3RpdmVNb2RhbCA9IG5ldyBEb2t1QWN0aXZlTW9kYWwoKTtcblxuICAgIGNvbnN0IHZpZXcgPSBWaWV3RWxlbWVudC5jcmVhdGVFbGVtZW50KGNvbXBvbmVudE9yVGVtcGxhdGVSZWYsIHtcbiAgICAgIGVudmlyb25tZW50SW5qZWN0b3I6IHRoaXMuZW52SW5qZWN0b3IsXG4gICAgICBhcHBsaWNhdGlvblJlZjogdGhpcy5hcHBSZWYsXG4gICAgICBkb2N1bWVudDogdGhpcy5kb2N1bWVudCxcbiAgICAgIGFjdGl2ZU1vZGFsOiBhY3RpdmVNb2RhbCxcbiAgICAgIGluamVjdG9yOiB0aGlzLmluamVjdG9yLFxuICAgIH0pO1xuXG4gICAgLy8gQWRkIHBvcnRhbCBjbGFzcyAoaWYgZXhpc3RzKSB0byB0aGUgcG9ydGFsIGVsZW1lbnRcbiAgICBpZiAoY29uZmlnPy5wb3J0YWxDbGFzcykge1xuICAgICAgdmlldy5lbGVtZW50LnBvcnRhbC5jbGFzc0xpc3QuYWRkKGNvbmZpZy5wb3J0YWxDbGFzcyk7XG4gICAgfVxuXG4gICAgY29uc3QgY29tcG9uZW50SW5zdGFuY2UgPVxuICAgICAgdmlldy5jb250ZW50LmNvbXBvbmVudFJlZj8uaW5zdGFuY2UgfHwgdmlldy5jb250ZW50LnRlbXBsYXRlUmVmPy5jb250ZXh0O1xuXG4gICAgY29uc3QgbW9kYWxSZWYgPSBuZXcgRG9rdU1vZGFsUmVmPFQ+KHRoaXMsIDxUPmNvbXBvbmVudEluc3RhbmNlLCB2aWV3KTtcblxuICAgIGNvbnN0IG5vcm1hbGl6ZWRDb25maWcgPSB0aGlzLnNldFZpZXdCeUNvbmZpZyh2aWV3LCBjb25maWcpO1xuXG4gICAgYWN0aXZlTW9kYWxbJ19jb25maWcnXSA9IG5vcm1hbGl6ZWRDb25maWc7XG4gICAgYWN0aXZlTW9kYWwuY2xvc2UgPSBtb2RhbFJlZi5jbG9zZS5iaW5kKG1vZGFsUmVmKTtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3QgeyBiYWNrZHJvcFJlZiB9ID0gVmlld0VsZW1lbnQuYXBwZW5kVG9Cb2R5KHZpZXcsIHtcbiAgICAgICAgYmFja2Ryb3BTZXJ2aWNlOiB0aGlzLmJhY2tkcm9wU2VydmljZSxcbiAgICAgICAgZG9jdW1lbnQ6IHRoaXMuZG9jdW1lbnQsXG4gICAgICB9KTtcblxuICAgICAgbW9kYWxSZWZbJ2JhY2tkcm9wUmVmJ10gPSBiYWNrZHJvcFJlZjtcblxuICAgICAgLy8gQWRkIG92ZXJmbG93LWhpZGRlbiBjbGFzcyB0byB0aGUgZG9jdW1lbnQgYm9keVxuICAgICAgdGhpcy5kb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoJ2QtYm9keS1vdmVyZmxvdy1oaWRkZW4nKTtcblxuICAgICAgdmlldy5jb250ZW50LmNvbXBvbmVudFJlZj8uY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgdmlldy5jb250ZW50LnRlbXBsYXRlUmVmPy5kZXRlY3RDaGFuZ2VzKCk7XG5cbiAgICAgIC8vIFJlbW92ZSBmb2N1cyBvbiB0cmlnZ2VyIGVsZW1lbnRcbiAgICAgICh0aGlzLmRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpPy5ibHVyKCk7XG4gICAgfSwgMCk7XG5cbiAgICB0aGlzLm1vZGFsUmVmcy5wdXNoKG1vZGFsUmVmKTtcbiAgICByZXR1cm4gbW9kYWxSZWY7XG4gIH1cblxuICBjbG9zZUFsbCgpIHtcbiAgICB0aGlzLm1vZGFsUmVmcy5mb3JFYWNoKChyZWYpID0+IHRoaXMuY2xvc2UocmVmKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xvc2UobW9kYWxSZWY6IERva3VNb2RhbFJlZjx1bmtub3duPikge1xuICAgIGlmICghbW9kYWxSZWZbJ3ZpZXcnXSkgcmV0dXJuO1xuICAgIFZpZXdFbGVtZW50LnJlbW92ZUZyb21Cb2R5KG1vZGFsUmVmWyd2aWV3J10sIHtcbiAgICAgIGJhY2tkcm9wU2VydmljZTogdGhpcy5iYWNrZHJvcFNlcnZpY2UsXG4gICAgICBkb2N1bWVudDogdGhpcy5kb2N1bWVudCxcbiAgICAgIGJhY2tkcm9wUmVmOiBtb2RhbFJlZlsnYmFja2Ryb3BSZWYnXSxcbiAgICB9KTtcbiAgICBtb2RhbFJlZlsndmlldyddID0gdW5kZWZpbmVkO1xuICAgIHRoaXMubW9kYWxSZWZzID0gdGhpcy5tb2RhbFJlZnMuZmlsdGVyKChyZWYpID0+IHJlZiAhPT0gbW9kYWxSZWYpO1xuXG4gICAgLy8gUmVtb3ZlIG92ZXJmbG93LWhpZGRlbiBjbGFzcyBmcm9tIGRvY3VtZW50IGJvZHkgaWYgYWxsIG9mIHRoZSBtb2RhbHMgaGF2ZSBiZWVuIGNsb3NlZC5cbiAgICBpZiAoIXRoaXMubW9kYWxSZWZzLmxlbmd0aCkge1xuICAgICAgdGhpcy5kb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ2QtYm9keS1vdmVyZmxvdy1oaWRkZW4nKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgTm9ybWFsaXplZCBEb2t1TW9kYWxDb25maWdcbiAgICovXG4gIHByaXZhdGUgc2V0Vmlld0J5Q29uZmlnKFxuICAgIHZpZXc6IFJldHVyblR5cGU8dHlwZW9mIFZpZXdFbGVtZW50LmNyZWF0ZUVsZW1lbnQ+LFxuICAgIGNvbmZpZz86IERva3VNb2RhbENvbmZpZ1xuICApOiBEb2t1TW9kYWxDb25maWcge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRDb25maWcgPSB7IC4uLmNvbmZpZyB9O1xuXG4gICAgaWYgKGNvbmZpZz8uY2VudGVyZWQgPT09IHVuZGVmaW5lZCB8fCBjb25maWcuY2VudGVyZWQgPT09IG51bGwpIHtcbiAgICAgIG5vcm1hbGl6ZWRDb25maWcuY2VudGVyZWQgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoIWNvbmZpZz8udmFyaWFudCkgbm9ybWFsaXplZENvbmZpZy52YXJpYW50ID0gJ2luZm8nO1xuICAgIGlmICghY29uZmlnPy5zaXplKSBub3JtYWxpemVkQ29uZmlnLnNpemUgPSAnbWVkaXVtJztcblxuICAgIGlmIChub3JtYWxpemVkQ29uZmlnLnZhcmlhbnQpIHtcbiAgICAgIHZpZXcuZWxlbWVudC5tb2RhbC5jbGFzc0xpc3QuYWRkKGBkLW1vZGFsLXZhcmlhbnQtJHtub3JtYWxpemVkQ29uZmlnLnZhcmlhbnR9YCk7XG5cbiAgICAgIGlmIChub3JtYWxpemVkQ29uZmlnLnZhcmlhbnQgPT09ICdmb3JtJykge1xuICAgICAgICB2aWV3LmVsZW1lbnQubW9kYWwuY2xhc3NMaXN0LmFkZCgnZC1tb2RhbC1zY3JvbGxhYmxlLWNvbnRlbnQnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG5vcm1hbGl6ZWRDb25maWcudmFyaWFudCA9PT0gJ2NvbmZpcm1hdGlvbicpIHtcbiAgICAgICAgbm9ybWFsaXplZENvbmZpZy5jb25maXJtYXRpb25PcHRpb25zID0geyAuLi5ub3JtYWxpemVkQ29uZmlnLmNvbmZpcm1hdGlvbk9wdGlvbnMgfTtcblxuICAgICAgICAvLyBTZXQgZGVmYXVsdCBzaXplIGlmIG5vdCBzZXQgZXhwbGljaXRseS5cbiAgICAgICAgaWYgKCFjb25maWc/LnNpemUpIG5vcm1hbGl6ZWRDb25maWcuc2l6ZSA9ICdzbWFsbCc7XG4gICAgICAgIC8vIFNldCBkZWZhdWx0IGljb24gdHlwZSBpZiBub3Qgc2V0IGV4cGxpY2l0bHkuXG4gICAgICAgIGlmICghY29uZmlnPy5jb25maXJtYXRpb25PcHRpb25zPy5pY29uVHlwZSkge1xuICAgICAgICAgIG5vcm1hbGl6ZWRDb25maWcuY29uZmlybWF0aW9uT3B0aW9ucy5pY29uVHlwZSA9ICd3YXJuaW5nJztcbiAgICAgICAgfVxuICAgICAgICAvLyBTZXQgZGVmYXVsdCBzaG93IGljb24gaWYgbm90IHNldCBleHBsaWNpdGx5LlxuICAgICAgICBpZiAoIWNvbmZpZz8uY29uZmlybWF0aW9uT3B0aW9ucz8uc2hvd0ljb24pIHtcbiAgICAgICAgICBub3JtYWxpemVkQ29uZmlnLmNvbmZpcm1hdGlvbk9wdGlvbnMuc2hvd0ljb24gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG5vcm1hbGl6ZWRDb25maWcuY2VudGVyZWQpIHtcbiAgICAgIHZpZXcuZWxlbWVudC5tb2RhbC5jbGFzc0xpc3QuYWRkKCdkLW1vZGFsLWNlbnRlcmVkJyk7XG4gICAgfVxuXG4gICAgaWYgKG5vcm1hbGl6ZWRDb25maWcuc2l6ZSkge1xuICAgICAgdmlldy5lbGVtZW50Lm1vZGFsLmNsYXNzTGlzdC5hZGQoYGQtbW9kYWwtJHtub3JtYWxpemVkQ29uZmlnLnNpemV9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vcm1hbGl6ZWRDb25maWc7XG4gIH1cbn1cbiJdfQ==