class TreeInterface {
constructor(tree) {
this.treeMap = this.buildTreeMap(tree);
}
buildTreeMap(tree) {
const treeMap = new Map();
const buildMap = (node) => {
treeMap.set(node.id, node);
if (node.children && node.children.length > 0) {
for (let i = 0; i < node.children.length; i++) {
buildMap(node.children[i]);
}
}
};
for (let i = 0; i < tree.length; i++) {
buildMap(tree[i]);
}
return treeMap;
}
getItemById(id) {
return this.treeMap.get(id) || null;
}
updateItemById(id, updatedItem) {
if (this.treeMap.has(id)) {
const node = this.treeMap.get(id);
Object.assign(node, updatedItem);
return true;
}
return false;
}
addNodeById(id, newNode) {
if (this.treeMap.has(id)) {
const parentNode = this.treeMap.get(id);
if (!parentNode.children) {
parentNode.children = [];
}
parentNode.children.push(newNode);
this.buildTreeMap(parentNode.children);
return true;
}
return false;
}
deleteItemById(id) {
if (this.treeMap.has(id)) {
const node = this.treeMap.get(id);
if (node && node.parentId !== -1) {
const parentNode = this.treeMap.get(node.parentId);
if (parentNode && parentNode.children && Array.isArray(parentNode.children)) {
const index = parentNode.children.findIndex((child) => child.id === id);
if (index !== -1) {
parentNode.children.splice(index, 1);
this.treeMap.delete(id);
return true;
}
}
}
}
return false;
}
addDisabledProperty(customCondition) {
for (const node of this.treeMap.values()) {
node.disabled = customCondition(node);
}
}
}