vscroll
Version:
Virtual scroll engine
82 lines • 3.51 kB
JavaScript
import { __extends, __read, __spreadArray } from "tslib";
import Update from './update';
import { BaseAdapterProcessFactory, AdapterProcess, ProcessStatus } from '../misc/index';
import { Item } from '../../classes/item';
import { Direction } from '../../inputs/index';
var Insert = /** @class */ (function (_super) {
__extends(Insert, _super);
function Insert() {
return _super !== null && _super.apply(this, arguments) || this;
}
Insert.run = function (scroller, options) {
var params = Insert.parseInput(scroller, options).params;
if (!params) {
return;
}
var shouldInsert = Insert.doInsert(scroller, params);
scroller.workflow.call({
process: Insert.process,
status: shouldInsert ? ProcessStatus.next : ProcessStatus.done
});
};
Insert.doInsert = function (scroller, params) {
if (!Insert.insertEmpty(scroller, params)) {
if (!Insert.insertInBuffer(scroller, params)) {
if (!Insert.insertVirtually(scroller, params)) {
return false;
}
}
}
return true;
};
Insert.insertEmpty = function (scroller, params) {
var buffer = scroller.buffer, routines = scroller.routines, fetch = scroller.state.fetch;
if (buffer.size) {
return false;
}
var beforeIndex = params.beforeIndex, afterIndex = params.afterIndex, items = params.items, decrease = params.decrease;
if (!buffer.fillEmpty(items, beforeIndex, afterIndex, !!decrease, function (index, data) { return new Item(index, data, routines); })) {
return false;
}
fetch.fill(buffer.items, buffer.startIndex);
return true;
};
Insert.insertInBuffer = function (scroller, params) {
var before = params.before, after = params.after, beforeIndex = params.beforeIndex, afterIndex = params.afterIndex, items = params.items, decrease = params.decrease;
var indexToInsert = scroller.buffer.getIndexToInsert(before || after, beforeIndex, afterIndex);
if (params.virtualize || isNaN(indexToInsert)) {
return false;
}
var isBackward = Number.isInteger(beforeIndex) || before;
var updateOptions = {
predicate: function (_a) {
var $index = _a.$index, data = _a.data;
if (indexToInsert === $index) {
return isBackward ? __spreadArray(__spreadArray([], __read(items), false), [data], false) : __spreadArray([data], __read(items), false);
}
return true;
},
fixRight: decrease
};
return Update.doUpdate(scroller, updateOptions);
};
Insert.insertVirtually = function (scroller, params) {
var beforeIndex = params.beforeIndex, afterIndex = params.afterIndex, items = params.items, decrease = params.decrease;
var buffer = scroller.buffer, fetch = scroller.state.fetch, viewport = scroller.viewport;
var direction = Number.isInteger(beforeIndex) ? Direction.backward : Direction.forward;
var indexToInsert = (direction === Direction.backward ? beforeIndex : afterIndex);
if (!buffer.insertVirtually(items, indexToInsert, direction, !!decrease)) {
return false;
}
var _a = viewport.getEdgeVisibleItem(buffer.items, Direction.backward), index = _a.index, diff = _a.diff;
fetch.firstVisible.index = index;
if (!isNaN(index)) {
fetch.simulate = true;
fetch.firstVisible.delta = -buffer.getSizeByIndex(index) + diff;
}
return true;
};
return Insert;
}(BaseAdapterProcessFactory(AdapterProcess.insert)));
export default Insert;
//# sourceMappingURL=insert.js.map