UNPKG

core-cde

Version:

351 lines 13.3 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.SortInfoChangedArg = exports.FilterChangedArg = exports.PageInfoChangedArg = exports.DataView = void 0; const tslib_1 = require("tslib"); const Events_module_1 = require("../../events/Events.module"); const Linq_1 = (0, tslib_1.__importDefault)(require("typescript-dotnet-commonjs/System.Linq/Linq")); const DM = (0, tslib_1.__importStar)(require("../Data.module")); class DataView { constructor(uniqueName, table) { this.uniqueName = uniqueName; this._sort = null; this._page = null; this._filter = null; /** * Событие, происходящее при изменении информации о страницах */ this._onPageInfoChanged = new Events_module_1.EventDispatcher(); /** * Событие, происходящее при изменении информации о фильтрации */ this._onFilterChanged = new Events_module_1.EventDispatcher(); /** * Событие, происходящее при изменении информации о сортировке */ this._onSortInfoChanged = new Events_module_1.EventDispatcher(); this._hashCode = ++DataView._counter; this.table = table; this._filter = new DM.FilterExprestion(); } get onPageInfoChanged() { return this._onPageInfoChanged; } get onFilterChanged() { return this._onFilterChanged; } get onSortInfoChanged() { return this._onSortInfoChanged; } get hashCode() { return this._hashCode; } static fromJSON(json) { if (typeof json === 'string') { return DataView.fromJSON(JSON.parse(json)); } const dv = new DataView(json.uniqueName, null); dv._page = DM.PageInfo.fromJSON(json.page); dv._sort = []; json.sort.forEach(s => { dv.sort.push(DM.SortInfo.fromJSON(s)); }); dv._filter = DM.FilterExprestion.fromJSON(json.filter); return dv; } toJSON() { var _a, _b; const sort = []; (_a = this.sort) === null || _a === void 0 ? void 0 : _a.forEach(s => { sort.push(s.toJSON()); }); const page = (_b = this.page) === null || _b === void 0 ? void 0 : _b.toJSON(); const filter = this.filter.toJSON(); return { sort, page, filter, uniqueName: this.uniqueName }; } /** * Объект таблицы */ get table() { return this._table; } set table(value) { var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m; if (typeof this._table !== 'undefined' && typeof ((_a = this._table) === null || _a === void 0 ? void 0 : _a.dataSet) !== 'undefined') { (_c = (_b = this._table.dataSet) === null || _b === void 0 ? void 0 : _b.onValuesUpdated) === null || _c === void 0 ? void 0 : _c.unregister(this, this.onTableValuesUpdated); (_e = (_d = this._table) === null || _d === void 0 ? void 0 : _d.onDataRowAdded) === null || _e === void 0 ? void 0 : _e.unregister(this, this.onTableDataRowAdded); (_g = (_f = this._table) === null || _f === void 0 ? void 0 : _f.onDataRowRemoved) === null || _g === void 0 ? void 0 : _g.unregister(this, this.onTableDataRowRemoved); } this._table = value; if (value) { this.resetRows(); } (_j = (_h = this._table) === null || _h === void 0 ? void 0 : _h.dataSet) === null || _j === void 0 ? void 0 : _j.onValuesUpdated.register(this, this.onTableValuesUpdated); (_k = this._table) === null || _k === void 0 ? void 0 : _k.onDataRowAdded.register(this, this.onTableDataRowAdded); (_m = (_l = this._table) === null || _l === void 0 ? void 0 : _l.onDataRowRemoved) === null || _m === void 0 ? void 0 : _m.register(this, this.onTableDataRowRemoved); } onTableDataRowAdded(e) { this.resetRows(); } onTableDataRowRemoved(e) { this.resetRows(); } onTableValuesUpdated(values) { this.resetRows(); } /** * Объект разбиения на страницы */ get page() { return this._page; } set page(value) { if (this._page !== value) { if (this._page !== null) { this._page.onPropertyChanged.unregister(this, this.onPageInfoPropertyChanged); } this._page = value; this.resetRows(); if (this._page !== null) { this._page.onPropertyChanged.register(this, this.onPageInfoPropertyChanged); } this.onPageInfoChanged.dispatch(new PageInfoChangedArg(this._page)); } } /** * Массив описателей сортировки */ get sort() { return this._sort; } // TODO: Сделать по аналогии с PageInfo при необходимости set sort(value) { if (this._sort !== value) { this._sort = value; this.resetRows(); this._onSortInfoChanged.dispatch(new SortInfoChangedArg(this._sort)); } } /** * Выражение фильтрации */ get filter() { return this._filter; } set filter(value) { if (this._filter !== value) { this._filter = value; this.resetRows(); this._onFilterChanged.dispatch(new FilterChangedArg(this._filter)); } } /** * По индексу записи в представлении возвращает индекс записи в таблице * @param viewRow Индекс записи в представлении */ getOriginalIndex(viewRow) { return this._rows[viewRow].index; } /** * Возвращает количество записей в представлении */ get rowCount() { return this._rows.length; } /** * Возвращает значение формулы в ячейке * @param row индекс строки * @param col индекс колонки */ getCellFormula(row, col) { return this._table.getCellFormula(row, col); } /** * Возвращает расчитанное значение ячейки * @param row индекс строки * @param col индекс колонки */ getCellValue(row, col) { const retVal = this.table.getCellValue(row, col); return retVal; } setCellValue(row, col, value) { if (this._table !== undefined) { return this._table.setCellValue(row, col, value); } } getPage() { return this.processPage(this._rows); } // ==== PRIVATE ==== resetRows() { this._rows = this.createRows(); } createRows() { var _a; let collection = this.processFilter((_a = this._table) === null || _a === void 0 ? void 0 : _a.getRowCollection().toArray()); collection = this.processSort(collection); return collection; } onPageInfoPropertyChanged(e) { this.resetRows(); this.onPageInfoChanged.dispatch(new PageInfoChangedArg(this._page)); } processFilter(rows) { if (this._filter === null) { // Скрываем удаленные записи const a = new Array(); // tslint:disable-next-line: prefer-for-of for (let i = 0; i < rows.length; i++) { const row = rows[i]; if (row.state !== DM.DataRowState.Deleted) { a.push(row); } } return a; } let e = (0, Linq_1.default)(rows); const filters = (0, Linq_1.default)(this._filter.list).select(f => ({ index: this._table.getColumnOrdinal(f.columnName), item: f })).toArray(); e = e.where((r) => { let result = true; let tmp; // tslint:disable-next-line: prefer-for-of for (let i = 0; i < filters.length; i++) { if (filters[i].item.logicBefore === DM.Logic.And) { tmp = this.predicate(r.sheetItems[filters[i].index], filters[i].item.value, filters[i].item.operation); result = result && tmp; } else { tmp = this.predicate(r.sheetItems[filters[i].index], filters[i].item.value, filters[i].item.operation); result = result || tmp; } } result = result && r.state !== DM.DataRowState.Deleted; // Скрываем удаленные записи return result; }); const arr = e.toArray(); return arr; } processSort(rows) { if (this._sort === null) { return rows; } let e = (0, Linq_1.default)(rows); const orders = (0, Linq_1.default)(this._sort).select(s => ({ index: this._table.getColumnOrdinal(s.columnName), direction: s.direction })).toArray(); // tslint:disable-next-line: prefer-for-of for (let i = orders.length - 1; i >= 0; i--) { if (orders[i].direction === DM.SortDirection.Asc) { e = e.orderBy((r) => r.sheetItems[orders[i].index]); } else { e = e.orderByDescending((r) => r.sheetItems[orders[i].index]); } } const arr = e.toArray(); return arr; } processPage(rows) { if (this._page === null || Object.keys(this._page).length === 0) { return rows; } if (this._page.pageSize === -1) { return rows; } let e = (0, Linq_1.default)(rows); e = e.skip(this._page.pageIndex * this._page.pageSize).take(this._page.pageSize); const res = e.toArray(); return res; } predicate(left, right, op) { switch (op) { case DM.FilterOperation.Blank: { return this.blank(left, right); } case DM.FilterOperation.NotBlank: { return this.notBlank(left, right); } case DM.FilterOperation.Equal: { return this.equal(left, right); } case DM.FilterOperation.NotEqual: { return this.notEqual(left, right); } case DM.FilterOperation.Greate: { return this.greate(left, right); } case DM.FilterOperation.Less: { return this.less(left, right); } case DM.FilterOperation.Between: { return this.between(left, right); } case DM.FilterOperation.NotBetween: { return this.notBetween(left, right); } case DM.FilterOperation.Contains: { return this.contains(left, right); } case DM.FilterOperation.NotContains: { return this.notContains(left, right); } case DM.FilterOperation.StartWith: { return this.startWith(left, right); } default: { throw new Error('Invalid operation'); } } } blank(left, right) { return left === null || left === undefined || left === ''; } notBlank(left, right) { return left !== null && left !== undefined && left !== ''; } equal(left, right) { return left === right; } notEqual(left, right) { return !this.equal(left, right); } between(left, right) { return left >= (right === null || right === void 0 ? void 0 : right.low) && left <= (right === null || right === void 0 ? void 0 : right.hight); } notBetween(left, right) { return !this.between(left, right); } contains(left, right) { return String(left).indexOf(right) > -1; } notContains(left, right) { return !this.contains(left, right); } greate(left, right) { return left > right; } less(left, right) { return left < right; } startWith(left, right) { return String(left).startsWith(right); } } exports.DataView = DataView; DataView._counter = 0; class PageInfoChangedArg { constructor(newPageInfo) { this.newPageInfo = newPageInfo; } } exports.PageInfoChangedArg = PageInfoChangedArg; class FilterChangedArg { constructor(newFilter) { this.newFilter = newFilter; } } exports.FilterChangedArg = FilterChangedArg; class SortInfoChangedArg { constructor(newSort) { this.newSort = newSort; } } exports.SortInfoChangedArg = SortInfoChangedArg; //# sourceMappingURL=DataView.js.map