@dotglitch/ngx-common
Version:
Angular components and utilities that are commonly used.
66 lines • 10.1 kB
JavaScript
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=