devextreme-vue
Version:
DevExtreme UI and Visualization Components for Vue
96 lines (94 loc) • 3.88 kB
JavaScript
/*!
* devextreme-vue
* Version: 25.2.7
* Build date: Tue May 05 2026
*
* Copyright (c) 2012 - 2026 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
*/
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.TemplatesManager = void 0;
const dom_adapter_1 = __importDefault(require("devextreme/core/dom_adapter"));
const events_1 = require("devextreme/events");
const templates_discovering_1 = require("./templates-discovering");
const constants_1 = require("./constants");
const helpers_1 = require("./helpers");
class TemplatesManager {
constructor(component) {
this._slots = {};
this._templates = {};
this._isDirty = false;
this._component = component;
this.discover();
}
discover() {
this._slots = {
...(0, templates_discovering_1.discover)(this._component),
};
if (!(0, helpers_1.allKeysAreEqual)(this._templates, this._slots)) {
this._prepareTemplates();
}
}
get templates() {
return this._templates;
}
get isDirty() {
return this._isDirty;
}
resetDirtyFlag() {
this._isDirty = false;
}
_prepareTemplates() {
this._templates = {};
for (const name of Object.keys(this._slots)) {
this._templates[name] = this.createDxTemplate(name);
}
this._isDirty = true;
}
createDxTemplate(name) {
return {
render: (data) => {
const rendered = ((onRendered, counter = 0) => () => {
if (counter === 1 && onRendered) {
onRendered();
}
counter++;
})(data.onRendered);
const scopeData = { data: data.model, index: data.index, onRendered: rendered };
const placeholder = document.createElement('div');
const container = data.container.get ? data.container.get(0) : data.container;
container.appendChild(placeholder);
const mountedTemplate = (0, templates_discovering_1.mountTemplate)(() => this._slots[name], this._component, scopeData, name, placeholder);
const element = mountedTemplate.$el;
container.removeChild(placeholder);
while (placeholder.firstChild) {
container.appendChild(placeholder.firstChild);
}
dom_adapter_1.default.setClass(element, constants_1.DX_TEMPLATE_WRAPPER_CLASS, true);
if (element.nodeType === Node.TEXT_NODE) {
const removalListener = document.createElement(container.nodeName === 'TABLE' ? 'tbody' : 'span');
removalListener.style.display = 'none';
container.insertBefore(removalListener, container.firstChild);
(0, events_1.one)(removalListener, constants_1.DX_REMOVE_EVENT, () => {
mountedTemplate.$.appContext.app.unmount.bind(mountedTemplate)();
removalListener.remove();
});
}
else {
(0, events_1.one)(element, constants_1.DX_REMOVE_EVENT, mountedTemplate.$.appContext.app.unmount.bind(mountedTemplate));
}
rendered();
return element;
},
};
}
}
exports.TemplatesManager = TemplatesManager;