fomantic-ui-sass 2.6.4 → 2.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (127) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.rubocop.yml +1 -0
  4. data/.rubocop_todo.yml +102 -0
  5. data/.travis.yml +9 -3
  6. data/README.md +4 -2
  7. data/Rakefile +25 -3
  8. data/app/assets/fonts/semantic-ui/brand-icons.eot +0 -0
  9. data/app/assets/fonts/semantic-ui/brand-icons.svg +178 -11
  10. data/app/assets/fonts/semantic-ui/brand-icons.ttf +0 -0
  11. data/app/assets/fonts/semantic-ui/brand-icons.woff +0 -0
  12. data/app/assets/fonts/semantic-ui/brand-icons.woff2 +0 -0
  13. data/app/assets/fonts/semantic-ui/icons.eot +0 -0
  14. data/app/assets/fonts/semantic-ui/icons.svg +1138 -92
  15. data/app/assets/fonts/semantic-ui/icons.ttf +0 -0
  16. data/app/assets/fonts/semantic-ui/icons.woff +0 -0
  17. data/app/assets/fonts/semantic-ui/icons.woff2 +0 -0
  18. data/app/assets/fonts/semantic-ui/outline-icons.eot +0 -0
  19. data/app/assets/fonts/semantic-ui/outline-icons.svg +127 -26
  20. data/app/assets/fonts/semantic-ui/outline-icons.ttf +0 -0
  21. data/app/assets/fonts/semantic-ui/outline-icons.woff +0 -0
  22. data/app/assets/fonts/semantic-ui/outline-icons.woff2 +0 -0
  23. data/app/assets/javascripts/semantic-ui.js +1 -1
  24. data/app/assets/javascripts/semantic-ui/accordion.js +5 -1
  25. data/app/assets/javascripts/semantic-ui/api.js +9 -2
  26. data/app/assets/javascripts/semantic-ui/calendar.js +25 -12
  27. data/app/assets/javascripts/semantic-ui/checkbox.js +39 -2
  28. data/app/assets/javascripts/semantic-ui/dimmer.js +25 -5
  29. data/app/assets/javascripts/semantic-ui/dropdown.js +130 -47
  30. data/app/assets/javascripts/semantic-ui/embed.js +5 -1
  31. data/app/assets/javascripts/semantic-ui/form.js +24 -19
  32. data/app/assets/javascripts/semantic-ui/modal.js +33 -17
  33. data/app/assets/javascripts/semantic-ui/nag.js +5 -1
  34. data/app/assets/javascripts/semantic-ui/popup.js +10 -5
  35. data/app/assets/javascripts/semantic-ui/progress.js +5 -1
  36. data/app/assets/javascripts/semantic-ui/rating.js +21 -6
  37. data/app/assets/javascripts/semantic-ui/search.js +43 -27
  38. data/app/assets/javascripts/semantic-ui/shape.js +5 -1
  39. data/app/assets/javascripts/semantic-ui/sidebar.js +7 -3
  40. data/app/assets/javascripts/semantic-ui/site.js +6 -2
  41. data/app/assets/javascripts/semantic-ui/slider.js +1216 -0
  42. data/app/assets/javascripts/semantic-ui/state.js +5 -1
  43. data/app/assets/javascripts/semantic-ui/sticky.js +5 -1
  44. data/app/assets/javascripts/semantic-ui/tab.js +10 -3
  45. data/app/assets/javascripts/semantic-ui/toast.js +6 -2
  46. data/app/assets/javascripts/semantic-ui/transition.js +6 -2
  47. data/app/assets/javascripts/semantic-ui/visibility.js +6 -2
  48. data/app/assets/stylesheets/semantic-ui/collections/_breadcrumb.scss +7 -7
  49. data/app/assets/stylesheets/semantic-ui/collections/_form.scss +59 -83
  50. data/app/assets/stylesheets/semantic-ui/collections/_grid.scss +110 -124
  51. data/app/assets/stylesheets/semantic-ui/collections/_menu.scss +262 -237
  52. data/app/assets/stylesheets/semantic-ui/collections/_message.scss +155 -118
  53. data/app/assets/stylesheets/semantic-ui/collections/_table.scss +332 -145
  54. data/app/assets/stylesheets/semantic-ui/elements/_button.scss +2281 -2415
  55. data/app/assets/stylesheets/semantic-ui/elements/_container.scss +1 -1
  56. data/app/assets/stylesheets/semantic-ui/elements/_divider.scss +10 -10
  57. data/app/assets/stylesheets/semantic-ui/elements/_flag.scss +81 -81
  58. data/app/assets/stylesheets/semantic-ui/elements/_header.scss +178 -191
  59. data/app/assets/stylesheets/semantic-ui/elements/_icon.scss +71 -103
  60. data/app/assets/stylesheets/semantic-ui/elements/_image.scss +8 -8
  61. data/app/assets/stylesheets/semantic-ui/elements/_input.scss +61 -40
  62. data/app/assets/stylesheets/semantic-ui/elements/_label.scss +1087 -444
  63. data/app/assets/stylesheets/semantic-ui/elements/_list.scss +69 -69
  64. data/app/assets/stylesheets/semantic-ui/elements/_loader.scss +510 -155
  65. data/app/assets/stylesheets/semantic-ui/elements/_placeholder.scss +20 -14
  66. data/app/assets/stylesheets/semantic-ui/elements/_rail.scss +26 -26
  67. data/app/assets/stylesheets/semantic-ui/elements/_reveal.scss +8 -8
  68. data/app/assets/stylesheets/semantic-ui/elements/_segment.scss +180 -216
  69. data/app/assets/stylesheets/semantic-ui/elements/_step.scss +34 -39
  70. data/app/assets/stylesheets/semantic-ui/elements/_text.scss +114 -0
  71. data/app/assets/stylesheets/semantic-ui/globals/_reset.scss +1 -1
  72. data/app/assets/stylesheets/semantic-ui/globals/_site.scss +11 -20
  73. data/app/assets/stylesheets/semantic-ui/modules/_accordion.scss +16 -16
  74. data/app/assets/stylesheets/semantic-ui/modules/_all.scss +1 -1
  75. data/app/assets/stylesheets/semantic-ui/modules/_calendar.scss +1 -1
  76. data/app/assets/stylesheets/semantic-ui/modules/_checkbox.scss +23 -23
  77. data/app/assets/stylesheets/semantic-ui/modules/_dimmer.scss +32 -32
  78. data/app/assets/stylesheets/semantic-ui/modules/_dropdown.scss +128 -155
  79. data/app/assets/stylesheets/semantic-ui/modules/_embed.scss +13 -13
  80. data/app/assets/stylesheets/semantic-ui/modules/_modal.scss +50 -48
  81. data/app/assets/stylesheets/semantic-ui/modules/_nag.scss +15 -15
  82. data/app/assets/stylesheets/semantic-ui/modules/_popup.scss +50 -50
  83. data/app/assets/stylesheets/semantic-ui/modules/_progress.scss +30 -44
  84. data/app/assets/stylesheets/semantic-ui/modules/_rating.scss +137 -111
  85. data/app/assets/stylesheets/semantic-ui/modules/_search.scss +24 -28
  86. data/app/assets/stylesheets/semantic-ui/modules/_shape.scss +6 -6
  87. data/app/assets/stylesheets/semantic-ui/modules/_sidebar.scss +29 -29
  88. data/app/assets/stylesheets/semantic-ui/modules/_slider.scss +768 -0
  89. data/app/assets/stylesheets/semantic-ui/modules/_sticky.scss +3 -3
  90. data/app/assets/stylesheets/semantic-ui/modules/_tab.scss +10 -14
  91. data/app/assets/stylesheets/semantic-ui/modules/_toast.scss +27 -16
  92. data/app/assets/stylesheets/semantic-ui/modules/_transition.scss +1 -1
  93. data/app/assets/stylesheets/semantic-ui/views/_ad.scss +6 -6
  94. data/app/assets/stylesheets/semantic-ui/views/_card.scss +103 -133
  95. data/app/assets/stylesheets/semantic-ui/views/_comment.scss +26 -26
  96. data/app/assets/stylesheets/semantic-ui/views/_feed.scss +27 -27
  97. data/app/assets/stylesheets/semantic-ui/views/_item.scss +54 -54
  98. data/app/assets/stylesheets/semantic-ui/views/_statistic.scss +138 -108
  99. data/app/helpers/semantic_breadcrumbs_helper.rb +1 -1
  100. data/app/helpers/semantic_flash_helper.rb +4 -2
  101. data/app/helpers/semantic_icon_helper.rb +1 -1
  102. data/fomantic-ui-sass.gemspec +20 -19
  103. data/gemfiles/rails_5.0.gemfile +5 -0
  104. data/gemfiles/rails_5.1.gemfile +5 -0
  105. data/gemfiles/rails_5.2.gemfile +5 -0
  106. data/lib/fomantic-ui-sass.rb +3 -4
  107. data/lib/fomantic/ui/sass/breadcrumbs.rb +2 -4
  108. data/lib/fomantic/ui/sass/engine.rb +3 -3
  109. data/lib/fomantic/ui/sass/version.rb +2 -2
  110. data/spec/dummy/Rakefile +1 -1
  111. data/spec/dummy/bin/bundle +1 -1
  112. data/spec/dummy/bin/rails +1 -1
  113. data/spec/dummy/bin/rake +0 -0
  114. data/spec/dummy/config.ru +1 -1
  115. data/spec/dummy/config/application.rb +5 -6
  116. data/spec/dummy/config/boot.rb +3 -3
  117. data/spec/dummy/config/environment.rb +1 -1
  118. data/spec/dummy/config/environments/test.rb +1 -1
  119. data/spec/helpers/semantic_breadcrumbs_helper_spec.rb +30 -32
  120. data/spec/helpers/semantic_flash_helper_spec.rb +15 -16
  121. data/spec/helpers/semantic_icon_helper_spec.rb +10 -10
  122. data/spec/spec_helper.rb +4 -6
  123. data/tasks/converter.rb +61 -73
  124. data/templates/project/manifest.rb +1 -2
  125. metadata +45 -23
  126. data/app/assets/javascripts/semantic-ui/range.js +0 -278
  127. data/app/assets/stylesheets/semantic-ui/modules/_range.scss +0 -192
