devextreme
Version:
HTML5 JavaScript Component Suite for Responsive Web Development
208 lines (207 loc) • 7.46 kB
JavaScript
/**
* DevExtreme (esm/ui/hierarchical_collection/ui.data_converter.js)
* Version: 21.1.4
* Build date: Mon Jun 21 2021
*
* Copyright (c) 2012 - 2021 Developer Express Inc. ALL RIGHTS RESERVED
* Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
*/
import Class from "../../core/class";
import {
extend
} from "../../core/utils/extend";
import errors from "../../ui/widget/ui.errors";
import {
each
} from "../../core/utils/iterator";
import {
isDefined,
isPrimitive
} from "../../core/utils/type";
var DataConverter = Class.inherit({
ctor: function() {
this._dataStructure = [];
this._itemsCount = 0;
this._visibleItemsCount = 0
},
_indexByKey: {},
_convertItemsToNodes: function(items, parentKey) {
var that = this;
each(items, (function(_, item) {
var parentId = isDefined(parentKey) ? parentKey : that._getParentId(item);
var node = that._convertItemToNode(item, parentId);
that._dataStructure.push(node);
that._checkForDuplicateId(node.internalFields.key);
that._indexByKey[node.internalFields.key] = that._dataStructure.length - 1;
if (that._itemHasChildren(item)) {
that._convertItemsToNodes(that._dataAccessors.getters.items(item), node.internalFields.key)
}
}))
},
_checkForDuplicateId: function(key) {
if (isDefined(this._indexByKey[key])) {
throw errors.Error("E1040", key)
}
},
_getParentId: function(item) {
return "plain" === this._dataType ? this._dataAccessors.getters.parentKey(item) : void 0
},
_itemHasChildren: function(item) {
if ("plain" === this._dataType) {
return
}
var items = this._dataAccessors.getters.items(item);
return items && items.length
},
_getUniqueKey: function(item) {
var keyGetter = this._dataAccessors.getters.key;
var itemKey = keyGetter(item);
var isCorrectKey = keyGetter && (itemKey || 0 === itemKey) && isPrimitive(itemKey);
return isCorrectKey ? itemKey : this.getItemsCount()
},
_convertItemToNode: function(item, parentKey) {
this._itemsCount++;
false !== item.visible && this._visibleItemsCount++;
var node = {
internalFields: {
disabled: this._dataAccessors.getters.disabled(item, {
defaultValue: false
}),
expanded: this._dataAccessors.getters.expanded(item, {
defaultValue: false
}),
selected: this._dataAccessors.getters.selected(item, {
defaultValue: false
}),
key: this._getUniqueKey(item),
parentKey: isDefined(parentKey) ? parentKey : this._rootValue,
item: this._makeObjectFromPrimitive(item),
childrenKeys: []
}
};
extend(node, item);
delete node.items;
return node
},
setChildrenKeys: function() {
var that = this;
each(this._dataStructure, (function(_, node) {
if (node.internalFields.parentKey === that._rootValue) {
return
}
var parent = that.getParentNode(node);
parent && parent.internalFields.childrenKeys.push(node.internalFields.key)
}))
},
_makeObjectFromPrimitive: function(item) {
if (isPrimitive(item)) {
var key = item;
item = {};
this._dataAccessors.setters.key(item, key)
}
return item
},
_convertToPublicNode: function(node, parent) {
if (!node) {
return null
}
var publicNode = {
text: this._dataAccessors.getters.display(node),
key: node.internalFields.key,
selected: node.internalFields.selected,
expanded: node.internalFields.expanded,
disabled: node.internalFields.disabled,
parent: parent || null,
itemData: node.internalFields.item,
children: [],
items: []
};
if (publicNode.parent) {
publicNode.parent.children.push(publicNode);
publicNode.parent.items.push(publicNode)
}
return publicNode
},
convertToPublicNodes: function(data, parent) {
if (!data.length) {
return []
}
var that = this;
var publicNodes = [];
each(data, (function(_, node) {
node = isPrimitive(node) ? that._getByKey(node) : node;
var publicNode = that._convertToPublicNode(node, parent);
publicNode.children = that.convertToPublicNodes(node.internalFields.childrenKeys, publicNode);
publicNodes.push(publicNode);
node.internalFields.publicNode = publicNode
}));
return publicNodes
},
setDataAccessors: function(accessors) {
this._dataAccessors = accessors
},
_getByKey: function(key) {
return this._dataStructure[this.getIndexByKey(key)] || null
},
getParentNode: function(node) {
return this._getByKey(node.internalFields.parentKey)
},
getByKey: function(data, key) {
if (null === key || void 0 === key) {
return null
}
var result = null;
var that = this;
var getByKey = function(data, key) {
each(data, (function(_, element) {
var currentElementKey = element.internalFields && element.internalFields.key || that._dataAccessors.getters.key(element);
if (currentElementKey.toString() === key.toString()) {
result = element;
return false
}
}));
return result
};
return getByKey(data, key)
},
getItemsCount: function() {
return this._itemsCount
},
getVisibleItemsCount: function() {
return this._visibleItemsCount
},
updateIndexByKey: function() {
var that = this;
this._indexByKey = {};
each(this._dataStructure, (function(index, node) {
that._checkForDuplicateId(node.internalFields.key);
that._indexByKey[node.internalFields.key] = index
}))
},
updateChildrenKeys: function() {
this._indexByKey = {};
this.removeChildrenKeys();
this.updateIndexByKey();
this.setChildrenKeys()
},
removeChildrenKeys: function() {
this._indexByKey = {};
each(this._dataStructure, (function(index, node) {
node.internalFields.childrenKeys = []
}))
},
getIndexByKey: function(key) {
return this._indexByKey[key]
},
createPlainStructure: function(items, rootValue, dataType) {
this._itemsCount = 0;
this._visibleItemsCount = 0;
this._rootValue = rootValue;
this._dataType = dataType;
this._indexByKey = {};
this._convertItemsToNodes(items);
this.setChildrenKeys();
return this._dataStructure
}
});
export default DataConverter;