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

Commit 6627376

Browse files
committed
Merge pull request #171 from just-boris/master
fix(groupBy): preserve groups in order of appearance
2 parents 59ddf64 + 360c6ff commit 6627376

File tree

5 files changed

+24
-17
lines changed

5 files changed

+24
-17
lines changed

src/bootstrap/choices.tpl.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
ng-show="$select.items.length > 0">
44
<li class="ui-select-choices-group">
55
<div class="divider" ng-show="$select.isGrouped && $index > 0"></div>
6-
<div ng-show="$select.isGrouped" class="ui-select-choices-group-label dropdown-header">{{$group}}</div>
6+
<div ng-show="$select.isGrouped" class="ui-select-choices-group-label dropdown-header">{{$group.name}}</div>
77
<div class="ui-select-choices-row" ng-class="{active: $select.isActive(this)}">
88
<a href="javascript:void(0)" class="ui-select-choices-row-inner"></a>
99
</div>

src/select.js

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -73,11 +73,11 @@
7373
};
7474

7575
self.getGroupNgRepeatExpression = function() {
76-
return '($group, $items) in $select.groups';
76+
return '$group in $select.groups';
7777
};
7878

7979
self.getNgRepeatExpression = function(itemName, source, trackByExp, grouped) {
80-
var expression = itemName + ' in ' + (grouped ? '$items' : source);
80+
var expression = itemName + ' in ' + (grouped ? '$group.items' : source);
8181
if (trackByExp) {
8282
expression += ' track by ' + trackByExp;
8383
}
@@ -146,22 +146,29 @@
146146
}
147147
};
148148

149+
ctrl.findGroupByName = function(name) {
150+
return ctrl.groups && ctrl.groups.filter(function(group) {
151+
return group.name === name;
152+
})[0];
153+
};
154+
149155
ctrl.parseRepeatAttr = function(repeatAttr, groupByExp) {
150156
function updateGroups(items) {
151-
ctrl.groups = {};
157+
ctrl.groups = [];
152158
angular.forEach(items, function(item) {
153159
var groupFn = $scope.$eval(groupByExp);
154-
var groupValue = angular.isFunction(groupFn) ? groupFn(item) : item[groupFn];
155-
if(!ctrl.groups[groupValue]) {
156-
ctrl.groups[groupValue] = [item];
160+
var groupName = angular.isFunction(groupFn) ? groupFn(item) : item[groupFn];
161+
var group = ctrl.findGroupByName(groupName);
162+
if(group) {
163+
group.items.push(item);
157164
}
158165
else {
159-
ctrl.groups[groupValue].push(item);
166+
ctrl.groups.push({name: groupName, items: [item]});
160167
}
161168
});
162169
ctrl.items = [];
163-
angular.forEach(Object.keys(ctrl.groups).sort(), function(group) {
164-
ctrl.items = ctrl.items.concat(ctrl.groups[group]);
170+
ctrl.groups.forEach(function(group) {
171+
ctrl.items = ctrl.items.concat(group.items);
165172
});
166173
}
167174

src/select2/choices.tpl.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<ul class="ui-select-choices ui-select-choices-content select2-results">
22
<li class="ui-select-choices-group" ng-class="{'select2-result-with-children': $select.isGrouped}">
3-
<div ng-show="$select.isGrouped" class="ui-select-choices-group-label select2-result-label">{{$group}}</div>
3+
<div ng-show="$select.isGrouped" class="ui-select-choices-group-label select2-result-label">{{$group.name}}</div>
44
<ul ng-class="{'select2-result-sub': $select.isGrouped, 'select2-result-single': !$select.isGrouped}">
55
<li class="ui-select-choices-row" ng-class="{'select2-highlighted': $select.isActive(this)}">
66
<div class="select2-result-label ui-select-choices-row-inner"></div>

src/selectize/choices.tpl.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<div ng-show="$select.open" class="ui-select-choices selectize-dropdown single">
22
<div class="ui-select-choices-content selectize-dropdown-content">
33
<div class="ui-select-choices-group optgroup">
4-
<div ng-show="$select.isGrouped" class="ui-select-choices-group-label optgroup-header">{{$group}}</div>
4+
<div ng-show="$select.isGrouped" class="ui-select-choices-group-label optgroup-header">{{$group.name}}</div>
55
<div class="ui-select-choices-row" ng-class="{active: $select.isActive(this)}">
66
<div class="option ui-select-choices-row-inner" data-selectable></div>
77
</div>

test/select.spec.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,7 @@ describe('ui-select tests', function() {
231231
var el = createUiSelect();
232232
expect(el.find('.ui-select-choices-group .ui-select-choices-group-label').map(function() {
233233
return this.textContent;
234-
}).toArray()).toEqual(['Baz', 'Foo', 'bar']);
234+
}).toArray()).toEqual(['Foo', 'bar', 'Baz']);
235235
});
236236

237237
it('should hide empty groups', function() {
@@ -246,16 +246,16 @@ describe('ui-select tests', function() {
246246

247247
it('should change activeItem through groups', function() {
248248
var el = createUiSelect();
249-
el.scope().$select.search = 'n';
249+
el.scope().$select.search = 't';
250250
scope.$digest();
251251
var choices = el.find('.ui-select-choices-row');
252252
expect(choices.eq(0)).toHaveClass('active');
253-
expect(getGroupLabel(choices.eq(0)).text()).toBe('Baz');
253+
expect(getGroupLabel(choices.eq(0)).text()).toBe('Foo');
254254

255255
triggerKeydown(el.find('input'), 40 /*Down*/);
256256
scope.$digest();
257257
expect(choices.eq(1)).toHaveClass('active');
258-
expect(getGroupLabel(choices.eq(1)).text()).toBe('Foo');
258+
expect(getGroupLabel(choices.eq(1)).text()).toBe('bar');
259259
});
260260
});
261261

@@ -274,7 +274,7 @@ describe('ui-select tests', function() {
274274
var el = createUiSelect();
275275
expect(el.find('.ui-select-choices-group .ui-select-choices-group-label').map(function() {
276276
return this.textContent;
277-
}).toArray()).toEqual(['even', 'odd']);
277+
}).toArray()).toEqual(['odd', 'even']);
278278
});
279279
});
280280

0 commit comments

Comments
 (0)