UNPKG

ngx-dynamic-hooks

Version:

Automatically insert live Angular components into a dynamic string of content (based on their selector or any pattern of your choice) and render the result in the DOM.

126 lines 16.9 kB
import { Component, Input, Output, EventEmitter } from '@angular/core'; import { getParseOptionDefaults } from '../../public-api'; import * as i0 from "@angular/core"; import * as i1 from "../services/dynamicHooksService"; import * as i2 from "../services/core/componentUpdater"; import * as i3 from "../services/platform/autoPlatformService"; /** * The main component of the ngx-dynamic-hooks library to dynamically load components into content */ export class DynamicHooksComponent { constructor(hostElement, dynamicHooksService, componentUpdater, platformService, environmentInjector, injector) { this.hostElement = hostElement; this.dynamicHooksService = dynamicHooksService; this.componentUpdater = componentUpdater; this.platformService = platformService; this.environmentInjector = environmentInjector; this.injector = injector; this.content = null; this.context = null; this.globalParsersBlacklist = null; this.globalParsersWhitelist = null; this.parsers = null; this.options = null; this.componentsLoaded = new EventEmitter(); this.hookIndex = {}; this.activeOptions = getParseOptionDefaults(); this.activeParsers = []; this.token = Math.random().toString(36).substring(2, 12); this.initialized = false; } ngDoCheck() { // Update bindings on every change detection run? if (!this.activeOptions.updateOnPushOnly) { this.refresh(false); } } ngOnChanges(changes) { // If text or options change, reset and parse from scratch if (changes.hasOwnProperty('content') || changes.hasOwnProperty('globalParsersBlacklist') || changes.hasOwnProperty('globalParsersWhitelist') || changes.hasOwnProperty('parsers') || changes.hasOwnProperty('options')) { this.reset(); this.parse(this.content); // If only context changed, just refresh hook inputs/outputs } else if (changes.hasOwnProperty('context')) { this.refresh(true); } } ngAfterViewInit() { } ngAfterViewChecked() { } ngOnDestroy() { this.reset(); } // ---------------------------------------------------------------------- /** * Empties the state of this component */ reset() { this.dynamicHooksService.destroy(this.hookIndex); // Reset state this.platformService.setInnerContent(this.hostElement.nativeElement, ''); this.hookIndex = {}; this.activeOptions = getParseOptionDefaults(); this.activeParsers = []; this.initialized = false; } /** * Parses the content and load components * * @param content - The content to parse */ parse(content) { this.dynamicHooksService.parse(content, this.parsers, this.context, this.options, this.globalParsersBlacklist, this.globalParsersWhitelist, this.hostElement.nativeElement, this.hookIndex, this.environmentInjector, this.injector).subscribe((parseResult) => { // hostElement and hookIndex are automatically filled this.activeParsers = parseResult.usedParsers; this.activeOptions = parseResult.usedOptions; this.initialized = true; // Return all loaded components const loadedComponents = Object.values(this.hookIndex).map((hook) => { return { hookId: hook.id, hookValue: hook.value, hookParser: hook.parser, componentRef: hook.componentRef }; }); this.componentsLoaded.emit(loadedComponents); }); } /** * Updates the bindings for all existing components * * @param triggerOnDynamicChanges - Whether to trigger the OnDynamicChanges method of dynamically loaded components */ refresh(triggerOnDynamicChanges) { if (this.initialized) { this.componentUpdater.refresh(this.hookIndex, this.context, this.activeOptions, triggerOnDynamicChanges); } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DynamicHooksComponent, deps: [{ token: i0.ElementRef }, { token: i1.DynamicHooksService }, { token: i2.ComponentUpdater }, { token: i3.AutoPlatformService }, { token: i0.EnvironmentInjector }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: DynamicHooksComponent, isStandalone: true, selector: "ngx-dynamic-hooks", inputs: { content: "content", context: "context", globalParsersBlacklist: "globalParsersBlacklist", globalParsersWhitelist: "globalParsersWhitelist", parsers: "parsers", options: "options" }, outputs: { componentsLoaded: "componentsLoaded" }, usesOnChanges: true, ngImport: i0, template: '', isInline: true }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DynamicHooksComponent, decorators: [{ type: Component, args: [{ selector: 'ngx-dynamic-hooks', template: '', standalone: true }] }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.DynamicHooksService }, { type: i2.ComponentUpdater }, { type: i3.AutoPlatformService }, { type: i0.EnvironmentInjector }, { type: i0.Injector }], propDecorators: { content: [{ type: Input }], context: [{ type: Input }], globalParsersBlacklist: [{ type: Input }], globalParsersWhitelist: [{ type: Input }], parsers: [{ type: Input }], options: [{ type: Input }], componentsLoaded: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pY0hvb2tzQ29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWR5bmFtaWMtaG9va3Mvc3JjL2xpYi9jb21wb25lbnRzL2R5bmFtaWNIb29rc0NvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFvQyxLQUFLLEVBQW9ELE1BQU0sRUFBRSxZQUFZLEVBQWtFLE1BQU0sZUFBZSxDQUFDO0FBTzNOLE9BQU8sRUFBZ0Isc0JBQXNCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQzs7Ozs7QUFFeEU7O0dBRUc7QUFPSCxNQUFNLE9BQU8scUJBQXFCO0lBY2hDLFlBQ1UsV0FBdUIsRUFDdkIsbUJBQXdDLEVBQ3hDLGdCQUFrQyxFQUNsQyxlQUFvQyxFQUNwQyxtQkFBd0MsRUFDeEMsUUFBa0I7UUFMbEIsZ0JBQVcsR0FBWCxXQUFXLENBQVk7UUFDdkIsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQUN4QyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLG9CQUFlLEdBQWYsZUFBZSxDQUFxQjtRQUNwQyx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBQ3hDLGFBQVEsR0FBUixRQUFRLENBQVU7UUFuQm5CLFlBQU8sR0FBUSxJQUFJLENBQUM7UUFDcEIsWUFBTyxHQUFRLElBQUksQ0FBQztRQUNwQiwyQkFBc0IsR0FBa0IsSUFBSSxDQUFDO1FBQzdDLDJCQUFzQixHQUFrQixJQUFJLENBQUM7UUFDN0MsWUFBTyxHQUEyQixJQUFJLENBQUM7UUFDdkMsWUFBTyxHQUFzQixJQUFJLENBQUM7UUFDakMscUJBQWdCLEdBQW9DLElBQUksWUFBWSxFQUFFLENBQUM7UUFDakYsY0FBUyxHQUFjLEVBQUUsQ0FBQztRQUMxQixrQkFBYSxHQUFpQixzQkFBc0IsRUFBRSxDQUFDO1FBQ3ZELGtCQUFhLEdBQWlCLEVBQUUsQ0FBQztRQUNqQyxV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LEtBQUs7b0JBQ3JCLFVBQVUsRUFBRSxJQUFJLENBQUMsTUFBTTtvQkFDdkIsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFhO2lCQUNqQyxDQUFDO1lBQ0osQ0FBQyxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDL0MsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILE9BQU8sQ0FBQyx1QkFBZ0M7UUFDdEMsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO1FBQzNHLENBQUM7SUFDSCxDQUFDOytHQXhIVSxxQkFBcUI7bUdBQXJCLHFCQUFxQixxVkFKdEIsRUFBRTs7NEZBSUQscUJBQXFCO2tCQU5qQyxTQUFTOytCQUNFLG1CQUFtQixZQUNuQixFQUFFLGNBQ0EsSUFBSTsyT0FJUCxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLHNCQUFzQjtzQkFBOUIsS0FBSztnQkFDRyxzQkFBc0I7c0JBQTlCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDSSxnQkFBZ0I7c0JBQXpCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95LCBJbnB1dCwgT25DaGFuZ2VzLCBFbGVtZW50UmVmLCBEb0NoZWNrLCBBZnRlclZpZXdDaGVja2VkLCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgSW5qZWN0b3IsIE9wdGlvbmFsLCBJbmplY3QsIFNpbXBsZUNoYW5nZXMsIEVudmlyb25tZW50SW5qZWN0b3IgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEhvb2tJbmRleCwgSG9vaywgUGFyc2VSZXN1bHQgfSBmcm9tICcuLi9pbnRlcmZhY2VzUHVibGljJztcbmltcG9ydCB7IEhvb2tQYXJzZXIsIExvYWRlZENvbXBvbmVudCB9IGZyb20gJy4uL2ludGVyZmFjZXNQdWJsaWMnO1xuaW1wb3J0IHsgRHluYW1pY0hvb2tzU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2R5bmFtaWNIb29rc1NlcnZpY2UnO1xuaW1wb3J0IHsgSG9va1BhcnNlckVudHJ5IH0gZnJvbSAnLi4vc2VydmljZXMvc2V0dGluZ3MvcGFyc2VyRW50cnknO1xuaW1wb3J0IHsgQ29tcG9uZW50VXBkYXRlciB9IGZyb20gJy4uL3NlcnZpY2VzL2NvcmUvY29tcG9uZW50VXBkYXRlcic7XG5pbXBvcnQgeyBBdXRvUGxhdGZvcm1TZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvcGxhdGZvcm0vYXV0b1BsYXRmb3JtU2VydmljZSc7XG5pbXBvcnQgeyBQYXJzZU9wdGlvbnMsIGdldFBhcnNlT3B0aW9uRGVmYXVsdHMgfSBmcm9tICcuLi8uLi9wdWJsaWMtYXBpJztcblxuLyoqXG4gKiBUaGUgbWFpbiBjb21wb25lbnQgb2YgdGhlIG5neC1keW5hbWljLWhvb2tzIGxpYnJhcnkgdG8gZHluYW1pY2FsbHkgbG9hZCBjb21wb25lbnRzIGludG8gY29udGVudFxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduZ3gtZHluYW1pYy1ob29rcycsXG4gIHRlbXBsYXRlOiAnJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgc3R5bGVzOiBbXVxufSlcbmV4cG9ydCBjbGFzcyBEeW5hbWljSG9va3NDb21wb25lbnQgaW1wbGVtZW50cyBEb0NoZWNrLCBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQsIEFmdGVyVmlld0NoZWNrZWQsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIGNvbnRlbnQ6IGFueSA9IG51bGw7XG4gIEBJbnB1dCgpIGNvbnRleHQ6IGFueSA9IG51bGw7XG4gIEBJbnB1dCgpIGdsb2JhbFBhcnNlcnNCbGFja2xpc3Q6IHN0cmluZ1tdfG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBnbG9iYWxQYXJzZXJzV2hpdGVsaXN0OiBzdHJpbmdbXXxudWxsID0gbnVsbDtcbiAgQElucHV0KCkgcGFyc2VyczogSG9va1BhcnNlckVudHJ5W118bnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIG9wdGlvbnM6IFBhcnNlT3B0aW9uc3xudWxsID0gbnVsbDtcbiAgQE91dHB1dCgpIGNvbXBvbmVudHNMb2FkZWQ6IEV2ZW50RW1pdHRlcjxMb2FkZWRDb21wb25lbnRbXT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIGhvb2tJbmRleDogSG9va0luZGV4ID0ge307XG4gIGFjdGl2ZU9wdGlvbnM6IFBhcnNlT3B0aW9ucyA9IGdldFBhcnNlT3B0aW9uRGVmYXVsdHMoKTtcbiAgYWN0aXZlUGFyc2VyczogSG9va1BhcnNlcltdID0gW107XG4gIHRva2VuID0gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIsIDEyKTtcbiAgaW5pdGlhbGl6ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGhvc3RFbGVtZW50OiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgZHluYW1pY0hvb2tzU2VydmljZTogRHluYW1pY0hvb2tzU2VydmljZSxcbiAgICBwcml2YXRlIGNvbXBvbmVudFVwZGF0ZXI6IENvbXBvbmVudFVwZGF0ZXIsXG4gICAgcHJpdmF0ZSBwbGF0Zm9ybVNlcnZpY2U6IEF1dG9QbGF0Zm9ybVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBlbnZpcm9ubWVudEluamVjdG9yOiBFbnZpcm9ubWVudEluamVjdG9yLFxuICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yXG4gICkge1xuICB9XG5cbiAgbmdEb0NoZWNrKCk6IHZvaWQge1xuICAgIC8vIFVwZGF0ZSBiaW5kaW5ncyBvbiBldmVyeSBjaGFuZ2UgZGV0ZWN0aW9uIHJ1bj9cbiAgICBpZiAoIXRoaXMuYWN0aXZlT3B0aW9ucy51cGRhdGVPblB1c2hPbmx5KSB7XG4gICAgICB0aGlzLnJlZnJlc2goZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAvLyBJZiB0ZXh0IG9yIG9wdGlvbnMgY2hhbmdlLCByZXNldCBhbmQgcGFyc2UgZnJvbSBzY3JhdGNoXG4gICAgaWYgKFxuICAgICAgY2hhbmdlcy5oYXNPd25Qcm9wZXJ0eSgnY29udGVudCcpIHx8XG4gICAgICBjaGFuZ2VzLmhhc093blByb3BlcnR5KCdnbG9iYWxQYXJzZXJzQmxhY2tsaXN0JykgfHxcbiAgICAgIGNoYW5nZXMuaGFzT3duUHJvcGVydHkoJ2dsb2JhbFBhcnNlcnNXaGl0ZWxpc3QnKSB8fFxuICAgICAgY2hhbmdlcy5oYXNPd25Qcm9wZXJ0eSgncGFyc2VycycpIHx8XG4gICAgICBjaGFuZ2VzLmhhc093blByb3BlcnR5KCdvcHRpb25zJylcbiAgICApIHtcbiAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgIHRoaXMucGFyc2UodGhpcy5jb250ZW50KTtcblxuICAgIC8vIElmIG9ubHkgY29udGV4dCBjaGFuZ2VkLCBqdXN0IHJlZnJlc2ggaG9vayBpbnB1dHMvb3V0cHV0c1xuICAgIH0gZWxzZSBpZiAoY2hhbmdlcy5oYXNPd25Qcm9wZXJ0eSgnY29udGV4dCcpKSB7XG4gICAgICB0aGlzLnJlZnJlc2godHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICB9XG5cbiAgbmdBZnRlclZpZXdDaGVja2VkKCk6IHZvaWQge1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5yZXNldCgpO1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8qKlxuICAgKiBFbXB0aWVzIHRoZSBzdGF0ZSBvZiB0aGlzIGNvbXBvbmVudFxuICAgKi9cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5keW5hbWljSG9va3NTZXJ2aWNlLmRlc3Ryb3kodGhpcy5ob29rSW5kZXgpO1xuXG4gICAgLy8gUmVzZXQgc3RhdGVcbiAgICB0aGlzLnBsYXRmb3JtU2VydmljZS5zZXRJbm5lckNvbnRlbnQodGhpcy5ob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50LCAnJyk7XG4gICAgdGhpcy5ob29rSW5kZXggPSB7fTtcbiAgICB0aGlzLmFjdGl2ZU9wdGlvbnMgPSBnZXRQYXJzZU9wdGlvbkRlZmF1bHRzKCk7XG4gICAgdGhpcy5hY3RpdmVQYXJzZXJzID0gW107XG4gICAgdGhpcy5pbml0aWFsaXplZCA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyB0aGUgY29udGVudCBhbmQgbG9hZCBjb21wb25lbnRzXG4gICAqXG4gICAqIEBwYXJhbSBjb250ZW50IC0gVGhlIGNvbnRlbnQgdG8gcGFyc2VcbiAgICovXG4gIHBhcnNlKGNvbnRlbnQ6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuZHluYW1pY0hvb2tzU2VydmljZS5wYXJzZShcbiAgICAgIGNvbnRlbnQsXG4gICAgICB0aGlzLnBhcnNlcnMsXG4gICAgICB0aGlzLmNvbnRleHQsXG4gICAgICB0aGlzLm9wdGlvbnMsXG4gICAgICB0aGlzLmdsb2JhbFBhcnNlcnNCbGFja2xpc3QsXG4gICAgICB0aGlzLmdsb2JhbFBhcnNlcnNXaGl0ZWxpc3QsXG4gICAgICB0aGlzLmhvc3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsXG4gICAgICB0aGlzLmhvb2tJbmRleCxcbiAgICAgIHRoaXMuZW52aXJvbm1lbnRJbmplY3RvcixcbiAgICAgIHRoaXMuaW5qZWN0b3JcbiAgICApLnN1YnNjcmliZSgocGFyc2VSZXN1bHQ6IFBhcnNlUmVzdWx0KSA9PiB7XG4gICAgICAvLyBob3N0RWxlbWVudCBhbmQgaG9va0luZGV4IGFyZSBhdXRvbWF0aWNhbGx5IGZpbGxlZFxuICAgICAgdGhpcy5hY3RpdmVQYXJzZXJzID0gcGFyc2VSZXN1bHQudXNlZFBhcnNlcnM7XG4gICAgICB0aGlzLmFjdGl2ZU9wdGlvbnMgPSBwYXJzZVJlc3VsdC51c2VkT3B0aW9ucztcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlO1xuXG4gICAgICAvLyBSZXR1cm4gYWxsIGxvYWRlZCBjb21wb25lbnRzXG4gICAgICBjb25zdCBsb2FkZWRDb21wb25lbnRzOiBMb2FkZWRDb21wb25lbnRbXSA9IE9iamVjdC52YWx1ZXModGhpcy5ob29rSW5kZXgpLm1hcCgoaG9vazogSG9vaykgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGhvb2tJZDogaG9vay5pZCxcbiAgICAgICAgICBob29rVmFsdWU6IGhvb2sudmFsdWUsXG4gICAgICAgICAgaG9va1BhcnNlcjogaG9vay5wYXJzZXIsXG4gICAgICAgICAgY29tcG9uZW50UmVmOiBob29rLmNvbXBvbmVudFJlZiFcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5jb21wb25lbnRzTG9hZGVkLmVtaXQobG9hZGVkQ29tcG9uZW50cyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgYmluZGluZ3MgZm9yIGFsbCBleGlzdGluZyBjb21wb25lbnRzXG4gICAqXG4gICAqIEBwYXJhbSB0cmlnZ2VyT25EeW5hbWljQ2hhbmdlcyAtIFdoZXRoZXIgdG8gdHJpZ2dlciB0aGUgT25EeW5hbWljQ2hhbmdlcyBtZXRob2Qgb2YgZHluYW1pY2FsbHkgbG9hZGVkIGNvbXBvbmVudHNcbiAgICovXG4gIHJlZnJlc2godHJpZ2dlck9uRHluYW1pY0NoYW5nZXM6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pbml0aWFsaXplZCkge1xuICAgICAgdGhpcy5jb21wb25lbnRVcGRhdGVyLnJlZnJlc2godGhpcy5ob29rSW5kZXgsIHRoaXMuY29udGV4dCwgdGhpcy5hY3RpdmVPcHRpb25zLCB0cmlnZ2VyT25EeW5hbWljQ2hhbmdlcyk7XG4gICAgfVxuICB9XG59XG4iXX0=