Skip to content

Commit 34174e0

Browse files
committed
Backport of the fix for #108 from the 0.8 branch.
1 parent 10c5d57 commit 34174e0

File tree

7 files changed

+120
-18
lines changed

7 files changed

+120
-18
lines changed

dist/js/selectize.js

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2163,7 +2163,7 @@
21632163

21642164
dataAttr: 'data-data',
21652165
optgroupField: 'optgroup',
2166-
sortField: null,
2166+
sortField: '$order',
21672167
sortDirection: 'asc',
21682168
valueField: 'value',
21692169
labelField: 'text',
@@ -2244,6 +2244,7 @@
22442244
var init_select = function($input, settings_element) {
22452245
var i, n, tagName;
22462246
var $children;
2247+
var order = 0;
22472248
settings_element.maxItems = !!$input.attr('multiple') ? null : 1;
22482249

22492250
var readData = function($el) {
@@ -2255,16 +2256,22 @@
22552256
};
22562257

22572258
var addOption = function($option, group) {
2259+
var value, option;
2260+
22582261
$option = $($option);
22592262

2260-
var value = $option.attr('value') || '';
2263+
value = $option.attr('value') || '';
22612264
if (!value.length) return;
22622265

2263-
settings_element.options[value] = readData($option) || {
2266+
option = readData($option) || {
22642267
'text' : $option.text(),
22652268
'value' : value,
22662269
'optgroup' : group
22672270
};
2271+
2272+
option.$order = ++order;
2273+
settings_element.options[value] = option;
2274+
22682275
if ($option.is(':selected')) {
22692276
settings_element.items.push(value);
22702277
}

dist/js/selectize.min.js

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/standalone/selectize.js

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -258,11 +258,7 @@
258258
var field = options.sort;
259259
var multiplier = options.direction === 'desc' ? -1 : 1;
260260
return function(a, b) {
261-
a = a && String(self.items[a.id][field] || '').toLowerCase();
262-
b = b && String(self.items[b.id][field] || '').toLowerCase();
263-
if (a > b) return 1 * multiplier;
264-
if (b > a) return -1 * multiplier;
265-
return 0;
261+
return cmp(self.items[a.id][field], self.items[b.id][field]) * multiplier;
266262
};
267263
})());
268264
}
@@ -280,6 +276,17 @@
280276
// utilities
281277
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
282278

