@emsipl/react-data-grid-addons
Version:
A set of addons for react-data-grid
57 lines (46 loc) • 2.25 kB
JavaScript
import { isImmutableCollection } from 'common/utils';
import Resolver from './RowGrouperResolver';
class RowGrouper {
constructor(columns, expandedRows, isImmutable = false) {
this.columns = columns.slice(0);
this.expandedRows = expandedRows;
this.resolver = new Resolver(isImmutable);
}
isRowExpanded(columnName, name) {
let isExpanded = true;
const expandedRowGroup = this.expandedRows[columnName];
if (expandedRowGroup && expandedRowGroup[name]) {
isExpanded = expandedRowGroup[name].isExpanded;
}
return isExpanded;
}
groupRowsByColumn(rows, columnIndex = 0) {
let nextColumnIndex = columnIndex;
const columnName = this.columns.length > 0 && typeof this.columns[columnIndex] === 'string' ? this.columns[columnIndex] : this.columns[columnIndex].key;
const columnGroupDisplayName = this.columns.length > 0 && typeof this.columns[columnIndex] === 'string' ? this.columns[columnIndex] : this.columns[columnIndex].name;
const groupedRows = this.resolver.getGroupedRows(rows, columnName);
const keys = this.resolver.getGroupKeys(groupedRows);
let dataviewRows = this.resolver.initRowsCollection();
for (let i = 0; i < keys.length; i++) {
const key = keys[i];
const isExpanded = this.isRowExpanded(columnName, key);
const rowGroupHeader = { name: key, __metaData: { isGroup: true, treeDepth: columnIndex, isExpanded: isExpanded, columnGroupName: columnName, columnGroupDisplayName } };
dataviewRows = this.resolver.addHeaderRow(rowGroupHeader, dataviewRows);
if (isExpanded) {
nextColumnIndex = columnIndex + 1;
if (this.columns.length > nextColumnIndex) {
dataviewRows = dataviewRows.concat(this.groupRowsByColumn(this.resolver.getRowObj(groupedRows, key), nextColumnIndex));
nextColumnIndex = columnIndex - 1;
} else {
dataviewRows = dataviewRows.concat(this.resolver.getRowObj(groupedRows, key));
}
}
}
return dataviewRows;
}
}
const groupRows = (rows, groupedColumns, expandedRows) => {
const rowGrouper = new RowGrouper(groupedColumns, expandedRows, isImmutableCollection(rows));
return rowGrouper.groupRowsByColumn(rows, 0);
};
export default groupRows;