UNPKG

ractive-ez-table

Version:
92 lines (67 loc) 2.38 kB
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;