| angular.module('ui.bootstrap.buttons', []) |
| |
| .constant('uibButtonConfig', { |
| activeClass: 'active', |
| toggleEvent: 'click' |
| }) |
| |
| .controller('UibButtonsController', ['uibButtonConfig', function(buttonConfig) { |
| this.activeClass = buttonConfig.activeClass || 'active'; |
| this.toggleEvent = buttonConfig.toggleEvent || 'click'; |
| }]) |
| |
| .directive('uibBtnRadio', function() { |
| return { |
| require: ['uibBtnRadio', 'ngModel'], |
| controller: 'UibButtonsController', |
| controllerAs: 'buttons', |
| link: function(scope, element, attrs, ctrls) { |
| var buttonsCtrl = ctrls[0], ngModelCtrl = ctrls[1]; |
| |
| element.find('input').css({display: 'none'}); |
| |
| //model -> UI |
| ngModelCtrl.$render = function() { |
| element.toggleClass(buttonsCtrl.activeClass, angular.equals(ngModelCtrl.$modelValue, scope.$eval(attrs.uibBtnRadio))); |
| }; |
| |
| //ui->model |
| element.on(buttonsCtrl.toggleEvent, function() { |
| if (attrs.disabled) { |
| return; |
| } |
| |
| var isActive = element.hasClass(buttonsCtrl.activeClass); |
| |
| if (!isActive || angular.isDefined(attrs.uncheckable)) { |
| scope.$apply(function() { |
| ngModelCtrl.$setViewValue(isActive ? null : scope.$eval(attrs.uibBtnRadio)); |
| ngModelCtrl.$render(); |
| }); |
| } |
| }); |
| } |
| }; |
| }) |
| |
| .directive('uibBtnCheckbox', function() { |
| return { |
| require: ['uibBtnCheckbox', 'ngModel'], |
| controller: 'UibButtonsController', |
| controllerAs: 'button', |
| link: function(scope, element, attrs, ctrls) { |
| var buttonsCtrl = ctrls[0], ngModelCtrl = ctrls[1]; |
| |
| element.find('input').css({display: 'none'}); |
| |
| function getTrueValue() { |
| return getCheckboxValue(attrs.btnCheckboxTrue, true); |
| } |
| |
| function getFalseValue() { |
| return getCheckboxValue(attrs.btnCheckboxFalse, false); |
| } |
| |
| function getCheckboxValue(attribute, defaultValue) { |
| return angular.isDefined(attribute) ? scope.$eval(attribute) : defaultValue; |
| } |
| |
| //model -> UI |
| ngModelCtrl.$render = function() { |
| element.toggleClass(buttonsCtrl.activeClass, angular.equals(ngModelCtrl.$modelValue, getTrueValue())); |
| }; |
| |
| //ui->model |
| element.on(buttonsCtrl.toggleEvent, function() { |
| if (attrs.disabled) { |
| return; |
| } |
| |
| scope.$apply(function() { |
| ngModelCtrl.$setViewValue(element.hasClass(buttonsCtrl.activeClass) ? getFalseValue() : getTrueValue()); |
| ngModelCtrl.$render(); |
| }); |
| }); |
| } |
| }; |
| }); |
| |
| /* Deprecated buttons below */ |
| |
| angular.module('ui.bootstrap.buttons') |
| |
| .value('$buttonsSuppressWarning', false) |
| |
| .controller('ButtonsController', ['$controller', '$log', '$buttonsSuppressWarning', function($controller, $log, $buttonsSuppressWarning) { |
| if (!$buttonsSuppressWarning) { |
| $log.warn('ButtonsController is now deprecated. Use UibButtonsController instead.'); |
| } |
| |
| angular.extend(this, $controller('UibButtonsController')); |
| }]) |
| |
| .directive('btnRadio', ['$log', '$buttonsSuppressWarning', function($log, $buttonsSuppressWarning) { |
| return { |
| require: ['btnRadio', 'ngModel'], |
| controller: 'ButtonsController', |
| controllerAs: 'buttons', |
| link: function(scope, element, attrs, ctrls) { |
| if (!$buttonsSuppressWarning) { |
| $log.warn('btn-radio is now deprecated. Use uib-btn-radio instead.'); |
| } |
| |
| var buttonsCtrl = ctrls[0], ngModelCtrl = ctrls[1]; |
| |
| element.find('input').css({display: 'none'}); |
| |
| //model -> UI |
| ngModelCtrl.$render = function() { |
| element.toggleClass(buttonsCtrl.activeClass, angular.equals(ngModelCtrl.$modelValue, scope.$eval(attrs.btnRadio))); |
| }; |
| |
| //ui->model |
| element.bind(buttonsCtrl.toggleEvent, function() { |
| if (attrs.disabled) { |
| return; |
| } |
| |
| var isActive = element.hasClass(buttonsCtrl.activeClass); |
| |
| if (!isActive || angular.isDefined(attrs.uncheckable)) { |
| scope.$apply(function() { |
| ngModelCtrl.$setViewValue(isActive ? null : scope.$eval(attrs.btnRadio)); |
| ngModelCtrl.$render(); |
| }); |
| } |
| }); |
| } |
| }; |
| }]) |
| |
| .directive('btnCheckbox', ['$document', '$log', '$buttonsSuppressWarning', function($document, $log, $buttonsSuppressWarning) { |
| return { |
| require: ['btnCheckbox', 'ngModel'], |
| controller: 'ButtonsController', |
| controllerAs: 'button', |
| link: function(scope, element, attrs, ctrls) { |
| if (!$buttonsSuppressWarning) { |
| $log.warn('btn-checkbox is now deprecated. Use uib-btn-checkbox instead.'); |
| } |
| |
| var buttonsCtrl = ctrls[0], ngModelCtrl = ctrls[1]; |
| |
| element.find('input').css({display: 'none'}); |
| |
| function getTrueValue() { |
| return getCheckboxValue(attrs.btnCheckboxTrue, true); |
| } |
| |
| function getFalseValue() { |
| return getCheckboxValue(attrs.btnCheckboxFalse, false); |
| } |
| |
| function getCheckboxValue(attributeValue, defaultValue) { |
| var val = scope.$eval(attributeValue); |
| return angular.isDefined(val) ? val : defaultValue; |
| } |
| |
| //model -> UI |
| ngModelCtrl.$render = function() { |
| element.toggleClass(buttonsCtrl.activeClass, angular.equals(ngModelCtrl.$modelValue, getTrueValue())); |
| }; |
| |
| //ui->model |
| element.bind(buttonsCtrl.toggleEvent, function() { |
| if (attrs.disabled) { |
| return; |
| } |
| |
| scope.$apply(function() { |
| ngModelCtrl.$setViewValue(element.hasClass(buttonsCtrl.activeClass) ? getFalseValue() : getTrueValue()); |
| ngModelCtrl.$render(); |
| }); |
| }); |
| |
| //accessibility |
| element.on('keypress', function(e) { |
| if (attrs.disabled || e.which !== 32 || $document[0].activeElement !== element[0]) { |
| return; |
| } |
| |
| scope.$apply(function() { |
| ngModelCtrl.$setViewValue(element.hasClass(buttonsCtrl.activeClass) ? getFalseValue() : getTrueValue()); |
| ngModelCtrl.$render(); |
| }); |
| }); |
| } |
| }; |
| }]); |
| |