@true-directive/base
Version:
The set of base classes for the TrueDirective Grid
188 lines (187 loc) • 7.82 kB
JavaScript
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
/**
* Copyright (c) 2018-2019 Aleksey Melnikov, True Directive Company.
* @link https://truedirective.com/
* @license MIT
*/
import { AxInject } from '../classes/ax-inject.class';
import { LazyLoadingMode } from '../classes/enums';
import { GridSettings } from '../classes/grid-settings.class';
import { DataSource } from '../classes/data-source.class';
var GridLazyLoadHandler = /** @class */ (function () {
function GridLazyLoadHandler() {
this._queriedFrom = null;
this._queriedTo = null;
this._loading = false;
this._lazyOffset_tmp = null;
this._lazyLimit_tmp = null;
}
GridLazyLoadHandler.prototype.query = function (offset, reset, force) {
var _this = this;
if (offset === void 0) { offset = 0; }
if (reset === void 0) { reset = false; }
if (force === void 0) { force = false; }
if (this.settings.lazyLoading === LazyLoadingMode.NONE) {
return false;
}
var limit = this.settings.lazyLoadingPageSize;
var e = this.events;
var st = this.settings;
this._lazyOffset_tmp = offset;
this._lazyLimit_tmp = limit;
var q = this.dataSource.getQuery();
q.forcedUpdate = force;
if (reset) {
// Полное обновление, всё сразу делаем
var res = this.check(q, offset, limit, reset);
if (res) {
this.start();
e.dataQueryEvent(q);
}
return res;
}
setTimeout(function () {
// Антидребезг. Если до сих пор те же лимит и оффсет, то загружаем
if (force || (_this._lazyOffset_tmp === offset && _this._lazyLimit_tmp === limit)) {
var res = _this.check(q, offset, limit, reset);
if (res && offset !== null && limit !== null) {
_this.start();
e.dataQueryEvent(q);
}
}
}, st.lazyLoadingPause);
return true;
};
GridLazyLoadHandler.prototype.reset = function () {
if (this.settings.lazyLoading !== LazyLoadingMode.NONE) {
this._queriedFrom = null;
this._queriedTo = null;
this.dataSource.totalRowCount = null;
this.dataSource.lazyLoaded = null;
}
};
GridLazyLoadHandler.prototype.start = function () {
this._loading = true;
};
GridLazyLoadHandler.prototype.done = function () {
this._loading = false;
};
GridLazyLoadHandler.prototype.fetch = function (rows, q, totalRowCount) {
this.done();
if (!rows) {
return;
}
var ds = this.dataSource;
var st = this.settings;
if (!ds.model || q.resetData || q.forcedUpdate) {
ds.lazyLoaded = 0;
ds.model = [];
}
if (st.lazyLoading === LazyLoadingMode.INCREMENTAL) {
// Incremental
for (var i = 0; i < rows.length; i++) {
ds.model[q.offset + i] = rows[i];
}
ds.lazyLoaded = ds.model.length;
}
if (st.lazyLoading === LazyLoadingMode.FRAGMENTARY) {
// Fragmentary
ds.lazyLoaded = ds.lazyLoaded === null ? 0 : ds.lazyLoaded;
for (var i = 0; i < rows.length; i++) {
var r = ds.model[q.offset + i];
if (!r || r.__ax === 'empty') {
ds.lazyLoaded++;
ds.model[q.offset + i] = rows[i];
}
}
}
// Если каким-то чудом так получилось.. Нужно обрезать...
if (ds.model.length > totalRowCount) {
ds.model.length = totalRowCount;
}
ds.totalRowCount = totalRowCount;
this.dataSource.accomplishFetch(ds.model);
};
/**
* Не пора ли ленивенько подгрузить немного данных?
* @param q DataQuery
* @param ds Data source
* @param offset Current page offset
* @param limit Current page limit
* @param reset Reset loading because query has been changed.
* @return True if we need load data
*/
GridLazyLoadHandler.prototype.check = function (q, offset, limit, reset) {
if (reset === void 0) { reset = false; }
if (reset) {
this.reset();
}
if (this._loading) {
// В процессе
return false;
}
var ds = this.dataSource;
var st = this.settings;
var needRows = offset + limit + st.lazyLoadingThreshold;
var total = ds.totalRowCount;
var loaded = reset ? 0 : ds.loadedRowCount;
// Если фрагментарный, то нужно искать наличие дырок
var needToLoad = false;
if (st.lazyLoading === LazyLoadingMode.INCREMENTAL) {
needToLoad = total === null || (needRows > loaded && loaded < total);
}
else {
// Если вообще ничего не загружено
needToLoad = loaded === 0;
var i = offset - st.lazyLoadingThreshold;
if (i < 0) {
i = 0;
}
if (q.forcedUpdate) {
// When update is forced we have to reload the current page and some nearest rows
needToLoad = true;
offset = i;
}
else {
while (!needToLoad && i < (offset + limit) && i < ds.totalRowCount) {
var r = ds.model[i];
if (r === undefined || r.__ax === 'empty') {
offset = i;
needToLoad = true;
}
i++;
}
}
}
q.offset = st.lazyLoading === LazyLoadingMode.INCREMENTAL ? loaded : offset;
q.limit = st.lazyLoadingPageSize + st.lazyLoadingThreshold;
q.resetData = reset;
if ((q.offset + q.limit) > this._queriedTo || q.offset < this._queriedFrom) {
this._queriedFrom = q.offset;
this._queriedTo = q.offset + q.limit;
}
return needToLoad;
};
__decorate([
AxInject('settings'),
__metadata("design:type", GridSettings)
], GridLazyLoadHandler.prototype, "settings", void 0);
__decorate([
AxInject('events'),
__metadata("design:type", Object)
], GridLazyLoadHandler.prototype, "events", void 0);
__decorate([
AxInject('dataSource'),
__metadata("design:type", DataSource)
], GridLazyLoadHandler.prototype, "dataSource", void 0);
return GridLazyLoadHandler;
}());
export { GridLazyLoadHandler };