ag-grid
Version:
Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components
86 lines (68 loc) • 3.19 kB
text/typescript
import {GridPanel} from "../gridPanel/gridPanel";
import {Autowired, Bean} from "../context/context";
import {Beans} from "./beans";
import {RowNode} from "../entities/rowNode";
import {CellComp} from "./cellComp";
import {ColumnController} from "../columnController/columnController";
import {_} from "../utils";
export class AutoHeightCalculator {
private beans: Beans;
private $scope: any;
private columnController: ColumnController;
private gridPanel: GridPanel;
private eDummyContainer: HTMLElement;
public registerGridComp(gridPanel: GridPanel): void {
this.gridPanel = gridPanel;
}
public getPreferredHeightForRow(rowNode: RowNode): number {
if (!this.eDummyContainer) {
this.eDummyContainer = document.createElement('div');
// so any styles on row also get applied in dummy, otherwise
// the content in dummy may differ to the real
_.addCssClass(this.eDummyContainer, 'ag-row ag-row-no-focus');
}
// we put the dummy into the body container, so it will inherit all the
// css styles that the real cells are inheriting
let eBodyContainer = this.gridPanel.getBodyContainer();
eBodyContainer.appendChild(this.eDummyContainer);
let cellComps: CellComp[] = [];
let cols = this.columnController.getAllAutoRowHeightCols();
console.log();
cols.forEach( col => {
let cellComp = new CellComp(
this.$scope,
this.beans,
col,
rowNode,
null,
true);
cellComp.setParentRow(this.eDummyContainer);
cellComps.push(cellComp);
});
let template = cellComps.map( cellComp => cellComp.getCreateTemplate() ).join(' ');
this.eDummyContainer.innerHTML = template;
// this gets any cellComps that are using components to put the components in
cellComps.forEach( cellComp => cellComp.afterAttached() );
// we should be able to just take the height of the row at this point, however
// the row isn't expanding to cover the cell heights, i don't know why, i couldn't
// figure it out so instead looking at the individual cells instead
let maxCellHeight = 0;
for (let i = 0; i < this.eDummyContainer.children.length; i++) {
let child = <HTMLElement> this.eDummyContainer.children[i];
if (child.offsetHeight > maxCellHeight) {
maxCellHeight = child.offsetHeight;
}
}
// we are finished with the dummy container, so get rid of it
eBodyContainer.removeChild(this.eDummyContainer);
cellComps.forEach( cellComp => {
// dunno why we need to detach first, doing it here to be consistent with code in RowComp
cellComp.detach();
cellComp.destroy();
} );
// in case anything left over from last time
_.removeAllChildren(this.eDummyContainer);
return maxCellHeight;
}
}