romo 0.19.4 → 0.19.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA512:
3
- metadata.gz: 05431cecaec71b465c4986bf8aa7df0e2a71c88a693c4d082f8937c0e562c351371e4dd45e945881297f2316a14498194969f712ceb6465cacc2532e03f78d7b
4
- data.tar.gz: 85887b774157ab564966b5007f4f0f04c51140af7a3be6e792d01731793801a6177ffc2c20538fea6c6f63afcbd2f263e7d1789b0addd8344471f4da6180f28c
5
2
  SHA1:
6
- metadata.gz: b24ab8cacb24c8fa5e9a7a64854ee8eb9f85a5f1
7
- data.tar.gz: 69de9ee98dabfef298bbe7b5e9fb1bf1339e133a
3
+ metadata.gz: 4fc3f8ffd4150f3516e977cc2c65e3fd25862848
4
+ data.tar.gz: 792b1f359b813c11cb40a595e23cd36aadd7f6e6
5
+ SHA512:
6
+ metadata.gz: 112164a4224eb8e7ac852de31606510b95ae4a52063ab9ccb40598e458955b72bcba9d991671f1d649adc770162059b74bc7a3cc25a0ea039a3e134cfb1e618d
7
+ data.tar.gz: e513bd994b174937fb9c6c5d3aa15c6c03a78020447705ec54c145bfad17ea67b6e5cd2093b6b47e5a614ba05bd84a79558064b98b5dfd26816b239ddd0cd565
@@ -342,12 +342,13 @@
342
342
  padding-left: $spacingSize1;
343
343
  }
344
344
 
