reactjs-query-builder
Version:
178 lines (150 loc) • 5.53 kB
JavaScript
;
exports.__esModule = true;
exports.getTotalNodesCountInTree = exports.getFlatTree = exports.fixPathsInTree = exports.getItemByPath = exports.expandTreeSubpath = exports.expandTreePath = undefined;
var _immutable = require('immutable');
var _immutable2 = _interopRequireDefault(_immutable);
var _clone = require('clone');
var _clone2 = _interopRequireDefault(_clone);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
/**
* @param {Immutable.List} path
* @param {...string} suffix
*/
var expandTreePath = exports.expandTreePath = function expandTreePath(path) {
for (var _len = arguments.length, suffix = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
suffix[_key - 1] = arguments[_key];
}
return path.interpose('children1').withMutations(function (list) {
list.skip(1);
list.push.apply(list, suffix);
return list;
});
};
/**
* @param {Immutable.List} path
* @param {...string} suffix
*/
var expandTreeSubpath = exports.expandTreeSubpath = function expandTreeSubpath(path) {
for (var _len2 = arguments.length, suffix = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
suffix[_key2 - 1] = arguments[_key2];
}
return path.interpose('children1').withMutations(function (list) {
list.push.apply(list, suffix);
return list;
});
};
/**
* @param {Immutable.Map} path
* @param {Immutable.List} path
*/
var getItemByPath = exports.getItemByPath = function getItemByPath(tree, path) {
var children = new _immutable2.default.OrderedMap(_defineProperty({}, tree.get('id'), tree));
var res = tree;
path.forEach(function (id) {
res = children.get(id);
children = res.get('children1');
});
return res;
};
/**
* Set correct `path` in every item
* @param {Immutable.Map} tree
* @return {Immutable.Map} tree
*/
var fixPathsInTree = exports.fixPathsInTree = function fixPathsInTree(tree) {
var newTree = tree;
function _processNode(item, path, lev) {
var id = item.get('id');
var itemPath = path.push(item.get('id'));
var currItemPath = item.get('path');
if (!currItemPath || !currItemPath.equals(itemPath)) {
newTree = newTree.setIn(expandTreePath(itemPath, 'path'), itemPath);
}
var children = item.get('children1');
if (children) {
children.map(function (child, childId) {
_processNode(child, itemPath, lev + 1);
});
}
};
_processNode(tree, new _immutable2.default.List(), 0);
return newTree;
};
/**
* @param {Immutable.Map} tree
* @return {Object} {flat, items}
*/
var getFlatTree = exports.getFlatTree = function getFlatTree(tree) {
var flat = [];
var items = {};
var realHeight = 0;
function _flatizeTree(item, path, insideCollapsed, lev, info) {
var type = item.get('type');
var collapsed = item.get('collapsed');
var id = item.get('id');
var children = item.get('children1');
var childrenIds = children ? children.map(function (child, childId) {
return childId;
}) : null;
var itemsBefore = flat.length;
var top = realHeight;
flat.push(id);
if (!insideCollapsed) realHeight += 1;
info.height = (info.height || 0) + 1;
if (children) {
var subinfo = {};
children.map(function (child, childId) {
_flatizeTree(child, path.concat(id), insideCollapsed || collapsed, lev + 1, subinfo);
});
if (!collapsed) {
info.height = (info.height || 0) + (subinfo.height || 0);
}
}
var itemsAfter = flat.length;
var bottom = realHeight;
var height = info.height;
items[id] = {
type: type,
parent: path.length ? path[path.length - 1] : null,
path: path.concat(id),
lev: lev,
leaf: !children,
index: itemsBefore,
id: id,
children: childrenIds,
_top: itemsBefore,
_height: itemsAfter - itemsBefore,
top: insideCollapsed ? null : top,
height: height,
bottom: (insideCollapsed ? null : top) + height,
collapsed: collapsed,
node: item
};
}
_flatizeTree(tree, [], false, 0, {});
for (var i = 0; i < flat.length; i++) {
var prevId = i > 0 ? flat[i - 1] : null;
var nextId = i < flat.length - 1 ? flat[i + 1] : null;
var item = items[flat[i]];
item.prev = prevId;
item.next = nextId;
}
return { flat: flat, items: items };
};
var getTotalNodesCountInTree = exports.getTotalNodesCountInTree = function getTotalNodesCountInTree(tree) {
if (!tree) return -1;
var cnt = 0;
function _processNode(item, path, lev) {
var id = item.get('id');
var children = item.get('children1');
cnt++;
if (children) {
children.map(function (child, childId) {
_processNode(child, path.concat(id), lev + 1);
});
}
};
_processNode(tree, [], 0);
return cnt;
};