UNPKG

@true-directive/base

Version:

The set of base classes for the TrueDirective Grid

188 lines (187 loc) 7.82 kB
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 };