UNPKG

@ngneat/overview

Version:

The Template for Success in Template Management

77 lines 11.1 kB
import { Directive, TemplateRef, ViewContainerRef, inject, input, } from '@angular/core'; import { isComponent, isString } from '../views/types'; import { ViewService } from '../views/view'; import { DynamicViewComponent } from './dynamic-view.component'; import * as i0 from "@angular/core"; export class DynamicViewDirective { constructor() { this.view = input(undefined, { alias: 'dynamicView' }); this.injector = input(undefined, { alias: 'dynamicViewInjector' }); this.context = input(undefined, { alias: 'dynamicViewContext' }); this.inputs = input(undefined, { alias: 'dynamicViewInputs' }); this.defaultTpl = inject(TemplateRef); this.vcr = inject(ViewContainerRef); this.viewService = inject(ViewService); } ngOnInit() { this.resolveContentType(); } ngOnChanges(changes) { const viewChanged = changes.view && !changes.view.isFirstChange(); const contextChanged = changes.context && !changes.context.isFirstChange(); const inputsChanged = changes.inputs && !changes.inputs.isFirstChange(); if (viewChanged) { this.resolveContentType(); } else if (contextChanged) { this.viewRef.updateContext(this.context()); } else if (isComponent(this.view()) && inputsChanged) { this.viewRef.setInputs(this.inputs() || {}); } } resolveContentType() { this.viewRef?.destroy(); const view = this.view(); const injector = this.injector(); const context = this.context(); if (isString(view)) { const viewRef = (this.viewRef = this.viewService.createComponent(DynamicViewComponent, { vcr: this.vcr, injector, })); viewRef.setInput('content', view).detectChanges(); } else if (isComponent(view)) { this.viewRef = this.viewService.createComponent(view, { vcr: this.vcr, injector: injector ?? this.vcr.injector, context, }); const inputs = this.inputs(); if (inputs) { this.viewRef.setInputs(inputs); } } else { this.viewRef = this.viewService.createView(view || this.defaultTpl, { vcr: this.vcr, injector: injector ?? this.vcr.injector, context, }); } } ngOnDestroy() { this.viewRef?.destroy(); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: DynamicViewDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.0.4", type: DynamicViewDirective, isStandalone: true, selector: "[dynamicView]", inputs: { view: { classPropertyName: "view", publicName: "dynamicView", isSignal: true, isRequired: false, transformFunction: null }, injector: { classPropertyName: "injector", publicName: "dynamicViewInjector", isSignal: true, isRequired: false, transformFunction: null }, context: { classPropertyName: "context", publicName: "dynamicViewContext", isSignal: true, isRequired: false, transformFunction: null }, inputs: { classPropertyName: "inputs", publicName: "dynamicViewInputs", isSignal: true, isRequired: false, transformFunction: null } }, usesOnChanges: true, ngImport: i0 }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: DynamicViewDirective, decorators: [{ type: Directive, args: [{ selector: '[dynamicView]', standalone: true, }] }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy12aWV3LmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nbmVhdC9vdmVydmlldy9zcmMvbGliL2R5bmFtaWMtdmlldy9keW5hbWljLXZpZXcuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBTVQsV0FBVyxFQUNYLGdCQUFnQixFQUNoQixNQUFNLEVBQ04sS0FBSyxHQUNOLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBVyxXQUFXLEVBQUUsUUFBUSxFQUFXLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUU1QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7QUFNaEUsTUFBTSxPQUFPLG9CQUFvQjtJQUpqQztRQUtXLFNBQUksR0FBRyxLQUFLLENBQVUsU0FBUyxFQUFFLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxDQUFDLENBQUM7UUFDM0QsYUFBUSxHQUFHLEtBQUssQ0FBVyxTQUFTLEVBQUUsRUFBRSxLQUFLLEVBQUUscUJBQXFCLEVBQUUsQ0FBQyxDQUFDO1FBQ3hFLFlBQU8sR0FBRyxLQUFLLENBQU0sU0FBUyxFQUFFLEVBQUUsS0FBSyxFQUFFLG9CQUFvQixFQUFFLENBQUMsQ0FBQztRQUNqRSxXQUFNLEdBQUcsS0FBSyxDQUFtQixTQUFTLEVBQUUsRUFBRSxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDO1FBRzdFLGVBQVUsR0FBcUIsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ25ELFFBQUcsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUMvQixnQkFBVyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztLQXlEM0M7SUF2REMsUUFBUTtRQUNOLElBQUksQ0FBQyxrQkFBa0Is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RSxlQUFlO29CQUN6QixVQUFVLEVBQUUsSUFBSTtpQkFDakIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBEaXJlY3RpdmUsXG4gIEluamVjdG9yLFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NvbnRhaW5lclJlZixcbiAgaW5qZWN0LFxuICBpbnB1dCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250ZW50LCBpc0NvbXBvbmVudCwgaXNTdHJpbmcsIFZpZXdSZWYgfSBmcm9tICcuLi92aWV3cy90eXBlcyc7XG5pbXBvcnQgeyBWaWV3U2VydmljZSB9IGZyb20gJy4uL3ZpZXdzL3ZpZXcnO1xuaW1wb3J0IHsgQ29tcFJlZiB9IGZyb20gJy4uL3ZpZXdzL2NvbXAtcmVmJztcbmltcG9ydCB7IER5bmFtaWNWaWV3Q29tcG9uZW50IH0gZnJvbSAnLi9keW5hbWljLXZpZXcuY29tcG9uZW50JztcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2R5bmFtaWNWaWV3XScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG59KVxuZXhwb3J0IGNsYXNzIER5bmFtaWNWaWV3RGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG4gIHJlYWRvbmx5IHZpZXcgPSBpbnB1dDxDb250ZW50Pih1bmRlZmluZWQsIHsgYWxpYXM6ICdkeW5hbWljVmlldycgfSk7XG4gIHJlYWRvbmx5IGluamVjdG9yID0gaW5wdXQ8SW5qZWN0b3I+KHVuZGVmaW5lZCwgeyBhbGlhczogJ2R5bmFtaWNWaWV3SW5qZWN0b3InIH0pO1xuICByZWFkb25seSBjb250ZXh0ID0gaW5wdXQ8YW55Pih1bmRlZmluZWQsIHsgYWxpYXM6ICdkeW5hbWljVmlld0NvbnRleHQnIH0pO1xuICByZWFkb25seSBpbnB1dHMgPSBpbnB1dDxSZWNvcmQ8YW55LCBhbnk+Pih1bmRlZmluZWQsIHsgYWxpYXM6ICdkeW5hbWljVmlld0lucHV0cycgfSk7XG5cbiAgcHJpdmF0ZSB2aWV3UmVmOiBWaWV3UmVmO1xuICBwcml2YXRlIGRlZmF1bHRUcGw6IFRlbXBsYXRlUmVmPGFueT4gPSBpbmplY3QoVGVtcGxhdGVSZWYpO1xuICBwcml2YXRlIHZjciA9IGluamVjdChWaWV3Q29udGFpbmVyUmVmKTtcbiAgcHJpdmF0ZSB2aWV3U2VydmljZSA9IGluamVjdChWaWV3U2VydmljZSk7XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5yZXNvbHZlQ29udGVudFR5cGUoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBjb25zdCB2aWV3Q2hhbmdlZCA9IGNoYW5nZXMudmlldyAmJiAhY2hhbmdlcy52aWV3LmlzRmlyc3RDaGFuZ2UoKTtcbiAgICBjb25zdCBjb250ZXh0Q2hhbmdlZCA9IGNoYW5nZXMuY29udGV4dCAmJiAhY2hhbmdlcy5jb250ZXh0LmlzRmlyc3RDaGFuZ2UoKTtcbiAgICBjb25zdCBpbnB1dHNDaGFuZ2VkID0gY2hhbmdlcy5pbnB1dHMgJiYgIWNoYW5nZXMuaW5wdXRzLmlzRmlyc3RDaGFuZ2UoKTtcblxuICAgIGlmICh2aWV3Q2hhbmdlZCkge1xuICAgICAgdGhpcy5yZXNvbHZlQ29udGVudFR5cGUoKTtcbiAgICB9IGVsc2UgaWYgKGNvbnRleHRDaGFuZ2VkKSB7XG4gICAgICB0aGlzLnZpZXdSZWYudXBkYXRlQ29udGV4dCh0aGlzLmNvbnRleHQoKSk7XG4gICAgfSBlbHNlIGlmIChpc0NvbXBvbmVudCh0aGlzLnZpZXcoKSkgJiYgaW5wdXRzQ2hhbmdlZCkge1xuICAgICAgKHRoaXMudmlld1JlZiBhcyBDb21wUmVmPGFueT4pLnNldElucHV0cyh0aGlzLmlucHV0cygpIHx8IHt9KTtcbiAgICB9XG4gIH1cblxuICByZXNvbHZlQ29udGVudFR5cGUoKSB7XG4gICAgdGhpcy52aWV3UmVmPy5kZXN0cm95KCk7XG5cbiAgICBjb25zdCB2aWV3ID0gdGhpcy52aWV3KCk7XG4gICAgY29uc3QgaW5qZWN0b3IgPSB0aGlzLmluamVjdG9yKCk7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMuY29udGV4dCgpO1xuXG4gICAgaWYgKGlzU3RyaW5nKHZpZXcpKSB7XG4gICAgICBjb25zdCB2aWV3UmVmID0gKHRoaXMudmlld1JlZiA9IHRoaXMudmlld1NlcnZpY2UuY3JlYXRlQ29tcG9uZW50KER5bmFtaWNWaWV3Q29tcG9uZW50LCB7XG4gICAgICAgIHZjcjogdGhpcy52Y3IsXG4gICAgICAgIGluamVjdG9yLFxuICAgICAgfSkpO1xuXG4gICAgICB2aWV3UmVmLnNldElucHV0KCdjb250ZW50JywgdmlldykuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH0gZWxzZSBpZiAoaXNDb21wb25lbnQodmlldykpIHtcbiAgICAgIHRoaXMudmlld1JlZiA9IHRoaXMudmlld1NlcnZpY2UuY3JlYXRlQ29tcG9uZW50KHZpZXcsIHtcbiAgICAgICAgdmNyOiB0aGlzLnZjcixcbiAgICAgICAgaW5qZWN0b3I6IGluamVjdG9yID8/IHRoaXMudmNyLmluamVjdG9yLFxuICAgICAgICBjb250ZXh0LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGlucHV0cyA9IHRoaXMuaW5wdXRzKCk7XG4gICAgICBpZiAoaW5wdXRzKSB7XG4gICAgICAgICh0aGlzLnZpZXdSZWYgYXMgQ29tcFJlZjxhbnk+KS5zZXRJbnB1dHMoaW5wdXRzKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52aWV3UmVmID0gdGhpcy52aWV3U2VydmljZS5jcmVhdGVWaWV3KHZpZXcgfHwgdGhpcy5kZWZhdWx0VHBsLCB7XG4gICAgICAgIHZjcjogdGhpcy52Y3IsXG4gICAgICAgIGluamVjdG9yOiBpbmplY3RvciA/PyB0aGlzLnZjci5pbmplY3RvcixcbiAgICAgICAgY29udGV4dCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMudmlld1JlZj8uZGVzdHJveSgpO1xuICB9XG59XG4iXX0=