@kaspersky/components
Version:
Kaspersky Design System UI Kit
103 lines (102 loc) • 2.34 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.checkNode = checkNode;
exports.getNodes = getNodes;
exports.getParents = getParents;
exports.hasUncheckedChildren = hasUncheckedChildren;
exports.sortCheckedKeys = sortCheckedKeys;
exports.uncheckNode = uncheckNode;
function hasUncheckedChildren(node, checked) {
if (!node.children) {
return false;
}
for (const child of node.children) {
if (!checked.has(child.key)) {
return true;
}
}
return false;
}
function checkNode(node, checkChildren, checked, halfChecked) {
if (checkChildren) {
checked.add(node.key);
halfChecked.delete(node.key);
if (!node.children) {
return;
}
for (const child of node.children) {
checkNode(child, checkChildren, checked, halfChecked);
}
} else {
if (hasUncheckedChildren(node, checked)) {
halfChecked.add(node.key);
} else {
checked.add(node.key);
}
}
}
function uncheckNode(node, uncheckChildren, checked, halfChecked) {
checked.delete(node.key);
halfChecked.delete(node.key);
if (!uncheckChildren || !node.children) {
return;
}
for (const child of node.children) {
uncheckNode(child, uncheckChildren, checked, halfChecked);
}
}
function getParents(treeData) {
const out = {};
const collect = node => {
if (!node.children) {
return;
}
for (const child of node.children) {
out[child.key] = node;
collect(child);
}
};
if (treeData) {
treeData.forEach(collect);
}
return out;
}
function getNodes(treeData) {
const out = {};
const collect = node => {
var _node$children;
out[node.key] = node;
(_node$children = node.children) === null || _node$children === void 0 ? void 0 : _node$children.forEach(collect);
};
if (treeData) {
treeData.forEach(collect);
}
return out;
}
function sortCheckedKeys(treeData, keys) {
if (!keys) {
return {
checked: [],
halfChecked: []
};
}
const nodes = getNodes(treeData);
const checked = [];
const halfChecked = [];
for (const key of keys) {
if (!nodes[key]) {
continue;
}
if (hasUncheckedChildren(nodes[key], new Set(keys))) {
halfChecked.push(key);
} else {
checked.push(key);
}
}
return {
checked,
halfChecked
};
}