@progress/kendo-angular-grid
Version:
Kendo UI Grid for Angular - high performance data grid with paging, filtering, virtualization, CRUD, and more.
99 lines (98 loc) • 4.5 kB
JavaScript
/**-----------------------------------------------------------------------------------------
* Copyright © 2025 Progress Software Corporation. All rights reserved.
* Licensed under commercial license. See LICENSE.md in the project root for more information
*-------------------------------------------------------------------------------------------*/
import { QueryList, EventEmitter } from '@angular/core';
import { isColumnGroupComponent } from './column-group.component';
import { columnsToRender, someLeafColumn } from './column-common';
const reset = (...lists) => {
let diff = false;
for (let idx = 0; idx < lists.length; idx++) {
const [list, columns] = lists[idx];
diff = diff || list.length !== columns.length;
list.reset(columns);
}
return diff;
};
/**
* @hidden
*/
export class ColumnsContainer {
columns;
allColumns = new QueryList();
leafColumns = new QueryList();
lockedColumns = new QueryList();
nonLockedColumns = new QueryList();
lockedLeafColumns = new QueryList();
nonLockedLeafColumns = new QueryList();
totalLevels = 0;
changes = new EventEmitter();
leafColumnsToRender = [];
lockedColumnsToRender = [];
nonLockedColumnsToRender = [];
hasGroupHeaderColumn = false;
hasGroupFooter = false;
hasFooter = false;
unlockedWidth = 0;
constructor(columns) {
this.columns = columns;
}
refresh() {
const currentLevels = this.totalLevels;
const leafColumns = new Array();
const lockedLeafColumns = new Array();
const nonLockedLeafColumns = new Array();
const lockedColumns = new Array();
const nonLockedColumns = new Array();
const allColumns = new Array();
const leafColumnsToRender = new Array();
const lockedColumnsToRender = new Array();
const nonLockedColumnsToRender = new Array();
let hasGroupHeaderColumn = false;
let hasGroupFooter = false;
let hasFooter = false;
let unlockedWidth = 0;
let leafIndex = 0;
this.totalLevels = 0;
this.columns().forEach(column => {
const containerLeafColumns = column.isLocked === true ? lockedLeafColumns : nonLockedLeafColumns;
const containerColumns = column.isLocked === true ? lockedColumns : nonLockedColumns;
const toRenderContainer = column.isLocked === true ? lockedColumnsToRender : nonLockedColumnsToRender;
if (!isColumnGroupComponent(column)) {
containerLeafColumns.push(column);
leafColumns.push(column);
leafColumnsToRender.push(...columnsToRender([column]));
toRenderContainer.push(...columnsToRender([column]));
hasGroupHeaderColumn = hasGroupHeaderColumn || someLeafColumn(leaf => Boolean(leaf.groupHeaderColumnTemplateRef), column);
hasGroupFooter = hasGroupFooter || someLeafColumn(leaf => Boolean(leaf.groupFooterTemplateRef), column);
hasFooter = hasFooter || someLeafColumn(leaf => Boolean(leaf.footerTemplateRef), column);
if (!column.isLocked) {
unlockedWidth += column.width || 0;
}
if (column.isSpanColumn) {
column.childColumns.forEach(c => {
c.leafIndex = leafIndex++;
});
}
else {
column.leafIndex = leafIndex++;
}
}
containerColumns.push(column);
allColumns.push(column);
this.totalLevels = column.level > this.totalLevels ? column.level : this.totalLevels;
});
this.hasGroupHeaderColumn = hasGroupHeaderColumn;
this.hasGroupFooter = hasGroupFooter;
this.hasFooter = hasFooter;
this.leafColumnsToRender = leafColumnsToRender;
this.lockedColumnsToRender = lockedColumnsToRender;
this.nonLockedColumnsToRender = nonLockedColumnsToRender;
this.unlockedWidth = unlockedWidth;
const changes = reset([this.leafColumns, leafColumns], [this.lockedLeafColumns, lockedLeafColumns], [this.nonLockedLeafColumns, nonLockedLeafColumns], [this.lockedColumns, lockedColumns], [this.allColumns, allColumns], [this.nonLockedColumns, nonLockedColumns]) || currentLevels !== this.totalLevels;
if (changes) {
this.changes.emit();
}
return changes;
}
}