@progress/kendo-angular-excel-export
Version:
Kendo UI for Angular Excel Export component
133 lines (132 loc) • 4.52 kB
JavaScript
/**-----------------------------------------------------------------------------------------
* Copyright © 2025 Progress Software Corporation. All rights reserved.
* Licensed under commercial license. See LICENSE.md in the project root for more information
*-------------------------------------------------------------------------------------------*/
const compileTemplate = (templateRef, context, updateContext) => {
let embeddedView = templateRef.createEmbeddedView(context);
const result = (data) => {
updateContext(context, data);
embeddedView.detectChanges();
return embeddedView.rootNodes.reduce((content, rootNode) => {
return content + rootNode.textContent;
}, '').trim();
};
result.destroy = () => {
embeddedView.destroy();
embeddedView = null;
};
return result;
};
const updateGroupHeaderContext = (context, data) => {
context.$implicit = context.group = data;
context.field = data.field;
context.value = data.value;
context.aggregates = data.aggregates;
};
const updateGroupFooterContext = (context, data) => {
context.group = data.group;
context.$implicit = context.aggregates = data;
};
const updateFooterContext = (context, data) => {
context.aggregates = data.aggregates;
};
/**
* @hidden
*/
export const toExporterColumns = (sourceColumns) => {
const exporterColumns = [];
let columnIndex = 0;
const addColumns = (columns, result, level) => {
columns.forEach((column) => {
if (column.level === level) {
const exporterColumn = new ExporterColumn(column, columnIndex);
result.push(exporterColumn);
if (column.children && column.children.some(c => c !== column)) {
const children = exporterColumn.columns = [];
addColumns(column.children, children, level + 1);
}
else {
columnIndex++;
}
}
});
};
addColumns(sourceColumns, exporterColumns, 0);
return exporterColumns;
};
/**
* @hidden
*/
export const destroyColumns = (columns) => {
if (columns) {
columns.forEach(column => {
column.destroy();
});
}
};
/**
* @hidden
*/
export class ExporterColumn {
title;
field;
hidden;
locked;
width;
columns;
groupHeaderTemplate;
groupHeaderColumnTemplate;
groupFooterTemplate;
footerTemplate;
headerCellOptions;
cellOptions;
groupHeaderCellOptions;
groupFooterCellOptions;
footerCellOptions;
constructor(column, columnIndex) {
this.title = column.title;
this.field = column.field;
this.hidden = column.hidden;
this.locked = column.locked;
this.width = column.width;
this.headerCellOptions = column.headerCellOptions;
this.cellOptions = column.cellOptions;
this.groupHeaderCellOptions = column.groupHeaderCellOptions;
this.groupFooterCellOptions = column.groupFooterCellOptions;
this.footerCellOptions = column.footerCellOptions;
if (column.footerTemplate) {
this.footerTemplate = compileTemplate(column.footerTemplate.templateRef, {
$implicit: column,
column: column,
columnIndex: columnIndex
}, updateFooterContext);
}
if (column.groupFooterTemplate) {
this.groupFooterTemplate = compileTemplate(column.groupFooterTemplate.templateRef, {
column: column,
field: column.field
}, updateGroupFooterContext);
}
if (column.groupHeaderTemplate) {
this.groupHeaderTemplate = compileTemplate(column.groupHeaderTemplate.templateRef, {}, updateGroupHeaderContext);
}
if (column.groupHeaderColumnTemplate) {
this.groupHeaderColumnTemplate = compileTemplate(column.groupHeaderColumnTemplate.templateRef, {}, updateGroupHeaderContext);
}
}
destroy() {
if (this.footerTemplate) {
this.footerTemplate.destroy();
}
if (this.groupFooterTemplate) {
this.groupFooterTemplate.destroy();
}
if (this.groupHeaderTemplate) {
this.groupHeaderTemplate.destroy();
}
if (this.groupHeaderColumnTemplate) {
this.groupHeaderColumnTemplate.destroy();
}
destroyColumns(this.columns);
}
}