vscroll
Version:
Virtual scroll engine
116 lines • 4.8 kB
JavaScript
import { __extends, __read, __spreadArray } from "tslib";
import Update from './update';
import { BaseAdapterProcessFactory, AdapterProcess, ProcessStatus } from '../misc/index';
import { Direction } from '../../inputs/index';
var Remove = /** @class */ (function (_super) {
__extends(Remove, _super);
function Remove() {
return _super !== null && _super.apply(this, arguments) || this;
}
Remove.run = function (scroller, options) {
var params = Remove.parseInput(scroller, options).params;
if (!params) {
return;
}
var shouldRemove = Remove.doRemove(scroller, params);
scroller.workflow.call({
process: Remove.process,
status: shouldRemove ? ProcessStatus.next : ProcessStatus.done
});
};
Remove.doRemove = function (scroller, params) {
var fetch = scroller.state.fetch;
fetch.firstVisible.index = NaN;
var removed = Remove.removeBufferedItems(scroller, params);
var shouldBuffered = removed.length > 0;
if (shouldBuffered) {
// exclude just removed in-buffer indexes
if (params.indexes && params.indexes.length) {
params.indexes = params.indexes.filter(function (i) { return !removed.includes(i); });
}
// shift virtual indexes that remain
if (params.indexes && params.indexes.length) {
var diffLeft_1 = (params.increase ? 1 : 0) * removed.length;
var diffRight_1 = (params.increase ? 0 : -1) * removed.length;
params.indexes = params.indexes.map(function (index) {
return index + (index < removed[0] ? diffLeft_1 : diffRight_1);
});
}
}
var shouldVirtual = Remove.removeVirtualItems(scroller, params);
if (!shouldBuffered && !shouldVirtual) {
return false;
}
scroller.logger.stat('after remove');
return true;
};
Remove.removeBufferedItems = function (scroller, options) {
var predicate = options.predicate, indexes = options.indexes, increase = options.increase;
if (!predicate && !indexes) {
return [];
}
var newPredicate = function (item) {
return (predicate && predicate(item)) ||
(!!indexes && indexes.includes(item.$index));
};
var indexesToRemove = scroller.buffer.items.reduce(function (acc, item) {
return newPredicate(item) ? __spreadArray(__spreadArray([], __read(acc), false), [item.$index], false) : acc;
}, []);
var updateOptions = {
predicate: function (item) { return !newPredicate(item); },
fixRight: increase
};
Update.doUpdate(scroller, updateOptions);
return indexesToRemove;
};
Remove.removeVirtualItems = function (scroller, params) {
var indexes = params.indexes, increase = params.increase;
if (!indexes || !indexes.length) {
return false;
}
var buffer = scroller.buffer, viewport = scroller.viewport, fetch = scroller.state.fetch;
// get items to remove
var finiteAbsMinIndex = buffer.finiteAbsMinIndex, firstIndex = buffer.firstIndex, finiteAbsMaxIndex = buffer.finiteAbsMaxIndex, lastIndex = buffer.lastIndex;
var toRemove = [];
for (var i = 0, len = indexes.length; i < len; i++) {
var index = indexes[i];
if (index >= finiteAbsMinIndex && !isNaN(firstIndex) && index < firstIndex) {
toRemove.push(index); // backward;
}
else if (index <= finiteAbsMaxIndex && !isNaN(lastIndex) && index > lastIndex) {
toRemove.push(index); // forward;
}
else {
continue;
}
}
if (!toRemove.length) {
return false;
}
// what should be shown after remove; Buffer removal has priority
if (isNaN(fetch.firstVisible.index)) {
var _a = viewport.getEdgeVisibleItem(buffer.items, Direction.backward), index = _a.index, diff = _a.diff;
fetch.firstVisible.index = index;
if (!isNaN(index)) {
fetch.firstVisible.delta = -buffer.getSizeByIndex(index) + diff;
}
}
// virtual removal
scroller.logger.log(function () { return "going to remove ".concat(toRemove.length, " item(s) virtually"); });
buffer.removeVirtually(toRemove, !!increase);
buffer.checkDefaultSize();
Remove.shiftFirstVisibleIndex(scroller, toRemove, !!increase);
return true;
};
Remove.shiftFirstVisibleIndex = function (scroller, listToRemove, increase) {
var firstVisible = scroller.state.fetch.firstVisible;
if (isNaN(firstVisible.index)) {
return;
}
var shift = listToRemove.reduce(function (acc, index) { return acc + (((increase && index > firstVisible.index) || (!increase && index < firstVisible.index)) ? 1 : 0); }, 0);
firstVisible.index = firstVisible.index + (increase ? shift : -shift);
};
return Remove;
}(BaseAdapterProcessFactory(AdapterProcess.remove)));
export default Remove;
//# sourceMappingURL=remove.js.map