Share via


Use the treeview control

This page shows different samples about the treeview control.

Go to API Reference for more details.

Tip

Check out our newest documentation on extension development using the Azure DevOps Extension SDK.

Basic treeview

This sample shows the basic usage of the TreeView control. The items of tree source need to be TreeView.TreeNode.

  import Controls = require("VSS/Controls");
  import TreeView = require("VSS/Controls/TreeView");

  var container = $(".sample-container");

  var source = [
   { name: "Asia", icon: "icon icon-people", children: [
      { name: "Russia" }, 
      { name: "Afghanistan" }, 
      { name: "India" }, 
      { name: "China" }] 
   },
   { name: "Africa", icon: "icon icon-people", children: [
      { name: "Algeria" }, 
      { name: "Botswana" }, 
      { name: "Cameroon" }] 
   },
   { name: "Europe", icon: "icon icon-people", children: [
      { name: "Germany" }, 
      { name: "Slovenia" }, 
      { name: "Belgium" }, 
      { name: "Luxembourg" }, 
      { name: "Turkey" }
      ], 
      expanded: true 
   }
  ];

  // Converts the source to TreeNodes
  function convertToTreeNodes(items) {
    return $.map(items, function (item) {
      var node = new TreeView.TreeNode(item.name);
      node.icon = item.icon;
      node.expanded = item.expanded;
      if (item.children && item.children.length > 0) {
        node.addRange(convertToTreeNodes(item.children));
      }
      return node;
    });
  }

  // Generate TreeView options
  var treeviewOptions = {
    width: 400,
    height: "100%",
    nodes: convertToTreeNodes(source)
  };

  // Create the TreeView inside the specified container
  Controls.create(TreeView.TreeView, container, treeviewOptions);

Attach to node selection change

Below code works based on Basic tree example above. Attaching selectionchanged event of container element to get notified when node selection changes.

  var container = $(".sample-container");

  // Attach selectionchanged event using a DOM element containing treeview
  container.bind("selectionchanged", function (e, args) {
    var selectedNode = args.selectedNode;
    if(selectedNode) {
      alert(`${selectedNode.text} selected!`);
    }
  });

Add/remove nodes

Below code works based on Basic tree example above. This sample displays how to add nodes to TreeView as well as removing nodes from it.

  <button id="btnAdd">Add cities to Turkey</button>
  <button id="btnRemove">Remove Africa node</button>
  $("#btnAdd").click(function(e) {
    // Find the node to add new children
    var turkeyNode = treeview.rootNode.findNode("europe/turkey");
    
    // Prepare new children
    var turkeyCities = [
      new TreeView.TreeNode("Istanbul"),
      new TreeView.TreeNode("Ankara"),  
      new TreeView.TreeNode("Izmir")
    ];
    
    // Add children to the node
    turkeyNode.addRange(turkeyCities);
    // Set node expanded
    turkeyNode.expanded = true;
    // Update treeview with the new node 
    treeview.updateNode(turkeyNode);
  });

  $("#btnRemove").click(function(e) {
      // Find the node to be removed
      var africaNode = treeview.rootNode.findNode("africa");
      if(africaNode) {
        // Remove the node if exists
        treeview.removeNode(africaNode);
      } else {
        alert("Node not found");
      }
  });

Set selected node programmatically

Below code works based on Basic tree example above. It enables setting a node selected programmatically.

<button id="btnSelectedNode">Set Belgium selected</button>
$("#btnSelectedNode").click(function (e) {
  // Keep a reference to old selected node
  var oldSelectedNode = treeview.getSelectedNode();
  // Find new node to select
  var belgiumNode = treeview.rootNode.findNode("europe/belgium");
  // Set new selected node 
  treeview.setSelectedNode(belgiumNode);
  alert(`Node selection changed from ${oldSelectedNode.text} to ${belgiumNode.text}`);
});

Context menu

Below code works based on the source used in Basic tree example above. The sample shows the usage of contextMenu for each node in the treeView. The item associated with the context menu is obtained using args.get_commandArgument().item in menuItemClick function.

  function menuItemClick(args) {
    // Get the item associated with the context menu
    var node = args.get_commandArgument().item;
    switch (args.get_commandName()) {
      case "open":
        alert(node.path());
        break;
      case "delete":
        confirm(`Are you sure you want to delete ${node.text}?`);
        break;
    }
  }

  function getContextMenuItems() {
    return [
        {
          id: "open",
          text: "Open Details"
        },
        { separator: true },
        {
          id: "delete",
          text: "Delete",
          icon: "icon-delete"
        }
    ];
  }

  // Generate TreeView options
  var treeviewOptions = {
    width: 400,
    height: "100%",
    nodes: convertToTreeNodes(source), // Nodes are defined above
    contextMenu: {
      items: getContextMenuItems(),
      executeAction: menuItemClick,
      arguments: function(contextInfo) {
        return { item: contextInfo.item };
      }
    }
  };