-
Notifications
You must be signed in to change notification settings - Fork 0
/
ng-infinimenu.js
123 lines (102 loc) · 3.39 KB
/
ng-infinimenu.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
angular.module('agh.multimenu', ['templates/multimenu.html', 'templates/menu_item.html'])
.service('menuService', ['$rootScope', function($rootScope) {
var visible;
this.setState = function(visible){
var visible = visible;
}
this.toggleVisible = function(){
visible = !visible;
$rootScope.$apply();
}
this.getVisible = function(){
return visible;
}
}])
.controller('MenuController', ['$scope', 'menuService', function($scope, menuService) {
var menu = this;
$scope.activeLevel = 0;
$scope.menuService = menuService;
menu.clickPath = [];
$scope.isVisible;
menu.init = function(visible){
$scope.isVisible = visible;
}
$scope.$watch('menuService.getVisible()', function(newValue, oldValue) {
if(newValue === oldValue){
return;
}
$scope.isVisible = newValue;
});
menu.incrementActiveLevel = function(){
$scope.activeLevel = $scope.activeLevel + 1;
}
menu.decrementActiveLevel = function(){
$scope.activeLevel = $scope.activeLevel - 1;
menu.clickPath[menu.clickPath.length - 1].removeClass('active');
menu.clickPath.pop();
$scope.$apply();
}
menu.setActiveItem = function(element){
element.addClass('active');
menu.clickPath.push(element);
$scope.$apply();
}
}])
.directive( 'multimenu', function () {
return {
restrict: 'EA',
replace: true,
templateUrl: '../templates/multimenu.html',
scope: {
menuitems: '=',
visible: '='
},
controller: 'MenuController',
link: function(scope, element, attrs, ctrl){
ctrl.init(scope.visible)
}
};
})
.directive( 'backbutton', function () {
return {
restrict: 'EA',
scope: {},
require: '^multimenu',
link: function(scope, element, attrs, ctrl) {
element.bind('click', function(){
ctrl.decrementActiveLevel();
})
}
};
})
.directive( 'closebutton', function () {
return {
restrict: 'EA',
scope: {},
require: '^multimenu',
controller: function($element, menuService){
$element.bind('click', function(){
menuService.toggleVisible();
});
}
};
})
.directive( 'menuitem', function () {
return {
restrict: 'EA',
require: '^multimenu',
link: function(scope, element, attrs, ctrls) {
var menuCtrl = ctrls;
element.bind('click', function(){
menuCtrl.incrementActiveLevel();
menuCtrl.setActiveItem(element);
});
}
};
})
angular.module("templates/multimenu.html", []).run(["$templateCache", function($templateCache) {
$templateCache.put("templates/multimenu.html");
}]);
angular.module("templates/menu_item.html", []).run(["$templateCache", function($templateCache) {
$templateCache.put("templates/menu_item.html");
}]);