UNPKG

@dotglitch/ngx-common

Version:

Angular components and utilities that are commonly used.

66 lines 10.1 kB
import { Injectable, Inject } from '@angular/core'; import { NGX_DYNAMIC_CONFIG } from './types'; import * as i0 from "@angular/core"; import * as i1 from "./types"; function isBrowserPlatform() { return window != null && window.document != null; } export class DynamicHTMLRenderer { constructor(config, cfr, injector) { this.config = config; this.cfr = cfr; this.injector = injector; this.componentFactories = new Map(); this.componentRefs = new Map(); this.config.components.forEach(({ selector, component }) => { let cf; cf = this.cfr.resolveComponentFactory(component); this.componentFactories.set(selector, cf); }); } renderInnerHTML(elementRef, html) { if (!isBrowserPlatform()) { return { check: () => { }, destroy: () => { }, }; } elementRef.nativeElement.innerHTML = html; const componentRefs = []; this.config.components.forEach(({ selector }) => { const elements = elementRef.nativeElement.querySelectorAll(selector); Array.prototype.forEach.call(elements, (el) => { const content = el.innerHTML; const cmpRef = this.componentFactories.get(selector).create(this.injector, [], el); el.removeAttribute('ng-version'); if (cmpRef.instance.dynamicOnMount) { const attrsMap = new Map(); if (el.hasAttributes()) { Array.prototype.forEach.call(el.attributes, (attr) => { attrsMap.set(attr.name, attr.value); }); } cmpRef.instance.dynamicOnMount(attrsMap, content, el); } componentRefs.push(cmpRef); }); }); this.componentRefs.set(elementRef, componentRefs); return { check: () => componentRefs.forEach(ref => ref.changeDetectorRef.detectChanges()), destroy: () => { componentRefs.forEach(ref => ref.destroy()); this.componentRefs.delete(elementRef); }, }; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: DynamicHTMLRenderer, deps: [{ token: NGX_DYNAMIC_CONFIG }, { token: i0.ComponentFactoryResolver }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: DynamicHTMLRenderer }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: DynamicHTMLRenderer, decorators: [{ type: Injectable }], ctorParameters: () => [{ type: i1.DynamicHTMLOptions, decorators: [{ type: Inject, args: [NGX_DYNAMIC_CONFIG] }] }, { type: i0.ComponentFactoryResolver }, { type: i0.Injector }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1odG1sLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vc3JjL2NvbXBvbmVudHMvZHluYW1pYy1odG1sL2R5bmFtaWMtaHRtbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQWtGLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuSSxPQUFPLEVBQXNCLGtCQUFrQixFQUFXLE1BQU0sU0FBUyxDQUFDOzs7QUFPMUUsU0FBUyxpQkFBaUI7SUFDdEIsT0FBTyxNQUFNLElBQUksSUFBSSxJQUFJLE1BQU0sQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDO0FBQ3JELENBQUM7QUFHRCxNQUFNLE9BQU8sbUJBQW1CO0lBTTVCLFlBQWdELE1BQTBCLEVBQVUsR0FBNkIsRUFBVSxRQUFrQjtRQUE3RixXQUFNLEdBQU4sTUFBTSxDQUFvQjtRQUFVLFFBQUcsR0FBSCxHQUFHLENBQTBCO1FBQVUsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUpySSx1QkFBa0IsR0FBRyxJQUFJLEdBQUcsRUFBaUMsQ0FBQztRQUU5RCxrQkFBYSxHQUFHLElBQUksR0FBRyxFQUFpQyxDQUFDO1FBRzdELElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUU7WUFDdkQsSUFBSSxFQUF5QixDQUFDO1lBQzlCLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLHVCQUF1QixDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2pELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzlDLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELGVBQWUsQ0FBQyxVQUFzQixFQUFFLElBQVk7UUFDaEQsSUFBSSxDQUFDLGlCQUFpQixFQUFFLEVBQUUsQ0FBQztZQUN2QixPQUFPO2dCQUNILEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO2dCQUNoQixPQUFPLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQzthQUNyQixDQUFDO1FBQ04sQ0FBQztRQUNELFVBQVUsQ0FBQyxhQUFhLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUUxQyxNQUFNLGFBQWEsR0FBNkIsRUFBRSxDQUFDO1FBQ25ELElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRTtZQUM1QyxNQUFNLFFBQVEsR0FBSSxVQUFVLENBQUMsYUFBeUIsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNsRixLQUFLLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBVyxFQUFFLEVBQUU7Z0JBQ25ELE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUM7Z0JBQzdCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUVuRixFQUFFLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUVqQyxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsY0FBYyxFQUFFLENBQUM7b0JBQ2pDLE1BQU0sUUFBUSxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO29CQUMzQyxJQUFJLEVBQUUsQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDO3dCQUNyQixLQUFLLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDLElBQVUsRUFBRSxFQUFFOzRCQUN2RCxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUN4QyxDQUFDLENBQUMsQ0FBQztvQkFDUCxDQUFDO29CQUNBLE1BQU0sQ0FBQyxRQUFvQixDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUN2RSxDQUFDO2dCQUVELGFBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDL0IsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUVsRCxPQUFPO1lBQ0gsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDaEYsT0FBTyxFQUFFLEdBQUcsRUFBRTtnQkFDVixhQUFhLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7Z0JBQzVDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzFDLENBQUM7U0FDSixDQUFDO0lBQ04sQ0FBQzs4R0F0RFEsbUJBQW1CLGtCQU1SLGtCQUFrQjtrSEFON0IsbUJBQW1COzsyRkFBbkIsbUJBQW1CO2tCQUQvQixVQUFVOzswQkFPTSxNQUFNOzJCQUFDLGtCQUFrQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIEluamVjdG9yLCBFbGVtZW50UmVmLCBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsIENvbXBvbmVudEZhY3RvcnksIENvbXBvbmVudFJlZiwgSW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEeW5hbWljSFRNTE9wdGlvbnMsIE5HWF9EWU5BTUlDX0NPTkZJRywgT25Nb3VudCB9IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIER5bmFtaWNIVE1MUmVmIHtcbiAgICBjaGVjazogKCkgPT4gdm9pZDtcbiAgICBkZXN0cm95OiAoKSA9PiB2b2lkO1xufVxuXG5mdW5jdGlvbiBpc0Jyb3dzZXJQbGF0Zm9ybSgpIHtcbiAgICByZXR1cm4gd2luZG93ICE9IG51bGwgJiYgd2luZG93LmRvY3VtZW50ICE9IG51bGw7XG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBEeW5hbWljSFRNTFJlbmRlcmVyIHtcblxuICAgIHByaXZhdGUgY29tcG9uZW50RmFjdG9yaWVzID0gbmV3IE1hcDxzdHJpbmcsIENvbXBvbmVudEZhY3Rvcnk8YW55Pj4oKTtcblxuICAgIHByaXZhdGUgY29tcG9uZW50UmVmcyA9IG5ldyBNYXA8YW55LCBBcnJheTxDb21wb25lbnRSZWY8YW55Pj4+KCk7XG5cbiAgICBjb25zdHJ1Y3RvcihASW5qZWN0KE5HWF9EWU5BTUlDX0NPTkZJRykgcHJpdmF0ZSBjb25maWc6IER5bmFtaWNIVE1MT3B0aW9ucywgcHJpdmF0ZSBjZnI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlciwgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IpIHtcbiAgICAgICAgdGhpcy5jb25maWcuY29tcG9uZW50cy5mb3JFYWNoKCh7IHNlbGVjdG9yLCBjb21wb25lbnQgfSkgPT4ge1xuICAgICAgICAgICAgbGV0IGNmOiBDb21wb25lbnRGYWN0b3J5PGFueT47XG4gICAgICAgICAgICBjZiA9IHRoaXMuY2ZyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KGNvbXBvbmVudCk7XG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudEZhY3Rvcmllcy5zZXQoc2VsZWN0b3IsIGNmKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmVuZGVySW5uZXJIVE1MKGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsIGh0bWw6IHN0cmluZyk6IER5bmFtaWNIVE1MUmVmIHtcbiAgICAgICAgaWYgKCFpc0Jyb3dzZXJQbGF0Zm9ybSgpKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGNoZWNrOiAoKSA9PiB7IH0sXG4gICAgICAgICAgICAgICAgZGVzdHJveTogKCkgPT4geyB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuaW5uZXJIVE1MID0gaHRtbDtcblxuICAgICAgICBjb25zdCBjb21wb25lbnRSZWZzOiBBcnJheTxDb21wb25lbnRSZWY8YW55Pj4gPSBbXTtcbiAgICAgICAgdGhpcy5jb25maWcuY29tcG9uZW50cy5mb3JFYWNoKCh7IHNlbGVjdG9yIH0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzID0gKGVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCBhcyBFbGVtZW50KS5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTtcbiAgICAgICAgICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZWxlbWVudHMsIChlbDogRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBlbC5pbm5lckhUTUw7XG4gICAgICAgICAgICAgICAgY29uc3QgY21wUmVmID0gdGhpcy5jb21wb25lbnRGYWN0b3JpZXMuZ2V0KHNlbGVjdG9yKS5jcmVhdGUodGhpcy5pbmplY3RvciwgW10sIGVsKTtcblxuICAgICAgICAgICAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZSgnbmctdmVyc2lvbicpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGNtcFJlZi5pbnN0YW5jZS5keW5hbWljT25Nb3VudCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhdHRyc01hcCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbC5oYXNBdHRyaWJ1dGVzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZWwuYXR0cmlidXRlcywgKGF0dHI6IEF0dHIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyc01hcC5zZXQoYXR0ci5uYW1lLCBhdHRyLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIChjbXBSZWYuaW5zdGFuY2UgYXMgT25Nb3VudCkuZHluYW1pY09uTW91bnQoYXR0cnNNYXAsIGNvbnRlbnQsIGVsKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb21wb25lbnRSZWZzLnB1c2goY21wUmVmKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jb21wb25lbnRSZWZzLnNldChlbGVtZW50UmVmLCBjb21wb25lbnRSZWZzKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY2hlY2s6ICgpID0+IGNvbXBvbmVudFJlZnMuZm9yRWFjaChyZWYgPT4gcmVmLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKSksXG4gICAgICAgICAgICBkZXN0cm95OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50UmVmcy5mb3JFYWNoKHJlZiA9PiByZWYuZGVzdHJveSgpKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudFJlZnMuZGVsZXRlKGVsZW1lbnRSZWYpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9XG59XG4iXX0=