@visactor/vtable
Version:
canvas table width high performance
758 lines (745 loc) • 46.2 kB
JavaScript
"use strict";
var __createBinding = this && this.__createBinding || (Object.create ? function(o, m, k, k2) {
void 0 === k2 && (k2 = k);
var desc = Object.getOwnPropertyDescriptor(m, k);
desc && !("get" in desc ? !m.__esModule : desc.writable || desc.configurable) || (desc = {
enumerable: !0,
get: function() {
return m[k];
}
}), Object.defineProperty(o, k2, desc);
} : function(o, m, k, k2) {
void 0 === k2 && (k2 = k), o[k2] = m[k];
}), __setModuleDefault = this && this.__setModuleDefault || (Object.create ? function(o, v) {
Object.defineProperty(o, "default", {
enumerable: !0,
value: v
});
} : function(o, v) {
o.default = v;
}), __importStar = this && this.__importStar || function(mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (null != mod) for (var k in mod) "default" !== k && Object.prototype.hasOwnProperty.call(mod, k) && __createBinding(result, mod, k);
return __setModuleDefault(result, mod), result;
};
Object.defineProperty(exports, "__esModule", {
value: !0
}), exports.sortRecordIndexs = exports.getValueFromDeepArray = exports.DataSource = exports.getField = exports.getValue = void 0;
const sort = __importStar(require("../tools/sort")), ts_types_1 = require("../ts-types"), helper_1 = require("../tools/helper"), EventTarget_1 = require("../event/EventTarget"), util_1 = require("../tools/util"), vutils_1 = require("@visactor/vutils"), aggregation_1 = require("../ts-types/dataset/aggregation");
function isFieldAssessor(field) {
if (helper_1.obj.isObject(field)) {
const a = field;
if ((0, vutils_1.isValid)(a.get) && (0, vutils_1.isValid)(a.set)) return !0;
}
return !1;
}
const EVENT_TYPE = {
SOURCE_LENGTH_UPDATE: "source_length_update",
CHANGE_ORDER: "change_order"
};
function getValue(value, promiseCallBack) {
const maybePromiseOrValue = (0, helper_1.getOrApply)(value);
if ((0, helper_1.isPromise)(maybePromiseOrValue)) {
const promiseValue = maybePromiseOrValue.then((r => (promiseCallBack(r), r)));
return promiseCallBack(promiseValue), promiseValue;
}
return maybePromiseOrValue;
}
function getField(record, field, col, row, table, promiseCallBack) {
if (null == record) return;
if ((0, helper_1.isPromise)(record)) return record.then((r => getField(r, field, col, row, table, promiseCallBack)));
const fieldGet = isFieldAssessor(field) ? field.get : field;
if ((0, vutils_1.isObject)(record) && fieldGet in record) {
return getValue(record[fieldGet], promiseCallBack);
}
if ("function" == typeof fieldGet) {
return getValue(fieldGet(record, col, row, table), promiseCallBack);
}
if (Array.isArray(fieldGet)) {
return getValue((0, util_1.getValueByPath)(record, [ ...fieldGet ]), promiseCallBack);
}
const fieldArray = `${fieldGet}`.split(".");
if (fieldArray.length <= 1) {
return getValue(record[fieldGet], promiseCallBack);
}
return getValue((0, helper_1.applyChainSafe)(record, ((val, name) => getField(val, name, col, row, table, helper_1.emptyFn)), ...fieldArray), promiseCallBack);
}
function _getIndex(sortedIndexMap, index) {
if (!sortedIndexMap) return index;
const mapIndex = sortedIndexMap[index];
return (0, vutils_1.isValid)(mapIndex) ? mapIndex : index;
}
exports.getValue = getValue, exports.getField = getField;
class DataSource extends EventTarget_1.EventTarget {
static get EVENT_TYPE() {
return EVENT_TYPE;
}
constructor(dataSourceObj, dataConfig, pagination, columns, rowHierarchyType, hierarchyExpandLevel) {
var _a;
super(), this.currentIndexedData = [], this.hierarchyExpandLevel = 0, this.hasHierarchyStateExpand = !1,
this.beforeChangedRecordsMap = new Map, this.registedAggregators = {}, this.rowHierarchyType = "grid",
this.fieldAggregators = [], this.registerAggregators(), this.dataSourceObj = dataSourceObj,
this.dataConfig = dataConfig, this._get = null == dataSourceObj ? void 0 : dataSourceObj.get,
this.columns = columns, this._source = (null == dataSourceObj ? void 0 : dataSourceObj.records) ? this.processRecords(null == dataSourceObj ? void 0 : dataSourceObj.records) : dataSourceObj,
this._sourceLength = (null === (_a = this._source) || void 0 === _a ? void 0 : _a.length) || 0,
this.sortedIndexMap = new Map, this._currentPagerIndexedData = [], this.userPagination = pagination,
this.pagination = pagination || {
totalCount: this._sourceLength,
perPageCount: this._sourceLength,
currentPage: 0
}, hierarchyExpandLevel >= 1 && (this.hierarchyExpandLevel = hierarchyExpandLevel),
this.currentIndexedData = Array.from({
length: this._sourceLength
}, ((_, i) => i)), "tree" === rowHierarchyType && this.initTreeHierarchyState(),
this.rowHierarchyType = rowHierarchyType, this.updatePagerData();
}
initTreeHierarchyState() {
var _a;
this.currentIndexedData = Array.from({
length: this._sourceLength
}, ((_, i) => i));
let nodeLength = this._sourceLength;
for (let i = 0; i < nodeLength; i++) {
const indexKey = this.currentIndexedData[i], nodeData = this.getOriginalRecord(indexKey), children = null !== (_a = nodeData.filteredChildren) && void 0 !== _a ? _a : nodeData.children;
if ((null == children ? void 0 : children.length) > 0) {
if (this.hierarchyExpandLevel > 1 ? !nodeData.hierarchyState && (nodeData.hierarchyState = ts_types_1.HierarchyState.expand) : !nodeData.hierarchyState && (nodeData.hierarchyState = ts_types_1.HierarchyState.collapse),
this.hasHierarchyStateExpand = !0, nodeData.hierarchyState === ts_types_1.HierarchyState.collapse) continue;
const childrenLength = this.initChildrenNodeHierarchy(indexKey, this.hierarchyExpandLevel, 2, nodeData);
i += childrenLength, nodeLength += childrenLength;
} else !0 === nodeData.children && !nodeData.hierarchyState && (nodeData.hierarchyState = ts_types_1.HierarchyState.collapse);
}
}
supplementConfig(pagination, columns, rowHierarchyType, hierarchyExpandLevel) {
var _a;
this.columns = columns, this._sourceLength = (null === (_a = this._source) || void 0 === _a ? void 0 : _a.length) || 0,
this.sortedIndexMap = new Map, this._currentPagerIndexedData = [], this.userPagination = pagination,
this.pagination = pagination || {
totalCount: this._sourceLength,
perPageCount: this._sourceLength,
currentPage: 0
}, hierarchyExpandLevel >= 1 && (this.hierarchyExpandLevel = hierarchyExpandLevel),
this.currentIndexedData = Array.from({
length: this._sourceLength
}, ((_, i) => i)), "tree" === rowHierarchyType && this.initTreeHierarchyState(),
this.rowHierarchyType = rowHierarchyType, this.updatePagerData();
}
registerAggregator(type, aggregator) {
this.registedAggregators[type] = aggregator;
}
registerAggregators() {
this.registerAggregator(ts_types_1.AggregationType.RECORD, aggregation_1.RecordAggregator),
this.registerAggregator(ts_types_1.AggregationType.SUM, aggregation_1.SumAggregator),
this.registerAggregator(ts_types_1.AggregationType.COUNT, aggregation_1.CountAggregator),
this.registerAggregator(ts_types_1.AggregationType.MAX, aggregation_1.MaxAggregator),
this.registerAggregator(ts_types_1.AggregationType.MIN, aggregation_1.MinAggregator),
this.registerAggregator(ts_types_1.AggregationType.AVG, aggregation_1.AvgAggregator),
this.registerAggregator(ts_types_1.AggregationType.NONE, aggregation_1.NoneAggregator),
this.registerAggregator(ts_types_1.AggregationType.CUSTOM, aggregation_1.CustomAggregator);
}
updateColumns(columns) {
this.columns = columns;
}
_generateFieldAggragations() {
const columnObjs = this.columns;
this.fieldAggregators = [];
const processColumn = column => {
delete column.vtable_aggregator;
const field = column.field, aggregation = column.aggregation;
if (aggregation) if (Array.isArray(aggregation)) for (const item of aggregation) {
const aggregator = new this.registedAggregators[item.aggregationType]({
field: field,
formatFun: item.formatFun,
isRecord: !0,
aggregationFun: item.aggregationFun
});
this.fieldAggregators.push(aggregator), column.vtable_aggregator || (column.vtable_aggregator = []),
column.vtable_aggregator.push(aggregator);
} else {
const aggregator = new this.registedAggregators[aggregation.aggregationType]({
field: field,
formatFun: aggregation.formatFun,
isRecord: !0,
aggregationFun: aggregation.aggregationFun
});
this.fieldAggregators.push(aggregator), column.vtable_aggregator = aggregator;
}
}, traverseColumns = columns => {
if (columns && 0 !== columns.length) for (const column of columns) processColumn(column),
column.columns && traverseColumns(column.columns);
};
traverseColumns(columnObjs);
}
processRecords(records) {
var _a, _b, _c, _d, _e, _f, _g, _h;
this._generateFieldAggragations();
const filteredRecords = [], isHasAggregation = this.fieldAggregators.length >= 1;
if ((null === (_b = null === (_a = this.dataConfig) || void 0 === _a ? void 0 : _a.filterRules) || void 0 === _b ? void 0 : _b.length) >= 1 || (null === (_c = this.lastFilterRules) || void 0 === _c ? void 0 : _c.length) >= 1 || isHasAggregation) {
for (let i = 0, len = records.length; i < len; i++) {
const record = records[i];
(null === (_e = null === (_d = this.dataConfig) || void 0 === _d ? void 0 : _d.filterRules) || void 0 === _e ? void 0 : _e.length) >= 1 ? this.filterRecord(record) && (filteredRecords.push(record),
"tree" === this.rowHierarchyType && record.children && (record.filteredChildren = this.filteredChildren(record.children)),
isHasAggregation && this.processRecord(record)) : (null === (_f = this.lastFilterRules) || void 0 === _f ? void 0 : _f.length) >= 1 ? (this.clearFilteredChildren(record),
isHasAggregation && this.processRecord(record)) : isHasAggregation && this.processRecord(record);
}
if ((null === (_h = null === (_g = this.dataConfig) || void 0 === _g ? void 0 : _g.filterRules) || void 0 === _h ? void 0 : _h.length) >= 1) return filteredRecords;
}
return records;
}
filteredChildren(records) {
const filteredRecords = [];
for (let i = 0, len = records.length; i < len; i++) {
const record = records[i];
this.filterRecord(record) && (filteredRecords.push(record), record.children && (record.filteredChildren = this.filteredChildren(record.children)));
}
return filteredRecords;
}
processRecord(record) {
for (let i = 0; i < this.fieldAggregators.length; i++) {
this.fieldAggregators[i].push(record);
}
}
initChildrenNodeHierarchy(indexKey, hierarchyExpandLevel, currentLevel, nodeData) {
var _a, _b, _c;
let childTotalLength = 0;
const nodeLength = nodeData.filteredChildren ? nodeData.filteredChildren.length : null !== (_b = null === (_a = nodeData.children) || void 0 === _a ? void 0 : _a.length) && void 0 !== _b ? _b : 0;
for (let j = 0; j < nodeLength; j++) {
(currentLevel <= hierarchyExpandLevel || nodeData.hierarchyState === ts_types_1.HierarchyState.expand) && (childTotalLength += 1);
const childNodeData = nodeData.filteredChildren ? nodeData.filteredChildren[j] : nodeData.children[j], childIndexKey = Array.isArray(indexKey) ? indexKey.concat(j) : [ indexKey, j ];
(currentLevel <= hierarchyExpandLevel || nodeData.hierarchyState === ts_types_1.HierarchyState.expand) && this.currentIndexedData.splice(this.currentIndexedData.indexOf(indexKey) + childTotalLength, 0, childIndexKey),
(childNodeData.filteredChildren ? childNodeData.filteredChildren.length > 0 : (null === (_c = childNodeData.children) || void 0 === _c ? void 0 : _c.length) > 0) && (currentLevel < hierarchyExpandLevel || childNodeData.hierarchyState === ts_types_1.HierarchyState.expand ? (!childNodeData.hierarchyState && (childNodeData.hierarchyState = ts_types_1.HierarchyState.expand),
this.hasHierarchyStateExpand = !0) : !childNodeData.hierarchyState && (childNodeData.hierarchyState = ts_types_1.HierarchyState.collapse)),
childNodeData.hierarchyState === ts_types_1.HierarchyState.expand && (childTotalLength += this.initChildrenNodeHierarchy(childIndexKey, hierarchyExpandLevel, currentLevel + 1, childNodeData)),
!0 === childNodeData.children && !childNodeData.hierarchyState && (childNodeData.hierarchyState = ts_types_1.HierarchyState.collapse);
}
return childTotalLength;
}
updatePagination(pagination) {
this.pagination = pagination || {
totalCount: this._sourceLength,
perPageCount: this._sourceLength,
currentPage: 0
}, this.updatePagerData();
}
updatePagerData() {
const {currentIndexedData: currentIndexedData} = this, {perPageCount: perPageCount, currentPage: currentPage} = this.pagination, startIndex = perPageCount * (currentPage || 0), endIndex = startIndex + perPageCount;
if (this._currentPagerIndexedData.length = 0, currentIndexedData && currentIndexedData.length > 0) {
let firstLevelIndex = -1;
for (let i = 0; i < currentIndexedData.length; i++) if ((Array.isArray(currentIndexedData[i]) && 1 === currentIndexedData[i].length || !Array.isArray(currentIndexedData[i])) && firstLevelIndex++,
firstLevelIndex >= startIndex && firstLevelIndex < endIndex) this._currentPagerIndexedData.push(currentIndexedData[i]); else if (firstLevelIndex >= endIndex) break;
} else if (this._sourceLength > 0) throw new Error("currentIndexedData should has values!");
}
getRecordIndexPaths(bodyShowIndex) {
return this._currentPagerIndexedData[bodyShowIndex];
}
get records() {
return Array.isArray(this._source) ? this._source : [];
}
get source() {
return this._source;
}
get(index) {
return this.getOriginalRecord(_getIndex(this.currentPagerIndexedData, index));
}
getRaw(index) {
return this.getRawRecord(_getIndex(this.currentPagerIndexedData, index));
}
getIndexKey(index) {
return _getIndex(this.currentPagerIndexedData, index);
}
getTableIndex(colOrRow) {
return Array.isArray(colOrRow) ? "tree" === this.rowHierarchyType ? this.currentPagerIndexedData.findIndex((value => (0,
vutils_1.arrayEqual)(value, colOrRow))) : this.currentPagerIndexedData.findIndex((value => value === colOrRow[0])) : this.currentPagerIndexedData.findIndex((value => value === colOrRow));
}
getField(index, field, col, row, table) {
return this.getOriginalField(_getIndex(this.currentPagerIndexedData, index), field, col, row, table);
}
getRawField(index, field, col, row, table) {
return this.getRawFieldData(_getIndex(this.currentPagerIndexedData, index), field, col, row, table);
}
hasField(index, field) {
return this.hasOriginalField(_getIndex(this.currentPagerIndexedData, index), field);
}
getHierarchyState(index) {
var _a;
const record = this.getOriginalRecord(this.currentPagerIndexedData[index]);
if (null == record ? void 0 : record.hierarchyState) {
const hierarchyState = record.hierarchyState;
if ((null === (_a = record.children) || void 0 === _a ? void 0 : _a.length) > 0 || !0 === record.children) return hierarchyState;
}
return null;
}
toggleHierarchyState(index, bodyStartIndex, bodyEndIndex) {
const oldIndexedData = this.currentIndexedData.slice(0), indexed = this.getIndexKey(index), state = this.getHierarchyState(index), data = this.getOriginalRecord(indexed);
if (this.clearSortedIndexMap(), state === ts_types_1.HierarchyState.collapse) data.hierarchyState = ts_types_1.HierarchyState.expand,
this.pushChildrenNode(indexed, ts_types_1.HierarchyState.expand, data), this.hasHierarchyStateExpand = !0; else if (state === ts_types_1.HierarchyState.expand) {
let childrenLength = 0;
const computeChildrenNodeLength = (indexKey, hierarchyState, nodeData) => {
if (!hierarchyState || hierarchyState === ts_types_1.HierarchyState.collapse || hierarchyState === ts_types_1.HierarchyState.none) return;
const children = nodeData.filteredChildren ? nodeData.filteredChildren : nodeData.children;
if (children) for (let i = 0; i < children.length; i++) {
childrenLength += 1;
const childIndex = Array.isArray(indexKey) ? indexKey.concat([ i ]) : [ indexKey, i ];
computeChildrenNodeLength(childIndex, children[i].hierarchyState, children[i]);
}
};
computeChildrenNodeLength(indexed, state, data), this.currentIndexedData.splice(this.currentIndexedData.indexOf(indexed) + 1, childrenLength),
data.hierarchyState = ts_types_1.HierarchyState.collapse;
}
this.updatePagerData();
const add = [], remove = [];
if (state === ts_types_1.HierarchyState.collapse) {
const addLength = this.currentIndexedData.length - oldIndexedData.length;
for (let i = 0; i < addLength; i++) add.push(index + i + 1);
} else if (state === ts_types_1.HierarchyState.expand) {
const removeLength = oldIndexedData.length - this.currentIndexedData.length;
for (let i = 0; i < removeLength; i++) remove.push(index + i + 1);
}
return {
add: add,
remove: remove
};
}
pushChildrenNode(indexKey, hierarchyState, nodeData) {
var _a, _b;
if (!hierarchyState || hierarchyState === ts_types_1.HierarchyState.collapse || hierarchyState === ts_types_1.HierarchyState.none) return 0;
let childrenLength = 0;
const children = nodeData.filteredChildren ? nodeData.filteredChildren : nodeData.children;
if (children) {
const subNodeSortedIndexArray = Array.from({
length: children.length
}, ((_, i) => i));
null === (_a = this.lastSortStates) || void 0 === _a || _a.forEach((state => {
"normal" !== state.order && sort.sort((index => (0, vutils_1.isValid)(subNodeSortedIndexArray[index]) ? subNodeSortedIndexArray[index] : subNodeSortedIndexArray[index] = index), ((index, rel) => {
subNodeSortedIndexArray[index] = rel;
}), children.length, state.orderFn, state.order, (index => this.getOriginalField(Array.isArray(indexKey) ? indexKey.concat([ index ]) : [ indexKey, index ], state.field)));
}));
for (let i = 0; i < subNodeSortedIndexArray.length; i++) {
childrenLength += 1;
const childIndex = Array.isArray(indexKey) ? indexKey.concat([ subNodeSortedIndexArray[i] ]) : [ indexKey, subNodeSortedIndexArray[i] ];
this.currentIndexedData.splice(this.currentIndexedData.indexOf(indexKey) + childrenLength, 0, childIndex);
const childData = this.getOriginalRecord(childIndex);
!childData.hierarchyState && (null !== (_b = childData.filteredChildren) && void 0 !== _b ? _b : childData.children) && (childData.hierarchyState = ts_types_1.HierarchyState.collapse),
childrenLength += this.pushChildrenNode(childIndex, childData.hierarchyState, children[subNodeSortedIndexArray[i]]);
}
}
return childrenLength;
}
changeFieldValue(value, index, field, col, row, table) {
var _a;
if (null !== field && index >= 0) {
const dataIndex = this.getIndexKey(index);
if (this.cacheBeforeChangedRecord(dataIndex, table), "string" == typeof field || "number" == typeof field) {
const beforeChangedValue = null === (_a = this.beforeChangedRecordsMap.get(dataIndex.toString())) || void 0 === _a ? void 0 : _a[field], record = this.getOriginalRecord(dataIndex);
let formatValue = value;
"number" == typeof beforeChangedValue && (0, util_1.isAllDigits)(value) && (formatValue = parseFloat(value)),
(0, helper_1.isPromise)(record) ? record.then((record => {
record[field] = formatValue;
})).catch((err => {})) : record ? record[field] = formatValue : (this.records[dataIndex] = {},
this.records[dataIndex][field] = formatValue);
}
}
}
cacheBeforeChangedRecord(dataIndex, table) {
var _a;
if (!this.beforeChangedRecordsMap.has(dataIndex.toString())) {
const originRecord = this.getOriginalRecord(dataIndex);
this.beforeChangedRecordsMap.set(dataIndex.toString(), null !== (_a = (0, vutils_1.cloneDeep)(originRecord, void 0, [ "vtable_gantt_linkedFrom", "vtable_gantt_linkedTo" ])) && void 0 !== _a ? _a : {});
}
}
setRecord(record, index) {
var _a, _b;
let isAdd = !0;
if ((null === (_b = null === (_a = this.dataConfig) || void 0 === _a ? void 0 : _a.filterRules) || void 0 === _b ? void 0 : _b.length) >= 1 && (this.filterRecord(record) ? "tree" === this.rowHierarchyType && record.children && (record.filteredChildren = this.filteredChildren(record.children)) : isAdd = !1),
isAdd && Array.isArray(this.records)) {
const indexed = this.getIndexKey(index);
Array.isArray(indexed) || this.records.splice(indexed, 1, record);
}
}
addRecord(record, index) {
var _a;
if (Array.isArray(this.records)) {
this.records.splice(index, 0, record), this.adjustBeforeChangedRecordsMap(index, 1),
this.currentIndexedData.push(this.currentIndexedData.length), this._sourceLength += 1;
for (let i = 0; i < this.fieldAggregators.length; i++) this.fieldAggregators[i].push(record);
if ("tree" === this.rowHierarchyType && this.initTreeHierarchyState(), this.userPagination) {
this.pagination.totalCount = this._sourceLength;
const {perPageCount: perPageCount, currentPage: currentPage} = this.pagination;
index < perPageCount * (currentPage || 0) + perPageCount && this.updatePagerData();
} else this.pagination.perPageCount = this._sourceLength, this.pagination.totalCount = this._sourceLength,
this.updatePagerData();
(null === (_a = this.dataSourceObj) || void 0 === _a ? void 0 : _a.added) && this.dataSourceObj.added(index, 1);
}
}
addRecords(recordArr, index) {
var _a;
if (Array.isArray(this.records)) {
if (Array.isArray(recordArr)) {
this.records.splice(index, 0, ...recordArr), this.adjustBeforeChangedRecordsMap(index, recordArr.length);
for (let i = 0; i < recordArr.length; i++) this.currentIndexedData.push(this.currentIndexedData.length);
this._sourceLength += recordArr.length;
for (let i = 0; i < this.fieldAggregators.length; i++) for (let j = 0; j < recordArr.length; j++) this.fieldAggregators[i].push(recordArr[j]);
}
if (this.userPagination) {
this.pagination.totalCount = this._sourceLength;
const {perPageCount: perPageCount, currentPage: currentPage} = this.pagination;
index < perPageCount * (currentPage || 0) + perPageCount && this.updatePagerData();
} else this.pagination.perPageCount = this._sourceLength, this.pagination.totalCount = this._sourceLength,
this.updatePagerData();
(null === (_a = this.dataSourceObj) || void 0 === _a ? void 0 : _a.added) && this.dataSourceObj.added(index, recordArr.length);
}
}
addRecordForSorted(record) {
Array.isArray(this.records) && (this.beforeChangedRecordsMap.clear(), this.records.push(record),
this.currentIndexedData.push(this.currentIndexedData.length), this._sourceLength += 1,
this.sortedIndexMap.clear(), this.userPagination || (this.pagination.perPageCount = this._sourceLength,
this.pagination.totalCount = this._sourceLength));
}
addRecordsForSorted(recordArr) {
if (Array.isArray(this.records)) {
if (this.beforeChangedRecordsMap.clear(), Array.isArray(recordArr)) {
this.records.push(...recordArr);
for (let i = 0; i < recordArr.length; i++) this.currentIndexedData.push(this.currentIndexedData.length);
this._sourceLength += recordArr.length, this.sortedIndexMap.clear();
}
this.userPagination || (this.pagination.perPageCount = this._sourceLength, this.pagination.totalCount = this._sourceLength);
}
}
adjustBeforeChangedRecordsMap(insertIndex, insertCount, type = "add") {
for (let key = this.beforeChangedRecordsMap.size - 1; key >= insertIndex; key--) {
const record = this.beforeChangedRecordsMap.get(key.toString());
this.beforeChangedRecordsMap.delete(key.toString()), this.beforeChangedRecordsMap.set((key + ("add" === type ? insertCount : -insertCount)).toString(), record);
}
}
deleteRecords(recordIndexs) {
var _a;
if (Array.isArray(this.records)) {
const realDeletedRecordIndexs = [], recordIndexsMaxToMin = recordIndexs.sort(((a, b) => b - a));
for (let index = 0; index < recordIndexsMaxToMin.length; index++) {
const recordIndex = recordIndexsMaxToMin[index];
if (recordIndex >= this._sourceLength || recordIndex < 0) continue;
this.adjustBeforeChangedRecordsMap(recordIndex, 1, "delete"), realDeletedRecordIndexs.push(recordIndex);
const deletedRecord = this.records[recordIndex];
for (let i = 0; i < this.fieldAggregators.length; i++) this.fieldAggregators[i].deleteRecord(deletedRecord);
this.records.splice(recordIndex, 1), this.currentIndexedData.pop(), this._sourceLength -= 1;
}
return this.userPagination || (this.pagination.perPageCount = this._sourceLength,
this.pagination.totalCount = this._sourceLength), this.updatePagerData(), (null === (_a = this.dataSourceObj) || void 0 === _a ? void 0 : _a.deleted) && this.dataSourceObj.deleted(realDeletedRecordIndexs),
realDeletedRecordIndexs;
}
return [];
}
deleteRecordsForSorted(recordIndexs) {
if (Array.isArray(this.records)) {
const recordIndexsMaxToMin = recordIndexs.sort(((a, b) => b - a));
for (let index = 0; index < recordIndexsMaxToMin.length; index++) {
const recordIndex = recordIndexsMaxToMin[index];
if (recordIndex >= this._sourceLength || recordIndex < 0) continue;
const rawIndex = this.currentIndexedData[recordIndex];
this.records.splice(rawIndex, 1), this._sourceLength -= 1;
}
this.sortedIndexMap.clear(), this.userPagination || (this.pagination.perPageCount = this._sourceLength,
this.pagination.totalCount = this._sourceLength), this.beforeChangedRecordsMap.clear();
}
}
updateRecords(records, recordIndexs) {
const realDeletedRecordIndexs = [];
for (let index = 0; index < recordIndexs.length; index++) {
const recordIndex = recordIndexs[index];
if (Array.isArray(recordIndex)) this.beforeChangedRecordsMap.delete(recordIndex.toString()),
realDeletedRecordIndexs.push(recordIndex), recordIndex.slice(0, -1).reduce(((acc, key) => (void 0 === acc[key] && (acc[key] = {}),
acc[key].children)), this.records)[recordIndex[recordIndex.length - 1]] = records[index]; else {
if (recordIndex >= this._sourceLength || recordIndex < 0) continue;
this.beforeChangedRecordsMap.delete(recordIndex.toString()), realDeletedRecordIndexs.push(recordIndex);
for (let i = 0; i < this.fieldAggregators.length; i++) this.fieldAggregators[i].updateRecord(this.records[recordIndex], records[index]);
this.records[recordIndex] = records[index];
}
}
return this.userPagination && this.updatePagerData(), realDeletedRecordIndexs;
}
updateRecordsForSorted(records, recordIndexs) {
const realDeletedRecordIndexs = [];
for (let index = 0; index < recordIndexs.length; index++) {
const recordIndex = recordIndexs[index];
if (recordIndex >= this._sourceLength || recordIndex < 0) continue;
const rawIndex = this.currentIndexedData[recordIndex];
if ("number" != typeof rawIndex) return;
this.beforeChangedRecordsMap.delete(rawIndex.toString()), realDeletedRecordIndexs.push(recordIndex),
this.records[rawIndex] = records[index];
}
this.sortedIndexMap.clear();
}
sort(states) {
states = (Array.isArray(states) ? states : [ states ]).filter((state => {
const column = this.columns.find((obj => obj.field === state.field));
return !1 !== (null == column ? void 0 : column.sort) && "normal" !== state.order;
})), this.lastSortStates = states;
let filedMapArray = states.map((state => this.sortedIndexMap.get(null == state ? void 0 : state.field) || {
asc: [],
desc: [],
normal: []
})), orderedData = null;
if (filedMapArray.length > 0 && (orderedData = states.reduce(((data, state, index) => {
var _a;
const currentData = null === (_a = filedMapArray[index]) || void 0 === _a ? void 0 : _a[state.order];
return currentData && currentData.length > 0 ? currentData : data;
}), null), orderedData && orderedData.length > 0)) return this.currentIndexedData = orderedData,
this.updatePagerData(), void this.fireListeners(EVENT_TYPE.CHANGE_ORDER, null);
const sortedIndexArray = Array.from({
length: this._sourceLength
}, ((_, i) => i));
if (sortedIndexArray.sort(((indexA, indexB) => states.reduce(((result, state) => {
if (0 !== result) return result;
return (state.orderFn || ("desc" !== state.order ? (v1, v2) => v1 === v2 ? 0 : v1 > v2 ? 1 : -1 : (v1, v2) => v1 === v2 ? 0 : v1 < v2 ? 1 : -1))(this.getOriginalField(indexA, state.field), this.getOriginalField(indexB, state.field), state.order);
}), 0))), this.currentIndexedData = sortedIndexArray, this.hierarchyExpandLevel) {
let nodeLength = sortedIndexArray.length;
for (let i = 0; i < nodeLength; i++) {
const record = this.getOriginalRecord(sortedIndexArray[i]), subNodeLength = this.pushChildrenNode(sortedIndexArray[i], record.hierarchyState, this.getOriginalRecord(sortedIndexArray[i]));
nodeLength += subNodeLength, i += subNodeLength;
}
}
if (!filedMapArray.length) {
filedMapArray = states.map((() => ({
asc: [],
desc: [],
normal: []
})));
for (let index = 0; index < states.length; index++) this.sortedIndexMap.set(states[index].field, filedMapArray[index]);
}
states.forEach(((state, index) => {
filedMapArray[index][state.order] = sortedIndexArray.slice();
})), this.updatePagerData(), this.fireListeners(EVENT_TYPE.CHANGE_ORDER, null);
}
setSortedIndexMap(field, filedMap) {
this.sortedIndexMap.set(field, filedMap);
}
clearFilteredChildren(record) {
var _a, _b;
record.filteredChildren = void 0;
for (let i = 0; i < (null !== (_b = null === (_a = record.children) || void 0 === _a ? void 0 : _a.length) && void 0 !== _b ? _b : 0); i++) this.clearFilteredChildren(record.children[i]);
}
filterRecord(record) {
var _a, _b, _c;
let isReserved = !0;
for (let i = 0; i < (null === (_a = this.dataConfig.filterRules) || void 0 === _a ? void 0 : _a.length); i++) {
const filterRule = null === (_b = this.dataConfig) || void 0 === _b ? void 0 : _b.filterRules[i];
if (filterRule.filterKey) {
const filterValue = record[filterRule.filterKey];
if (-1 === filterRule.filteredValues.indexOf(filterValue)) {
isReserved = !1;
break;
}
} else if (!(null === (_c = filterRule.filterFunc) || void 0 === _c ? void 0 : _c.call(filterRule, record))) {
isReserved = !1;
break;
}
}
return isReserved;
}
updateFilterRulesForSorted(filterRules) {
var _a, _b, _c;
this.lastFilterRules = this.dataConfig.filterRules, this.dataConfig.filterRules = filterRules,
this._source = this.processRecords(null !== (_b = null === (_a = this.dataSourceObj) || void 0 === _a ? void 0 : _a.records) && void 0 !== _b ? _b : this.dataSourceObj),
this._sourceLength = (null === (_c = this._source) || void 0 === _c ? void 0 : _c.length) || 0,
this.sortedIndexMap.clear(), this.currentIndexedData = Array.from({
length: this._sourceLength
}, ((_, i) => i)), this.userPagination || (this.pagination.perPageCount = this._sourceLength,
this.pagination.totalCount = this._sourceLength);
}
updateFilterRules(filterRules) {
var _a, _b, _c;
this.lastFilterRules = this.dataConfig.filterRules, this.dataConfig.filterRules = filterRules,
this._source = this.processRecords(null !== (_b = null === (_a = this.dataSourceObj) || void 0 === _a ? void 0 : _a.records) && void 0 !== _b ? _b : this.dataSourceObj),
this._sourceLength = (null === (_c = this._source) || void 0 === _c ? void 0 : _c.length) || 0,
this.currentIndexedData = Array.from({
length: this._sourceLength
}, ((_, i) => i)), this.userPagination || (this.pagination.perPageCount = this._sourceLength,
this.pagination.totalCount = this._sourceLength, "tree" === this.rowHierarchyType && this.initTreeHierarchyState()),
this.updatePagerData();
}
clearSortedIndexMap() {
this.lastSortStates && this.lastSortStates.length > 0 && this.sortedIndexMap.forEach(((sortMap, key) => {
this.lastSortStates.some((state => state.field === key)) ? this.lastSortStates.forEach((state => {
"asc" === state.order ? (sortMap.desc = [], sortMap.normal = []) : "desc" === state.order ? (sortMap.asc = [],
sortMap.normal = []) : (sortMap.asc = [], sortMap.desc = []);
})) : this.sortedIndexMap.delete(key);
}));
}
get sourceLength() {
return this._sourceLength;
}
set sourceLength(sourceLen) {
this._sourceLength !== sourceLen && (this._sourceLength = sourceLen, this.fireListeners(EVENT_TYPE.SOURCE_LENGTH_UPDATE, this._sourceLength));
}
get length() {
return this.currentPagerIndexedData.length;
}
get dataSource() {
return this;
}
get currentPagerIndexedData() {
return this._currentPagerIndexedData.length > 0 ? this._currentPagerIndexedData : [];
}
release() {
var _a;
null === (_a = super.release) || void 0 === _a || _a.call(this), this.lastFilterRules = null;
}
clearSortedMap() {
this.currentIndexedData && (this.currentIndexedData.length = 0), this.currentIndexedData = null,
this.sortedIndexMap.forEach((item => {
item.asc && (item.asc.length = 0), item.desc && (item.desc.length = 0);
})), this.sortedIndexMap.clear();
}
clearCurrentIndexedData() {
this.currentIndexedData = null, this.currentPagerIndexedData.length = 0;
}
getOriginalRecord(dataIndex) {
let data;
return data = this.dataSourceObj.records ? Array.isArray(dataIndex) ? getValueFromDeepArray(this.records, dataIndex) : this.records[dataIndex] : this._get(dataIndex),
getValue(data, (val => {
this.recordPromiseCallBack(dataIndex, val);
}));
}
getRawRecord(dataIndex) {
var _a, _b;
if (null === (_a = this.beforeChangedRecordsMap) || void 0 === _a ? void 0 : _a.has(dataIndex.toString())) return null === (_b = this.beforeChangedRecordsMap) || void 0 === _b ? void 0 : _b.get(dataIndex.toString());
let data;
return data = this.dataSourceObj.records ? Array.isArray(dataIndex) ? getValueFromDeepArray(this.records, dataIndex) : this.records[dataIndex] : this._get(dataIndex),
getValue(data, (val => {
this.recordPromiseCallBack(dataIndex, val);
}));
}
getOriginalField(index, field, col, row, table) {
if (null === field) return;
return getField(this.getOriginalRecord(index), field, col, row, table, (val => {
this.fieldPromiseCallBack(index, field, val);
}));
}
getRawFieldData(index, field, col, row, table) {
if (null === field) return;
return getField(this.getRawRecord(index), field, col, row, table, (val => {
this.fieldPromiseCallBack(index, field, val);
}));
}
hasOriginalField(index, field) {
if (null === field) return !1;
if ("function" == typeof field) return !0;
const record = this.getOriginalRecord(index);
return Boolean(record && field in record);
}
fieldPromiseCallBack(_index, _field, _value) {}
recordPromiseCallBack(_index, _record) {}
canChangeOrder(sourceIndex, targetIndex) {
var _a;
if (null === (_a = this.dataSourceObj) || void 0 === _a ? void 0 : _a.canChangeOrder) return this.dataSourceObj.canChangeOrder(sourceIndex, targetIndex);
if (this.hasHierarchyStateExpand) {
let sourceIndexs = this.currentPagerIndexedData[sourceIndex], targetIndexs = this.currentPagerIndexedData[targetIndex];
if (sourceIndexs = Array.isArray(sourceIndexs) ? [ ...sourceIndexs ] : [ sourceIndexs ],
targetIndexs = Array.isArray(targetIndexs) ? [ ...targetIndexs ] : [ targetIndexs ],
targetIndex > sourceIndex && targetIndexs.length > sourceIndexs.length) {
let targetNextIndexs = this.currentPagerIndexedData[targetIndex + 1];
targetNextIndexs = Array.isArray(targetNextIndexs) ? [ ...targetNextIndexs ] : [ targetNextIndexs ],
targetNextIndexs.length < targetIndexs.length && targetIndexs.splice(targetIndexs.length - 1, 1);
}
if (sourceIndexs.length === targetIndexs.length) {
for (let i = 0; i <= sourceIndexs.length - 2; i++) if (sourceIndexs[i] !== targetIndexs[i]) return !1;
return !0;
}
return !1;
}
return !0;
}
changeOrder(sourceIndex, targetIndex) {
var _a, _b, _c;
if (null === (_a = this.dataSourceObj) || void 0 === _a ? void 0 : _a.changeOrder) this.dataSourceObj.changeOrder(sourceIndex, targetIndex); else if (!(null === (_b = this.lastSortStates) || void 0 === _b ? void 0 : _b.some((state => "asc" === state.order || "desc" === state.order))) && this.canChangeOrder(sourceIndex, targetIndex)) if (this.hasHierarchyStateExpand) {
let sourceI, targetI, sourceIndexs = this.currentPagerIndexedData[sourceIndex], targetIndexs = this.currentPagerIndexedData[targetIndex];
if (sourceIndexs = Array.isArray(sourceIndexs) ? [ ...sourceIndexs ] : [ sourceIndexs ],
targetIndexs = Array.isArray(targetIndexs) ? [ ...targetIndexs ] : [ targetIndexs ],
sourceIndexs.length > 1 || targetIndexs.length > 1) {
if (targetIndex > sourceIndex && targetIndexs.length > sourceIndexs.length) {
let targetNextIndexs = this.currentPagerIndexedData[targetIndex + 1];
targetNextIndexs = Array.isArray(targetNextIndexs) ? [ ...targetNextIndexs ] : [ targetNextIndexs ],
targetNextIndexs.length < targetIndexs.length && targetIndexs.splice(targetIndexs.length - 1, 1);
}
if (sourceI = sourceIndexs.splice(sourceIndexs.length - 1, 1)[0], targetI = targetIndexs.splice(targetIndexs.length - 1, 1)[0],
sourceIndexs.length >= 1) {
const parent = this.getOriginalRecord(sourceIndexs), sourceIds = parent.filteredChildren ? parent.filteredChildren.splice(sourceI, 1) : parent.children.splice(sourceI, 1);
sourceIds.unshift(targetI, 0), Array.prototype.splice.apply(null !== (_c = parent.filteredChildren) && void 0 !== _c ? _c : parent.children, sourceIds);
} else {
const sourceIds = this.records.splice(sourceI, 1);
sourceIds.unshift(targetI, 0), Array.prototype.splice.apply(this.records, sourceIds);
}
} else {
sourceI = this.currentPagerIndexedData[sourceIndex], targetI = this.currentPagerIndexedData[targetIndex];
const records = this.records.splice(sourceI, 1);
records.unshift(targetI, 0), Array.prototype.splice.apply(this.records, records);
}
this.restoreTreeHierarchyState(), this.updatePagerData();
} else {
const records = this.records.splice(sourceIndex, 1);
records.unshift(targetIndex, 0), Array.prototype.splice.apply(this.records, records);
}
}
restoreTreeHierarchyState() {
var _a, _b;
if (this.hierarchyExpandLevel) {
for (let i = 0; i < this._sourceLength; i++) {
const nodeData = this.getOriginalRecord(i);
(null !== (_a = nodeData.filteredChildren) && void 0 !== _a ? _a : nodeData.children) && !nodeData.hierarchyState && (nodeData.hierarchyState = ts_types_1.HierarchyState.collapse);
}
this.currentIndexedData = Array.from({
length: this._sourceLength
}, ((_, i) => i));
let nodeLength = this._sourceLength;
for (let i = 0; i < nodeLength; i++) {
const indexKey = this.currentIndexedData[i], nodeData = this.getOriginalRecord(indexKey), children = null !== (_b = nodeData.filteredChildren) && void 0 !== _b ? _b : nodeData.children;
if ((null == children ? void 0 : children.length) > 0 && nodeData.hierarchyState === ts_types_1.HierarchyState.expand) {
this.hasHierarchyStateExpand = !0;
const childrenLength = this.restoreChildrenNodeHierarchy(indexKey, nodeData);
i += childrenLength, nodeLength += childrenLength;
} else !0 === nodeData.children && !nodeData.hierarchyState && (nodeData.hierarchyState = ts_types_1.HierarchyState.collapse);
}
}
}
restoreChildrenNodeHierarchy(indexKey, nodeData) {
var _a, _b;
let childTotalLength = 0;
const children = null !== (_a = nodeData.filteredChildren) && void 0 !== _a ? _a : nodeData.children, nodeLength = null !== (_b = null == children ? void 0 : children.length) && void 0 !== _b ? _b : 0;
for (let j = 0; j < nodeLength; j++) {
nodeData.hierarchyState === ts_types_1.HierarchyState.expand && (childTotalLength += 1);
const childNodeData = children[j], childIndexKey = Array.isArray(indexKey) ? indexKey.concat(j) : [ indexKey, j ];
nodeData.hierarchyState === ts_types_1.HierarchyState.expand && this.currentIndexedData.splice(this.currentIndexedData.indexOf(indexKey) + childTotalLength, 0, childIndexKey),
childTotalLength += this.restoreChildrenNodeHierarchy(childIndexKey, childNodeData);
}
return childTotalLength;
}
}
function getValueFromDeepArray(array, index) {
var _a;
let result = array;
for (let i = 0; i < index.length; i++) {
const currentIdx = index[i];
if (!result[currentIdx]) return;
result = result[currentIdx];
const children = null !== (_a = result.filteredChildren) && void 0 !== _a ? _a : null == result ? void 0 : result.children;
children && i + 1 < index.length && (result = children);
}
return result;
}
function sortRecordIndexs(recordIndexs, sort) {
return recordIndexs.sort(((a, b) => {
var _a, _b;
(0, vutils_1.isNumber)(a) && (a = [ a ]), (0, vutils_1.isNumber)(b) && (b = [ b ]);
const length = Math.max(a.length, b.length);
for (let i = 0; i < length; i++) {
const aa = null !== (_a = a[i]) && void 0 !== _a ? _a : -1, bb = null !== (_b = b[i]) && void 0 !== _b ? _b : -1;
if (aa !== bb) return 1 === sort ? aa - bb : bb - aa;
}
return 0;
}));
}
exports.DataSource = DataSource, DataSource.EMPTY = new DataSource({
get() {},
length: 0
}), exports.getValueFromDeepArray = getValueFromDeepArray, exports.sortRecordIndexs = sortRecordIndexs;
//# sourceMappingURL=DataSource.js.map