fomantic-ui-sass 2.8.6 → 2.8.8

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.
Files changed (83) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +12 -0
  3. data/README.md +6 -0
  4. data/app/assets/fonts/semantic-ui/brand-icons.eot +0 -0
  5. data/app/assets/fonts/semantic-ui/brand-icons.svg +6 -41
  6. data/app/assets/fonts/semantic-ui/brand-icons.ttf +0 -0
  7. data/app/assets/fonts/semantic-ui/brand-icons.woff +0 -0
  8. data/app/assets/fonts/semantic-ui/brand-icons.woff2 +0 -0
  9. data/app/assets/fonts/semantic-ui/icons.eot +0 -0
  10. data/app/assets/fonts/semantic-ui/icons.svg +7 -245
  11. data/app/assets/fonts/semantic-ui/icons.ttf +0 -0
  12. data/app/assets/fonts/semantic-ui/icons.woff +0 -0
  13. data/app/assets/fonts/semantic-ui/icons.woff2 +0 -0
  14. data/app/assets/fonts/semantic-ui/outline-icons.eot +0 -0
  15. data/app/assets/fonts/semantic-ui/outline-icons.svg +2 -2
  16. data/app/assets/fonts/semantic-ui/outline-icons.ttf +0 -0
  17. data/app/assets/fonts/semantic-ui/outline-icons.woff +0 -0
  18. data/app/assets/fonts/semantic-ui/outline-icons.woff2 +0 -0
  19. data/app/assets/javascripts/semantic-ui/calendar.js +153 -29
  20. data/app/assets/javascripts/semantic-ui/checkbox.js +1 -1
  21. data/app/assets/javascripts/semantic-ui/dimmer.js +11 -14
  22. data/app/assets/javascripts/semantic-ui/dropdown.js +240 -112
  23. data/app/assets/javascripts/semantic-ui/form.js +131 -67
  24. data/app/assets/javascripts/semantic-ui/modal.js +259 -16
  25. data/app/assets/javascripts/semantic-ui/nag.js +130 -64
  26. data/app/assets/javascripts/semantic-ui/popup.js +4 -4
  27. data/app/assets/javascripts/semantic-ui/progress.js +25 -31
  28. data/app/assets/javascripts/semantic-ui/search.js +15 -12
  29. data/app/assets/javascripts/semantic-ui/slider.js +57 -33
  30. data/app/assets/javascripts/semantic-ui/toast.js +26 -6
  31. data/app/assets/stylesheets/semantic-ui/collections/_breadcrumb.scss +1 -1
  32. data/app/assets/stylesheets/semantic-ui/collections/_form.scss +69 -74
  33. data/app/assets/stylesheets/semantic-ui/collections/_grid.scss +14 -7
  34. data/app/assets/stylesheets/semantic-ui/collections/_menu.scss +14 -11
  35. data/app/assets/stylesheets/semantic-ui/collections/_message.scss +52 -5
  36. data/app/assets/stylesheets/semantic-ui/collections/_table.scss +9 -5
  37. data/app/assets/stylesheets/semantic-ui/elements/_all.scss +1 -0
  38. data/app/assets/stylesheets/semantic-ui/elements/_button.scss +29 -2
  39. data/app/assets/stylesheets/semantic-ui/elements/_container.scss +3 -4
  40. data/app/assets/stylesheets/semantic-ui/elements/_divider.scss +1 -1
  41. data/app/assets/stylesheets/semantic-ui/elements/_flag.scss +1 -1
  42. data/app/assets/stylesheets/semantic-ui/elements/_header.scss +14 -9
  43. data/app/assets/stylesheets/semantic-ui/elements/_icon.scss +244 -66
  44. data/app/assets/stylesheets/semantic-ui/elements/_image.scss +34 -5
  45. data/app/assets/stylesheets/semantic-ui/elements/_input.scss +34 -33
  46. data/app/assets/stylesheets/semantic-ui/elements/_label.scss +1 -1
  47. data/app/assets/stylesheets/semantic-ui/elements/_list.scss +13 -13
  48. data/app/assets/stylesheets/semantic-ui/elements/_loader.scss +41 -37
  49. data/app/assets/stylesheets/semantic-ui/elements/_placeholder.scss +1 -1
  50. data/app/assets/stylesheets/semantic-ui/elements/_rail.scss +1 -1
  51. data/app/assets/stylesheets/semantic-ui/elements/_reveal.scss +1 -1
  52. data/app/assets/stylesheets/semantic-ui/elements/_segment.scss +40 -2
  53. data/app/assets/stylesheets/semantic-ui/elements/_step.scss +10 -10
  54. data/app/assets/stylesheets/semantic-ui/elements/_text.scss +13 -1
  55. data/app/assets/stylesheets/semantic-ui/globals/_reset.scss +2 -3
  56. data/app/assets/stylesheets/semantic-ui/globals/_site.scss +2 -2
  57. data/app/assets/stylesheets/semantic-ui/modules/_accordion.scss +1 -1
  58. data/app/assets/stylesheets/semantic-ui/modules/_calendar.scss +18 -11
  59. data/app/assets/stylesheets/semantic-ui/modules/_checkbox.scss +46 -4
  60. data/app/assets/stylesheets/semantic-ui/modules/_dimmer.scss +15 -15
  61. data/app/assets/stylesheets/semantic-ui/modules/_dropdown.scss +180 -28
  62. data/app/assets/stylesheets/semantic-ui/modules/_embed.scss +7 -7
  63. data/app/assets/stylesheets/semantic-ui/modules/_modal.scss +22 -11
  64. data/app/assets/stylesheets/semantic-ui/modules/_nag.scss +168 -16
  65. data/app/assets/stylesheets/semantic-ui/modules/_popup.scss +6 -2
  66. data/app/assets/stylesheets/semantic-ui/modules/_progress.scss +18 -10
  67. data/app/assets/stylesheets/semantic-ui/modules/_rating.scss +18 -33
  68. data/app/assets/stylesheets/semantic-ui/modules/_search.scss +1 -1
  69. data/app/assets/stylesheets/semantic-ui/modules/_shape.scss +1 -1
  70. data/app/assets/stylesheets/semantic-ui/modules/_sidebar.scss +3 -2
  71. data/app/assets/stylesheets/semantic-ui/modules/_slider.scss +11 -0
  72. data/app/assets/stylesheets/semantic-ui/modules/_sticky.scss +1 -2
  73. data/app/assets/stylesheets/semantic-ui/modules/_tab.scss +1 -1
  74. data/app/assets/stylesheets/semantic-ui/modules/_toast.scss +103 -16
  75. data/app/assets/stylesheets/semantic-ui/modules/_transition.scss +1 -1
  76. data/app/assets/stylesheets/semantic-ui/views/_ad.scss +1 -1
  77. data/app/assets/stylesheets/semantic-ui/views/_card.scss +75 -3
  78. data/app/assets/stylesheets/semantic-ui/views/_comment.scss +1 -1
  79. data/app/assets/stylesheets/semantic-ui/views/_feed.scss +6 -6
  80. data/app/assets/stylesheets/semantic-ui/views/_item.scss +1 -1
  81. data/app/assets/stylesheets/semantic-ui/views/_statistic.scss +5 -5
  82. data/lib/fomantic/ui/sass/version.rb +2 -2
  83. metadata +3 -3
