blob: 14ed715a9ec19b5922408434859be129c817ea1b [file] [log] [blame]
Matteo Scandolo46b56102015-12-16 14:23:08 -08001angular.module('ui.bootstrap.buttons', [])
2
3.constant('uibButtonConfig', {
4 activeClass: 'active',
5 toggleEvent: 'click'
6})
7
8.controller('UibButtonsController', ['uibButtonConfig', function(buttonConfig) {
9 this.activeClass = buttonConfig.activeClass || 'active';
10 this.toggleEvent = buttonConfig.toggleEvent || 'click';
11}])
12
13.directive('uibBtnRadio', function() {
14 return {
15 require: ['uibBtnRadio', 'ngModel'],
16 controller: 'UibButtonsController',
17 controllerAs: 'buttons',
18 link: function(scope, element, attrs, ctrls) {
19 var buttonsCtrl = ctrls[0], ngModelCtrl = ctrls[1];
20
21 element.find('input').css({display: 'none'});
22
23 //model -> UI
24 ngModelCtrl.$render = function() {
25 element.toggleClass(buttonsCtrl.activeClass, angular.equals(ngModelCtrl.$modelValue, scope.$eval(attrs.uibBtnRadio)));
26 };
27
28 //ui->model
29 element.on(buttonsCtrl.toggleEvent, function() {
30 if (attrs.disabled) {
31 return;
32 }
33
34 var isActive = element.hasClass(buttonsCtrl.activeClass);
35
36 if (!isActive || angular.isDefined(attrs.uncheckable)) {
37 scope.$apply(function() {
38 ngModelCtrl.$setViewValue(isActive ? null : scope.$eval(attrs.uibBtnRadio));
39 ngModelCtrl.$render();
40 });
41 }
42 });
43 }
44 };
45})
46
47.directive('uibBtnCheckbox', function() {
48 return {
49 require: ['uibBtnCheckbox', 'ngModel'],
50 controller: 'UibButtonsController',
51 controllerAs: 'button',
52 link: function(scope, element, attrs, ctrls) {
53 var buttonsCtrl = ctrls[0], ngModelCtrl = ctrls[1];
54
55 element.find('input').css({display: 'none'});
56
57 function getTrueValue() {
58 return getCheckboxValue(attrs.btnCheckboxTrue, true);
59 }
60
61 function getFalseValue() {
62 return getCheckboxValue(attrs.btnCheckboxFalse, false);
63 }
64
65 function getCheckboxValue(attribute, defaultValue) {
66 return angular.isDefined(attribute) ? scope.$eval(attribute) : defaultValue;
67 }
68
69 //model -> UI
70 ngModelCtrl.$render = function() {
71 element.toggleClass(buttonsCtrl.activeClass, angular.equals(ngModelCtrl.$modelValue, getTrueValue()));
72 };
73
74 //ui->model
75 element.on(buttonsCtrl.toggleEvent, function() {
76 if (attrs.disabled) {
77 return;
78 }
79
80 scope.$apply(function() {
81 ngModelCtrl.$setViewValue(element.hasClass(buttonsCtrl.activeClass) ? getFalseValue() : getTrueValue());
82 ngModelCtrl.$render();
83 });
84 });
85 }
86 };
87});
88
89/* Deprecated buttons below */
90
91angular.module('ui.bootstrap.buttons')
92
93 .value('$buttonsSuppressWarning', false)
94
95 .controller('ButtonsController', ['$controller', '$log', '$buttonsSuppressWarning', function($controller, $log, $buttonsSuppressWarning) {
96 if (!$buttonsSuppressWarning) {
97 $log.warn('ButtonsController is now deprecated. Use UibButtonsController instead.');
98 }
99
100 angular.extend(this, $controller('UibButtonsController'));
101 }])
102
103 .directive('btnRadio', ['$log', '$buttonsSuppressWarning', function($log, $buttonsSuppressWarning) {
104 return {
105 require: ['btnRadio', 'ngModel'],
106 controller: 'ButtonsController',
107 controllerAs: 'buttons',
108 link: function(scope, element, attrs, ctrls) {
109 if (!$buttonsSuppressWarning) {
110 $log.warn('btn-radio is now deprecated. Use uib-btn-radio instead.');
111 }
112
113 var buttonsCtrl = ctrls[0], ngModelCtrl = ctrls[1];
114
115 element.find('input').css({display: 'none'});
116
117 //model -> UI
118 ngModelCtrl.$render = function() {
119 element.toggleClass(buttonsCtrl.activeClass, angular.equals(ngModelCtrl.$modelValue, scope.$eval(attrs.btnRadio)));
120 };
121
122 //ui->model
123 element.bind(buttonsCtrl.toggleEvent, function() {
124 if (attrs.disabled) {
125 return;
126 }
127
128 var isActive = element.hasClass(buttonsCtrl.activeClass);
129
130 if (!isActive || angular.isDefined(attrs.uncheckable)) {
131 scope.$apply(function() {
132 ngModelCtrl.$setViewValue(isActive ? null : scope.$eval(attrs.btnRadio));
133 ngModelCtrl.$render();
134 });
135 }
136 });
137 }
138 };
139 }])
140
141 .directive('btnCheckbox', ['$document', '$log', '$buttonsSuppressWarning', function($document, $log, $buttonsSuppressWarning) {
142 return {
143 require: ['btnCheckbox', 'ngModel'],
144 controller: 'ButtonsController',
145 controllerAs: 'button',
146 link: function(scope, element, attrs, ctrls) {
147 if (!$buttonsSuppressWarning) {
148 $log.warn('btn-checkbox is now deprecated. Use uib-btn-checkbox instead.');
149 }
150
151 var buttonsCtrl = ctrls[0], ngModelCtrl = ctrls[1];
152
153 element.find('input').css({display: 'none'});
154
155 function getTrueValue() {
156 return getCheckboxValue(attrs.btnCheckboxTrue, true);
157 }
158
159 function getFalseValue() {
160 return getCheckboxValue(attrs.btnCheckboxFalse, false);
161 }
162
163 function getCheckboxValue(attributeValue, defaultValue) {
164 var val = scope.$eval(attributeValue);
165 return angular.isDefined(val) ? val : defaultValue;
166 }
167
168 //model -> UI
169 ngModelCtrl.$render = function() {
170 element.toggleClass(buttonsCtrl.activeClass, angular.equals(ngModelCtrl.$modelValue, getTrueValue()));
171 };
172
173 //ui->model
174 element.bind(buttonsCtrl.toggleEvent, function() {
175 if (attrs.disabled) {
176 return;
177 }
178
179 scope.$apply(function() {
180 ngModelCtrl.$setViewValue(element.hasClass(buttonsCtrl.activeClass) ? getFalseValue() : getTrueValue());
181 ngModelCtrl.$render();
182 });
183 });
184
185 //accessibility
186 element.on('keypress', function(e) {
187 if (attrs.disabled || e.which !== 32 || $document[0].activeElement !== element[0]) {
188 return;
189 }
190
191 scope.$apply(function() {
192 ngModelCtrl.$setViewValue(element.hasClass(buttonsCtrl.activeClass) ? getFalseValue() : getTrueValue());
193 ngModelCtrl.$render();
194 });
195 });
196 }
197 };
198 }]);
199