Angular Tree Control
Angular Tree Control is a versatile and user-friendly npm package specifically designed for developers working with AngularJS. It provides a dynamic and interactive tree component that can be easily integrated into any Angular-based application. The primary purpose of Angular Tree Control is to display hierarchical data structures in a clear and navigable tree format, making it an ideal choice for projects that require a visual representation of nested data. This package supports a variety of operations such as expand/collapse, select/deselect, and dynamic data loading, which are essential for managing large datasets efficiently.
To start using Angular Tree Control in your project, you can easily install it by running the command `npm install angular-tree-control`. This simple installation process integrates seamlessly with your existing Angular application, allowing you to utilize the tree control component without any hassle. Once installed, Angular Tree Control can be customized to meet specific requirements, such as configuring node templates or adjusting the tree's appearance through CSS. The flexibility and ease of installation make it a popular choice among developers looking to enhance the functionality and user experience of their applications.
One of the key benefits of using Angular Tree Control is its ability to improve the overall user interface by providing a structured and interactive method for data exploration. Users can quickly navigate through complex structures, making it easier to locate specific items or understand relationships within the data. Additionally, Angular Tree Control is designed to be highly performable, ensuring that it can handle large amounts of data without compromising on speed or responsiveness. This makes it an excellent tool for applications that deal with extensive datasets and require a robust solution for data management and representation.
Core dependencies of this npm package and its dev dependencies.
grunt, grunt-release, karma-script-launcher, karma-chrome-launcher, karma-firefox-launcher, karma-html2js-preprocessor, karma-jasmine, karma-coffee-preprocessor, requirejs, karma-requirejs, karma-phantomjs-launcher, karma, grunt-karma, karma-growl-reporter, grunt-contrib-watch, grunt-contrib-connect, karma-coverage, coveralls
A README file for the angular-tree-control code repository. View Code
Pure AngularJS based tree control component.
To get started, check out wix.github.io/angular-tree-control
We have tried a number of tree controls built for angular and experience a lot of issues with each. As a result we decided to build a new tree control with the following design guidelines
Bower: bower install angular-tree-control
The tree control can be used as a Dom element or as an attribute.
Copy the script and css into your project and add a script and link tag to your page.
<script type="text/javascript" src="/angular-tree-control.js"></script>
<!-- Include context-menu module if you're going to use menu-id attribute -->
<script type="text/javascript" src="/context-menu.js"></script>
<!-- link for CSS when using the tree as a Dom element -->
<link rel="stylesheet" type="text/css" href="css/tree-control.css">
<!-- link for CSS when using the tree as an attribute -->
<link rel="stylesheet" type="text/css" href="css/tree-control-attribute.css">
Add a dependency to your application module.
angular.module('myApp', ['treeControl']);
Add tree elements to your Angular template
<!-- as a Dom element -->
<treecontrol class="tree-classic"
tree-model="dataForTheTree"
options="treeOptions"
on-selection="showSelected(node)"
selected-node="node1">
employee: {{node.name}} age {{node.age}}
</treecontrol>
<!-- as an attribute -->
<div treecontrol class="tree-classic"
tree-model="dataForTheTree"
options="treeOptions"
on-selection="showSelected(node)"
selected-node="node1">
employee: {{node.name}} age {{node.age}}
</div>
and add the data for the tree
$scope.treeOptions = {
nodeChildren: "children",
dirSelectable: true,
injectClasses: {
ul: "a1",
li: "a2",
liSelected: "a7",
iExpanded: "a3",
iCollapsed: "a4",
iLeaf: "a5",
label: "a6",
labelSelected: "a8"
}
}
$scope.dataForTheTree =
[
{ "name" : "Joe", "age" : "21", "children" : [
{ "name" : "Smith", "age" : "42", "children" : [] },
{ "name" : "Gary", "age" : "21", "children" : [
{ "name" : "Jenifer", "age" : "23", "children" : [
{ "name" : "Dani", "age" : "32", "children" : [] },
{ "name" : "Max", "age" : "34", "children" : [] }
]}
]}
]},
{ "name" : "Albert", "age" : "33", "children" : [] },
{ "name" : "Ron", "age" : "29", "children" : [] }
];
Attributes of angular treecontrol
treecontrol
: the treeview element.tree-model
: [Node|Array[Node]] the tree data on the $scope
. This can be an array of nodes or a single node.selected-node
: [Node], used when multiSelection=false
. Binding for the selected node in the tree. Updating this value updates the selection displayed in the tree. Selecting a node in the tree will update this value.selected-nodes
: [Array[Node]], used when multiSelection=true
. Binding for the selected nodes in the tree. Updating this value updates the selection displayed in the tree. Selecting a node in the tree will update this value.expanded-nodes
: [Array[Node]] binding for the expanded nodes in the tree. Updating this value updates the nodes that are expanded in the tree.on-selection
: (node, selected)
callback called whenever selecting a node in the tree. The callback expression can use the selected node (node
) and a boolean which indicates if the node was selected or deselected (selected
).on-node-toggle
: (node, expanded)
callback called whenever a node expands or collapses in the tree. The callback expression can use the toggled node (node
) and a boolean which indicates expansion or collapse (expanded
).on-right-click
: (node)
callback called whenever a node is right-clicked.options
: different options to customize the tree control.multiSelection
: [Boolean] enable multiple nodes selection in the tree.
nodeChildren
: the name of the property of each node that holds the node children. Defaults to 'children'.
dirSelectable
: are directories (nodes with children) selectable? If not, clicking on the dir label will expand and contact the dir. Defaults to true
.
allowDeselect
: are nodes deselectable? If not, clicking on the label will not deselect node. Defaults to true
.
equality
: the function used to determine equality between old nodes and new ones when checking whether a replacement node should be expanded and/or marked as selected. Defaults to a function which uses angular.equals()
on everything except the property indicated in nodeChildren
.
isLeaf
: function (node) -> boolean used to determine if a node is a leaf or branch. The default function checks for existence of children of the node to determine leaf or branch.
injectClasses
: allows to inject additional CSS classes into the tree DOM
ul
: inject classes into the ul elementsli
: inject classes into the li elements. Also allows for an external function that takes a single node
parameter.// Example:
function getBranchClass(node) {
// `matchingNodeIds` is local to a parent component controller.
if (matchingNodeIds.includes(node.id)) {
return "tree-branch-match";
}
}
liSelected
: inject classes into the li elements only when the node is selectediExpanded
: inject classes into the 'i' element for the expanded nodesiCollapsed
: inject classes into the 'i' element for the collapsed nodesiLeaf
: inject classes into the 'i' element for leaf nodeslabel
: inhject classes into the div element around the labellabelSelected
: inject classes into the div element around the label only when the node is selectedorder-by
: value for ng-repeat to use for ordering sibling nodesreverse-order
: whether or not to reverse the ordering of sibling nodes based on the value of order-by
filter-expression
: value for ng-repeat to use for filtering the sibling nodesfilter-comparator
: value for ng-repeat to use for comparing nodes with the filter expressionmenu-id
: the id of an ul element which will be displayed after a right-clickThe Angular Tree control uses a similar paradigm to ng-repeat in that it allows using the current node as well as values from
the parent scope. The current node is injected into the scope used to render the label as the node
member (unlike ng-repeat, we
do not allow to name the current node item in the transcluded scope).
In order to render a template that takes a value X
from the parent scope of the tree and value Y
from the current node, use the following template
{{X}} {{node.Y}}
The angular-tree-control renders to the following DOM structure
<treecontrol class="tree-classic">
<ul>
<li class="tree-expanded">
<i class="tree-branch-head"></i>
<i class="tree-leaf-head"></i>
<div class="tree-label">
... label - expanded angular template is in the treecontrol element ...
</div>
<treeitem>
<ul>
<li class="tree-leaf">
<i class="tree-branch-head"></i>
<i class="tree-leaf-head"></i>
<div class="tree-label tree-selected">
... label - expanded angular template is in the treecontrol element ...
</div>
</li>
<li class="tree-leaf">
<i class="tree-branch-head"></i>
<i class="tree-leaf-head"></i>
<div class="tree-label">
... label - expanded angular template is in the treecontrol element ...
</div>
</li>
</ul>
</treeitem>
</li>
</ul>
</treecontrol>
The following CSS classes are used in the built-in styles for the tree-control. Additional classes can be added using the options.injectClasses member (see above)
This tree control is based in part on the angular.treeview component
The MIT License.
See LICENSE