ractive-ez-table
Version:
Ractive Ez UI Table
92 lines (67 loc) • 2.38 kB
JavaScript
import utils from './utils.js';
class Virtualization {
constructor(viewport, labelHeight, itemHeight) {
this._viewport = viewport;
this._labelHeight = labelHeight;
this._itemHeight = itemHeight;
}
getGroupsHeight(groups) {
return groups.reduce((height, group) => height + this.getGroupHeight(group), 0);
}
getItemsHeight(items) {
return items.length * this._itemHeight;
}
getItemHeight(item) {
return this._itemHeight;
}
getGroupHeight(group) {
const contentHeight = group.subGroups
? this.getGroupsHeight(group.subGroups)
: this.getItemsHeight(group.items);
return this._labelHeight + contentHeight;
}
isVisible(top, height) {
const vpBottom = this._viewport.top + this._viewport.height;
const bottom = top + height;
return top <= vpBottom
&& bottom >= this._viewport.top;
}
virtualize(grouping, virtualizationEnabled, top = 0) {
const visibleItems = [];
let itemOffset = top;
let groupingOffsetTop = top;
let groupingOffsetBottom = 0;
let skipMode = -1;
const action = grouping.subGroups
? group => this.virtualize(group, virtualizationEnabled, itemOffset + this._labelHeight)
: item => item;
const getHeight = grouping.subGroups
? group => this.getGroupHeight(group)
: item => this.getItemHeight(item);
const collection = grouping.subGroups
? grouping.subGroups
: grouping.items;
if (!collection) return grouping;
if (!collection.length) return grouping;
for (let i = 0; i < collection.length; i++) {
const item = collection[i];
const itemHeight = getHeight(item);
const itemVisible = (!virtualizationEnabled) || this.isVisible(itemOffset, itemHeight);
if (itemVisible) visibleItems.push(action(item));
if (skipMode == -1 && itemVisible) skipMode = 0;
if (skipMode == 0 && !itemVisible) skipMode = 1;
itemOffset += itemHeight;
if (skipMode == -1) groupingOffsetTop += itemHeight;
if (skipMode == 1) groupingOffsetBottom += itemHeight;
}
grouping.top = groupingOffsetTop - top;
grouping.bottom = groupingOffsetBottom;
if (grouping.subGroups) {
grouping.subGroups = visibleItems;
} else {
grouping.virtualItems = visibleItems;
}
return grouping;
}
};
export default Virtualization;