Skip to content

Commit 62ff2d1

Browse files
committed
fix #49, support null as valid empty value
fix merge issue. add ngDisabled support
1 parent 48a1c85 commit 62ff2d1

File tree

10 files changed

+149
-65
lines changed

10 files changed

+149
-65
lines changed

bower.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "nya-bootstrap-select",
3-
"version": "2.2.0",
3+
"version": "2.3.0",
44
"main": [
55
"dist/js/nya-bs-select.js",
66
"dist/css/nya-bs-select.css"

dist/css/nya-bs-select.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/**
2-
* @lordfriend/nya-bootstrap-select v2.2.0
2+
* @lordfriend/nya-bootstrap-select v2.3.0
33
* Copyright 2014 Nyasoft
44
* Licensed under MIT license
55
*/

dist/css/nya-bs-select.min.css

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/js/nya-bs-select.js

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/**
2-
* @lordfriend/nya-bootstrap-select v2.2.0
2+
* @lordfriend/nya-bootstrap-select v2.3.0
33
* Copyright 2014 Nyasoft
44
* Licensed under MIT license
55
*/
@@ -616,29 +616,29 @@ nyaBsSelect.directive('nyaBsSelect', ['$parse', '$document', '$timeout', '$compi
616616
};
617617
}
618618
function disabledHandling(disabled){
619-
if(disabled) {
620-
dropdownToggle.addClass('disabled');
621-
dropdownToggle.attr('disabled', 'disabled');
622-
previousTabIndex = dropdownToggle.attr('tabindex');
623-
dropdownToggle.attr('tabindex', '-1');
624-
isDisabled = true;
619+
if(disabled) {
620+
dropdownToggle.addClass('disabled');
621+
dropdownToggle.attr('disabled', 'disabled');
622+
previousTabIndex = dropdownToggle.attr('tabindex');
623+
dropdownToggle.attr('tabindex', '-1');
624+
isDisabled = true;
625+
} else {
626+
dropdownToggle.removeClass('disabled');
627+
dropdownToggle.removeAttr('disabled');
628+
if(previousTabIndex) {
629+
dropdownToggle.attr('tabindex', previousTabIndex);
625630
} else {
626-
dropdownToggle.removeClass('disabled');
627-
dropdownToggle.removeAttr('disabled');
628-
if(previousTabIndex) {
629-
dropdownToggle.attr('tabindex', previousTabIndex);
630-
} else {
631-
dropdownToggle.removeAttr('tabindex');
632-
}
633-
isDisabled = false;
631+
dropdownToggle.removeAttr('tabindex');
634632
}
633+
isDisabled = false;
634+
}
635635
}
636636
if(typeof $attrs.disabled !== 'undefined') {
637637
$scope.$watch($attrs.disabled, function(disabled){
638638
disabledHandling(disabled);
639639
});
640640
}else if(typeof $attrs.ngDisabled !== 'undefined'){
641-
$scope.$watch($attrs.ngDisabled, function(disabled){
641+
$scope.$watch($attrs.ngDisabled, function(disabled){
642642
disabledHandling(disabled);
643643
});
644644
}
@@ -850,7 +850,7 @@ nyaBsSelect.directive('nyaBsSelect', ['$parse', '$document', '$timeout', '$compi
850850
bsOptionElements = dropdownMenu.children(),
851851
length = bsOptionElements.length,
852852
value;
853-
if(typeof modelValue === 'undefined') {
853+
if(typeof modelValue === 'undefined' || modelValue === null) {
854854
// if modelValue is undefined. uncheck all option
855855
for(index = 0; index < length; index++) {
856856
if(bsOptionElements.eq(index).hasClass('nya-bs-option')) {
@@ -1080,7 +1080,7 @@ nyaBsSelect.directive('nyaBsSelect', ['$parse', '$document', '$timeout', '$compi
10801080
}
10811081
}
10821082
}
1083-
1083+
10841084
function supportsSelector(selector) {
10851085
var el = document.createElement('div');
10861086
el.innerHTML = ['&shy;', '<style>', selector, '{}', '</style>'].join('');
@@ -1296,7 +1296,7 @@ nyaBsSelect.directive('nyaBsSelect', ['$parse', '$document', '$timeout', '$compi
12961296

12971297
var filterOption = jqLite(dropdownToggle[0].querySelector('.filter-option'));
12981298
var specialTitle = jqLite(dropdownToggle[0].querySelector('.special-title'));
1299-
if(typeof viewValue === 'undefined') {
1299+
if(typeof viewValue === 'undefined' || viewValue === null) {
13001300
/**
13011301
* Select empty option when model is undefined.
13021302
*/
@@ -1763,4 +1763,4 @@ nyaBsSelect.directive('nyaBsOption', ['$parse', function($parse){
17631763
}]);
17641764

17651765

1766-
})();
1766+
})();

dist/js/nya-bs-select.min.js

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/dist/js/nya-bs-select.js

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -615,24 +615,31 @@ nyaBsSelect.directive('nyaBsSelect', ['$parse', '$document', '$timeout', '$compi
615615
return !value || value.length === 0;
616616
};
617617
}
618-
if(typeof $attrs.disabled !== 'undefined') {
619-
$scope.$watch($attrs.disabled, function(disabled){
620-
if(disabled) {
621-
dropdownToggle.addClass('disabled');
622-
dropdownToggle.attr('disabled', 'disabled');
623-
previousTabIndex = dropdownToggle.attr('tabindex');
624-
dropdownToggle.attr('tabindex', '-1');
625-
isDisabled = true;
618+
function disabledHandling(disabled){
619+
if(disabled) {
620+
dropdownToggle.addClass('disabled');
621+
dropdownToggle.attr('disabled', 'disabled');
622+
previousTabIndex = dropdownToggle.attr('tabindex');
623+
dropdownToggle.attr('tabindex', '-1');
624+
isDisabled = true;
625+
} else {
626+
dropdownToggle.removeClass('disabled');
627+
dropdownToggle.removeAttr('disabled');
628+
if(previousTabIndex) {
629+
dropdownToggle.attr('tabindex', previousTabIndex);
626630
} else {
627-
dropdownToggle.removeClass('disabled');
628-
dropdownToggle.removeAttr('disabled');
629-
if(previousTabIndex) {
630-
dropdownToggle.attr('tabindex', previousTabIndex);
631-
} else {
632-
dropdownToggle.removeAttr('tabindex');
633-
}
634-
isDisabled = false;
631+
dropdownToggle.removeAttr('tabindex');
635632
}
633+
isDisabled = false;
634+
}
635+
}
636+
if(typeof $attrs.disabled !== 'undefined') {
637+
$scope.$watch($attrs.disabled, function(disabled){
638+
disabledHandling(disabled);
639+
});
640+
}else if(typeof $attrs.ngDisabled !== 'undefined'){
641+
$scope.$watch($attrs.ngDisabled, function(disabled){
642+
disabledHandling(disabled);
636643
});
637644
}
638645

@@ -1073,7 +1080,7 @@ nyaBsSelect.directive('nyaBsSelect', ['$parse', '$document', '$timeout', '$compi
10731080
}
10741081
}
10751082
}
1076-
1083+
10771084
function supportsSelector(selector) {
10781085
var el = document.createElement('div');
10791086
el.innerHTML = ['&shy;', '<style>', selector, '{}', '</style>'].join('');

docs/src/content/examples/form-control-feature.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,16 @@ Currently form control valid and disabled are supported.
66

77
### Disable a select
88

9-
To disable a select. Use `disabled="true"` as an attribute on `nya-bs-select` element. the value of this attribute is a data-binding to current scope. So you can use model to control
10-
an select being disabled or enabled. Note that `ng-disabled` are not supported.
9+
To disable a select. Use `ng-disabled="true"` as an attribute on `nya-bs-select` element. the value of this attribute is a data-binding to current scope. So you can use model to control
10+
an select being disabled or enabled. Note that in the early version `disabled` is used to support this feature, you can still use disabled but this could cause buggy in IE.
1111

1212
<example>
1313
<file name="index.html">
1414
<form>
1515
<button class="btn btn-default" ng-click="disable=!disable">
1616
{{ disable ? "Enable select" : "Disable select" }}
1717
</button>
18-
<ol class="nya-bs-select" ng-model="model" disabled="disable">
18+
<ol class="nya-bs-select" ng-model="model" ng-disabled="disable">
1919
<li nya-bs-option="option in options">
2020
<a>
2121
{{option}}

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@lordfriend/nya-bootstrap-select",
3-
"version": "2.2.0",
3+
"version": "2.3.0",
44
"description": "An angular directive wraps bootstrap-select",
55
"main": "index.js",
66
"repository": {

src/nya-bs-select.js

Lines changed: 26 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -205,24 +205,31 @@ nyaBsSelect.directive('nyaBsSelect', ['$parse', '$document', '$timeout', '$compi
205205
return !value || value.length === 0;
206206
};
207207
}
208-
if(typeof $attrs.disabled !== 'undefined') {
209-
$scope.$watch($attrs.disabled, function(disabled){
210-
if(disabled) {
211-
dropdownToggle.addClass('disabled');
212-
dropdownToggle.attr('disabled', 'disabled');
213-
previousTabIndex = dropdownToggle.attr('tabindex');
214-
dropdownToggle.attr('tabindex', '-1');
215-
isDisabled = true;
208+
function disabledHandling(disabled){
209+
if(disabled) {
210+
dropdownToggle.addClass('disabled');
211+
dropdownToggle.attr('disabled', 'disabled');
212+
previousTabIndex = dropdownToggle.attr('tabindex');
213+
dropdownToggle.attr('tabindex', '-1');
214+
isDisabled = true;
215+
} else {
216+
dropdownToggle.removeClass('disabled');
217+
dropdownToggle.removeAttr('disabled');
218+
if(previousTabIndex) {
219+
dropdownToggle.attr('tabindex', previousTabIndex);
216220
} else {
217-
dropdownToggle.removeClass('disabled');
218-
dropdownToggle.removeAttr('disabled');
219-
if(previousTabIndex) {
220-
dropdownToggle.attr('tabindex', previousTabIndex);
221-
} else {
222-
dropdownToggle.removeAttr('tabindex');
223-
}
224-
isDisabled = false;
221+
dropdownToggle.removeAttr('tabindex');
225222
}
223+
isDisabled = false;
224+
}
225+
}
226+
if(typeof $attrs.disabled !== 'undefined') {
227+
$scope.$watch($attrs.disabled, function(disabled){
228+
disabledHandling(disabled);
229+
});
230+
}else if(typeof $attrs.ngDisabled !== 'undefined'){
231+
$scope.$watch($attrs.ngDisabled, function(disabled){
232+
disabledHandling(disabled);
226233
});
227234
}
228235

@@ -433,7 +440,7 @@ nyaBsSelect.directive('nyaBsSelect', ['$parse', '$document', '$timeout', '$compi
433440
bsOptionElements = dropdownMenu.children(),
434441
length = bsOptionElements.length,
435442
value;
436-
if(typeof modelValue === 'undefined') {
443+
if(typeof modelValue === 'undefined' || modelValue === null) {
437444
// if modelValue is undefined. uncheck all option
438445
for(index = 0; index < length; index++) {
439446
if(bsOptionElements.eq(index).hasClass('nya-bs-option')) {
@@ -663,7 +670,7 @@ nyaBsSelect.directive('nyaBsSelect', ['$parse', '$document', '$timeout', '$compi
663670
}
664671
}
665672
}
666-
673+
667674
function supportsSelector(selector) {
668675
var el = document.createElement('div');
669676
el.innerHTML = ['&shy;', '<style>', selector, '{}', '</style>'].join('');
@@ -879,7 +886,7 @@ nyaBsSelect.directive('nyaBsSelect', ['$parse', '$document', '$timeout', '$compi
879886

880887
var filterOption = jqLite(dropdownToggle[0].querySelector('.filter-option'));
881888
var specialTitle = jqLite(dropdownToggle[0].querySelector('.special-title'));
882-
if(typeof viewValue === 'undefined') {
889+
if(typeof viewValue === 'undefined' || viewValue === null) {
883890
/**
884891
* Select empty option when model is undefined.
885892
*/

test/spec/dynamic-feature.js

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -400,4 +400,74 @@ describe('Features contains ngModel, option auto generate, etc;', function() {
400400

401401
expect($scope.testForm.testPicker.$setViewValue).not.toHaveBeenCalled();
402402
});
403+
404+
it('should reset select when model is null or undefined', function () {
405+
$scope.options = [
406+
{name: 'Alpha', value: 'a'},
407+
{name: 'Bravo', value: 'b'}
408+
];
409+
$scope.model = 'b';
410+
$scope.$digest();
411+
412+
var selectElement = angular.element('<form name="testForm">' +
413+
'<ol class="nya-bs-select" ng-model="model" name="testPicker">' +
414+
'<li nya-bs-option="option in options" value="option.value">' +
415+
'<a>{{option.name}}</a>' +
416+
'</li>' +
417+
'</ol>' +
418+
'</form>'
419+
);
420+
$compile(selectElement)($scope);
421+
$scope.$digest();
422+
423+
var selectedOptions = selectElement[0].querySelectorAll('li.selected');
424+
expect(selectedOptions.length).toEqual(1);
425+
426+
$scope.model = null;
427+
$scope.$digest();
428+
selectedOptions = selectElement[0].querySelectorAll('li.selected');
429+
expect(selectedOptions.length).toEqual(0);
430+
431+
$scope.model = 'a';
432+
$scope.$digest();
433+
434+
selectedOptions = selectElement[0].querySelectorAll('li.selected');
435+
expect(selectedOptions.length).toEqual(1);
436+
437+
$scope.model = undefined;
438+
$scope.$digest();
439+
440+
selectedOptions = selectElement[0].querySelectorAll('li.selected');
441+
expect(selectedOptions.length).toEqual(0);
442+
443+
});
444+
445+
it('should add/remove disabled class in dropdownToggle button when using ngDisabled', function () {
446+
$scope.options = [
447+
{name: 'Alpha', value: 'a'},
448+
{name: 'Bravo', value: 'b'}
449+
];
450+
$scope.model = 'b';
451+
$scope.$digest();
452+
$scope.disableMe = true;
453+
454+
var selectElement = angular.element('<form name="testForm">' +
455+
'<ol class="nya-bs-select" ng-model="model" name="testPicker" ng-disabled="disableMe">' +
456+
'<li nya-bs-option="option in options" value="option.value">' +
457+
'<a>{{option.name}}</a>' +
458+
'</li>' +
459+
'</ol>' +
460+
'</form>'
461+
);
462+
$compile(selectElement)($scope);
463+
$scope.$digest();
464+
465+
var dropdownToggle = selectElement[0].querySelector('.dropdown-toggle');
466+
expect(dropdownToggle.classList.contains('disabled')).toBeTruthy();
467+
468+
$scope.disableMe = false;
469+
$scope.$digest();
470+
471+
expect(dropdownToggle.classList.contains('disabled')).toBeFalsy();
472+
});
403473
});

0 commit comments

Comments
 (0)