@@ -87,6 +87,7 @@ $.fn.dropdown = function(parameters) {
87
87
  internalChange = false,
88
88
  iconClicked = false,
89
89
  element = this,
90
+ focused = false,
90
91
  instance = $module.data(moduleNamespace),
91
92
 
92
93
  selectActionActive,
@@ -97,6 +98,7 @@ $.fn.dropdown = function(parameters) {
97
98
  id,
98
99
  selectObserver,
99
100
  menuObserver,
101
+ classObserver,
100
102
  module
101
103
  ;
102
104
 
@@ -162,15 +164,18 @@ $.fn.dropdown = function(parameters) {
162
164
  ;
163
165
  module.disconnect.menuObserver();
164
166
  module.disconnect.selectObserver();
167
+ module.disconnect.classObserver();
165
168
  },
166
169
 
167
170
  observeChanges: function() {
168
171
  if('MutationObserver' in window) {
169
172
  selectObserver = new MutationObserver(module.event.select.mutation);
170
173
  menuObserver = new MutationObserver(module.event.menu.mutation);
171
- module.debug('Setting up mutation observer', selectObserver, menuObserver);
174
+ classObserver = new MutationObserver(module.event.class.mutation);
175
+ module.debug('Setting up mutation observer', selectObserver, menuObserver, classObserver);
172
176
  module.observe.select();
173
177
  module.observe.menu();
178
+ module.observe.class();
174
179
  }
175
180
  },
176
181
 
@@ -184,6 +189,11 @@ $.fn.dropdown = function(parameters) {
184
189
  if(selectObserver) {
185
190
  selectObserver.disconnect();
186
191
  }
192
+ },
193
+ classObserver: function() {
194
+ if(classObserver) {
195
+ classObserver.disconnect();
196
+ }
187
197
  }
188
198
  },
189
199
  observe: {
@@ -202,6 +212,13 @@ $.fn.dropdown = function(parameters) {
202
212
  subtree : true
203
213
  });
204
214
  }
215
+ },
216
+ class: function() {
217
+ if(module.has.search() && classObserver) {
218
+ classObserver.observe($module[0], {
219
+ attributes : true
220
+ });
221
+ }
205
222
  }
206
223
  },
207
224
 