279+
var cmp = function(a, b) {
280+
if (typeof a === 'number' && typeof b === 'number') {
281+
return a > b ? 1 : (a < b ? -1 : 0);
282+
}
283+
a = String(a || '').toLowerCase();
284+
b = String(b || '').toLowerCase();
285+
if (a > b) return 1;
286+
if (b > a) return -1;
287+
return 0;
288+
};
289+
283290
var extend = function(a, b) {
284291
var i, n, k, object;
285292
for (i = 1, n = arguments.length; i < n; i++) {
@@ -454,7 +461,7 @@
454461
};
455462

456463
var utils = {
457-
isArray: Array.isArray || function() {
464+
isArray: Array.isArray || function(vArg) {
458465
return Object.prototype.toString.call(vArg) === '[object Array]';
459466
}
460467
};
@@ -2627,7 +2634,7 @@
26272634

26282635
dataAttr: 'data-data',
26292636
optgroupField: 'optgroup',
2630-
sortField: null,
2637+
sortField: '$order',
26312638
sortDirection: 'asc',
26322639
valueField: 'value',
26332640
labelField: 'text',
@@ -2708,6 +2715,7 @@
27082715
var init_select = function($input, settings_element) {
27092716
var i, n, tagName;
27102717
var $children;
2718+
var order = 0;
27112719
settings_element.maxItems = !!$input.attr('multiple') ? null : 1;
27122720

27132721
var readData = function($el) {
@@ -2719,16 +2727,22 @@
27192727
};
27202728

27212729
var addOption = function($option, group) {
2730+
var value, option;
2731+
27222732
$option = $($option);
27232733

2724-
var value = $option.attr('value') || '';
2734+
value = $option.attr('value') || '';
27252735
if (!value.length) return;
27262736

2727-
settings_element.options[value] = readData($option) || {
2737+
option = readData($option) || {
27282738
'text' : $option.text(),
27292739
'value' : value,
27302740
'optgroup' : group
27312741
};
2742+
2743+
option.$order = ++order;
2744+
settings_element.options[value] = option;
2745+
27322746
if ($option.is(':selected')) {
27332747
settings_element.items.push(value);
27342748
}

dist/js/standalone/selectize.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.

src/defaults.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ Selectize.defaults = {
1717

1818
dataAttr: 'data-data',
1919
optgroupField: 'optgroup',
20-
sortField: null,
20+
sortField: '$order',
2121
sortDirection: 'asc',
2222
valueField: 'value',
2323
labelField: 'text',

src/selectize.jquery.js

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ $.fn.selectize = function(settings) {
3434
var init_select = function($input, settings_element) {
3535
var i, n, tagName;
3636
var $children;
37+
var order = 0;
3738
settings_element.maxItems = !!$input.attr('multiple') ? null : 1;
3839

3940
var readData = function($el) {
@@ -45,16 +46,22 @@ $.fn.selectize = function(settings) {
4546
};
4647

4748
var addOption = function($option, group) {
49+
var value, option;
50+
4851
$option = $($option);
4952

50-
var value = $option.attr('value') || '';
53+
value = $option.attr('value') || '';
5154
if (!value.length) return;
5255

53-
settings_element.options[value] = readData($option) || {
56+
option = readData($option) || {
5457
'text' : $option.text(),
5558
'value' : value,
5659
'optgroup' : group
5760
};
61+
62+
option.$order = ++order;
63+
settings_element.options[value] = option;
64+
5865
if ($option.is(':selected')) {
5966
settings_element.items.push(value);
6067
}

test/setup.js

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,80 @@
3636
expect(test.selectize.options['a'].text).to.be.equal('<hi>');
3737
test.teardown();
3838
});
39+
it('should keep options in original order if no sort given', function(done) {
40+
test = setup_test([
41+
'<select multiple>',
42+
'<option value="">Select a state...</option>',
43+
'<option value="AL">Alabama</option>',
44+
'<option value="AK">Alaska</option>',
45+
'<option value="AZ">Arizona</option>',
46+
'<option value="AR">Arkansas</option>',
47+
'<option value="CA" selected>California</option>',
48+
'<option value="CO">Colorado</option>',
49+
'<option value="CT">Connecticut</option>',
50+
'<option value="DE">Delaware</option>',
51+
'<option value="DC">District of Columbia</option>',
52+
'<option value="FL">Florida</option>',
53+
'<option value="GA">Georgia</option>',
54+
'<option value="HI">Hawaii</option>',
55+
'<option value="ID">Idaho</option>',
56+
'<option value="IL">Illinois</option>',
57+
'<option value="IN">Indiana</option>',
58+
'<option value="IA">Iowa</option>',
59+
'<option value="KS">Kansas</option>',
60+
'<option value="KY">Kentucky</option>',
61+
'<option value="LA">Louisiana</option>',
62+
'<option value="ME">Maine</option>',
63+
'<option value="MD">Maryland</option>',
64+
'<option value="MA">Massachusetts</option>',
65+
'<option value="MI">Michigan</option>',
66+
'<option value="MN">Minnesota</option>',
67+
'<option value="MS">Mississippi</option>',
68+
'<option value="MO">Missouri</option>',
69+
'<option value="MT">Montana</option>',
70+
'<option value="NE">Nebraska</option>',
71+
'<option value="NV">Nevada</option>',
72+
'<option value="NH">New Hampshire</option>',
73+
'<option value="NJ">New Jersey</option>',
74+
'<option value="NM">New Mexico</option>',
75+
'<option value="NY">New York</option>',
76+
'<option value="NC">North Carolina</option>',
77+
'<option value="ND">North Dakota</option>',
78+
'<option value="OH">Ohio</option>',
79+
'<option value="OK">Oklahoma</option>',
80+
'<option value="OR">Oregon</option>',
81+
'<option value="PA">Pennsylvania</option>',
82+
'<option value="RI">Rhode Island</option>',
83+
'<option value="SC">South Carolina</option>',
84+
'<option value="SD">South Dakota</option>',
85+
'<option value="TN">Tennessee</option>',
86+
'<option value="TX">Texas</option>',
87+
'<option value="UT">Utah</option>',
88+
'<option value="VT">Vermont</option>',
89+
'<option value="VA">Virginia</option>',
90+
'<option value="WA">Washington</option>',
91+
'<option value="WV">West Virginia</option>',
92+
'<option value="WI">Wisconsin</option>',
93+
'<option value="01">01</option>',
94+
'<option value="10">10</option>',
95+
'<option value="WY" selected>Wyoming</option>',
96+
'</select>'
97+
].join(), {});
98+
99+
var order_expected = ['AL','AK','AZ','AR','CO','CT','DE','DC','FL','GA','HI','ID','IL','IN','IA','KS','KY','LA','ME','MD','MA','MI','MN','MS','MO','MT','NE','NV','NH','NJ','NM','NY','NC','ND','OH','OK','OR','PA','RI','SC','SD','TN','TX','UT','VT','VA','WA','WV','WI','01','10'];
100+
var order_actual = [];
101+
102+
test.selectize.refreshOptions(true);
103+
window.setTimeout(function() {
104+
test.selectize.$dropdown.find('[data-value]').each(function(i, el) {
105+
order_actual.push($(el).attr('data-value'));
106+
});
107+
108+
expect(order_actual).to.eql(order_expected);
109+
test.teardown();
110+
done();
111+
}, 0);
112+
});
39113
describe('getValue()', function() {
40114
it('should return "" when empty', function() {
41115
test = setup_test('<select>', {});

0 commit comments

Comments
 (0)