@@ -12,6 +12,10 @@
12
12
 
13
13
  'use strict';
14
14
 
15
+ $.isFunction = $.isFunction || function(obj) {
16
+ return typeof obj === "function" && typeof obj.nodeType !== "number";
17
+ };
18
+
15
19
  window = (typeof window != 'undefined' && window.Math == Math)
16
20
  ? window
17
21
  : (typeof self != 'undefined' && self.Math == Math)
@@ -171,6 +175,11 @@ $.fn.checkbox = function(parameters) {
171
175
  },
172
176
 
173
177
  event: {
178
+ change: function(event) {
179
+ if( !module.should.ignoreCallbacks() ) {
180
+ settings.onChange.call(input);
181
+ }
182
+ },
174
183
  click: function(event) {
175
184
  var
176
185
  $target = $(event.target)
@@ -193,9 +202,36 @@ $.fn.checkbox = function(parameters) {
193
202
  keyCode = {
194
203
  enter : 13,
195
204
  space : 32,
196
- escape : 27
205
+ escape : 27,
206
+ left : 37,
207
+ up : 38,
208
+ right : 39,
209
+ down : 40
197
210
  }
198
211
  ;
212
+
213
+ var r = module.get.radios(),
214
+ rIndex = r.index($module),
215
+ rLen = r.length,
216
+ checkIndex = false;
217
+
218
+ if(key == keyCode.left || key == keyCode.up) {
219
+ checkIndex = (rIndex === 0 ? rLen : rIndex) - 1;
220
+ } else if(key == keyCode.right || key == keyCode.down) {
221
+ checkIndex = rIndex === rLen-1 ? 0 : rIndex+1;
222
+ }
223
+
224
+ if (!module.should.ignoreCallbacks() && checkIndex !== false) {
225
+ if(!settings.beforeUnchecked.apply(input)) {
226
+ module.verbose('Option not allowed to be unchecked, cancelling key navigation');
227
+ return false;
228
+ }
229
+ if (!settings.beforeChecked.apply($(r[checkIndex]).children(selector.input)[0])) {
230
+ module.verbose('Next option should not allow check, cancelling key navigation');
231
+ return false;
232
+ }
233
+ }
234
+
199
235
  if(key == keyCode.escape) {
200
236
  module.verbose('Escape key pressed blurring field');
201
237
  $input.blur();
@@ -546,6 +582,7 @@ $.fn.checkbox = function(parameters) {
546
582
  module.verbose('Attaching checkbox events');
547
583
  $module
548
584
  .on('click' + eventNamespace, module.event.click)
585
+ .on('change' + eventNamespace, module.event.change)
549
586
  .on('keydown' + eventNamespace, selector.input, module.event.keydown)
550
587
  .on('keyup' + eventNamespace, selector.input, module.event.keyup)
551
588
  ;
@@ -735,7 +772,7 @@ $.fn.checkbox = function(parameters) {
735
772
  else if(found !== undefined) {
736
773
  response = found;
737
774
  }
738
- if($.isArray(returnedValue)) {
775
+ if(Array.isArray(returnedValue)) {
739
776
  returnedValue.push(response);
740
777
  }
741
778
  else if(returnedValue !== undefined) {
@@ -12,6 +12,10 @@
12
12
 
13
13
  'use strict';
14
14
 
15
+ $.isFunction = $.isFunction || function(obj) {
16
+ return typeof obj === "function" && typeof obj.nodeType !== "number";
17
+ };
18
+
15
19
  window = (typeof window != 'undefined' && window.Math == Math)
16
20
  ? window
17
21
  : (typeof self != 'undefined' && self.Math == Math)
@@ -171,7 +175,7 @@ $.fn.dimmer = function(parameters) {
171
175
 
172
176
  create: function() {
173
177
  var
174
- $element = $( settings.template.dimmer() )
178
+ $element = $( settings.template.dimmer(settings) )
175
179
  ;
176
180
  if(settings.dimmerName) {
177
181
  module.debug('Creating named dimmer', settings.dimmerName);
@@ -622,7 +626,7 @@ $.fn.dimmer = function(parameters) {
622
626
  else if(found !== undefined) {
623
627
  response = found;
624
628
  }
625
- if($.isArray(returnedValue)) {
629
+ if(Array.isArray(returnedValue)) {
626
630
  returnedValue.push(response);
627
631
  }
628
632
  else if(returnedValue !== undefined) {
@@ -697,6 +701,10 @@ $.fn.dimmer.settings = {
697
701
  show : 500,
698
702
  hide : 500
699
703
  },
704
+ // whether the dynamically created dimmer should have a loader
705
+ displayLoader: false,
706
+ loaderText : false,
707
+ loaderVariation : '',
700
708
 
701
709
  onChange : function(){},
702
710
  onShow : function(){},
@@ -716,7 +724,8 @@ $.fn.dimmer.settings = {
716
724
  hide : 'hide',
717
725
  legacy : 'legacy',
718
726
  pageDimmer : 'page',
719
- show : 'show'
727
+ show : 'show',
728
+ loader : 'ui loader'
720
729
  },
721
730
 
722
731
  selector: {
@@ -725,8 +734,19 @@ $.fn.dimmer.settings = {
725
734
  },
726
735
 
727
736
  template: {
728
- dimmer: function() {
729
- return $('<div />').attr('class', 'ui dimmer');
737
+ dimmer: function(settings) {
738
+ var d = $('<div/>').addClass('ui dimmer'),l;
739
+ if(settings.displayLoader) {
740
+ l = $('<div/>')
741
+ .addClass(settings.className.loader)
742
+ .addClass(settings.loaderVariation);
743
+ if(!!settings.loaderText){
744
+ l.text(settings.loaderText);
745
+ l.addClass('text');
746
+ }
747
+ d.append(l);
748
+ }
749
+ return d;
730
750
  }
731
751
  }
732
752
 
@@ -12,6 +12,10 @@
12
12
 
13
13
  'use strict';
14
14
 
15
+ $.isFunction = $.isFunction || function(obj) {
16
+ return typeof obj === "function" && typeof obj.nodeType !== "number";
17
+ };
18
+
15
19
  window = (typeof window != 'undefined' && window.Math == Math)
16
20
  ? window
17
21
  : (typeof self != 'undefined' && self.Math == Math)
@@ -203,7 +207,7 @@ $.fn.dropdown = function(parameters) {
203
207
  if(!values) {
204
208
  return false;
205
209
  }
206
- values = $.isArray(values)
210
+ values = Array.isArray(values)
207
211
  ? values
208
212
  : [values]
209
213
  ;
@@ -369,7 +373,7 @@ $.fn.dropdown = function(parameters) {
369
373
  .attr('class', $input.attr('class') )
370
374
  .addClass(className.selection)
371
375
  .addClass(className.dropdown)
372
- .html( templates.dropdown(selectValues) )
376
+ .html( templates.dropdown(selectValues,settings.preserveHTML) )
373
377
  .insertBefore($input)
374
378
  ;
375
379
  if($input.hasClass(className.multiple) && $input.prop('multiple') === false) {
@@ -392,7 +396,7 @@ $.fn.dropdown = function(parameters) {
392
396
  module.refresh();
393
397
  },
394
398
  menu: function(values) {
395
- $menu.html( templates.menu(values, fields));
399
+ $menu.html( templates.menu(values, fields,settings.preserveHTML));
396
400
  $item = $menu.find(selector.item);
397
401
  $divider = settings.hideDividers ? $item.parent().children(selector.divider) : $();
398
402
  },
@@ -725,7 +729,7 @@ $.fn.dropdown = function(parameters) {
725
729
  module.remove.message();
726
730
  }
727
731
  if(settings.allowAdditions) {
728
- module.add.userSuggestion(query);
732
+ module.add.userSuggestion(module.escape.htmlEntities(query));
729
733
  }
730
734
  if(module.is.searchSelection() && module.can.show() && module.is.focusedOnSearch() ) {
731
735
  module.show();
@@ -741,6 +745,15 @@ $.fn.dropdown = function(parameters) {
741
745
  if(settings.filterRemoteData) {
742
746
  module.filterItems(searchTerm);
743
747
  }
748
+ var preSelected = $input.val();
749
+ if(!Array.isArray(preSelected)) {
750
+ preSelected = preSelected!=="" ? preSelected.split(settings.delimiter) : [];
751
+ }
752
+ $.each(preSelected,function(index,value){
753
+ $item.filter('[data-value="'+value+'"]')
754
+ .addClass(className.filtered)
755
+ ;
756
+ });
744
757
  afterFiltered();
745
758
  });
746
759
  }
@@ -773,16 +786,17 @@ $.fn.dropdown = function(parameters) {
773
786
  },
774
787
  onSuccess : function(response) {
775
788
  var
776
- values = response[fields.remoteValues],
777
- hasRemoteValues = ($.isArray(values) && values.length > 0)
789
+ values = response[fields.remoteValues]
778
790
  ;
779
- if(hasRemoteValues) {
780
- module.remove.message();
781
- module.setup.menu({
782
- values: response[fields.remoteValues]
783
- });
791
+ if (!Array.isArray(values)){
792
+ values = [];
784
793
  }
785
- else {
794
+ module.remove.message();
795
+ module.setup.menu({
796
+ values: values
797
+ });
798
+
799
+ if(values.length===0 && !settings.allowAdditions) {
786
800
  module.add.message(message.noResults);
787
801
  }
788
802
  callback();
@@ -982,9 +996,11 @@ $.fn.dropdown = function(parameters) {
982
996
  module.setup.menu({values: values});
983
997
  $.each(values, function(index, item) {
984
998
  if(item.selected == true) {
985
- module.debug('Setting initial selection to', item.value);
986
- module.set.selected(item.value);
987
- return true;
999
+ module.debug('Setting initial selection to', item[fields.value]);
1000
+ module.set.selected(item[fields.value]);
1001
+ if(!module.is.multiple()) {
1002
+ return false;
1003
+ }
988
1004
  }
989
1005
  });
990
1006
  }
@@ -1439,6 +1455,9 @@ $.fn.dropdown = function(parameters) {
1439
1455
  if(module.is.searchSelection()) {
1440
1456
  module.remove.searchTerm();
1441
1457
  }
1458
+ if(module.is.multiple()){
1459
+ event.preventDefault();
1460
+ }
1442
1461
  }
1443
1462
 
1444
1463
  // visible menu keyboard shortcuts
@@ -1749,7 +1768,7 @@ $.fn.dropdown = function(parameters) {
1749
1768
  count
1750
1769
  ;
1751
1770
  count = ( module.is.multiple() )
1752
- ? $.isArray(values)
1771
+ ? Array.isArray(values)
1753
1772
  ? values.length
1754
1773
  : 0
1755
1774
  : (module.get.value() !== '')
@@ -1773,7 +1792,7 @@ $.fn.dropdown = function(parameters) {
1773
1792
  if(!values) {
1774
1793
  return false;
1775
1794
  }
1776
- values = $.isArray(values)
1795
+ values = Array.isArray(values)
1777
1796
  ? values
1778
1797
  : [values]
1779
1798
  ;
@@ -1808,7 +1827,7 @@ $.fn.dropdown = function(parameters) {
1808
1827
  value = ($input.length > 0)
1809
1828
  ? $input.val()
1810
1829
  : $module.data(metadata.value),
1811
- isEmptyMultiselect = ($.isArray(value) && value.length === 1 && value[0] === '')
1830
+ isEmptyMultiselect = (Array.isArray(value) && value.length === 1 && value[0] === '')
1812
1831
  ;
1813
1832
  // prevents placeholder element from being selected when multiple
1814
1833
  return (value === undefined || isEmptyMultiselect)
@@ -1999,7 +2018,7 @@ $.fn.dropdown = function(parameters) {
1999
2018
  ? (value.length > 0)
2000
2019
  : (value !== undefined && value !== null)
2001
2020
  ;
2002
- isMultiple = (module.is.multiple() && $.isArray(value));
2021
+ isMultiple = (module.is.multiple() && Array.isArray(value));
2003
2022
  strict = (value === '' || value === 0)
2004
2023
  ? true
2005
2024
  : strict || false
@@ -2143,6 +2162,11 @@ $.fn.dropdown = function(parameters) {
2143
2162
  else {
2144
2163
  module.set.selected();
2145
2164
  }
2165
+ if(module.get.item()) {
2166
+ $input.removeClass(className.noselection);
2167
+ } else {
2168
+ $input.addClass(className.noselection);
2169
+ }
2146
2170
  module.remove.initialLoad();
2147
2171
  },
2148
2172
  remoteValues: function() {
@@ -2485,8 +2509,13 @@ $.fn.dropdown = function(parameters) {
2485
2509
  },
2486
2510
  direction: function($menu) {
2487
2511
  if(settings.direction == 'auto') {
2488
- // reset position
2489
- module.remove.upward();
2512
+ // reset position, remove upward if it's base menu
2513
+ if (!$menu) {
2514
+ module.remove.upward();
2515
+ } else if (module.is.upward($menu)) {
2516
+ //we need make sure when make assertion openDownward for $menu, $menu does not have upward class
2517
+ module.remove.upward($menu);
2518
+ }
2490
2519
 
2491
2520
  if(module.can.openDownward($menu)) {
2492
2521
  module.remove.upward($menu);
@@ -2511,6 +2540,11 @@ $.fn.dropdown = function(parameters) {
2511
2540
  $element.addClass(className.leftward);
2512
2541
  },
2513
2542
  value: function(value, text, $selected) {
2543
+ if(value !== undefined && value !== '' && !(Array.isArray(value) && value.length === 0)) {
2544
+ $input.removeClass(className.noselection);
2545
+ } else {
2546
+ $input.addClass(className.noselection);
2547
+ }
2514
2548
  var
2515
2549
  escapedValue = module.escape.value(value),
2516
2550
  hasInput = ($input.length > 0),
@@ -2664,7 +2698,7 @@ $.fn.dropdown = function(parameters) {
2664
2698
  $label = $('<a />')
2665
2699
  .addClass(className.label)
2666
2700
  .attr('data-' + metadata.value, escapedValue)
2667
- .html(templates.label(escapedValue, text))
2701
+ .html(templates.label(escapedValue, text, settings.preserveHTML))
2668
2702
  ;
2669
2703
  $label = settings.onLabelCreate.call($label, escapedValue, text);
2670
2704
 
@@ -2817,7 +2851,7 @@ $.fn.dropdown = function(parameters) {
2817
2851
  return;
2818
2852
  }
2819
2853
  // extend current array
2820
- if($.isArray(currentValue)) {
2854
+ if(Array.isArray(currentValue)) {
2821
2855
  newValue = currentValue.concat([addedValue]);
2822
2856
  newValue = module.get.uniqueArray(newValue);
2823
2857
  }
@@ -3002,7 +3036,7 @@ $.fn.dropdown = function(parameters) {
3002
3036
  module.check.maxSelections();
3003
3037
  },
3004
3038
  arrayValue: function(removedValue, values) {
3005
- if( !$.isArray(values) ) {
3039
+ if( !Array.isArray(values) ) {
3006
3040
  values = [values];
3007
3041
  }
3008
3042
  values = $.grep(values, function(value){
@@ -3160,7 +3194,7 @@ $.fn.dropdown = function(parameters) {
3160
3194
  valueMatchingCase: function(value) {
3161
3195
  var
3162
3196
  values = module.get.values(),
3163
- hasValue = $.isArray(values)
3197
+ hasValue = Array.isArray(values)
3164
3198
  ? values && ($.inArray(value, values) !== -1)
3165
3199
  : (values == value)
3166
3200
  ;
@@ -3174,7 +3208,7 @@ $.fn.dropdown = function(parameters) {
3174
3208
  values = module.get.values(),
3175
3209
  hasValue = false
3176
3210
  ;
3177
- if(!$.isArray(values)) {
3211
+ if(!Array.isArray(values)) {
3178
3212
  values = [values];
3179
3213
  }
3180
3214
  $.each(values, function(index, existingValue) {
@@ -3546,7 +3580,7 @@ $.fn.dropdown = function(parameters) {
3546
3580
  escape: {
3547
3581
  value: function(value) {
3548
3582
  var
3549
- multipleValues = $.isArray(value),
3583
+ multipleValues = Array.isArray(value),
3550
3584
  stringValue = (typeof value === 'string'),
3551
3585
  isUnparsable = (!stringValue && !multipleValues),
3552
3586
  hasQuotes = (stringValue && value.search(regExp.quote) !== -1),
@@ -3567,6 +3601,27 @@ $.fn.dropdown = function(parameters) {
3567
3601
  string: function(text) {
3568
3602
  text = String(text);
3569
3603
  return text.replace(regExp.escape, '\\$&');
3604
+ },
3605
+ htmlEntities: function(string) {
3606
+ var
3607
+ badChars = /[&<>"'`]/g,
3608
+ shouldEscape = /[&<>"'`]/,
3609
+ escape = {
3610
+ "&": "&amp;",
3611
+ "<": "&lt;",
3612
+ ">": "&gt;",
3613
+ '"': "&quot;",
3614
+ "'": "&#x27;",
3615
+ "`": "&#x60;"
3616
+ },
3617
+ escapedChar = function(chr) {
3618
+ return escape[chr];
3619
+ }
3620
+ ;
3621
+ if(shouldEscape.test(string)) {
3622
+ return string.replace(badChars, escapedChar);
3623
+ }
3624
+ return string;
3570
3625
  }
3571
3626
  },
3572
3627
 
@@ -3720,7 +3775,7 @@ $.fn.dropdown = function(parameters) {
3720
3775
  else if(found !== undefined) {
3721
3776
  response = found;
3722
3777
  }
3723
- if($.isArray(returnedValue)) {
3778
+ if(Array.isArray(returnedValue)) {
3724
3779
  returnedValue.push(response);
3725
3780
  }
3726
3781
  else if(returnedValue !== undefined) {
@@ -3861,7 +3916,7 @@ $.fn.dropdown.settings = {
3861
3916
  },
3862
3917
 
3863
3918
  regExp : {
3864
- escape : /[-[\]{}()*+?.,\\^$|#\s]/g,
3919
+ escape : /[-[\]{}()*+?.,\\^$|#\s:=@]/g,
3865
3920
  quote : /"/g
3866
3921
  },
3867
3922
 
@@ -3942,33 +3997,58 @@ $.fn.dropdown.settings = {
3942
3997
  upward : 'upward',
3943
3998
  leftward : 'left',
3944
3999
  visible : 'visible',
3945
- clearable : 'clearable'
4000
+ clearable : 'clearable',
4001
+ noselection : 'noselection'
3946
4002
  }
3947
4003
 
3948
4004
  };
3949
4005
 
3950
4006
  /* Templates */
3951
4007
  $.fn.dropdown.settings.templates = {
3952
-
4008
+ escape: function(string, preserveHTML) {
4009
+ if (preserveHTML){
4010
+ return string;
4011
+ }
4012
+ var
4013
+ badChars = /[&<>"'`]/g,
4014
+ shouldEscape = /[&<>"'`]/,
4015
+ escape = {
4016
+ "&": "&amp;",
4017
+ "<": "&lt;",
4018
+ ">": "&gt;",
4019
+ '"': "&quot;",
4020
+ "'": "&#x27;",
4021
+ "`": "&#x60;"
4022
+ },
4023
+ escapedChar = function(chr) {
4024
+ return escape[chr];
4025
+ }
4026
+ ;
4027
+ if(shouldEscape.test(string)) {
4028
+ return string.replace(badChars, escapedChar);
4029
+ }
4030
+ return string;
4031
+ },
3953
4032
  // generates dropdown from select values
3954
- dropdown: function(select) {
4033
+ dropdown: function(select, preserveHTML) {
3955
4034
  var
3956
4035
  placeholder = select.placeholder || false,
3957
- values = select.values || {},
3958
- html = ''
4036
+ values = select.values || [],
4037
+ html = '',
4038
+ escape = $.fn.dropdown.settings.templates.escape
3959
4039
  ;
3960
4040
  html += '<i class="dropdown icon"></i>';
3961
- if(select.placeholder) {
3962
- html += '<div class="default text">' + placeholder + '</div>';
4041
+ if(placeholder) {
4042
+ html += '<div class="default text">' + escape(placeholder,preserveHTML) + '</div>';
3963
4043
  }
3964
4044
  else {
3965
4045
  html += '<div class="text"></div>';
3966
4046
  }
3967
4047
  html += '<div class="menu">';
3968
- $.each(select.values, function(index, option) {
4048
+ $.each(values, function(index, option) {
3969
4049
  html += (option.disabled)
3970
- ? '<div class="disabled item" data-value="' + option.value + '">' + option.name + '</div>'
3971
- : '<div class="item" data-value="' + option.value + '">' + option.name + '</div>'
4050
+ ? '<div class="disabled item" data-value="' + option.value.replace(/"/g,"") + '">' + escape(option.name,preserveHTML) + '</div>'
4051
+ : '<div class="item" data-value="' + option.value.replace(/"/g,"") + '">' + escape(option.name,preserveHTML) + '</div>'
3972
4052
  ;
3973
4053
  });
3974
4054
  html += '</div>';
@@ -3976,10 +4056,11 @@ $.fn.dropdown.settings.templates = {
3976
4056
  },
3977
4057
 
3978
4058
  // generates just menu from select
3979
- menu: function(response, fields) {
4059
+ menu: function(response, fields, preserveHTML) {
3980
4060
  var
3981
- values = response[fields.values] || {},
3982
- html = ''
4061
+ values = response[fields.values] || [],
4062
+ html = '',
4063
+ escape = $.fn.dropdown.settings.templates.escape
3983
4064
  ;
3984
4065
  $.each(values, function(index, option) {
3985
4066
  var
@@ -3997,12 +4078,12 @@ $.fn.dropdown.settings.templates = {
3997
4078
  ? 'disabled '
3998
4079
  : ''
3999
4080
  ;
4000
- html += '<div class="'+ maybeDisabled +'item" data-value="' + option[fields.value] + '"' + maybeText + '>';
4001
- html += option[fields.name];
4081
+ html += '<div class="'+ maybeDisabled +'item" data-value="' + option[fields.value].replace(/"/g,"") + '"' + maybeText + '>';
4082
+ html += escape(option[fields.name],preserveHTML);
4002
4083
  html += '</div>';
4003
4084
  } else if (itemType === 'header') {
4004
4085
  html += '<div class="header">';
4005
- html += option[fields.name];
4086
+ html += escape(option[fields.name],preserveHTML);
4006
4087
  html += '</div>';
4007
4088
  }
4008
4089
  });
@@ -4010,8 +4091,10 @@ $.fn.dropdown.settings.templates = {
4010
4091
  },
4011
4092
 
4012
4093
  // generates label for multiselect
4013
- label: function(value, text) {
4014
- return text + '<i class="delete icon"></i>';
4094
+ label: function(value, text, preserveHTML) {
4095
+ var
4096
+ escape = $.fn.dropdown.settings.templates.escape;
4097
+ return escape(text,preserveHTML) + '<i class="delete icon"></i>';
4015
4098
  },
4016
4099
 
4017
4100