@@ -280,7 +297,9 @@ $.fn.dropdown = function(parameters) {
280
297
  : module.get.query()
281
298
  ;
282
299
  module.verbose('Searching for query', query);
283
- if(module.has.minCharacters(query)) {
300
+ if(settings.fireOnInit === false && module.is.initialLoad()) {
301
+ module.verbose('Skipping callback on initial load', settings.onSearch);
302
+ } else if(module.has.minCharacters(query) && settings.onSearch.call(element, query) !== false) {
284
303
  module.filter(query);
285
304
  }
286
305
  else {
@@ -342,7 +361,7 @@ $.fn.dropdown = function(parameters) {
342
361
  if( !module.has.menu() ) {
343
362
  module.create.menu();
344
363
  }
345
- if ( module.is.selection() && module.is.clearable() && !module.has.clearItem() ) {
364
+ if ( module.is.clearable() && !module.has.clearItem() ) {
346
365
  module.verbose('Adding clear icon');
347
366
  $clear = $('<i />')
348
367
  .addClass('remove icon')
@@ -353,7 +372,7 @@ $.fn.dropdown = function(parameters) {
353
372
  module.verbose('Adding search input');
354
373
  $search = $('<input />')
355
374
  .addClass(className.search)
356
- .prop('autocomplete', 'off')
375
+ .prop('autocomplete', module.is.chrome() ? 'fomantic-search' : 'off')
357
376
  .insertBefore($text)
358
377
  ;
359
378
  }
@@ -481,6 +500,11 @@ $.fn.dropdown = function(parameters) {
481
500
  ;
482
501
  },
483
502
 
503
+ clearItems: function() {
504
+ $menu.empty();
505
+ module.refreshItems();
506
+ },
507
+
484
508
  toggle: function() {
485
509
  module.verbose('Toggling menu visibility');
486
510
  if( !module.is.active() ) {
@@ -496,9 +520,12 @@ $.fn.dropdown = function(parameters) {
496
520
  ? callback
497
521
  : function(){}
498
522
  ;
523
+ if ((focused || iconClicked) && module.is.remote() && module.is.noApiCache()) {
524
+ module.clearItems();
525
+ }
499
526
  if(!module.can.show() && module.is.remote()) {
500
527
  module.debug('No API results retrieved, searching before show');
501
- module.queryRemote(module.get.query(), module.show);
528
+ module.queryRemote(module.get.query(), module.show, [callback, preventFocus]);
502
529
  }
503
530
  if( module.can.show() && !module.is.active() ) {
504
531
  module.debug('Showing dropdown');
@@ -544,6 +571,7 @@ $.fn.dropdown = function(parameters) {
544
571
  module.unbind.intent();
545
572
  }
546
573
  iconClicked = false;
574
+ focused = false;
547
575
  },
548
576
 
549
577
  hideOthers: function() {
@@ -622,6 +650,7 @@ $.fn.dropdown = function(parameters) {
622
650
  if(module.is.multiple()) {
623
651
  $module
624
652
  .on(clickEvent + eventNamespace, module.event.click)
653
+ .on(clickEvent + eventNamespace, module.event.search.focus)
625
654
  ;
626
655
  }
627
656
  }
@@ -751,11 +780,14 @@ $.fn.dropdown = function(parameters) {
751
780
  if(!Array.isArray(preSelected)) {
752
781
  preSelected = preSelected && preSelected!=="" ? preSelected.split(settings.delimiter) : [];
753
782
  }
754
- $.each(preSelected,function(index,value){
755
- $item.filter('[data-value="'+value+'"]')
756
- .addClass(className.filtered)
757
- ;
758
- });
783
+ if (module.is.multiple()) {
784
+ $.each(preSelected,function(index,value){
785
+ $item.filter('[data-value="'+value+'"]')
786
+ .addClass(className.filtered)
787
+ ;
788
+ });
789
+ }
790
+ module.focusSearch(true);
759
791
  afterFiltered();
760
792
  });
761
793
  }
@@ -769,7 +801,10 @@ $.fn.dropdown = function(parameters) {
769
801
  }
770
802
  },
771
803
 
772
- queryRemote: function(query, callback) {
804
+ queryRemote: function(query, callback, callbackParameters) {
805
+ if(!Array.isArray(callbackParameters)){
806
+ callbackParameters = [callbackParameters];
807
+ }
773
808
  var
774
809
  apiSettings = {
775
810
  errorDuration : false,
@@ -780,11 +815,15 @@ $.fn.dropdown = function(parameters) {
780
815
  },
781
816
  onError: function() {
782
817
  module.add.message(message.serverError);
783
- callback();
818
+ iconClicked = false;
819
+ focused = false;
820
+ callback.apply(null, callbackParameters);
784
821
  },
785
822
  onFailure: function() {
786
823
  module.add.message(message.serverError);
787
- callback();
824
+ iconClicked = false;
825
+ focused = false;
826
+ callback.apply(null, callbackParameters);
788
827
  },
789
828
  onSuccess : function(response) {
790
829
  var
@@ -794,14 +833,23 @@ $.fn.dropdown = function(parameters) {
794
833
  values = [];
795
834
  }
796
835
  module.remove.message();
797
- module.setup.menu({
798
- values: values
799
- });
836
+ var menuConfig = {};
837
+ menuConfig[fields.values] = values;
838
+ module.setup.menu(menuConfig);
800
839
 
801
840
  if(values.length===0 && !settings.allowAdditions) {
802
841
  module.add.message(message.noResults);
803
842
  }
804
- callback();
843
+ else {
844
+ var value = module.is.multiple() ? module.get.values() : module.get.value();
845
+ if (value !== '') {
846
+ module.verbose('Value(s) present after click icon, select value(s) in items');
847
+ module.set.selected(value, null, null, true);
848
+ }
849
+ }
850
+ iconClicked = false;
851
+ focused = false;
852
+ callback.apply(null, callbackParameters);
805
853
  }
806
854
  }
807
855
  ;
@@ -992,7 +1040,9 @@ $.fn.dropdown = function(parameters) {
992
1040
  module.clear();
993
1041
  }
994
1042
  module.debug('Creating dropdown with specified values', values);
995
- module.setup.menu({values: values});
1043
+ var menuConfig = {};
1044
+ menuConfig[fields.values] = values;
1045
+ module.setup.menu(menuConfig);
996
1046
  $.each(values, function(index, item) {
997
1047
  if(item.selected == true) {
998
1048
  module.debug('Setting initial selection to', item[fields.value]);
@@ -1031,6 +1081,7 @@ $.fn.dropdown = function(parameters) {
1031
1081
  },
1032
1082
  focus: function() {
1033
1083
  if(settings.showOnFocus && !activated && module.is.hidden() && !pageLostFocus) {
1084
+ focused = true;
1034
1085
  module.show();
1035
1086
  }
1036
1087
  },
@@ -1080,7 +1131,8 @@ $.fn.dropdown = function(parameters) {
1080
1131
  if(module.is.multiple()) {
1081
1132
  module.remove.activeLabel();
1082
1133
  }
1083
- if(settings.showOnFocus || (event.type !== 'focus' && event.type !== 'focusin')) {
1134
+ if(!focused && !module.is.active() && (settings.showOnFocus || (event.type !== 'focus' && event.type !== 'focusin'))) {
1135
+ focused = true;
1084
1136
  module.search();
1085
1137
  }
1086
1138
  },
@@ -1125,6 +1177,7 @@ $.fn.dropdown = function(parameters) {
1125
1177
  } else {
1126
1178
  module.toggle();
1127
1179
  }
1180
+ event.stopPropagation();
1128
1181
  }
1129
1182
  },
1130
1183
  text: {
@@ -1164,10 +1217,11 @@ $.fn.dropdown = function(parameters) {
1164
1217
  $label.addClass(className.active);
1165
1218
  }
1166
1219
  settings.onLabelSelect.apply(this, $labels.filter('.' + className.active));
1220
+ event.stopPropagation();
1167
1221
  }
1168
1222
  },
1169
1223
  remove: {
1170
- click: function() {
1224
+ click: function(event) {
1171
1225
  var
1172
1226
  $label = $(this).parent()
1173
1227
  ;
@@ -1179,6 +1233,7 @@ $.fn.dropdown = function(parameters) {
1179
1233
  // remove this label only
1180
1234
  module.remove.activeLabels( $label );
1181
1235
  }
1236
+ event.stopPropagation();
1182
1237
  }
1183
1238
  },
1184
1239
  test: {
@@ -1191,6 +1246,9 @@ $.fn.dropdown = function(parameters) {
1191
1246
  if(module.is.bubbledLabelClick(event) || module.is.bubbledIconClick(event)) {
1192
1247
  return;
1193
1248
  }
1249
+ if (!module.is.multiple() || (module.is.multiple() && !module.is.active())) {
1250
+ focused = true;
1251
+ }
1194
1252
  if( module.determine.eventOnElement(event, toggleBehavior) ) {
1195
1253
  event.preventDefault();
1196
1254
  }
@@ -1216,6 +1274,15 @@ $.fn.dropdown = function(parameters) {
1216
1274
  }
1217
1275
  }
1218
1276
  },
1277
+ class: {
1278
+ mutation: function(mutations) {
1279
+ mutations.forEach(function(mutation) {
1280
+ if(mutation.attributeName === "class") {
1281
+ module.check.disabled();
1282
+ }
1283
+ });
1284
+ }
1285
+ },
1219
1286
  select: {
1220
1287
  mutation: function(mutations) {
1221
1288
  module.debug('<select> modified, recreating menu');
@@ -1637,10 +1704,10 @@ $.fn.dropdown = function(parameters) {
1637
1704
  trigger: {
1638
1705
  change: function() {
1639
1706
  var
1640
- events = document.createEvent('HTMLEvents'),
1641
1707
  inputElement = $input[0]
1642
1708
  ;
1643
1709
  if(inputElement) {
1710
+ var events = document.createEvent('HTMLEvents');
1644
1711
  module.verbose('Triggering native change event');
1645
1712
  events.initEvent('change', true, false);
1646
1713
  inputElement.dispatchEvent(events);
@@ -1772,7 +1839,7 @@ $.fn.dropdown = function(parameters) {
1772
1839
  return $module.data(metadata.placeholderText) || '';
1773
1840
  },
1774
1841
  text: function() {
1775
- return $text.text();
1842
+ return settings.preserveHTML ? $text.html() : $text.text();
1776
1843
  },
1777
1844
  query: function() {
1778
1845
  return String($search.val()).trim();
@@ -1802,7 +1869,7 @@ $.fn.dropdown = function(parameters) {
1802
1869
  return count;
1803
1870
  },
1804
1871
  transition: function($subMenu) {
1805
- return (settings.transition == 'auto')
1872
+ return (settings.transition === 'auto')
1806
1873
  ? module.is.upward($subMenu)
1807
1874
  ? 'slide up'
1808
1875
  : 'slide down'
@@ -1865,7 +1932,7 @@ $.fn.dropdown = function(parameters) {
1865
1932
  : value
1866
1933
  ;
1867
1934
  },
1868
- values: function() {
1935
+ values: function(raw) {
1869
1936
  var
1870
1937
  value = module.get.value()
1871
1938
  ;
@@ -1874,7 +1941,7 @@ $.fn.dropdown = function(parameters) {
1874
1941
  }
1875
1942
  return ( !module.has.selectInput() && module.is.multiple() )
1876
1943
  ? (typeof value == 'string') // delimited string
1877
- ? module.escape.htmlEntities(value).split(settings.delimiter)
1944
+ ? (raw ? value : module.escape.htmlEntities(value)).split(settings.delimiter)
1878
1945
  : ''
1879
1946
  : value
1880
1947
  ;
@@ -1918,8 +1985,8 @@ $.fn.dropdown = function(parameters) {
1918
1985
  return ($choice.data(metadata.text) !== undefined)
1919
1986
  ? $choice.data(metadata.text)
1920
1987
  : (preserveHTML)
1921
- ? $choice.html().trim()
1922
- : $choice.text().trim()
1988
+ ? $choice.html() && $choice.html().trim()
1989
+ : $choice.text() && $choice.text().trim()
1923
1990
  ;
1924
1991
  }
1925
1992
  },
@@ -1956,9 +2023,9 @@ $.fn.dropdown = function(parameters) {
1956
2023
  selectValues: function() {
1957
2024
  var
1958
2025
  select = {},
1959
- oldGroup = []
2026
+ oldGroup = [],
2027
+ values = []
1960
2028
  ;
1961
- select.values = [];
1962
2029
  $module
1963
2030
  .find('option')
1964
2031
  .each(function() {
@@ -1979,14 +2046,14 @@ $.fn.dropdown = function(parameters) {
1979
2046
  }
1980
2047
  else {
1981
2048
  if(group.length !== oldGroup.length || group[0] !== oldGroup[0]) {
1982
- select.values.push({
2049
+ values.push({
1983
2050
  type: 'header',
1984
2051
  divider: settings.headerDivider,
1985
2052
  name: group.attr('label') || ''
1986
2053
  });
1987
2054
  oldGroup = group;
1988
2055
  }
1989
- select.values.push({
2056
+ values.push({
1990
2057
  name : name,
1991
2058
  value : value,
1992
2059
  text : text,
@@ -2001,19 +2068,21 @@ $.fn.dropdown = function(parameters) {
2001
2068
  }
2002
2069
  if(settings.sortSelect) {
2003
2070
  if(settings.sortSelect === true) {
2004
- select.values.sort(function(a, b) {
2071
+ values.sort(function(a, b) {
2005
2072
  return a.name.localeCompare(b.name);
2006
2073
  });
2007
2074
  } else if(settings.sortSelect === 'natural') {
2008
- select.values.sort(function(a, b) {
2075
+ values.sort(function(a, b) {
2009
2076
  return (a.name.toLowerCase().localeCompare(b.name.toLowerCase()));
2010
2077
  });
2011
2078
  } else if($.isFunction(settings.sortSelect)) {
2012
- select.values.sort(settings.sortSelect);
2079
+ values.sort(settings.sortSelect);
2013
2080
  }
2081
+ select[fields.values] = values;
2014
2082
  module.debug('Retrieved and sorted values from select', select);
2015
2083
  }
2016
2084
  else {
2085
+ select[fields.values] = values;
2017
2086
  module.debug('Retrieved values from select', select);
2018
2087
  }
2019
2088
  return select;
@@ -2107,6 +2176,9 @@ $.fn.dropdown = function(parameters) {
2107
2176
  ;
2108
2177
  }
2109
2178
  return $selectedItem;
2179
+ },
2180
+ displayType: function() {
2181
+ return $module.hasClass('column') ? 'flex' : settings.displayType;
2110
2182
  }
2111
2183
  },
2112
2184
 
@@ -2136,6 +2208,9 @@ $.fn.dropdown = function(parameters) {
2136
2208
  }
2137
2209
  }
2138
2210
  return true;
2211
+ },
2212
+ disabled: function(){
2213
+ $search.attr('tabindex',module.is.disabled() ? -1 : 0);
2139
2214
  }
2140
2215
  },
2141
2216
 
@@ -2295,7 +2370,7 @@ $.fn.dropdown = function(parameters) {
2295
2370
 
2296
2371
  clear: function(preventChangeTrigger) {
2297
2372
  if(module.is.multiple() && settings.useLabels) {
2298
- module.remove.labels();
2373
+ module.remove.labels($module.find(selector.label), preventChangeTrigger);
2299
2374
  }
2300
2375
  else {
2301
2376
  module.remove.activeItem();
@@ -2401,8 +2476,8 @@ $.fn.dropdown = function(parameters) {
2401
2476
  module.debug('Added tabindex to searchable dropdown');
2402
2477
  $search
2403
2478
  .val('')
2404
- .attr('tabindex', 0)
2405
2479
  ;
2480
+ module.check.disabled();
2406
2481
  $menu
2407
2482
  .attr('tabindex', -1)
2408
2483
  ;
@@ -2658,7 +2733,7 @@ $.fn.dropdown = function(parameters) {
2658
2733
  module.clear();
2659
2734
  module.set.selected(value, $selectedItem);
2660
2735
  },
2661
- selected: function(value, $selectedItem) {
2736
+ selected: function(value, $selectedItem, preventChangeTrigger, keepSearchTerm) {
2662
2737
  var
2663
2738
  isMultiple = module.is.multiple()
2664
2739
  ;
@@ -2720,8 +2795,10 @@ $.fn.dropdown = function(parameters) {
2720
2795
  if(settings.apiSettings && settings.saveRemoteData) {
2721
2796
  module.save.remoteData(selectedText, selectedValue);
2722
2797
  }
2723
- module.set.text(selectedText);
2724
- module.set.value(selectedValue, selectedText, $selected);
2798
+ if (!keepSearchTerm) {
2799
+ module.set.text(selectedText);
2800
+ }
2801
+ module.set.value(selectedValue, selectedText, $selected, preventChangeTrigger);
2725
2802
  $selected
2726
2803
  .addClass(className.active)
2727
2804
  .addClass(className.selected)
@@ -2729,7 +2806,9 @@ $.fn.dropdown = function(parameters) {
2729
2806
  }
2730
2807
  })
2731
2808
  ;
2732
- module.remove.searchTerm();
2809
+ if (!keepSearchTerm) {
2810
+ module.remove.searchTerm();
2811
+ }
2733
2812
  }
2734
2813
  },
2735
2814
 
@@ -2893,7 +2972,7 @@ $.fn.dropdown = function(parameters) {
2893
2972
  },
2894
2973
  value: function(addedValue, addedText, $selectedItem) {
2895
2974
  var
2896
- currentValue = module.get.values(),
2975
+ currentValue = module.get.values(true),
2897
2976
  newValue
2898
2977
  ;
2899
2978
  if(module.has.value(addedValue)) {
@@ -3017,7 +3096,7 @@ $.fn.dropdown = function(parameters) {
3017
3096
  userAddition: function() {
3018
3097
  $item.filter(selector.addition).remove();
3019
3098
  },
3020
- selected: function(value, $selectedItem) {
3099
+ selected: function(value, $selectedItem, preventChangeTrigger) {
3021
3100
  $selectedItem = (settings.allowAdditions)
3022
3101
  ? $selectedItem || module.get.itemWithAdditions(value)
3023
3102
  : $selectedItem || module.get.item(value)
@@ -3036,11 +3115,11 @@ $.fn.dropdown = function(parameters) {
3036
3115
  ;
3037
3116
  if(module.is.multiple()) {
3038
3117
  if(settings.useLabels) {
3039
- module.remove.value(selectedValue, selectedText, $selected);
3118
+ module.remove.value(selectedValue, selectedText, $selected, preventChangeTrigger);
3040
3119
  module.remove.label(selectedValue);
3041
3120
  }
3042
3121
  else {
3043
- module.remove.value(selectedValue, selectedText, $selected);
3122
+ module.remove.value(selectedValue, selectedText, $selected, preventChangeTrigger);
3044
3123
  if(module.get.selectionCount() === 0) {
3045
3124
  module.set.placeholderText();
3046
3125
  }
@@ -3050,7 +3129,7 @@ $.fn.dropdown = function(parameters) {
3050
3129
  }
3051
3130
  }
3052
3131
  else {
3053
- module.remove.value(selectedValue, selectedText, $selected);
3132
+ module.remove.value(selectedValue, selectedText, $selected, preventChangeTrigger);
3054
3133
  }
3055
3134
  $selected
3056
3135
  .removeClass(className.filtered)
@@ -3065,7 +3144,7 @@ $.fn.dropdown = function(parameters) {
3065
3144
  selectedItem: function() {
3066
3145
  $item.removeClass(className.selected);
3067
3146
  },
3068
- value: function(removedValue, removedText, $removedItem) {
3147
+ value: function(removedValue, removedText, $removedItem, preventChangeTrigger) {
3069
3148
  var
3070
3149
  values = module.get.values(),
3071
3150
  newValue
@@ -3087,7 +3166,7 @@ $.fn.dropdown = function(parameters) {
3087
3166
  else {
3088
3167
  settings.onRemove.call(element, removedValue, removedText, $removedItem);
3089
3168
  }
3090
- module.set.value(newValue, removedText, $removedItem);
3169
+ module.set.value(newValue, removedText, $removedItem, preventChangeTrigger);
3091
3170
  module.check.maxSelections();
3092
3171
  },
3093
3172
  arrayValue: function(removedValue, values) {
@@ -3102,8 +3181,9 @@ $.fn.dropdown = function(parameters) {
3102
3181
  },
3103
3182
  label: function(value, shouldAnimate) {
3104
3183
  var
3184
+ escapedValue = module.escape.value(value),
3105
3185
  $labels = $module.find(selector.label),
3106
- $removedLabel = $labels.filter('[data-' + metadata.value + '="' + module.escape.string(settings.ignoreCase ? value.toLowerCase() : value) +'"]')
3186
+ $removedLabel = $labels.filter('[data-' + metadata.value + '="' + module.escape.string(settings.ignoreCase ? escapedValue.toLowerCase() : escapedValue) +'"]')
3107
3187
  ;
3108
3188
  module.verbose('Removing label', $removedLabel);
3109
3189
  $removedLabel.remove();
@@ -3113,7 +3193,7 @@ $.fn.dropdown = function(parameters) {
3113
3193
  module.verbose('Removing active label selections', $activeLabels);
3114
3194
  module.remove.labels($activeLabels);
3115
3195
  },
3116
- labels: function($labels) {
3196
+ labels: function($labels, preventChangeTrigger) {
3117
3197
  $labels = $labels || $module.find(selector.label);
3118
3198
  module.verbose('Removing labels', $labels);
3119
3199
  $labels
@@ -3132,12 +3212,12 @@ $.fn.dropdown = function(parameters) {
3132
3212
  }
3133
3213
  module.remove.message();
3134
3214
  if(isUserValue) {
3135
- module.remove.value(stringValue);
3215
+ module.remove.value(stringValue, stringValue, module.get.item(stringValue), preventChangeTrigger);
3136
3216
  module.remove.label(stringValue);
3137
3217
  }
3138
3218
  else {
3139
3219
  // selected will also remove label
3140
- module.remove.selected(stringValue);
3220
+ module.remove.selected(stringValue, false, preventChangeTrigger);
3141
3221
  }
3142
3222
  })
3143
3223
  ;
@@ -3216,6 +3296,9 @@ $.fn.dropdown = function(parameters) {
3216
3296
  menu: function() {
3217
3297
  return ($menu.length > 0);
3218
3298
  },
3299
+ subMenu: function($currentMenu) {
3300
+ return ($currentMenu || $menu).find(selector.menu).length > 0;
3301
+ },
3219
3302
  message: function() {
3220
3303
  return ($menu.children(selector.message).length !== 0);
3221
3304
  },
@@ -3252,7 +3335,7 @@ $.fn.dropdown = function(parameters) {
3252
3335
  },
3253
3336
  valueMatchingCase: function(value) {
3254
3337
  var
3255
- values = module.get.values(),
3338
+ values = module.get.values(true),
3256
3339
  hasValue = Array.isArray(values)
3257
3340
  ? values && ($.inArray(value, values) !== -1)
3258
3341
  : (values == value)
@@ -3264,7 +3347,7 @@ $.fn.dropdown = function(parameters) {
3264
3347
  },
3265
3348
  valueIgnoringCase: function(value) {
3266
3349
  var
3267
- values = module.get.values(),
3350
+ values = module.get.values(true),
3268
3351
  hasValue = false
3269
3352
  ;
3270
3353
  if(!Array.isArray(values)) {
@@ -3296,6 +3379,9 @@ $.fn.dropdown = function(parameters) {
3296
3379
  bubbledIconClick: function(event) {
3297
3380
  return $(event.target).closest($icon).length > 0;
3298
3381
  },
3382
+ chrome: function() {
3383
+ return !!window.chrome && (!!window.chrome.webstore || !!window.chrome.runtime);
3384
+ },
3299
3385
  alreadySetup: function() {
3300
3386
  return ($module.is('select') && $module.parent(selector.dropdown).data(moduleNamespace) !== undefined && $module.prev().length === 0);
3301
3387
  },
@@ -3348,6 +3434,9 @@ $.fn.dropdown = function(parameters) {
3348
3434
  remote: function() {
3349
3435
  return settings.apiSettings && module.can.useAPI();
3350
3436
  },
3437
+ noApiCache: function() {
3438
+ return settings.apiSettings && !settings.apiSettings.cache
3439
+ },
3351
3440
  single: function() {
3352
3441
  return !module.is.multiple();
3353
3442
  },
@@ -3442,6 +3531,9 @@ $.fn.dropdown = function(parameters) {
3442
3531
  if(module.is.verticallyScrollableContext()) {
3443
3532
  calculations.menu.offset.top += calculations.context.scrollTop;
3444
3533
  }
3534
+ if(module.has.subMenu($currentMenu)) {
3535
+ calculations.menu.height += $currentMenu.find(selector.menu).first().outerHeight();
3536
+ }
3445
3537
  onScreen = {
3446
3538
  above : (calculations.context.scrollTop) <= calculations.menu.offset.top - calculations.context.offset.top - calculations.menu.height,
3447
3539
  below : (calculations.context.scrollTop + calculations.context.height) >= calculations.menu.offset.top - calculations.context.offset.top + calculations.menu.height
@@ -3528,14 +3620,16 @@ $.fn.dropdown = function(parameters) {
3528
3620
  ;
3529
3621
  module.verbose('Doing menu show animation', $currentMenu);
3530
3622
  module.set.direction($subMenu);
3531
- transition = module.get.transition($subMenu);
3623
+ transition = settings.transition.showMethod || module.get.transition($subMenu);
3532
3624
  if( module.is.selection() ) {
3533
3625
  module.set.scrollPosition(module.get.selectedItem(), true);
3534
3626
  }
3535
3627
  if( module.is.hidden($currentMenu) || module.is.animating($currentMenu) ) {
3536
- if(transition == 'none') {
3628
+ if(transition === 'none') {
3537
3629
  start();
3538
- $currentMenu.transition('show');
3630
+ $currentMenu.transition({
3631
+ displayType: module.get.displayType()
3632
+ }).transition('show');
3539
3633
  callback.call(element);
3540
3634
  }
3541
3635
  else if($.fn.transition !== undefined && $module.transition('is supported')) {
@@ -3544,9 +3638,10 @@ $.fn.dropdown = function(parameters) {
3544
3638
  animation : transition + ' in',
3545
3639
  debug : settings.debug,
3546
3640
  verbose : settings.verbose,
3547
- duration : settings.duration,
3641
+ duration : settings.transition.showDuration || settings.duration,
3548
3642
  queue : true,
3549
3643
  onStart : start,
3644
+ displayType: module.get.displayType(),
3550
3645
  onComplete : function() {
3551
3646
  callback.call(element);
3552
3647
  }
@@ -3569,7 +3664,7 @@ $.fn.dropdown = function(parameters) {
3569
3664
  }
3570
3665
  module.remove.active();
3571
3666
  },
3572
- transition = module.get.transition($subMenu)
3667
+ transition = settings.transition.hideMethod || module.get.transition($subMenu)
3573
3668
  ;
3574
3669
  callback = $.isFunction(callback)
3575
3670
  ? callback
@@ -3578,20 +3673,23 @@ $.fn.dropdown = function(parameters) {
3578
3673
  if( module.is.visible($currentMenu) || module.is.animating($currentMenu) ) {
3579
3674
  module.verbose('Doing menu hide animation', $currentMenu);
3580
3675
 
3581
- if(transition == 'none') {
3676
+ if(transition === 'none') {
3582
3677
  start();
3583
- $currentMenu.transition('hide');
3678
+ $currentMenu.transition({
3679
+ displayType: module.get.displayType()
3680
+ }).transition('hide');
3584
3681
  callback.call(element);
3585
3682
  }
3586
3683
  else if($.fn.transition !== undefined && $module.transition('is supported')) {
3587
3684
  $currentMenu
3588
3685
  .transition({
3589
3686
  animation : transition + ' out',
3590
- duration : settings.duration,
3687
+ duration : settings.transition.hideDuration || settings.duration,
3591
3688
  debug : settings.debug,
3592
3689
  verbose : settings.verbose,
3593
3690
  queue : false,
3594
3691
  onStart : start,
3692
+ displayType: module.get.displayType(),
3595
3693
  onComplete : function() {
3596
3694
  callback.call(element);
3597
3695
  }
@@ -3920,6 +4018,7 @@ $.fn.dropdown.settings = {
3920
4018
 
3921
4019
  transition : 'auto', // auto transition will slide down or up based on direction
3922
4020
  duration : 200, // duration of transition
4021
+ displayType : false, // displayType of transition
3923
4022
 
3924
4023
  glyphWidth : 1.037, // widest glyph width in em (W is 1.037 em) used to calculate multiselect input width
3925
4024
 
@@ -3944,6 +4043,7 @@ $.fn.dropdown.settings = {
3944
4043
  onChange : function(value, text, $selected){},
3945
4044
  onAdd : function(value, text, $selected){},
3946
4045
  onRemove : function(value, text, $selected){},
4046
+ onSearch : function(searchTerm){},
3947
4047
 
3948
4048
  onLabelSelect : function($selectedLabels){},
3949
4049
  onLabelCreate : function(value, text) { return $(this); },
@@ -3991,19 +4091,21 @@ $.fn.dropdown.settings = {
3991
4091
 
3992
4092
  // property names for remote query
3993
4093
  fields: {
3994
- remoteValues : 'results', // grouping for api results
3995
- values : 'values', // grouping for all dropdown values
3996
- disabled : 'disabled', // whether value should be disabled
3997
- name : 'name', // displayed dropdown text
3998
- value : 'value', // actual dropdown value
3999
- text : 'text', // displayed text when selected
4000
- type : 'type', // type of dropdown element
4001
- image : 'image', // optional image path
4002
- imageClass : 'imageClass', // optional individual class for image
4003
- icon : 'icon', // optional icon name
4004
- iconClass : 'iconClass', // optional individual class for icon (for example to use flag instead)
4005
- class : 'class', // optional individual class for item/header
4006
- divider : 'divider' // optional divider append for group headers
4094
+ remoteValues : 'results', // grouping for api results
4095
+ values : 'values', // grouping for all dropdown values
4096
+ disabled : 'disabled', // whether value should be disabled
4097
+ name : 'name', // displayed dropdown text
4098
+ description : 'description', // displayed dropdown description
4099
+ descriptionVertical : 'descriptionVertical', // whether description should be vertical
4100
+ value : 'value', // actual dropdown value
4101
+ text : 'text', // displayed text when selected
4102
+ type : 'type', // type of dropdown element
4103
+ image : 'image', // optional image path
4104
+ imageClass : 'imageClass', // optional individual class for image
4105
+ icon : 'icon', // optional icon name
4106
+ iconClass : 'iconClass', // optional individual class for icon (for example to use flag instead)
4107
+ class : 'class', // optional individual class for item/header
4108
+ divider : 'divider' // optional divider append for group headers
4007
4109
  },
4008
4110
 
4009
4111
  keys : {
@@ -4042,45 +4144,48 @@ $.fn.dropdown.settings = {
4042
4144
  },
4043
4145
 
4044
4146
  className : {
4045
- active : 'active',
4046
- addition : 'addition',
4047
- animating : 'animating',
4048
- disabled : 'disabled',
4049
- empty : 'empty',
4050
- dropdown : 'ui dropdown',
4051
- filtered : 'filtered',
4052
- hidden : 'hidden transition',
4053
- icon : 'icon',
4054
- image : 'image',
4055
- item : 'item',
4056
- label : 'ui label',
4057
- loading : 'loading',
4058
- menu : 'menu',
4059
- message : 'message',
4060
- multiple : 'multiple',
4061
- placeholder : 'default',
4062
- sizer : 'sizer',
4063
- search : 'search',
4064
- selected : 'selected',
4065
- selection : 'selection',
4066
- upward : 'upward',
4067
- leftward : 'left',
4068
- visible : 'visible',
4069
- clearable : 'clearable',
4070
- noselection : 'noselection',
4071
- delete : 'delete',
4072
- header : 'header',
4073
- divider : 'divider',
4074
- groupIcon : '',
4075
- unfilterable : 'unfilterable'
4147
+ active : 'active',
4148
+ addition : 'addition',
4149
+ animating : 'animating',
4150
+ description : 'description',
4151
+ descriptionVertical : 'vertical',
4152
+ disabled : 'disabled',
4153
+ empty : 'empty',
4154
+ dropdown : 'ui dropdown',
4155
+ filtered : 'filtered',
4156
+ hidden : 'hidden transition',
4157
+ icon : 'icon',
4158
+ image : 'image',
4159
+ item : 'item',
4160
+ label : 'ui label',
4161
+ loading : 'loading',
4162
+ menu : 'menu',
4163
+ message : 'message',
4164
+ multiple : 'multiple',
4165
+ placeholder : 'default',
4166
+ sizer : 'sizer',
4167
+ search : 'search',
4168
+ selected : 'selected',
4169
+ selection : 'selection',
4170
+ text : 'text',
4171
+ upward : 'upward',
4172
+ leftward : 'left',
4173
+ visible : 'visible',
4174
+ clearable : 'clearable',
4175
+ noselection : 'noselection',
4176
+ delete : 'delete',
4177
+ header : 'header',
4178
+ divider : 'divider',
4179
+ groupIcon : '',
4180
+ unfilterable : 'unfilterable'
4076
4181
  }
4077
4182
 
4078
4183
  };
4079
4184
 
4080
4185
  /* Templates */
4081
4186
  $.fn.dropdown.settings.templates = {
4082
- deQuote: function(string) {
4083
- return String(string).replace(/"/g,"");
4187
+ deQuote: function(string, encode) {
4188
+ return String(string).replace(/"/g,encode ? "&quot;" : "");
4084
4189
  },
4085
4190
  escape: function(string, preserveHTML) {
4086
4191
  if (preserveHTML){
@@ -4138,26 +4243,49 @@ $.fn.dropdown.settings.templates = {
4138
4243
  var
4139
4244
  itemType = (option[fields.type])
4140
4245
  ? option[fields.type]
4141
- : 'item'
4246
+ : 'item',
4247
+ isMenu = itemType.indexOf('menu') !== -1
4142
4248
  ;
4143
4249
 
4144
- if( itemType === 'item' ) {
4250
+ if( itemType === 'item' || isMenu) {
4145
4251
  var
4146
4252
  maybeText = (option[fields.text])
4147
- ? ' data-text="' + deQuote(option[fields.text]) + '"'
4253
+ ? ' data-text="' + deQuote(option[fields.text],true) + '"'
4148
4254
  : '',
4149
4255
  maybeDisabled = (option[fields.disabled])
4150
4256
  ? className.disabled+' '
4151
- : ''
4257
+ : '',
4258
+ maybeDescriptionVertical = (option[fields.descriptionVertical])
4259
+ ? className.descriptionVertical+' '
4260
+ : '',
4261
+ hasDescription = (escape(option[fields.description] || '', preserveHTML) != '')
4152
4262
  ;
4153
- html += '<div class="'+ maybeDisabled + (option[fields.class] ? deQuote(option[fields.class]) : className.item)+'" data-value="' + deQuote(option[fields.value]) + '"' + maybeText + '>';
4263
+ html += '<div class="'+ maybeDisabled + maybeDescriptionVertical + (option[fields.class] ? deQuote(option[fields.class]) : className.item)+'" data-value="' + deQuote(option[fields.value],true) + '"' + maybeText + '>';
4264
+ if (isMenu) {
4265
+ html += '<i class="'+ (itemType.indexOf('left') !== -1 ? 'left' : '') + ' dropdown icon"></i>';
4266
+ }
4154
4267
  if(option[fields.image]) {
4155
4268
  html += '<img class="'+(option[fields.imageClass] ? deQuote(option[fields.imageClass]) : className.image)+'" src="' + deQuote(option[fields.image]) + '">';
4156
4269
  }
4157
4270
  if(option[fields.icon]) {
4158
4271
  html += '<i class="'+deQuote(option[fields.icon])+' '+(option[fields.iconClass] ? deQuote(option[fields.iconClass]) : className.icon)+'"></i>';
4159
4272
  }
4273
+ if(hasDescription){
4274
+ html += '<span class="'+ className.description +'">'+ escape(option[fields.description] || '', preserveHTML) + '</span>';
4275
+ html += (!isMenu) ? '<span class="'+ className.text + '">' : '';
4276
+ }
4277
+ if (isMenu) {
4278
+ html += '<span class="' + className.text + '">';
4279
+ }
4160
4280
  html += escape(option[fields.name] || '', preserveHTML);
4281
+ if (isMenu) {
4282
+ html += '</span>';
4283
+ html += '<div class="' + itemType + '">';
4284
+ html += $.fn.dropdown.settings.templates.menu(option, fields, preserveHTML, className);
4285
+ html += '</div>';
4286
+ } else if(hasDescription){
4287
+ html += '</span>';
4288
+ }
4161
4289
  html += '</div>';
4162
4290
  } else if (itemType === 'header') {
4163
4291
  var groupName = escape(option[fields.name] || '', preserveHTML),