345
- .romo-input-option-list LI {
345
+ .romo-input-option-list LI[data-romo-option-list-dropdown-item="opt"] {
346
346
  @include input-option-list-option;
347
347
  }
348
348
 
349
- .romo-input-option-list LI[data-romo-option-list-item="optgroup"] {
349
+ .romo-input-option-list LI[data-romo-option-list-dropdown-item="optgroup"] {
350
350
  @include input-option-list-optgroup;
351
+ padding: 0 $spacingSize0;
351
352
  }
352
353
 
353
354
  .romo-input-option-list LI.romo-option-list-dropdown-highlight {
@@ -5,12 +5,15 @@ $.fn.romoOptionListDropdown = function() {
5
5
  }
6
6
 
7
7
  var RomoOptionListDropdown = function(element) {
8
- this.elem = $(element);
9
- this.prevValue = '';
8
+ this.elem = $(element);
9
+
10
+ this.prevValue = '';
11
+ this.optionListItems = [];
10
12
 
11
13
  var selCustomization = this.elem.data('romo-option-list-dropdown-item-selector-customization') || '';
12
14
  this.itemSelector = 'LI[data-romo-option-list-dropdown-item="opt"]:not(.disabled)'+selCustomization;
13
15
  this.focusStyleClass = this.elem.data('romo-option-list-focus-style-class');
16
+ this.openOnFocus = this.elem.data('romo-option-list-dropdown-open-on-focus');
14
17
 
15
18
  this.doInit();
16
19
  this._bindElem();
@@ -44,6 +47,10 @@ RomoOptionListDropdown.prototype.selectedItemText = function() {
44
47
  return this.elem.attr('data-romo-option-list-dropdown-selected-text');
45
48
  }
46
49
 
50
+ RomoOptionListDropdown.prototype.optionFilterValue = function() {
51
+ return this.optionFilterElem.val();
52
+ }
53
+
47
54
  RomoOptionListDropdown.prototype.optItemElems = function() {
48
55
  return this.romoDropdown.bodyElem.find('LI[data-romo-option-list-dropdown-item="opt"]');
49
56
  }
@@ -80,7 +87,8 @@ RomoOptionListDropdown.prototype.doSetSelectedValueAndText = function(newValue,
80
87
  Options are specified as a list of items. Each 'option' item object
81
88
  has either display text or html, a value, and can optionally be
82
89
  selected or disabled. Each 'optgroup' item object has a label and
83
- a list of items.
90
+ a list of items. Option groups cannot contain other option groups in
91
+ their items.
84
92
 
85
93
  Example:
86
94
  [ { 'type': 'option', 'value': 'a', 'displayText': 'A', 'displayHtml': 'A' },
@@ -100,6 +108,7 @@ Example:
100
108
  */
101
109
 
102
110
  RomoOptionListDropdown.prototype.doSetListItems = function(itemsList) {
111
+ this.optionListItems = itemsList;
103
112
  this.optionListContainer.html(this._buildListElem(itemsList));
104
113
 
105
114
  this._updateOptionsListUI();
@@ -210,7 +219,7 @@ RomoOptionListDropdown.prototype._buildListOptionElem = function(item) {
210
219
  return itemElem;
211
220
  }
212
221
 
213
- RomoOptionListDropdown.prototype._buildListOptGroupElemItem = function(item) {
222
+ RomoOptionListDropdown.prototype._buildListOptGroupElem = function(item) {
214
223
  var itemElem = $('<li data-romo-option-list-dropdown-item="optgroup"></li>');
215
224
 
216
225
  itemElem.text(item.label);
@@ -251,6 +260,12 @@ RomoOptionListDropdown.prototype._bindDropdownOptionFilter = function() {
251
260
  // remove any manual elem focus when elem is actually focused
252
261
  this.optionFilterFocused = false;
253
262
  this.romoDropdown.elem.removeClass(this.focusStyleClass);
263
+
264
+ if (this.openOnFocus === true) {
265
+ this.romoDropdown.elem.trigger('dropdown:triggerPopupOpen', []);
266
+ } else {
267
+ this.openOnFocus = this.elem.data('romo-option-list-dropdown-open-on-focus');
268
+ }
254
269
  }, this));
255
270
  this.romoDropdown.elem.on('blur', $.proxy(function(e) {
256
271
  if (this.blurTimeoutId !== undefined) {
@@ -283,6 +298,7 @@ RomoOptionListDropdown.prototype._bindDropdownOptionFilter = function() {
283
298
  this.optionFilterElem.trigger('indicatorTextInput:triggerPlaceIndicator');
284
299
  this.optionFilterElem.focus();
285
300
  this._filterOptionElems();
301
+ this.openOnFocus = false;
286
302
  }, this));
287
303
  this.romoDropdown.elem.on('dropdown:popupClose', $.proxy(function(e, dropdown) {
288
304
  this.optionFilterElem.val('');
@@ -334,7 +350,7 @@ RomoOptionListDropdown.prototype._updateOptionsListUI = function(highlightOption
334
350
  }
335
351
 
336
352
  RomoOptionListDropdown.prototype._selectHighlightedItem = function() {
337
- var curr = this._getHighlightedItem();
353
+ var curr = this._getHighlightedItemElem();
338
354
  if (curr.length !== 0) {
339
355
  var prevValue = this.prevValue;
340
356
  var newValue = curr.data('romo-option-list-dropdown-option-value');
@@ -481,49 +497,84 @@ RomoOptionListDropdown.prototype._scrollBottomToItem = function(item) {
481
497
  }
482
498
 
483
499
  RomoOptionListDropdown.prototype._nextListItem = function() {
484
- var curr = this._getHighlightedItem();
500
+ var curr = this._getHighlightedItemElem();
485
501
  if (curr.length === 0) {
486
502
  return curr;
487
503
  }
488
- var currList = curr.closest('UL');
489
- var next = Romo.selectNext(curr, this.itemSelector);
490
-
491
- while (next.length === 0) {
492
- currList = Romo.selectNext(currList, 'UL');
493
- if (currList.length !== 0) {
494
- next = currList.find(this.itemSelector).first();
495
- } else {
496
- next = this.romoDropdown.bodyElem.find(this.itemSelector).first();
497
- }
504
+ var next = Romo.selectNext(curr, this.itemSelector+', UL.romo-option-list-optgroup');
505
+ if (next.length === 0) {
506
+ // curr is either the last ungrouped opt elem in the overall
507
+ // list OR is the last opt elem in a grouped list.
508
+
509
+ // if the hightlighted opt elem is in an opt group list, use
510
+ // its list as the reference elem. otherwise keep using the
511
+ // hightlighted opt elem itself.
512
+ curr = curr.closest('UL.romo-option-list-optgroup') || curr;
513
+ next = Romo.selectNext(curr, this.itemSelector+', UL.romo-option-list-optgroup');
498
514
  }
515
+ while (next.hasClass('romo-option-list-optgroup') && next.children().size() === 0) {
516
+ // keep trying until you find a opt group list with options or an option or nothing
517
+ curr = next;
518
+ next = Romo.selectNext(curr, this.itemSelector+', UL.romo-option-list-optgroup');
519
+ }
520
+ if (next.length === 0) {
521
+ // curr is the last opt elem (grouped or not) in the overall
522
+ // list. get the the first opt elem in the overall list
523
+ next = this.romoDropdown.bodyElem.find(this.itemSelector).first();
524
+ } else if (next.hasClass('romo-option-list-optgroup')) {
525
+ // curr (grouped or not) is before an opt group list. get
526
+ // the first opt elem in that list.
527
+ next = next.find(this.itemSelector).first();
528
+ }
529
+ // otherwise curr (grouped or not) is before an opt elem.
530
+ // use that opt elem.
531
+
499
532
  return next;
500
533
  }
501
534
 
502
535
  RomoOptionListDropdown.prototype._prevListItem = function() {
503
- var curr = this._getHighlightedItem();
536
+ var curr = this._getHighlightedItemElem();
504
537
  if (curr.length === 0) {
505
538
  return curr;
506
539
  }
507
- var currList = curr.closest('UL');
508
- var prev = Romo.selectPrev(curr, this.itemSelector);
509
540
 
510
- while (prev.length === 0) {
511
- currList = Romo.selectPrev(currList, 'UL');
512
- if (currList.length !== 0) {
513
- prev = currList.find(this.itemSelector).last();
514
- } else {
515
- prev = this.romoDropdown.bodyElem.find(this.itemSelector).last();
516
- }
541
+ var prev = Romo.selectPrev(curr, this.itemSelector+', UL.romo-option-list-optgroup');
542
+ if (prev.length === 0) {
543
+ // curr is either the first ungrouped opt elem in the overall
544
+ // list OR is the first opt elem in a grouped list
545
+
546
+ // if the hightlighted opt elem is in an opt group list, use
547
+ // its list as the reference elem. otherwise keep using the
548
+ // hightlighted opt elem itself.
549
+ curr = curr.closest('UL.romo-option-list-optgroup') || curr;
550
+ prev = Romo.selectPrev(curr, this.itemSelector+', UL.romo-option-list-optgroup');
551
+ }
552
+ while (prev.hasClass('romo-option-list-optgroup') && prev.children().size() === 0) {
553
+ // keep trying until you find a opt group list with options or an option or nothing
554
+ curr = prev;
555
+ prev = Romo.selectPrev(curr, this.itemSelector+', UL.romo-option-list-optgroup');
517
556
  }
557
+ if (prev.length === 0) {
558
+ // curr is the first opt elem (grouped or not) in the overall
559
+ // list. get the the last opt elem in the overall list
560
+ prev = this.romoDropdown.bodyElem.find(this.itemSelector).last();
561
+ } else if (prev.hasClass('romo-option-list-optgroup')) {
562
+ // curr (grouped or not) is after an opt group list. get
563
+ // the last opt elem in that list.
564
+ prev = prev.find(this.itemSelector).last();
565
+ }
566
+ // otherwise curr (grouped or not) is after an opt elem.
567
+ // use that opt elem.
568
+
518
569
  return prev;
519
570
  }
520
571
 
521
572
  RomoOptionListDropdown.prototype._highlightItem = function(item) {
522
- this._getHighlightedItem().removeClass('romo-option-list-dropdown-highlight');
573
+ this._getHighlightedItemElem().removeClass('romo-option-list-dropdown-highlight');
523
574
  item.addClass('romo-option-list-dropdown-highlight');
524
575
  }
525
576
 
526
- RomoOptionListDropdown.prototype._getHighlightedItem = function() {
577
+ RomoOptionListDropdown.prototype._getHighlightedItemElem = function() {
527
578
  return this.romoDropdown.bodyElem.find('LI.romo-option-list-dropdown-highlight');
528
579
  }
529
580
 
@@ -11,7 +11,8 @@ var RomoPicker = function(element) {
11
11
  this.defaultCaretPaddingPx = 5;
12
12
  this.defaultCaretPosition = 'right'
13
13
 
14
- this.defaultOptionItems = this._buildDefaultOptionItems();
14
+ this.defaultOptionItems = this._buildDefaultOptionItems();
15
+ this.filteredOptionItems = [];
15
16
 
16
17
  this.doInit();
17
18
  this._bindElem();
@@ -109,9 +110,13 @@ RomoPicker.prototype._bindOptionListDropdown = function() {
109
110
 
110
111
  this.romoOptionListDropdown.elem.on('romoOptionListDropdown:filterChange', $.proxy(function(e, filterValue, romoOptionListDropdown) {
111
112
  if (filterValue !== '') {
113
+ // immediately update the custom opt as the filter changes
114
+ // but keep the current filtered option items
115
+ this._setListItems(this.filteredOptionItems.concat(this._buildCustomOptionItems()));
116
+ // this will update with the new filtered items plus the custom on ajax callback
112
117
  this.elem.trigger('romoAjax:triggerInvoke', [{ 'filter': filterValue }]);
113
118
  } else {
114
- this._setListItems(this.defaultOptionItems);
119
+ this._setListItems(this.defaultOptionItems.concat(this._buildCustomOptionItems()));
115
120
  }
116
121
  }, this));
117
122
  this.romoOptionListDropdown.elem.on('romoOptionListDropdown:itemSelected', $.proxy(function(e, newValue, prevValue, optionListDropdown) {
@@ -152,6 +157,9 @@ RomoPicker.prototype._buildOptionListDropdownElem = function() {
152
157
  if (this.elem.data('romo-picker-no-filter') !== undefined) {
153
158
  romoOptionListDropdownElem.attr('data-romo-option-list-dropdown-no-filter', this.elem.data('romo-picker-no-filter'));
154
159
  }
160
+ if (this.elem.data('romo-picker-open-on-focus') !== undefined) {
161
+ romoOptionListDropdownElem.attr('data-romo-option-list-dropdown-open-on-focus', this.elem.data('romo-picker-open-on-focus'));
162
+ }
155
163
 
156
164
  var classList = this.elem.attr('class') !== undefined ? this.elem.attr('class').split(/\s+/) : [];
157
165
  $.each(classList, function(idx, classItem) {
@@ -218,11 +226,12 @@ RomoPicker.prototype._bindAjax = function() {
218
226
  this.romoOptionListDropdown.elem.trigger('romoOptionListDropdown:triggerFilterIndicatorStart', []);
219
227
  }, this));
220
228
  this.elem.on('romoAjax:callSuccess', $.proxy(function(e, data, romoAjax) {
221
- this._setListItems(data);
229
+ this.filteredOptionItems = data;
230
+ this._setListItems(this.filteredOptionItems.concat(this._buildCustomOptionItems()));
222
231
  this.romoOptionListDropdown.elem.trigger('romoOptionListDropdown:triggerFilterIndicatorStop', []);
223
232
  }, this));
224
233
  this.elem.on('romoAjax:callError', $.proxy(function(e, xhr, romoAjax) {
225
- this._setListItems(this.defaultOptionItems);
234
+ this._setListItems(this.defaultOptionItems.concat(this._buildCustomOptionItems()));
226
235
  this.romoOptionListDropdown.elem.trigger('romoOptionListDropdown:triggerFilterIndicatorStop', []);
227
236
  }, this));
228
237
 
@@ -234,7 +243,7 @@ RomoPicker.prototype._setListItems = function(items) {
234
243
  this.romoOptionListDropdown.elem.trigger('romoOptionListDropdown:triggerListOptionsUpdate', [this.romoOptionListDropdown.optItemElems().first()]);
235
244
  }
236
245
 
237
- RomoPicker.prototype._buildDefaultOptionItems = function(e) {
246
+ RomoPicker.prototype._buildDefaultOptionItems = function() {
238
247
  var items = []
239
248
 
240
249
  if (this.elem.data('romo-picker-empty-option') === true) {
@@ -249,6 +258,35 @@ RomoPicker.prototype._buildDefaultOptionItems = function(e) {
249
258
  return items;
250
259
  }
251
260
 
261
+ RomoPicker.prototype._buildCustomOptionItems = function() {
262
+ var items = [];
263
+
264
+ var value = this.romoOptionListDropdown.optionFilterValue();
265
+ if (value !== '' && this.elem.data('romo-picker-custom-option') === true) {
266
+ var prompt = this.elem.data('romo-picker-custom-option-prompt');
267
+ if (prompt !== undefined) {
268
+ items.push({
269
+ 'type': 'optgroup',
270
+ 'label': prompt,
271
+ 'items': [this._buildCustomOptionItem(value)]
272
+ });
273
+ } else {
274
+ items.push(this._buildCustomOptionItem(value));
275
+ }
276
+ }
277
+
278
+ return items;
279
+ }
280
+
281
+ RomoPicker.prototype._buildCustomOptionItem = function(value) {
282
+ return {
283
+ 'type': 'option',
284
+ 'value': value,
285
+ 'displayText': value,
286
+ 'displayHtml': value
287
+ };
288
+ }
289
+
252
290
  RomoPicker.prototype._onCaretClick = function(e) {
253
291
  if (this.elem.prop('disabled') === false) {
254
292
  this.romoOptionListDropdown.elem.focus();
@@ -66,6 +66,12 @@ RomoSelect.prototype._bindElem = function() {
66
66
  this.elem.on('select:triggerPopupClose', $.proxy(function(e) {
67
67
  this.romoSelectDropdown.elem.trigger('selectDropdown:triggerPopupClose', []);
68
68
  }, this));
69
+
70
+
71
+ var presetVal = this.elem[0].value;
72
+ if (presetVal !== '') {
73
+ this.doSetValue(presetVal);
74
+ }
69
75
  }
70
76
 
71
77
  RomoSelect.prototype._bindSelectDropdown = function() {
@@ -117,6 +123,15 @@ RomoSelect.prototype._buildSelectDropdownElem = function() {
117
123
  if (this.elem.data('romo-select-no-filter') !== undefined) {
118
124
  romoSelectDropdownElem.attr('data-romo-select-dropdown-no-filter', this.elem.data('romo-select-no-filter'));
119
125
  }
126
+ if (this.elem.data('romo-select-custom-option') !== undefined) {
127
+ romoSelectDropdownElem.attr('data-romo-select-dropdown-custom-option', this.elem.data('romo-select-custom-option'));
128
+ }
129
+ if (this.elem.data('romo-select-custom-option-prompt') !== undefined) {
130
+ romoSelectDropdownElem.attr('data-romo-select-dropdown-custom-option-prompt', this.elem.data('romo-select-custom-option-prompt'));
131
+ }
132
+ if (this.elem.data('romo-select-open-on-focus') !== undefined) {
133
+ romoSelectDropdownElem.attr('data-romo-select-dropdown-open-on-focus', this.elem.data('romo-select-open-on-focus'));
134
+ }
120
135
 
121
136
  var classList = this.elem.attr('class') !== undefined ? this.elem.attr('class').split(/\s+/) : [];
122
137
  $.each(classList, function(idx, classItem) {
@@ -7,10 +7,9 @@ $.fn.romoSelectDropdown = function(optionElemsParent) {
7
7
  var RomoSelectDropdown = function(element, optionElemsParent) {
8
8
  this.elem = $(element);
9
9
 
10
- this.filterHiddenClass = 'romo-select-filter-hidden';
11
-
12
- var optsParent = (optionElemsParent || this.elem.find('.romo-select-dropdown-options-parent'));
13
- this.optionElems = optsParent.children();
10
+ this.filterHiddenClass = 'romo-select-filter-hidden';
11
+ this.optionElemSelector = ':not(.'+this.filterHiddenClass+')';
12
+ this.optionElemsParent = (optionElemsParent || this.elem.find('.romo-select-dropdown-options-parent'));
14
13
 
15
14
  this.doInit();
16
15
  this._bindElem();
@@ -44,6 +43,10 @@ RomoSelectDropdown.prototype.selectedItemText = function() {
44
43
  return this.romoOptionListDropdown.selectedItemText();
45
44
  }
46
45
 
46
+ RomoSelectDropdown.prototype.optionFilterValue = function() {
47
+ return this.romoOptionListDropdown.optionFilterValue();
48
+ }
49
+
47
50
  RomoSelectDropdown.prototype.optItemElems = function() {
48
51
  return this.romoOptionListDropdown.optItemElems();
49
52
  }
@@ -63,7 +66,6 @@ RomoSelectDropdown.prototype.doSetNewValue = function(newValue) {
63
66
  /* private */
64
67
 
65
68
  RomoSelectDropdown.prototype._bindElem = function() {
66
- this.elem.attr('data-romo-option-list-dropdown-item-selector-customization', ':not(.'+this.filterHiddenClass+')');
67
69
  this.elem.attr('data-romo-option-list-focus-style-class', 'romo-select-focus');
68
70
 
69
71
  if (this.elem.data('romo-select-dropdown-no-filter') !== undefined) {
@@ -78,6 +80,9 @@ RomoSelectDropdown.prototype._bindElem = function() {
78
80
  if (this.elem.data('romo-select-dropdown-filter-indicator-width-px') !== undefined) {
79
81
  this.elem.attr('data-romo-option-list-dropdown-filter-indicator-width-px', this.elem.data('romo-select-dropdown-filter-indicator-width-px'));
80
82
  }
83
+ if (this.elem.data('romo-select-dropdown-open-on-focus') !== undefined) {
84
+ this.elem.attr('data-romo-option-list-dropdown-open-on-focus', this.elem.data('romo-select-dropdown-open-on-focus'));
85
+ }
81
86
 
82
87
  this.elem.on('romoOptionListDropdown:dropdown:toggle', $.proxy(function(e, dropdown) {
83
88
  this.elem.trigger('selectDropdown:dropdown:toggle', [dropdown, this]);
@@ -109,36 +114,46 @@ RomoSelectDropdown.prototype._bindElem = function() {
109
114
  this.romoOptionListDropdown = this.elem.romoOptionListDropdown()[0];
110
115
 
111
116
  this.elem.on('romoOptionListDropdown:filterChange', $.proxy(function(e, filterValue, romoOptionListDropdown) {
112
- var wbFilter = new RomoWordBoundaryFilter(filterValue, this.optItemElems(), function(elem) {
113
- // The romo word boundary filter by default considers a space, "-" and "_" as word boundaries.
114
- // We want to also consider other non-word characters (such as ":", "/", ".", "?", "=", "&")
115
- // as word boundaries as well.
117
+ var elems = this.optionElemsParent.find('option');
118
+ var wbFilter = new RomoWordBoundaryFilter(filterValue, elems, function(elem) {
119
+ // The romo word boundary filter by default considers a space, "-" and "_"
120
+ // as word boundaries. We want to also consider other non-word characters
121
+ // (such as ":", "/", ".", "?", "=", "&") as word boundaries as well.
116
122
  return elem[0].textContent.replace(/\W/g, ' ');
117
123
  });
118
124
 
119
- wbFilter.matchingElems.show();
120
- wbFilter.notMatchingElems.hide();
121
125
  wbFilter.matchingElems.removeClass(this.filterHiddenClass);
122
126
  wbFilter.notMatchingElems.addClass(this.filterHiddenClass);
127
+ this._setListItems();
123
128
 
124
129
  if (filterValue !== '') {
125
- this.elem.trigger('romoOptionListDropdown:triggerListOptionsUpdate', [wbFilter.matchingElems.first()]);
130
+ this.romoOptionListDropdown.elem.trigger('romoOptionListDropdown:triggerListOptionsUpdate', [this.optItemElems().first()]);
126
131
  } else {
127
132
  this.elem.trigger('romoOptionListDropdown:triggerListOptionsUpdate', [this.selectedItemElem()]);
128
133
  }
129
134
  }, this));
130
135
 
131
- this.romoOptionListDropdown.doSetListItems(this._buildOptionList(this.optionElems));
136
+ this._setListItems();
137
+ this.elem.trigger('romoOptionListDropdown:triggerListOptionsUpdate', [this.selectedItemElem()]);
132
138
  }
133
139
 
134
- RomoSelectDropdown.prototype._buildOptionList = function(optionElems) {
140
+ RomoSelectDropdown.prototype._setListItems = function() {
141
+ var optElems = this.optionElemsParent.children(this.optionElemSelector);
142
+ var items = this._buildOptionListItems(optElems).concat(this._buildCustomOptionItems());
143
+ this.romoOptionListDropdown.doSetListItems(items);
144
+ }
145
+
146
+ RomoSelectDropdown.prototype._buildOptionListItems = function(optionElems) {
135
147
  var list = [];
136
148
 
137
149
  $.each(optionElems, $.proxy(function(idx, optionNode) {
138
150
  if (optionNode.tagName === "OPTION") {
139
151
  list.push(this._buildOptionItem($(optionNode)));
140
152
  } else if (optionNode.tagName === "OPTGROUP") {
141
- list.push(this._buildOptGroupItem($(optionNode)));
153
+ var optGroupItem = this._buildOptGroupItem($(optionNode));
154
+ if (optGroupItem.items.length !== 0) {
155
+ list.push(optGroupItem);
156
+ }
142
157
  }
143
158
  }, this));
144
159
 
@@ -168,11 +183,40 @@ RomoSelectDropdown.prototype._buildOptGroupItem = function(optGroupElem) {
168
183
 
169
184
  item['type'] = 'optgroup';
170
185
  item['label'] = optGroupElem.attr('label');
171
- item['items'] = this._buildOptionList(optGroupElem.children());
186
+ item['items'] = this._buildOptionListItems(optGroupElem.children(this.optionElemSelector));
172
187
 
173
188
  return item;
174
189
  }
175
190
 
191
+ RomoSelectDropdown.prototype._buildCustomOptionItems = function() {
192
+ var items = [];
193
+
194
+ var value = this.romoOptionListDropdown.optionFilterValue();
195
+ if (value !== '' && this.elem.data('romo-select-dropdown-custom-option') === true) {
196
+ var prompt = this.elem.data('romo-select-dropdown-custom-option-prompt');
197
+ if (prompt !== undefined) {
198
+ items.push({
199
+ 'type': 'optgroup',
200
+ 'label': prompt,
201
+ 'items': [this._buildCustomOptionItem(value)]
202
+ });
203
+ } else {
204
+ items.push(this._buildCustomOptionItem(value));
205
+ }
206
+ }
207
+
208
+ return items;
209
+ }
210
+
211
+ RomoSelectDropdown.prototype._buildCustomOptionItem = function(value) {
212
+ return {
213
+ 'type': 'option',
214
+ 'value': value,
215
+ 'displayText': value,
216
+ 'displayHtml': value
217
+ };
218
+ }
219
+
176
220
  Romo.onInitUI(function(e) {
177
221
  Romo.initUIElems(e, '[data-romo-select-dropdown-auto="true"]').romoSelectDropdown();
178
222
  });
data/lib/romo/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Romo
2
- VERSION = "0.19.4"
2
+ VERSION = "0.19.5"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: romo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.19.4
4
+ version: 0.19.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kelly Redding
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2017-08-18 00:00:00 Z
13
+ date: 2017-08-23 00:00:00 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: assert