UNPKG

devextreme-angular

Version:

Angular UI and visualization components based on DevExtreme widgets

104 lines 12 kB
/*! * devextreme-angular * Version: 25.1.4 * Build date: Tue Aug 05 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?._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, isStandalone: true, 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]', standalone: true, }] }], 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, imports: [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: [{ imports: [DxTemplateDirective], exports: [DxTemplateDirective], }] }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9kaXN0L2NvcmUvdGVtcGxhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7O0dBV0c7QUFFSCxpREFBaUQ7QUFFakQsT0FBTyxFQUNMLFNBQVMsRUFDVCxRQUFRLEVBQ1IsV0FBVyxFQUNYLGdCQUFnQixFQUNoQixLQUFLLEVBQ0wsU0FBUyxFQUNULE1BQU0sR0FFUCxNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDeEMsT0FBTyxVQUFVLE1BQU0sNkJBQTZCLENBQUM7QUFDckQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxTQUFTLENBQUM7OztBQUVyQyxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRyxxQkFBcUIsQ0FBQztBQUUvRCxNQUFNLE9BQU8sVUFBVTtJQUNyQixLQUFLLENBQU07SUFFWCxLQUFLLENBQVM7SUFFZCxTQUFTLENBQU07Q0FDaEI7QUFNRCxNQUFNLE9BQU8sbUJBQW1CO0lBU1g7SUFDQTtJQUVBO0lBQ0E7SUFabkIsSUFDSSxZQUFZLENBQUMsS0FBSztRQUNwQixJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztJQUNwQixDQUFDO0lBRUQsSUFBSSxDQUFTO0lBRWIsWUFDbUIsV0FBNkIsRUFDN0IsZ0JBQWtDLEVBQ25ELFlBQTRCLEVBQ1gsUUFBbUIsRUFDbkIsSUFBWTtRQUpaLGdCQUFXLEdBQVgsV0FBVyxDQUFrQjtRQUM3QixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBRWxDLGFBQVEsR0FBUixRQUFRLENBQVc7UUFDbkIsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUU3QixZQUFZLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFTyxjQUFjLENBQUMsVUFBc0I7UUFDM0MsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDM0UsU0FBUyxFQUFFLFVBQVUsQ0FBQyxLQUFLO1lBQzNCLEtBQUssRUFBRSxVQUFVLENBQUMsS0FBSztTQUN4QixDQUFDLENBQUM7UUFFSCxNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ25ELElBQUksVUFBVSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3pCLFNBQVMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7Z0JBQ3RDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNoRCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsTUFBTSxDQUFDLFVBQXNCO1FBQzNCLElBQUksU0FBUyxDQUFDO1FBQ2QsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3ZCLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFDbkUsQ0FBQzthQUFNLENBQUM7WUFDTixTQUFTLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM5QyxDQUFDO1FBQ0QsdUNBQXVDO1FBQ3ZDLGtEQUFrRDtRQUNsRCxTQUFTLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDMUIsd0NBQXdDO1FBRXhDLFNBQVMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDdEMsSUFBSSxPQUFPLENBQUMsUUFBUSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUMzQixVQUFVLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNoRSxDQUFDO1lBRUQsR0FBRyxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUU7Z0JBQ3RDLElBQUksQ0FBQyxNQUFNLEVBQUUsbUJBQW1CLEVBQUUsQ0FBQztvQkFDakMsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUN0QixDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sU0FBUyxDQUFDLFNBQVMsQ0FBQztJQUM3QixDQUFDOzJIQTNEVSxtQkFBbUI7K0dBQW5CLG1CQUFtQjs7NEZBQW5CLG1CQUFtQjtrQkFKL0IsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsY0FBYztvQkFDeEIsVUFBVSxFQUFFLElBQUk7aUJBQ2pCO3lMQUdLLFlBQVk7c0JBRGYsS0FBSzs7QUFpRVIsTUFBTSxPQUFPLGdCQUFnQjsySEFBaEIsZ0JBQWdCOzRIQUFoQixnQkFBZ0IsWUFsRWhCLG1CQUFtQixhQUFuQixtQkFBbUI7NEhBa0VuQixnQkFBZ0I7OzRGQUFoQixnQkFBZ0I7a0JBSjVCLFFBQVE7bUJBQUM7b0JBQ1IsT0FBTyxFQUFFLENBQUMsbUJBQW1CLENBQUM7b0JBQzlCLE9BQU8sRUFBRSxDQUFDLG1CQUFtQixDQUFDO2lCQUMvQiIsInNvdXJjZXNDb250ZW50IjpbIi8qIVxuICogZGV2ZXh0cmVtZS1hbmd1bGFyXG4gKiBWZXJzaW9uOiAyNS4xLjRcbiAqIEJ1aWxkIGRhdGU6IFR1ZSBBdWcgMDUgMjAyNVxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxMiAtIDIwMjUgRGV2ZWxvcGVyIEV4cHJlc3MgSW5jLiBBTEwgUklHSFRTIFJFU0VSVkVEXG4gKlxuICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgbW9kaWZpZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtc1xuICogb2YgdGhlIE1JVCBsaWNlbnNlLiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgcHJvamVjdCBmb3IgZGV0YWlscy5cbiAqXG4gKiBodHRwczovL2dpdGh1Yi5jb20vRGV2RXhwcmVzcy9kZXZleHRyZW1lLWFuZ3VsYXJcbiAqL1xuXG4vKiB0c2xpbnQ6ZGlzYWJsZTp1c2UtaW5wdXQtcHJvcGVydHktZGVjb3JhdG9yICovXHJcblxyXG5pbXBvcnQge1xyXG4gIERpcmVjdGl2ZSxcclxuICBOZ01vZHVsZSxcclxuICBUZW1wbGF0ZVJlZixcclxuICBWaWV3Q29udGFpbmVyUmVmLFxyXG4gIElucHV0LFxyXG4gIFJlbmRlcmVyMixcclxuICBOZ1pvbmUsXHJcbiAgRW1iZWRkZWRWaWV3UmVmLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuaW1wb3J0IHsgb25lIH0gZnJvbSAnZGV2ZXh0cmVtZS9ldmVudHMnO1xyXG5pbXBvcnQgZG9tQWRhcHRlciBmcm9tICdkZXZleHRyZW1lL2NvcmUvZG9tX2FkYXB0ZXInO1xyXG5pbXBvcnQgeyBEeFRlbXBsYXRlSG9zdCB9IGZyb20gJy4vdGVtcGxhdGUtaG9zdCc7XHJcbmltcG9ydCB7IGdldEVsZW1lbnQgfSBmcm9tICcuL3V0aWxzJztcclxuXHJcbmV4cG9ydCBjb25zdCBEWF9URU1QTEFURV9XUkFQUEVSX0NMQVNTID0gJ2R4LXRlbXBsYXRlLXdyYXBwZXInO1xyXG5cclxuZXhwb3J0IGNsYXNzIFJlbmRlckRhdGEge1xyXG4gIG1vZGVsOiBhbnk7XHJcblxyXG4gIGluZGV4OiBudW1iZXI7XHJcblxyXG4gIGNvbnRhaW5lcjogYW55O1xyXG59XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ1tkeFRlbXBsYXRlXScsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxufSlcclxuZXhwb3J0IGNsYXNzIER4VGVtcGxhdGVEaXJlY3RpdmUge1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IGR4VGVtcGxhdGVPZih2YWx1ZSkge1xyXG4gICAgdGhpcy5uYW1lID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBuYW1lOiBzdHJpbmc7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSB0ZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8YW55PixcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZixcclxuICAgIHRlbXBsYXRlSG9zdDogRHhUZW1wbGF0ZUhvc3QsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlbmRlcmVyOiBSZW5kZXJlcjIsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IHpvbmU6IE5nWm9uZSxcclxuICApIHtcclxuICAgIHRlbXBsYXRlSG9zdC5zZXRUZW1wbGF0ZSh0aGlzKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyVGVtcGxhdGUocmVuZGVyRGF0YTogUmVuZGVyRGF0YSk6IEVtYmVkZGVkVmlld1JlZjxhbnk+IHtcclxuICAgIGNvbnN0IGNoaWxkVmlldyA9IHRoaXMudmlld0NvbnRhaW5lclJlZi5jcmVhdGVFbWJlZGRlZFZpZXcodGhpcy50ZW1wbGF0ZVJlZiwge1xyXG4gICAgICAkaW1wbGljaXQ6IHJlbmRlckRhdGEubW9kZWwsXHJcbiAgICAgIGluZGV4OiByZW5kZXJEYXRhLmluZGV4LFxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgY29udGFpbmVyID0gZ2V0RWxlbWVudChyZW5kZXJEYXRhLmNvbnRhaW5lcik7XHJcbiAgICBpZiAocmVuZGVyRGF0YS5jb250YWluZXIpIHtcclxuICAgICAgY2hpbGRWaWV3LnJvb3ROb2Rlcy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChjb250YWluZXIsIGVsZW1lbnQpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY2hpbGRWaWV3O1xyXG4gIH1cclxuXHJcbiAgcmVuZGVyKHJlbmRlckRhdGE6IFJlbmRlckRhdGEpIHtcclxuICAgIGxldCBjaGlsZFZpZXc7XHJcbiAgICBpZiAodGhpcy56b25lLmlzU3RhYmxlKSB7XHJcbiAgICAgIGNoaWxkVmlldyA9IHRoaXMuem9uZS5ydW4oKCkgPT4gdGhpcy5yZW5kZXJUZW1wbGF0ZShyZW5kZXJEYXRhKSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjaGlsZFZpZXcgPSB0aGlzLnJlbmRlclRlbXBsYXRlKHJlbmRlckRhdGEpO1xyXG4gICAgfVxyXG4gICAgLy8gPT09PT09PT09PT0gV09SS0FST1VORCA9PT09PT09PT09PT09XHJcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy8xMjI0M1xyXG4gICAgY2hpbGRWaWV3LmRldGVjdENoYW5nZXMoKTtcclxuICAgIC8vID09PT09PT09PT09IC9XT1JLQVJPVU5EID09PT09PT09PT09PT1cclxuXHJcbiAgICBjaGlsZFZpZXcucm9vdE5vZGVzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcclxuICAgICAgaWYgKGVsZW1lbnQubm9kZVR5cGUgPT09IDEpIHtcclxuICAgICAgICBkb21BZGFwdGVyLnNldENsYXNzKGVsZW1lbnQsIERYX1RFTVBMQVRFX1dSQVBQRVJfQ0xBU1MsIHRydWUpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBvbmUoZWxlbWVudCwgJ2R4cmVtb3ZlJywgKHt9LCBwYXJhbXMpID0+IHtcclxuICAgICAgICBpZiAoIXBhcmFtcz8uX2FuZ3VsYXJJbnRlZ3JhdGlvbikge1xyXG4gICAgICAgICAgY2hpbGRWaWV3LmRlc3Ryb3koKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIGNoaWxkVmlldy5yb290Tm9kZXM7XHJcbiAgfVxyXG59XHJcblxyXG5ATmdNb2R1bGUoe1xyXG4gIGltcG9ydHM6IFtEeFRlbXBsYXRlRGlyZWN0aXZlXSxcclxuICBleHBvcnRzOiBbRHhUZW1wbGF0ZURpcmVjdGl2ZV0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEeFRlbXBsYXRlTW9kdWxlIHsgfVxyXG4iXX0=