Skip to content
This repository was archived by the owner on Oct 2, 2019. It is now read-only.

Commit 50b6bf9

Browse files
committed
changed func. and added tests
1 parent 20f2d70 commit 50b6bf9

File tree

5 files changed

+96
-11
lines changed

5 files changed

+96
-11
lines changed

src/bootstrap/select.tpl.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<div class="ui-select-container ui-select-bootstrap dropdown" ng-class="{open: $select.open}">
22
<div class="ui-select-match"></div>
3-
<span ng-show="$select.refreshing" class="ui-select-refreshing" ng-class="{ 'glyphicon-refresh ui-select-spin': $select.refreshing }"></span>
3+
<span ng-show="$select.open && $select.refreshing && $select.spinnerEnabled" class="ui-select-refreshing {{$select.spinnerClass}}""></span>
44
<input type="search" autocomplete="off" tabindex="-1"
55
aria-expanded="true"
66
aria-label="{{ $select.baseTitle }}"

src/common.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,9 @@ var uis = angular.module('ui.select', [])
106106
generateId: function() {
107107
return latestId++;
108108
},
109-
appendToBody: false
109+
appendToBody: false,
110+
spinnerEnabled: false,
111+
spinnerClass: 'glyphicon-refresh ui-select-spin'
110112
})
111113

112114
// See Rename minErr and make it accessible from outside https://github.com/angular/angular.js/issues/6913

src/uiSelectController.js

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ uis.controller('uiSelectCtrl',
1919
ctrl.paste = uiSelectConfig.paste;
2020
ctrl.resetSearchInput = uiSelectConfig.resetSearchInput;
2121
ctrl.refreshing = false;
22+
ctrl.spinnerEnabled = uiSelectConfig.spinnerEnabled;
23+
ctrl.spinnerClass = uiSelectConfig.spinnerClass;
2224

2325
ctrl.removeSelected = uiSelectConfig.removeSelected; //If selected item(s) should be removed from dropdown list
2426
ctrl.closeOnSelect = true; //Initialized inside uiSelect directive link function
@@ -293,18 +295,20 @@ uis.controller('uiSelectCtrl',
293295
*/
294296
ctrl.refresh = function(refreshAttr) {
295297
if (refreshAttr !== undefined) {
296-
ctrl.refreshing = true;
297-
298298
// Debounce
299299
// See https://github.com/angular-ui/bootstrap/blob/0.10.0/src/typeahead/typeahead.js#L155
300300
// FYI AngularStrap typeahead does not have debouncing: https://github.com/mgcrea/angular-strap/blob/v2.0.0-rc.4/src/typeahead/typeahead.js#L177
301301
if (_refreshDelayPromise) {
302302
$timeout.cancel(_refreshDelayPromise);
303303
}
304304
_refreshDelayPromise = $timeout(function() {
305-
$scope.$eval(refreshAttr);
306-
ctrl.refreshing = false;
307-
}, ctrl.refreshDelay);
305+
var refreshPromise = $scope.$eval(refreshAttr);
306+
if (refreshPromise && angular.isFunction(refreshPromise.then) && !ctrl.refreshing) {
307+
ctrl.refreshing = true;
308+
refreshPromise.then(function() {
309+
ctrl.refreshing = false;
310+
});
311+
}}, ctrl.refreshDelay);
308312
}
309313
};
310314

src/uiSelectDirective.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,17 @@ uis.directive('uiSelect',
143143
}
144144
});
145145

