UNPKG

devextreme-angular

Version:

Angular UI and visualization components based on DevExtreme widgets

103 lines 12 kB
/*! * devextreme-angular * Version: 24.2.6 * Build date: Mon Mar 17 2025 * * Copyright (c) 2012 - 2025 Developer Express Inc. ALL RIGHTS RESERVED * * This software may be modified and distributed under the terms * of the MIT license. See the LICENSE file in the root of the project for details. * * https://github.com/DevExpress/devextreme-angular */ /* tslint:disable:use-input-property-decorator */ import { Directive, NgModule, TemplateRef, ViewContainerRef, Input, Renderer2, NgZone, } from '@angular/core'; import { one } from 'devextreme/events'; import domAdapter from 'devextreme/core/dom_adapter'; import { DxTemplateHost } from './template-host'; import { getElement } from './utils'; import * as i0 from "@angular/core"; import * as i1 from "./template-host"; export const DX_TEMPLATE_WRAPPER_CLASS = 'dx-template-wrapper'; export class RenderData { model; index; container; } export class DxTemplateDirective { templateRef; viewContainerRef; renderer; zone; set dxTemplateOf(value) { this.name = value; } name; constructor(templateRef, viewContainerRef, templateHost, renderer, zone) { this.templateRef = templateRef; this.viewContainerRef = viewContainerRef; this.renderer = renderer; this.zone = zone; templateHost.setTemplate(this); } renderTemplate(renderData) { const childView = this.viewContainerRef.createEmbeddedView(this.templateRef, { $implicit: renderData.model, index: renderData.index, }); const container = getElement(renderData.container); if (renderData.container) { childView.rootNodes.forEach((element) => { this.renderer.appendChild(container, element); }); } return childView; } render(renderData) { let childView; if (this.zone.isStable) { childView = this.zone.run(() => this.renderTemplate(renderData)); } else { childView = this.renderTemplate(renderData); } // =========== WORKAROUND ============= // https://github.com/angular/angular/issues/12243 childView.detectChanges(); // =========== /WORKAROUND ============= childView.rootNodes.forEach((element) => { if (element.nodeType === 1) { domAdapter.setClass(element, DX_TEMPLATE_WRAPPER_CLASS, true); } one(element, 'dxremove', ({}, params) => { if (!params || !params._angularIntegration) { childView.destroy(); } }); }); return childView.rootNodes; } /** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DxTemplateDirective, deps: [{ token: i0.TemplateRef }, { token: i0.ViewContainerRef }, { token: i1.DxTemplateHost }, { token: i0.Renderer2 }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Directive }); /** @nocollapse */ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: DxTemplateDirective, selector: "[dxTemplate]", inputs: { dxTemplateOf: "dxTemplateOf" }, ngImport: i0 }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DxTemplateDirective, decorators: [{ type: Directive, args: [{ selector: '[dxTemplate]', }] }], ctorParameters: () => [{ type: i0.TemplateRef }, { type: i0.ViewContainerRef }, { type: i1.DxTemplateHost }, { type: i0.Renderer2 }, { type: i0.NgZone }], propDecorators: { dxTemplateOf: [{ type: Input }] } }); export class DxTemplateModule { /** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DxTemplateModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); /** @nocollapse */ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.3.12", ngImport: i0, type: DxTemplateModule, declarations: [DxTemplateDirective], exports: [DxTemplateDirective] }); /** @nocollapse */ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DxTemplateModule }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DxTemplateModule, decorators: [{ type: NgModule, args: [{ declarations: [DxTemplateDirective], exports: [DxTemplateDirective], }] }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9kaXN0L2NvcmUvdGVtcGxhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7O0dBV0c7QUFFSCxpREFBaUQ7QUFFakQsT0FBTyxFQUNMLFNBQVMsRUFDVCxRQUFRLEVBQ1IsV0FBVyxFQUNYLGdCQUFnQixFQUNoQixLQUFLLEVBQ0wsU0FBUyxFQUNULE1BQU0sR0FFUCxNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDeEMsT0FBTyxVQUFVLE1BQU0sNkJBQTZCLENBQUM7QUFDckQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxTQUFTLENBQUM7OztBQUVyQyxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRyxxQkFBcUIsQ0FBQztBQUUvRCxNQUFNLE9BQU8sVUFBVTtJQUNyQixLQUFLLENBQU07SUFFWCxLQUFLLENBQVM7SUFFZCxTQUFTLENBQU07Q0FDaEI7QUFLRCxNQUFNLE9BQU8sbUJBQW1CO0lBU1g7SUFDQTtJQUVBO0lBQ0E7SUFabkIsSUFDSSxZQUFZLENBQUMsS0FBSztRQUNwQixJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztJQUNwQixDQUFDO0lBRUQsSUFBSSxDQUFTO0lBRWIsWUFDbUIsV0FBNkIsRUFDN0IsZ0JBQWtDLEVBQ25ELFlBQTRCLEVBQ1gsUUFBbUIsRUFDbkIsSUFBWTtRQUpaLGdCQUFXLEdBQVgsV0FBVyxDQUFrQjtRQUM3QixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBRWxDLGFBQVEsR0FBUixRQUFRLENBQVc7UUFDbkIsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUU3QixZQUFZLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFTyxjQUFjLENBQUMsVUFBc0I7UUFDM0MsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDM0UsU0FBUyxFQUFFLFVBQVUsQ0FBQyxLQUFLO1lBQzNCLEtBQUssRUFBRSxVQUFVLENBQUMsS0FBSztTQUN4QixDQUFDLENBQUM7UUFFSCxNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ25ELElBQUksVUFBVSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3pCLFNBQVMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7Z0JBQ3RDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNoRCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsTUFBTSxDQUFDLFVBQXNCO1FBQzNCLElBQUksU0FBUyxDQUFDO1FBQ2QsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3ZCLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFDbkUsQ0FBQzthQUFNLENBQUM7WUFDTixTQUFTLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM5QyxDQUFDO1FBQ0QsdUNBQXVDO1FBQ3ZDLGtEQUFrRDtRQUNsRCxTQUFTLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDMUIsd0NBQXdDO1FBRXhDLFNBQVMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDdEMsSUFBSSxPQUFPLENBQUMsUUFBUSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUMzQixVQUFVLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNoRSxDQUFDO1lBRUQsR0FBRyxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUU7Z0JBQ3RDLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztvQkFDM0MsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUN0QixDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sU0FBUyxDQUFDLFNBQVMsQ0FBQztJQUM3QixDQUFDOzJIQTNEVSxtQkFBbUI7K0dBQW5CLG1CQUFtQjs7NEZBQW5CLG1CQUFtQjtrQkFIL0IsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsY0FBYztpQkFDekI7eUxBR0ssWUFBWTtzQkFEZixLQUFLOztBQWlFUixNQUFNLE9BQU8sZ0JBQWdCOzJIQUFoQixnQkFBZ0I7NEhBQWhCLGdCQUFnQixpQkFsRWhCLG1CQUFtQixhQUFuQixtQkFBbUI7NEhBa0VuQixnQkFBZ0I7OzRGQUFoQixnQkFBZ0I7a0JBSjVCLFFBQVE7bUJBQUM7b0JBQ1IsWUFBWSxFQUFFLENBQUMsbUJBQW1CLENBQUM7b0JBQ25DLE9BQU8sRUFBRSxDQUFDLG1CQUFtQixDQUFDO2lCQUMvQiIsInNvdXJjZXNDb250ZW50IjpbIi8qIVxuICogZGV2ZXh0cmVtZS1hbmd1bGFyXG4gKiBWZXJzaW9uOiAyNC4yLjZcbiAqIEJ1aWxkIGRhdGU6IE1vbiBNYXIgMTcgMjAyNVxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxMiAtIDIwMjUgRGV2ZWxvcGVyIEV4cHJlc3MgSW5jLiBBTEwgUklHSFRTIFJFU0VSVkVEXG4gKlxuICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgbW9kaWZpZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtc1xuICogb2YgdGhlIE1JVCBsaWNlbnNlLiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgcHJvamVjdCBmb3IgZGV0YWlscy5cbiAqXG4gKiBodHRwczovL2dpdGh1Yi5jb20vRGV2RXhwcmVzcy9kZXZleHRyZW1lLWFuZ3VsYXJcbiAqL1xuXG4vKiB0c2xpbnQ6ZGlzYWJsZTp1c2UtaW5wdXQtcHJvcGVydHktZGVjb3JhdG9yICovXHJcblxyXG5pbXBvcnQge1xyXG4gIERpcmVjdGl2ZSxcclxuICBOZ01vZHVsZSxcclxuICBUZW1wbGF0ZVJlZixcclxuICBWaWV3Q29udGFpbmVyUmVmLFxyXG4gIElucHV0LFxyXG4gIFJlbmRlcmVyMixcclxuICBOZ1pvbmUsXHJcbiAgRW1iZWRkZWRWaWV3UmVmLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuaW1wb3J0IHsgb25lIH0gZnJvbSAnZGV2ZXh0cmVtZS9ldmVudHMnO1xyXG5pbXBvcnQgZG9tQWRhcHRlciBmcm9tICdkZXZleHRyZW1lL2NvcmUvZG9tX2FkYXB0ZXInO1xyXG5pbXBvcnQgeyBEeFRlbXBsYXRlSG9zdCB9IGZyb20gJy4vdGVtcGxhdGUtaG9zdCc7XHJcbmltcG9ydCB7IGdldEVsZW1lbnQgfSBmcm9tICcuL3V0aWxzJztcclxuXHJcbmV4cG9ydCBjb25zdCBEWF9URU1QTEFURV9XUkFQUEVSX0NMQVNTID0gJ2R4LXRlbXBsYXRlLXdyYXBwZXInO1xyXG5cclxuZXhwb3J0IGNsYXNzIFJlbmRlckRhdGEge1xyXG4gIG1vZGVsOiBhbnk7XHJcblxyXG4gIGluZGV4OiBudW1iZXI7XHJcblxyXG4gIGNvbnRhaW5lcjogYW55O1xyXG59XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ1tkeFRlbXBsYXRlXScsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEeFRlbXBsYXRlRGlyZWN0aXZlIHtcclxuICBASW5wdXQoKVxyXG4gIHNldCBkeFRlbXBsYXRlT2YodmFsdWUpIHtcclxuICAgIHRoaXMubmFtZSA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgbmFtZTogc3RyaW5nO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgdGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPGFueT4sXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXHJcbiAgICB0ZW1wbGF0ZUhvc3Q6IER4VGVtcGxhdGVIb3N0LFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSByZW5kZXJlcjogUmVuZGVyZXIyLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSB6b25lOiBOZ1pvbmUsXHJcbiAgKSB7XHJcbiAgICB0ZW1wbGF0ZUhvc3Quc2V0VGVtcGxhdGUodGhpcyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlclRlbXBsYXRlKHJlbmRlckRhdGE6IFJlbmRlckRhdGEpOiBFbWJlZGRlZFZpZXdSZWY8YW55PiB7XHJcbiAgICBjb25zdCBjaGlsZFZpZXcgPSB0aGlzLnZpZXdDb250YWluZXJSZWYuY3JlYXRlRW1iZWRkZWRWaWV3KHRoaXMudGVtcGxhdGVSZWYsIHtcclxuICAgICAgJGltcGxpY2l0OiByZW5kZXJEYXRhLm1vZGVsLFxyXG4gICAgICBpbmRleDogcmVuZGVyRGF0YS5pbmRleCxcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IGNvbnRhaW5lciA9IGdldEVsZW1lbnQocmVuZGVyRGF0YS5jb250YWluZXIpO1xyXG4gICAgaWYgKHJlbmRlckRhdGEuY29udGFpbmVyKSB7XHJcbiAgICAgIGNoaWxkVmlldy5yb290Tm9kZXMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQoY29udGFpbmVyLCBlbGVtZW50KTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGNoaWxkVmlldztcclxuICB9XHJcblxyXG4gIHJlbmRlcihyZW5kZXJEYXRhOiBSZW5kZXJEYXRhKSB7XHJcbiAgICBsZXQgY2hpbGRWaWV3O1xyXG4gICAgaWYgKHRoaXMuem9uZS5pc1N0YWJsZSkge1xyXG4gICAgICBjaGlsZFZpZXcgPSB0aGlzLnpvbmUucnVuKCgpID0+IHRoaXMucmVuZGVyVGVtcGxhdGUocmVuZGVyRGF0YSkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY2hpbGRWaWV3ID0gdGhpcy5yZW5kZXJUZW1wbGF0ZShyZW5kZXJEYXRhKTtcclxuICAgIH1cclxuICAgIC8vID09PT09PT09PT09IFdPUktBUk9VTkQgPT09PT09PT09PT09PVxyXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMTIyNDNcclxuICAgIGNoaWxkVmlldy5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAvLyA9PT09PT09PT09PSAvV09SS0FST1VORCA9PT09PT09PT09PT09XHJcblxyXG4gICAgY2hpbGRWaWV3LnJvb3ROb2Rlcy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XHJcbiAgICAgIGlmIChlbGVtZW50Lm5vZGVUeXBlID09PSAxKSB7XHJcbiAgICAgICAgZG9tQWRhcHRlci5zZXRDbGFzcyhlbGVtZW50LCBEWF9URU1QTEFURV9XUkFQUEVSX0NMQVNTLCB0cnVlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgb25lKGVsZW1lbnQsICdkeHJlbW92ZScsICh7fSwgcGFyYW1zKSA9PiB7XHJcbiAgICAgICAgaWYgKCFwYXJhbXMgfHwgIXBhcmFtcy5fYW5ndWxhckludGVncmF0aW9uKSB7XHJcbiAgICAgICAgICBjaGlsZFZpZXcuZGVzdHJveSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gY2hpbGRWaWV3LnJvb3ROb2RlcztcclxuICB9XHJcbn1cclxuXHJcbkBOZ01vZHVsZSh7XHJcbiAgZGVjbGFyYXRpb25zOiBbRHhUZW1wbGF0ZURpcmVjdGl2ZV0sXHJcbiAgZXhwb3J0czogW0R4VGVtcGxhdGVEaXJlY3RpdmVdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgRHhUZW1wbGF0ZU1vZHVsZSB7IH1cclxuIl19