fomantic-ui-sass 2.8.6 → 2.8.8

Sign up to get free protection for your applications and to get access to all the features.
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),