146+
attrs.$observe('spinnerEnabled', function() {
147+
// $eval() is needed otherwise we get a string instead of a boolean
148+
var spinnerEnabled = scope.$eval(attrs.spinnerEnabled);
149+
$select.spinnerEnabled = spinnerEnabled !== undefined ? spinnerEnabled : uiSelectConfig.spinnerEnabled;
150+
});
151+
152+
attrs.$observe('spinnerClass', function() {
153+
var spinnerClass = attrs.spinnerClass;
154+
$select.spinnerClass = spinnerClass !== undefined ? attrs.spinnerClass : uiSelectConfig.spinnerClass;
155+
});
156+
146157
//Automatically gets focus when loaded
147158
if (angular.isDefined(attrs.autofocus)){
148159
$timeout(function(){

test/select.spec.js

Lines changed: 72 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
'use strict';
22

33
describe('ui-select tests', function() {
4-
var scope, $rootScope, $compile, $timeout, $injector, uisRepeatParser;
4+
var scope, $rootScope, $compile, $timeout, $injector, $q,uisRepeatParser ;
55

66
var Key = {
77
Enter: 13,
@@ -78,12 +78,13 @@ describe('ui-select tests', function() {
7878
});
7979
});
8080

81-
beforeEach(inject(function(_$rootScope_, _$compile_, _$timeout_, _$injector_, _uisRepeatParser_) {
81+
beforeEach(inject(function(_$rootScope_, _$compile_, _$timeout_, _$injector_,_$q_ , _uisRepeatParser_) {
8282
$rootScope = _$rootScope_;
8383
scope = $rootScope.$new();
8484
$compile = _$compile_;
8585
$timeout = _$timeout_;
8686
$injector = _$injector_;
87+
$q = _$q_;
8788
uisRepeatParser = _uisRepeatParser_;
8889
scope.selection = {};
8990

@@ -146,7 +147,8 @@ describe('ui-select tests', function() {
146147

147148
function createUiSelect(attrs) {
148149
var attrsHtml = '',
149-
matchAttrsHtml = '';
150+
matchAttrsHtml = '',
151+
choicesAttrsHtml = ''
150152
if (attrs !== undefined) {
151153
if (attrs.disabled !== undefined) { attrsHtml += ' ng-disabled="' + attrs.disabled + '"'; }
152154
if (attrs.required !== undefined) { attrsHtml += ' ng-required="' + attrs.required + '"'; }
@@ -161,12 +163,16 @@ describe('ui-select tests', function() {
161163
if (attrs.ngClass !== undefined) { attrsHtml += ' ng-class="' + attrs.ngClass + '"'; }
162164
if (attrs.resetSearchInput !== undefined) { attrsHtml += ' reset-search-input="' + attrs.resetSearchInput + '"'; }
163165
if (attrs.closeOnSelect !== undefined) { attrsHtml += ' close-on-select="' + attrs.closeOnSelect + '"'; }
166+
if (attrs.spinnerEnabled !== undefined) { attrsHtml += ' spinner-enabled="' + attrs.spinnerEnabled + '"'; }
167+
if (attrs.spinnerClass !== undefined) { attrsHtml += ' spinner-class="' + attrs.spinnerClass + '"'; }
168+
if (attrs.refresh !== undefined) { choicesAttrsHtml += ' refresh="' + attrs.refresh + '"'; }
169+
if (attrs.refreshDelay !== undefined) { choicesAttrsHtml += ' refresh-delay="' + attrs.refreshDelay + '"'; }
164170
}
165171

166172
return compileTemplate(
167173
'<ui-select ng-model="selection.selected"' + attrsHtml + '> \
168174
<ui-select-match placeholder="Pick one..."' + matchAttrsHtml + '>{{$select.selected.name}}</ui-select-match> \
169-
<ui-select-choices repeat="person in people | filter: $select.search"> \
175+
<ui-select-choices repeat="person in people | filter: $select.search"'+ choicesAttrsHtml + '"> \
170176
<div ng-bind-html="person.name | highlight: $select.search"></div> \
171177
<div ng-bind-html="person.email | highlight: $select.search"></div> \
172178
</ui-select-choices> \
@@ -3031,4 +3037,66 @@ describe('ui-select tests', function() {
30313037
});
30323038
});
30333039

3040+
describe('Test Spinner for promises',function(){
3041+
var deferred;
3042+
3043+
function getFromServer(){
3044+
deferred = $q.defer();
3045+
return deferred.promise;
3046+
}
3047+
it('should have a default value of false', function () {
3048+
var control = createUiSelect();
3049+
expect(control.scope().$select.spinnerEnabled).toEqual(false);
3050+
});
3051+
3052+
it('should have a set a value of true', function () {
3053+
var control = createUiSelect({spinnerEnabled: true});
3054+
expect(control.scope().$select.spinnerEnabled).toEqual(true);
3055+
});
3056+
3057+
it('should have a default value of glyphicon-refresh ui-select-spin', function () {
3058+
var control = createUiSelect();
3059+
expect(control.scope().$select.spinnerClass).toEqual('glyphicon-refresh ui-select-spin');
3060+
});
3061+
3062+
it('should have set a custom class value of randomclass', function () {
3063+
var control = createUiSelect({spinnerClass: 'randomclass'});
3064+
expect(control.scope().$select.spinnerClass).toEqual('randomclass');
3065+
});
3066+
3067+
it('should not display spinner when disabled', function() {
3068+
scope.getFromServer = getFromServer;
3069+
var el = createUiSelect({theme: 'bootstrap', refresh:"getFromServer($select.search)", refreshDelay:0});
3070+
openDropdown(el);
3071+
var spinner = el.find('.ui-select-refreshing');
3072+
expect(spinner.hasClass('ng-hide')).toBe(true);
3073+
setSearchText(el, 'a');
3074+
expect(spinner.hasClass('ng-hide')).toBe(true);
3075+
deferred.resolve();
3076+
scope.$digest();
3077+
expect(spinner.hasClass('ng-hide')).toBe(true);
3078+
});
3079+
3080+
it('should display spinner when enabled', function() {
3081+
scope.getFromServer = getFromServer;
3082+
var el = createUiSelect({spinnerEnabled: true,theme: 'bootstrap', refresh:"getFromServer($select.search)", refreshDelay:0});
3083+
openDropdown(el);
3084+
var spinner = el.find('.ui-select-refreshing');
3085+
expect(spinner.hasClass('ng-hide')).toBe(true);
3086+
setSearchText(el, 'a');
3087+
expect(spinner.hasClass('ng-hide')).toBe(false);
3088+
deferred.resolve();
3089+
scope.$digest();
3090+
expect(spinner.hasClass('ng-hide')).toBe(true);
3091+
});
3092+
3093+
it('should not display spinner when enabled', function() {
3094+
var el = createUiSelect({spinnerEnabled: true,theme: 'bootstrap', spinnerClass: 'randomclass'});
3095+
openDropdown(el);
3096+
var spinner = el.find('.ui-select-refreshing');
3097+
setSearchText(el, 'a');
3098+
expect(el.scope().$select.spinnerClass).toBe('randomclass');
3099+
});
3100+
});
3101+
30343102
});

0 commit comments

Comments
 (0)