core-cde
Version:
351 lines • 13.3 kB
JavaScript
"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