Skip to content

Commit f704c25

Browse files
committed
Crude initial implementation of #76.
1 parent c0f3b46 commit f704c25

File tree

3 files changed

+59
-11
lines changed

3 files changed

+59
-11
lines changed

examples/optgroups.html

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,29 @@ <h2>Optgroups (basic)</h2>
6161
</script>
6262
</div>
6363

64+
<div class="demo">
65+
<h2>Optgroups (repeated options)</h2>
66+
<div class="control-group">
67+
<label for="select-repeated-options">Options:</label>
68+
<select id="select-repeated-options" class="demo-default" multiple>
69+
<option value="">Select...</option>
70+
<optgroup label="Group 1">
71+
<option value="a">Item A</option>
72+
<option value="b">Item B</option>
73+
</optgroup>
74+
<optgroup label="Group 2">
75+
<option value="a">Item A</option>
76+
<option value="b">Item B</option>
77+
</optgroup>
78+
</select>
79+
</div>
80+
<script>
81+
$('#select-repeated-options').selectize({
82+
sortField: 'text'
83+
});
84+
</script>
85+
</div>
86+
6487
<div class="demo">
6588
<h2>Optgroups (programmatic)</h2>
6689
<div class="control-group">

src/selectize.jquery.js

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ $.fn.selectize = function(settings) {
3535
var i, n, tagName;
3636
var $children;
3737
var order = 0;
38+
var options = settings_element.options;
39+
3840
settings_element.maxItems = !!$input.attr('multiple') ? null : 1;
3941

4042
var readData = function($el) {
@@ -53,14 +55,31 @@ $.fn.selectize = function(settings) {
5355
value = $option.attr('value') || '';
5456
if (!value.length) return;
5557

58+
// if the option already exists, it's probably been
59+
// duplicated in another optgroup. in this case, push
60+
// the current group to the "optgroup" property on the
61+
// existing option so that it's rendered in both places.
62+
if (options.hasOwnProperty(value)) {
63+
if (group) {
64+
if (!options[value].optgroup) {
65+
options[value].optgroup = group;
66+
} else if (!$.isArray(options[value].optgroup)) {
67+
options[value].optgroup = [options[value].optgroup, group];
68+
} else {
69+
options[value].optgroup.push(group);
70+
}
71+
}
72+
return;
73+
}
74+
5675
option = readData($option) || {
5776
'text' : $option.text(),
5877
'value' : value,
5978
'optgroup' : group
6079
};
6180

6281
option.$order = ++order;
63-
settings_element.options[value] = option;
82+
options[value] = option;
6483

6584
if ($option.is(':selected')) {
6685
settings_element.items.push(value);

src/selectize.js

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -844,7 +844,7 @@ $.extend(Selectize.prototype, {
844844
}
845845

846846
var self = this;
847-
var i, n, groups, groups_order, option, optgroup, html, html_children;
847+
var i, j, k, n, groups, groups_order, option, option_html, optgroup, optgroups, html, html_children;
848848
var hasCreateOption;
849849
var query = self.$control_input.val();
850850
var results = self.search(query);
@@ -870,16 +870,22 @@ $.extend(Selectize.prototype, {
870870
}
871871

872872
for (i = 0; i < n; i++) {
873-
option = self.options[results.items[i].id];
874-
optgroup = option[self.settings.optgroupField] || '';
875-
if (!self.optgroups.hasOwnProperty(optgroup)) {
876-
optgroup = '';
877-
}
878-
if (!groups.hasOwnProperty(optgroup)) {
879-
groups[optgroup] = [];
880-
groups_order.push(optgroup);
873+
option = self.options[results.items[i].id];
874+
option_html = self.render('option', option);
875+
optgroup = option[self.settings.optgroupField] || '';
876+
optgroups = $.isArray(optgroup) ? optgroup : [optgroup];
877+
878+
for (j = 0, k = optgroups && optgroups.length; j < k; j++) {
879+
optgroup = optgroups[j];
880+
if (!self.optgroups.hasOwnProperty(optgroup)) {
881+
optgroup = '';
882+
}
883+
if (!groups.hasOwnProperty(optgroup)) {
884+
groups[optgroup] = [];
885+
groups_order.push(optgroup);
886+
}
887+
groups[optgroup].push(option_html);
881888
}
882-
groups[optgroup].push(self.render('option', option));
883889
}
884890

885891
// render optgroup headers & join groups

0 commit comments

Comments
 (0)