/// var common = MindFusion.Common; var ui = MindFusion.Common.UI; // Create some data to use for tree nodes. var treeData = [ { title: "Parent 1", items: [{ title: "Child 1.1" }, { title: "Child 1.2" }] }, { title: "Parent 2", items: [{ title: "Child 2.1" }, { title: "Child 2.2" }] }, { title: "Parent 3", items: [{ title: "Child 3.1" }, { title: "Child 3.2" }, { title: "Child 3.3" }] }]; // Create a new TreeView control. var tree = new ui.TreeView(); tree.theme = "gray"; tree.allowDrag = false; tree.fromObject(treeData); tree.itemMouseDown.addEventListener(nodeMouseDown); document.body.appendChild(tree.draw()); tree.attach(); // Handle the contextmenu JS event to prevent the default context menu from showing. tree.element.addEventListener('contextmenu', function (e) { e.preventDefault() }); // Handle the mousedown JS event to show the menu. tree.element.addEventListener('mousedown', treeMouseDown); tree.selectionChanged.addEventListener(treeSelectionChanged); // Create a new Menu control. var menu = new ui.Menu(); menu.theme = "gray"; menu.cssClass = "popmenu"; menu.visible = false; var item1 = new ui.MenuItem(); item1.template = "➕"; item1.tooltip = "Add child node"; item1.data = "child"; menu.items.add(item1); var item2 = new ui.MenuItem("Remove selected node"); item2.data = "remove"; menu.items.add(item2); menu.itemClick.addEventListener(menuItemClick); document.body.appendChild(menu.draw()); menu.attach(); function treeSelectionChanged(sender, args) { if (args.oldItems) args.oldItems.forEach((item) => console.log(item.title + " deselected")); if (args.newItems) args.newItems.forEach((item) => console.log(item.title + " selected")); } // This is the handler function for tree mousedown JS event. // Modify the menu accordingly and show it on right mouse button click. function treeMouseDown(e) { if (e.button == 2) { if (!menu.visible) { menu.left = common.Unit.pixel(e.clientX + 20); menu.top = common.Unit.pixel(e.clientY); menu.items.first().tooltip = "Add root item"; menu.items.first().data = "root"; menu.items.last().enabled = false; menu.visible = true; } } else menu.visible = false; } // This is the handler function for tree itemMouseDown event. // Modify the menu accordingly and show it on right mouse button click. function nodeMouseDown(sender, args) { if (args.rawEventArgs.button == 2) { menu.left = common.Unit.pixel(args.rawEventArgs.clientX + 20); menu.top = common.Unit.pixel(args.rawEventArgs.clientY); menu.items.first().tooltip = "Add child item"; menu.items.first().data = "child"; menu.items.last().enabled = true; menu.visible = true; } else menu.visible = false; } // This is the handler function for menu itemClick event. // If the "remove" item was clicked, remove the selected node. // If the "add" item was clicked, add a new child node (if there is a selected node), // or a new root node. function menuItemClick(sender, args) { if (args.item.data == "remove") { var node = tree.selection.first(); if (node.parentNode) node.parentNode.items.remove(node); else tree.items.remove(node); } else { var input = args.item.element.querySelector("#node_title"); if (args.rawEventArgs.target == input) return; var title = input.value || ""; var node = new ui.TreeNode(title); if (args.item.data == "root") tree.items.add(node); else tree.selection.first().items.add(node); input.value = ""; } menu.visible = false; }