AngularJS Tree Menu Example for Github 

Edit / Add Node.

HTML

<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.0.6/angular.min.js"></script>
<div ng-app="myApp">
    <div ng-controller="myController">
        <div class="button_panel">
            <input type="button" value="EDIT NODE" data-ng-click="mode = 'editNode'" data-ng-disabled="!mytree.currentNode" />
            <input type="button" value="ADD CHILD" data-ng-click="mode = 'addChild'" data-ng-disabled="!mytree.currentNode" />
            <div class="input_panel" data-ng-show="mode == 'editNode'">
                 <h4>Selected Node</h4>

                <label>ID</label>
                <input data-ng-model="mytree.currentNode.id" disabled/>
                <br />
                <label>Label</label>
                <input data-ng-model="mytree.currentNode.label" />
                <br />
                <input type="button" value="DONE" class="done_button" data-ng-click="done()">
            </div>
            <div class="input_panel" data-ng-show="mode == 'addChild'">
                 <h4>New Node</h4>

                <label>ID</label>
                <input data-ng-model="temporaryNode.id" />
                <br />
                <label>Label</label>
                <input data-ng-model="temporaryNode.label" />
                <br />
                <input type="button" value="DONE" class="done_button" data-ng-click="addChildDone()">
            </div>
        </div>
        <!-- [TREE attribute] angular-treeview: the treeview directive tree-id : each tree's unique id. tree-model : the tree model on $scope. node-id : each node's id node-label : each node's label node-children: each node's children -->
        <div data-angular-treeview="true" data-tree-id="mytree" data-tree-model="roleList"></div>
    </div>
</div>

CSS

/* angular.treeview */
 div[data-angular-treeview] {
    /* prevent user selection */
    -moz-user-select: -moz-none;
    -khtml-user-select: none;
    -webkit-user-select: none;
    -ms-user-select: none;
    user-select: none;
    /* default */
    font-family: Tahoma;
    font-size:13px;
    color: #555;
    text-decoration: none;
}
div[data-tree-model] ul {
    margin: 0;
    padding: 0;
    list-style: none;
    border: none;
    overflow: hidden;
}
div[data-tree-model] li {
    position: relative;
    padding: 0 0 0 20px;
    line-height: 20px;
}
div[data-tree-model] li .expanded {
    padding: 1px 10px;
    background-image: url("http://cfile23.uf.tistory.com/image/205B973A50C13F4B19D9BD");
    background-repeat: no-repeat;
}
div[data-tree-model] li .collapsed {
    padding: 1px 10px;
    background-image: url("http://cfile23.uf.tistory.com/image/1459193A50C13F4B1B05FB");
    background-repeat: no-repeat;
}
div[data-tree-model] li .normal {
    padding: 1px 10px;
    background-image: url("http://cfile23.uf.tistory.com/image/165B663A50C13F4B196CCA");
    background-repeat: no-repeat;
}
div[data-tree-model] li i, div[data-tree-model] li span {
    cursor: pointer;
}
div[data-tree-model] li .selected {
    background-color: #aaddff;
    font-weight: bold;
    padding: 1px 5px;
}
/* example */
 label {
    display: inline-block;
    width: 30px;
    padding: 0 10px;
    font-weight: bold;
}
.button_panel {
    margin:10px 0 30px 0;
    padding:10px;
    background-color:#EEEEEE;
    border-radius:5px;
    font:12px Tahoma;
}
.input_panel {
    padding: 10px 5px;
}
.done_button {
    margin-top: 10px;
}

JavaScript

(function () {

    //angular module
    var myApp = angular.module('myApp', ['angularTreeview']);

    //test controller
    myApp.controller('myController', function ($scope) {

        //temporary node
        $scope.temporaryNode = {
            children: []
        };

        //test tree model
        $scope.roleList = [{
            label: "User",
            id: "role1",
            children: [{
                label: "subUser1",
                id: "role11",
                children: []
            }, {
                label: "subUser2",
                id: "role12",
                children: [{
                    label: "subUser2-1",
                    id: "role121",
                    children: [{
                        label: "subUser2-1-1",
                        id: "role1211",
                        children: []
                    }, {
                        label: "subUser2-1-2",
                        id: "role1212",
                        children: []
                    }]
                }]
            }]
        },

        {
            label: "Admin",
            id: "role2",
            children: []
        },

        {
            label: "Guest",
            id: "role3",
            children: []
        }];

        $scope.done = function () {
            /* reset */
            $scope.mytree.currentNode.selected = undefined;
            $scope.mytree.currentNode = undefined;
            $scope.mode = undefined;
        };

        $scope.addChildDone = function () {
            /* add child */
            if ($scope.temporaryNode.id && $scope.temporaryNode.label) {
                $scope.mytree.currentNode.children.push(angular.copy($scope.temporaryNode));
            }

            /* reset */
            $scope.temporaryNode.id = "";
            $scope.temporaryNode.label = "";

            $scope.done();
        };

    });

})();


/*
	@license Angular Treeview version 0.1.6
	ⓒ 2013 AHN JAE-HA...