123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484 |
- (function() {
- var module;
- module = angular.module('angularBootstrapNavTree', []);
- module.directive('abnTree', [
- '$timeout', function($timeout) {
- return {
- restrict: 'E',
- template: "<ul class=\"nav nav-list nav-pills nav-stacked abn-tree\">\n <li ng-repeat=\"row in tree_rows | filter:{visible:true} track by row.branch.uid\" ng-animate=\"'abn-tree-animate'\" ng-class=\"'level-' + {{ row.level }} + (row.branch.selected ? ' active':'')\" class=\"abn-tree-row\">\n <a ng-click=\"user_clicks_branch(row.branch)\">\n <i ng-class=\"row.tree_icon\" ng-click=\"row.branch.expanded = !row.branch.expanded\" class=\"indented tree-icon\"> </i>\n <span class=\"indented tree-label\">{{ row.label }} </span>\n </a>\n </li>\n</ul>",
- replace: true,
- scope: {
- treeData: '=',
- onSelect: '&',
- initialSelection: '@',
- treeControl: '='
- },
- link: function(scope, element, attrs) {
- var error, expand_all_parents, expand_level, for_all_ancestors, for_each_branch, get_parent, n, on_treeData_change, select_branch, selected_branch, tree;
- error = function(s) {
- console.log('ERROR:' + s);
- debugger;
- return void 0;
- };
- if (attrs.iconExpand == null) {
- attrs.iconExpand = 'icon-plus glyphicon glyphicon-plus fa fa-plus';
- }
- if (attrs.iconCollapse == null) {
- attrs.iconCollapse = 'icon-minus glyphicon glyphicon-minus fa fa-minus';
- }
- if (attrs.iconLeaf == null) {
- attrs.iconLeaf = 'icon-file glyphicon glyphicon-file fa fa-file';
- }
- if (attrs.expandLevel == null) {
- attrs.expandLevel = '3';
- }
- expand_level = parseInt(attrs.expandLevel, 10);
- if (!scope.treeData) {
- alert('no treeData defined for the tree!');
- return;
- }
- if (scope.treeData.length == null) {
- if (treeData.label != null) {
- scope.treeData = [treeData];
- } else {
- alert('treeData should be an array of root branches');
- return;
- }
- }
- for_each_branch = function(f) {
- var do_f, root_branch, _i, _len, _ref, _results;
- do_f = function(branch, level) {
- var child, _i, _len, _ref, _results;
- f(branch, level);
- if (branch.children != null) {
- _ref = branch.children;
- _results = [];
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- child = _ref[_i];
- _results.push(do_f(child, level + 1));
- }
- return _results;
- }
- };
- _ref = scope.treeData;
- _results = [];
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- root_branch = _ref[_i];
- _results.push(do_f(root_branch, 1));
- }
- return _results;
- };
- selected_branch = null;
- select_branch = function(branch) {
- if (!branch) {
- if (selected_branch != null) {
- selected_branch.selected = false;
- }
- selected_branch = null;
- return;
- }
- if (branch !== selected_branch) {
- if (selected_branch != null) {
- selected_branch.selected = false;
- }
- branch.selected = true;
- selected_branch = branch;
- expand_all_parents(branch);
- if (branch.onSelect != null) {
- return $timeout(function() {
- return branch.onSelect(branch);
- });
- } else {
- if (scope.onSelect != null) {
- return $timeout(function() {
- return scope.onSelect({
- branch: branch
- });
- });
- }
- }
- }
- };
- scope.user_clicks_branch = function(branch) {
- if (branch !== selected_branch) {
- return select_branch(branch);
- }
- };
- get_parent = function(child) {
- var parent;
- parent = void 0;
- if (child.parent_uid) {
- for_each_branch(function(b) {
- if (b.uid === child.parent_uid) {
- return parent = b;
- }
- });
- }
- return parent;
- };
- for_all_ancestors = function(child, fn) {
- var parent;
- parent = get_parent(child);
- if (parent != null) {
- fn(parent);
- return for_all_ancestors(parent, fn);
- }
- };
- expand_all_parents = function(child) {
- return for_all_ancestors(child, function(b) {
- return b.expanded = true;
- });
- };
- scope.tree_rows = [];
- on_treeData_change = function() {
- var add_branch_to_list, root_branch, _i, _len, _ref, _results;
- for_each_branch(function(b, level) {
- if (!b.uid) {
- return b.uid = "" + Math.random();
- }
- });
- console.log('UIDs are set.');
- for_each_branch(function(b) {
- var child, _i, _len, _ref, _results;
- if (angular.isArray(b.children)) {
- _ref = b.children;
- _results = [];
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- child = _ref[_i];
- _results.push(child.parent_uid = b.uid);
- }
- return _results;
- }
- });
- scope.tree_rows = [];
- for_each_branch(function(branch) {
- var child, f;
- if (branch.children) {
- if (branch.children.length > 0) {
- f = function(e) {
- if (typeof e === 'string') {
- return {
- label: e,
- children: []
- };
- } else {
- return e;
- }
- };
- return branch.children = (function() {
- var _i, _len, _ref, _results;
- _ref = branch.children;
- _results = [];
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- child = _ref[_i];
- _results.push(f(child));
- }
- return _results;
- })();
- }
- } else {
- return branch.children = [];
- }
- });
- add_branch_to_list = function(level, branch, visible) {
- var child, child_visible, tree_icon, _i, _len, _ref, _results;
- if (branch.expanded == null) {
- branch.expanded = false;
- }
- if (!branch.children || branch.children.length === 0) {
- tree_icon = attrs.iconLeaf;
- } else {
- if (branch.expanded) {
- tree_icon = attrs.iconCollapse;
- } else {
- tree_icon = attrs.iconExpand;
- }
- }
- scope.tree_rows.push({
- level: level,
- branch: branch,
- label: branch.label,
- tree_icon: tree_icon,
- visible: visible
- });
- if (branch.children != null) {
- _ref = branch.children;
- _results = [];
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- child = _ref[_i];
- child_visible = visible && branch.expanded;
- _results.push(add_branch_to_list(level + 1, child, child_visible));
- }
- return _results;
- }
- };
- _ref = scope.treeData;
- _results = [];
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- root_branch = _ref[_i];
- _results.push(add_branch_to_list(1, root_branch, true));
- }
- return _results;
- };
- scope.$watch('treeData', on_treeData_change, true);
- if (attrs.initialSelection != null) {
- for_each_branch(function(b) {
- if (b.label === attrs.initialSelection) {
- return $timeout(function() {
- return select_branch(b);
- });
- }
- });
- }
- n = scope.treeData.length;
- console.log('num root branches = ' + n);
- for_each_branch(function(b, level) {
- b.level = level;
- return b.expanded = b.level < expand_level;
- });
- if (scope.treeControl != null) {
- if (angular.isObject(scope.treeControl)) {
- tree = scope.treeControl;
- tree.expand_all = function() {
- return for_each_branch(function(b, level) {
- return b.expanded = true;
- });
- };
- tree.collapse_all = function() {
- return for_each_branch(function(b, level) {
- return b.expanded = false;
- });
- };
- tree.get_first_branch = function() {
- n = scope.treeData.length;
- if (n > 0) {
- return scope.treeData[0];
- }
- };
- tree.select_first_branch = function() {
- var b;
- b = tree.get_first_branch();
- return tree.select_branch(b);
- };
- tree.get_selected_branch = function() {
- return selected_branch;
- };
- tree.get_parent_branch = function(b) {
- return get_parent(b);
- };
- tree.select_branch = function(b) {
- select_branch(b);
- return b;
- };
- tree.get_children = function(b) {
- return b.children;
- };
- tree.select_parent_branch = function(b) {
- var p;
- if (b == null) {
- b = tree.get_selected_branch();
- }
- if (b != null) {
- p = tree.get_parent_branch(b);
- if (p != null) {
- tree.select_branch(p);
- return p;
- }
- }
- };
- tree.add_branch = function(parent, new_branch) {
- if (parent != null) {
- parent.children.push(new_branch);
- parent.expanded = true;
- } else {
- scope.treeData.push(new_branch);
- }
- return new_branch;
- };
- tree.add_root_branch = function(new_branch) {
- tree.add_branch(null, new_branch);
- return new_branch;
- };
- tree.expand_branch = function(b) {
- if (b == null) {
- b = tree.get_selected_branch();
- }
- if (b != null) {
- b.expanded = true;
- return b;
- }
- };
- tree.collapse_branch = function(b) {
- if (b == null) {
- b = selected_branch;
- }
- if (b != null) {
- b.expanded = false;
- return b;
- }
- };
- tree.get_siblings = function(b) {
- var p, siblings;
- if (b == null) {
- b = selected_branch;
- }
- if (b != null) {
- p = tree.get_parent_branch(b);
- if (p) {
- siblings = p.children;
- } else {
- siblings = scope.treeData;
- }
- return siblings;
- }
- };
- tree.get_next_sibling = function(b) {
- var i, siblings;
- if (b == null) {
- b = selected_branch;
- }
- if (b != null) {
- siblings = tree.get_siblings(b);
- n = siblings.length;
- i = siblings.indexOf(b);
- if (i < n) {
- return siblings[i + 1];
- }
- }
- };
- tree.get_prev_sibling = function(b) {
- var i, siblings;
- if (b == null) {
- b = selected_branch;
- }
- siblings = tree.get_siblings(b);
- n = siblings.length;
- i = siblings.indexOf(b);
- if (i > 0) {
- return siblings[i - 1];
- }
- };
- tree.select_next_sibling = function(b) {
- var next;
- if (b == null) {
- b = selected_branch;
- }
- if (b != null) {
- next = tree.get_next_sibling(b);
- if (next != null) {
- return tree.select_branch(next);
- }
- }
- };
- tree.select_prev_sibling = function(b) {
- var prev;
- if (b == null) {
- b = selected_branch;
- }
- if (b != null) {
- prev = tree.get_prev_sibling(b);
- if (prev != null) {
- return tree.select_branch(prev);
- }
- }
- };
- tree.get_first_child = function(b) {
- var _ref;
- if (b == null) {
- b = selected_branch;
- }
- if (b != null) {
- if (((_ref = b.children) != null ? _ref.length : void 0) > 0) {
- return b.children[0];
- }
- }
- };
- tree.get_closest_ancestor_next_sibling = function(b) {
- var next, parent;
- next = tree.get_next_sibling(b);
- if (next != null) {
- return next;
- } else {
- parent = tree.get_parent_branch(b);
- return tree.get_closest_ancestor_next_sibling(parent);
- }
- };
- tree.get_next_branch = function(b) {
- var next;
- if (b == null) {
- b = selected_branch;
- }
- if (b != null) {
- next = tree.get_first_child(b);
- if (next != null) {
- return next;
- } else {
- next = tree.get_closest_ancestor_next_sibling(b);
- return next;
- }
- }
- };
- tree.select_next_branch = function(b) {
- var next;
- if (b == null) {
- b = selected_branch;
- }
- if (b != null) {
- next = tree.get_next_branch(b);
- if (next != null) {
- tree.select_branch(next);
- return next;
- }
- }
- };
- tree.last_descendant = function(b) {
- var last_child;
- if (b == null) {
- debugger;
- }
- n = b.children.length;
- if (n === 0) {
- return b;
- } else {
- last_child = b.children[n - 1];
- return tree.last_descendant(last_child);
- }
- };
- tree.get_prev_branch = function(b) {
- var parent, prev_sibling;
- if (b == null) {
- b = selected_branch;
- }
- if (b != null) {
- prev_sibling = tree.get_prev_sibling(b);
- if (prev_sibling != null) {
- return tree.last_descendant(prev_sibling);
- } else {
- parent = tree.get_parent_branch(b);
- return parent;
- }
- }
- };
- return tree.select_prev_branch = function(b) {
- var prev;
- if (b == null) {
- b = selected_branch;
- }
- if (b != null) {
- prev = tree.get_prev_branch(b);
- if (prev != null) {
- tree.select_branch(prev);
- return prev;
- }
- }
- };
- }
- }
- }
- };
- }
- ]);
- }).call(this);
|