From 54960a50d59aa0ec9e3a2b38d7d615f95cd2e109 Mon Sep 17 00:00:00 2001 From: Wesley Cho Date: Fri, 30 Oct 2015 19:26:08 -0700 Subject: [PATCH] feat(buttons): add uib-uncheckable support - Add support for `uib-uncheckable` with uib-btn-radio --- src/buttons/buttons.js | 11 +++++++++-- src/buttons/docs/demo.html | 7 ++++++- src/buttons/docs/readme.md | 4 ++++ src/buttons/test/buttons.spec.js | 14 ++++++++++++++ 4 files changed, 33 insertions(+), 3 deletions(-) diff --git a/src/buttons/buttons.js b/src/buttons/buttons.js index 79f8c43cca..1548bead3b 100644 --- a/src/buttons/buttons.js +++ b/src/buttons/buttons.js @@ -10,13 +10,14 @@ angular.module('ui.bootstrap.buttons', []) this.toggleEvent = buttonConfig.toggleEvent || 'click'; }]) -.directive('uibBtnRadio', function() { +.directive('uibBtnRadio', ['$parse', function($parse) { return { require: ['uibBtnRadio', 'ngModel'], controller: 'UibButtonsController', controllerAs: 'buttons', link: function(scope, element, attrs, ctrls) { var buttonsCtrl = ctrls[0], ngModelCtrl = ctrls[1]; + var uncheckableExpr = $parse(attrs.uibUncheckable); element.find('input').css({display: 'none'}); @@ -40,9 +41,15 @@ angular.module('ui.bootstrap.buttons', []) }); } }); + + if (attrs.uibUncheckable) { + scope.$watch(uncheckableExpr, function(uncheckable) { + attrs.$set('uncheckable', uncheckable ? '' : null); + }); + } } }; -}) +}]) .directive('uibBtnCheckbox', function() { return { diff --git a/src/buttons/docs/demo.html b/src/buttons/docs/demo.html index 72b0b39311..1ceeabbc60 100644 --- a/src/buttons/docs/demo.html +++ b/src/buttons/docs/demo.html @@ -22,6 +22,11 @@

Radio & Uncheckable Radio

- + +
+
+
diff --git a/src/buttons/docs/readme.md b/src/buttons/docs/readme.md index 9367d50f08..500bcf5306 100644 --- a/src/buttons/docs/readme.md +++ b/src/buttons/docs/readme.md @@ -24,6 +24,10 @@ With the buttons directive, we can make a group of buttons behave like a set of * `uncheckable` _(Boolean attribute)_ - Whether a radio button can be unchecked or not. + +* `uib-uncheckable` + _(Default: null)_ - + An expression that evaluates to a truthy or falsy value that determines whether the `uncheckable` attribute is present ### Default settings `uibButtonConfig` diff --git a/src/buttons/test/buttons.spec.js b/src/buttons/test/buttons.spec.js index 1f6ee16619..6116119a8f 100644 --- a/src/buttons/test/buttons.spec.js +++ b/src/buttons/test/buttons.spec.js @@ -322,5 +322,19 @@ describe('buttons', function() { expect(btns.eq(1)).not.toHaveClass('active'); }); }); + + describe('uibUncheckable', function() { + it('should set uncheckable', function() { + $scope.uncheckable = false; + var btns = compileButtons('', $scope); + expect(btns.eq(0).attr('uncheckable')).toBeUndefined(); + expect(btns.eq(0).attr('uncheckable')).toBeUndefined(); + + $scope.uncheckable = true; + $scope.$digest(); + expect(btns.eq(0).attr('uncheckable')).toBeUndefined(); + expect(btns.eq(1).attr('uncheckable')).toBeDefined(); + }); + }); }); });