@mhmdaljefri/revogrid
Version:
Virtual reactive data grid component - RevoGrid.
77 lines (76 loc) • 2.15 kB
JavaScript
import { PSEUDO_GROUP_ITEM_ID, GROUP_EXPANDED, GROUP_DEPTH } from './grouping.const';
import { isGrouping, getParsedGroup, isSameGroup } from './grouping.service';
// provide collapse data
export function doCollapse(pIndex, source) {
const model = source[pIndex];
const currentId = model[PSEUDO_GROUP_ITEM_ID];
const trimmed = {};
let i = pIndex + 1;
const total = source.length;
while (i < total) {
const currentModel = source[i];
if (isGrouping(currentModel)) {
if (currentId !== currentModel[PSEUDO_GROUP_ITEM_ID]) {
break;
}
else {
currentModel[GROUP_EXPANDED] = false;
}
}
trimmed[i++] = true;
}
model[GROUP_EXPANDED] = false;
return { trimmed };
}
/**
*
* @param pIndex - physical index
* @param vIndex - virtual index, need to update item collection
* @param source - data source
* @param rowItemsIndexes - rgRow indexes
*/
export function doExpand(vIndex, source, rowItemsIndexes) {
const physicalIndex = rowItemsIndexes[vIndex];
const model = source[physicalIndex];
const currentGroup = getParsedGroup(model[PSEUDO_GROUP_ITEM_ID]);
const trimmed = {};
// no group found
if (!currentGroup) {
return { trimmed };
}
const groupItems = [];
model[GROUP_EXPANDED] = true;
let i = physicalIndex + 1;
const total = source.length;
let groupLevelOnly = 0;
// go through all rows
while (i < total) {
const currentModel = source[i];
const isGroup = isGrouping(currentModel);
// group found
if (isGroup) {
if (!isSameGroup(currentGroup, model, currentModel)) {
break;
}
else if (!groupLevelOnly) {
// if get group first it's group only level
groupLevelOnly = currentModel[GROUP_DEPTH];
}
}
// level 0 or same depth
if (!groupLevelOnly || (isGroup && groupLevelOnly === currentModel[GROUP_DEPTH])) {
trimmed[i] = false;
groupItems.push(i);
}
i++;
}
const result = {
trimmed,
};
if (groupItems.length) {
const items = [...rowItemsIndexes];
items.splice(vIndex + 1, 0, ...groupItems);
result.items = items;
}
return result;
}