@revolist/revogrid
Version:
Virtual reactive data grid spreadsheet component - RevoGrid.
91 lines (90 loc) • 2.84 kB
JavaScript
/*!
* Built by Revolist OU ❤️
*/
import { columnTypes } from "../../store/index";
export default class GridScrollingService {
constructor(setViewport) {
this.setViewport = setViewport;
this.elements = {};
}
async proxyScroll(e, key, skipEvent) {
var _a;
let newEventPromise;
let event = e;
for (let elKey in (skipEvent ? {} : this.elements)) {
// skip
if (e.dimension === 'rgCol' && elKey === 'headerRow') {
continue;
// pinned column only
}
else if (this.isPinnedColumn(key) && e.dimension === 'rgCol') {
if (elKey === key || !e.delta) {
continue;
}
for (let el of this.elements[elKey]) {
if (el.changeScroll) {
newEventPromise = el.changeScroll(e);
}
}
}
else {
for (let el of this.elements[elKey]) {
await ((_a = el.setScroll) === null || _a === void 0 ? void 0 : _a.call(el, e));
}
}
}
const newEvent = await newEventPromise;
if (newEvent) {
event = newEvent;
}
this.setViewport(skipEvent && this.isPinnedColumn(key)
? Object.assign(Object.assign({}, event), { dimension: key }) : event);
}
/**
* Silent scroll update for mobile devices when we have negative scroll top
*/
async scrollSilentService(e, key) {
var _a;
for (let elKey in this.elements) {
// skip same element update
if (elKey === key) {
continue;
}
if (columnTypes.includes(key) &&
(elKey === 'headerRow' ||
columnTypes.includes(elKey))) {
for (let el of this.elements[elKey]) {
await ((_a = el.changeScroll) === null || _a === void 0 ? void 0 : _a.call(el, e, true));
}
continue;
}
}
}
isPinnedColumn(key) {
return !!key && ['colPinStart', 'colPinEnd'].indexOf(key) > -1;
}
registerElements(els) {
this.elements = els;
}
/**
* Register new element for farther scroll support
* @param el - can be null if holder removed
* @param key - element key
*/
registerElement(el, key) {
if (!this.elements[key]) {
this.elements[key] = [];
}
// new element added
if (el) {
this.elements[key].push(el);
}
else if (this.elements[key]) {
// element removed
delete this.elements[key];
}
}
unregister() {
this.elements = {};
}
}