@syncfusion/ej2-grids
Version:
Feature-rich JavaScript datagrid (datatable) control with built-in support for editing, filtering, grouping, paging, sorting, and exporting to Excel.
201 lines (200 loc) • 9.7 kB
JavaScript
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
import { isNullOrUndefined, extend } from '@syncfusion/ej2-base';
import { DataManager, Query, Deferred, Predicate, DataUtil } from '@syncfusion/ej2-data';
import { initForeignKeyColumn, getForeignKeyData, generateQuery } from '../base/constant';
import { getDatePredicate } from '../base/util';
import { Data } from './data';
import * as events from '../base/constant';
/**
* `ForeignKey` module is used to handle foreign key column's actions.
*/
var ForeignKey = /** @class */ (function (_super) {
__extends(ForeignKey, _super);
function ForeignKey(parent, serviceLocator) {
var _this = _super.call(this, parent, serviceLocator) || this;
_this.parent = parent;
_this.serviceLocator = serviceLocator;
_this.initEvent();
return _this;
}
ForeignKey.prototype.initEvent = function () {
if (this.parent.isDestroyed) {
return;
}
this.parent.on(initForeignKeyColumn, this.initForeignKeyColumns, this);
this.parent.on(getForeignKeyData, this.getForeignKeyData, this);
this.parent.on(generateQuery, this.generateQueryFormData, this);
};
ForeignKey.prototype.initForeignKeyColumns = function (columns) {
for (var i = 0; i < columns.length; i++) {
columns[parseInt(i.toString(), 10)].dataSource = (columns[parseInt(i.toString(), 10)].dataSource instanceof DataManager ?
columns[parseInt(i.toString(), 10)].dataSource :
(isNullOrUndefined(columns[parseInt(i.toString(), 10)].dataSource) ? new DataManager() :
'result' in columns[parseInt(i.toString(), 10)].dataSource ? columns[parseInt(i.toString(), 10)].dataSource :
new DataManager(columns[parseInt(i.toString(), 10)].dataSource)));
}
};
ForeignKey.prototype.eventfPromise = function (args, query, key, column) {
var state = this.getStateEventArgument(query);
var def = new Deferred();
var deff = new Deferred();
state.action = args.action;
var dataModule = this.parent.getDataModule();
if (!isNullOrUndefined(args.action) && args.action.requestType && dataModule.foreignKeyDataState.isDataChanged !== false) {
dataModule.setForeignKeyDataState({
isPending: true, resolver: deff.resolve
});
deff.promise.then(function () {
def.resolve(column.dataSource);
});
state.setColumnData = this.parent.setForeignKeyData.bind(this.parent);
this.parent.trigger(events.columnDataStateChange, state);
}
else {
dataModule.setForeignKeyDataState({});
def.resolve(key);
}
return def;
};
ForeignKey.prototype.getForeignKeyData = function (args) {
var _this = this;
var foreignColumns = args.column ? [args.column] : this.parent.getForeignKeyColumns();
if (this.parent.columnQueryMode === 'ExcludeHidden') {
foreignColumns = foreignColumns.filter(function (col) { return col.visible !== false; });
}
var allPromise = [];
var _loop_1 = function (i) {
var promise = void 0;
var query = args.isComplex ? this_1.genarateColumnQuery(foreignColumns[parseInt(i.toString(), 10)]) :
this_1.genarateQuery(foreignColumns[parseInt(i.toString(), 10)], args.result.result, false, true);
query.params = this_1.parent.query.params;
var dataSource = foreignColumns[parseInt(i.toString(), 10)].dataSource;
if (dataSource && 'result' in dataSource) {
var def = this_1.eventfPromise(args, query, dataSource, foreignColumns[parseInt(i.toString(), 10)]);
promise = def.promise;
}
else if (!dataSource.ready || dataSource.dataSource.offline) {
promise = dataSource.executeQuery(query);
}
else {
promise = dataSource.ready.then(function () {
return dataSource.executeQuery(query);
});
}
allPromise.push(promise);
};
var this_1 = this;
for (var i = 0; i < foreignColumns.length; i++) {
_loop_1(i);
}
Promise.all(allPromise).then(function (responses) {
for (var i = 0; i < responses.length; i++) {
foreignColumns[parseInt(i.toString(), 10)].columnData = responses[parseInt(i.toString(), 10)].result;
if (foreignColumns[parseInt(i.toString(), 10)].editType === 'dropdownedit' && 'result' in foreignColumns[parseInt(i.toString(), 10)].dataSource) {
foreignColumns[parseInt(i.toString(), 10)].edit.params = extend(foreignColumns[parseInt(i.toString(), 10)]
.edit.params, {
dataSource: responses[parseInt(i.toString(), 10)].result,
query: new Query(), fields: {
value: foreignColumns[parseInt(i.toString(), 10)].foreignKeyField ||
foreignColumns[parseInt(i.toString(), 10)].field,
text: foreignColumns[parseInt(i.toString(), 10)].foreignKeyValue
}
});
}
}
args.promise.resolve(args.result);
}).catch(function (e) {
var errorMsg = e;
if (!errorMsg.error) {
errorMsg = { error: errorMsg };
}
_this.parent.log(['actionfailure', 'foreign_key_failure'], errorMsg);
if (args.promise && args.promise.reject) {
args.promise.reject(e);
}
return e;
});
};
ForeignKey.prototype.generateQueryFormData = function (args) {
args.predicate.predicate = this.genarateQuery(args.column, args.column.columnData, true);
};
ForeignKey.prototype.genarateQuery = function (column, e, fromData, needQuery) {
var gObj = this.parent;
var predicates = [];
var query = new Query();
var field = fromData ? column.foreignKeyField : column.field;
if (gObj.allowPaging || gObj.enableVirtualization || fromData) {
e = new DataManager(((gObj.allowGrouping && gObj.groupSettings.columns.length && !fromData) ?
e.records : e)).executeLocal(new Query().select(field));
var filteredValue = DataUtil.distinct(e, field, false);
field = fromData ? column.field : column.foreignKeyField;
for (var i = 0; i < filteredValue.length; i++) {
if (filteredValue[parseInt(i.toString(), 10)] && filteredValue[parseInt(i.toString(), 10)].getDay) {
predicates.push(getDatePredicate({ field: field, operator: 'equal', value: filteredValue[parseInt(i.toString(), 10)], matchCase: false }));
}
else {
predicates.push(new Predicate(field, 'equal', filteredValue[parseInt(i.toString(), 10)], false));
}
}
}
if (needQuery) {
return predicates.length ? query.where(Predicate.or(predicates)) : query;
}
return (predicates.length ? Predicate.or(predicates) : { predicates: [] });
};
ForeignKey.prototype.genarateColumnQuery = function (column) {
var gObj = this.parent;
var query = new Query();
var queryColumn = this.isFiltered(column);
if (queryColumn.isTrue) {
query = this.filterQuery(query, queryColumn.column, true);
}
if (gObj.searchSettings.key.length) {
var sSettings = gObj.searchSettings;
if (column.dataSource instanceof DataManager && (column.dataSource.adaptor.getModuleName &&
column.dataSource.adaptor.getModuleName() === 'ODataV4Adaptor')) {
query = this.searchQuery(query, column, true);
}
else {
query.search(sSettings.key, column.foreignKeyValue, sSettings.operator, sSettings.ignoreCase);
}
}
return query;
};
ForeignKey.prototype.isFiltered = function (column) {
var filterColumn = this.parent.filterSettings.columns.filter(function (fColumn) {
return (fColumn.field === column.foreignKeyValue && fColumn.uid === column.uid);
});
return {
column: filterColumn, isTrue: !!filterColumn.length
};
};
ForeignKey.prototype.getModuleName = function () {
return 'foreignKey';
};
ForeignKey.prototype.destroy = function () {
this.destroyEvent();
};
ForeignKey.prototype.destroyEvent = function () {
if (this.parent.isDestroyed) {
return;
}
this.parent.off(initForeignKeyColumn, this.initForeignKeyColumns);
this.parent.off(getForeignKeyData, this.getForeignKeyData);
this.parent.off(generateQuery, this.generateQueryFormData);
};
return ForeignKey;
}(Data));
export { ForeignKey };