devextreme-angular
Version:
Angular UI and visualization components based on DevExtreme widgets
104 lines • 12 kB
JavaScript
/*!
* 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=