semantic-ui-sass 2.0.7.0 → 2.1.3.0

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 (61) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/semantic-ui/accordion.js +17 -13
  3. data/app/assets/javascripts/semantic-ui/api.js +25 -7
  4. data/app/assets/javascripts/semantic-ui/checkbox.js +124 -48
  5. data/app/assets/javascripts/semantic-ui/dropdown.js +193 -108
  6. data/app/assets/javascripts/semantic-ui/embed.js +1 -4
  7. data/app/assets/javascripts/semantic-ui/form.js +125 -12
  8. data/app/assets/javascripts/semantic-ui/modal.js +13 -13
  9. data/app/assets/javascripts/semantic-ui/nag.js +11 -1
  10. data/app/assets/javascripts/semantic-ui/popup.js +23 -10
  11. data/app/assets/javascripts/semantic-ui/search.js +83 -54
  12. data/app/assets/javascripts/semantic-ui/sticky.js +34 -32
  13. data/app/assets/javascripts/semantic-ui/tab.js +8 -7
  14. data/app/assets/javascripts/semantic-ui/transition.js +5 -5
  15. data/app/assets/stylesheets/semantic-ui/collections/_breadcrumb.scss +2 -2
  16. data/app/assets/stylesheets/semantic-ui/collections/_form.scss +102 -31
  17. data/app/assets/stylesheets/semantic-ui/collections/_grid.scss +159 -10
  18. data/app/assets/stylesheets/semantic-ui/collections/_menu.scss +151 -60
  19. data/app/assets/stylesheets/semantic-ui/collections/_message.scss +1 -1
  20. data/app/assets/stylesheets/semantic-ui/collections/_table.scss +18 -1
  21. data/app/assets/stylesheets/semantic-ui/elements/_button.scss +187 -97
  22. data/app/assets/stylesheets/semantic-ui/elements/_container.scss +29 -5
  23. data/app/assets/stylesheets/semantic-ui/elements/_divider.scss +6 -3
  24. data/app/assets/stylesheets/semantic-ui/elements/_flag.scss +1 -1
  25. data/app/assets/stylesheets/semantic-ui/elements/_header.scss +1 -3
  26. data/app/assets/stylesheets/semantic-ui/elements/_icon.scss +23 -38
  27. data/app/assets/stylesheets/semantic-ui/elements/_image.scss +1 -1
  28. data/app/assets/stylesheets/semantic-ui/elements/_input.scss +69 -39
  29. data/app/assets/stylesheets/semantic-ui/elements/_label.scss +423 -222
  30. data/app/assets/stylesheets/semantic-ui/elements/_list.scss +16 -1
  31. data/app/assets/stylesheets/semantic-ui/elements/_loader.scss +1 -1
  32. data/app/assets/stylesheets/semantic-ui/elements/_rail.scss +1 -1
  33. data/app/assets/stylesheets/semantic-ui/elements/_reveal.scss +5 -13
  34. data/app/assets/stylesheets/semantic-ui/elements/_segment.scss +1 -1
  35. data/app/assets/stylesheets/semantic-ui/elements/_step.scss +9 -6
  36. data/app/assets/stylesheets/semantic-ui/globals/_reset.scss +1 -1
  37. data/app/assets/stylesheets/semantic-ui/globals/_site.scss +1 -1
  38. data/app/assets/stylesheets/semantic-ui/modules/_accordion.scss +1 -1
  39. data/app/assets/stylesheets/semantic-ui/modules/_checkbox.scss +7 -7
  40. data/app/assets/stylesheets/semantic-ui/modules/_dimmer.scss +1 -1
  41. data/app/assets/stylesheets/semantic-ui/modules/_dropdown.scss +26 -9
  42. data/app/assets/stylesheets/semantic-ui/modules/_embed.scss +1 -1
  43. data/app/assets/stylesheets/semantic-ui/modules/_modal.scss +1 -1
  44. data/app/assets/stylesheets/semantic-ui/modules/_nag.scss +1 -1
  45. data/app/assets/stylesheets/semantic-ui/modules/_popup.scss +1 -1
  46. data/app/assets/stylesheets/semantic-ui/modules/_progress.scss +1 -1
  47. data/app/assets/stylesheets/semantic-ui/modules/_rating.scss +1 -1
  48. data/app/assets/stylesheets/semantic-ui/modules/_search.scss +1 -1
  49. data/app/assets/stylesheets/semantic-ui/modules/_shape.scss +1 -1
  50. data/app/assets/stylesheets/semantic-ui/modules/_sidebar.scss +1 -1
  51. data/app/assets/stylesheets/semantic-ui/modules/_sticky.scss +1 -1
  52. data/app/assets/stylesheets/semantic-ui/modules/_tab.scss +1 -1
  53. data/app/assets/stylesheets/semantic-ui/modules/_transition.scss +1 -1
  54. data/app/assets/stylesheets/semantic-ui/views/_ad.scss +1 -1
  55. data/app/assets/stylesheets/semantic-ui/views/_card.scss +1 -1
  56. data/app/assets/stylesheets/semantic-ui/views/_comment.scss +1 -1
  57. data/app/assets/stylesheets/semantic-ui/views/_feed.scss +1 -1
  58. data/app/assets/stylesheets/semantic-ui/views/_item.scss +7 -7
  59. data/app/assets/stylesheets/semantic-ui/views/_statistic.scss +1 -1
  60. data/lib/semantic/ui/sass/version.rb +2 -2
  61. metadata +2 -2
@@ -39,6 +39,7 @@ $.fn.dropdown = function(parameters) {
39
39
 
40
40
  className = settings.className,
41
41
  message = settings.message,
42
+ fields = settings.fields,
42
43
  metadata = settings.metadata,
43
44
  namespace = settings.namespace,
44
45
  regExp = settings.regExp,
@@ -65,6 +66,7 @@ $.fn.dropdown = function(parameters) {
65
66
 
66
67
  activated = false,
67
68
  itemActivated = false,
69
+ internalChange = false,
68
70
  element = this,
69
71
  instance = $module.data(moduleNamespace),
70
72
 
@@ -93,11 +95,7 @@ $.fn.dropdown = function(parameters) {
93
95
  module.restore.selected();
94
96
 
95
97
  module.create.id();
96
- if(hasTouch) {
97
- module.bind.touchEvents();
98
- }
99
- module.bind.mouseEvents();
100
- module.bind.keyboardEvents();
98
+ module.bind.events();
101
99
 
102
100
  module.observeChanges();
103
101
  module.instantiate();
@@ -183,10 +181,11 @@ $.fn.dropdown = function(parameters) {
183
181
  ;
184
182
  $.each(values, function(index, value) {
185
183
  if(module.get.item(value) === false) {
186
- html = settings.templates.addition(value);
184
+ html = settings.templates.addition( module.add.variables(message.addResult, value) );
187
185
  $userChoice = $('<div />')
188
186
  .html(html)
189
- .data(metadata.value, value)
187
+ .attr('data-' + metadata.value, value)
188
+ .attr('data-' + metadata.text, value)
190
189
  .addClass(className.addition)
191
190
  .addClass(className.item)
192
191
  ;
@@ -211,6 +210,12 @@ $.fn.dropdown = function(parameters) {
211
210
  });
212
211
  }
213
212
  },
213
+ menu: function() {
214
+ $menu = $('<div />')
215
+ .addClass(className.menu)
216
+ .appendTo($module)
217
+ ;
218
+ }
214
219
  },
215
220
 
216
221
  search: function(query) {
@@ -268,6 +273,9 @@ $.fn.dropdown = function(parameters) {
268
273
  module.setup.select();
269
274
  module.setup.returnedObject();
270
275
  }
276
+ if( !module.has.menu() ) {
277
+ module.create.menu();
278
+ }
271
279
  if( module.is.search() && !module.has.search() ) {
272
280
  module.verbose('Adding search input');
273
281
  $search = $('<input />')
@@ -278,12 +286,6 @@ $.fn.dropdown = function(parameters) {
278
286
  if(settings.allowTab) {
279
287
  module.set.tabbable();
280
288
  }
281
- if($menu.length === 0) {
282
- $menu = $('<div />')
283
- .addClass(className.menu)
284
- .appendTo($module)
285
- ;
286
- }
287
289
  },
288
290
  select: function() {
289
291
  var
@@ -297,7 +299,10 @@ $.fn.dropdown = function(parameters) {
297
299
  if($input.parent(selector.dropdown).length > 0) {
298
300
  module.debug('UI dropdown already exists. Creating dropdown menu only');
299
301
  $module = $input.closest(selector.dropdown);
300
- $menu = $module.children(selector.menu);
302
+ if( !module.has.menu() ) {
303
+ module.create.menu();
304
+ }
305
+ $menu = $module.children(selector.menu);
301
306
  module.setup.menu(selectValues);
302
307
  }
303
308
  else {
@@ -325,7 +330,7 @@ $.fn.dropdown = function(parameters) {
325
330
  module.refresh();
326
331
  },
327
332
  menu: function(values) {
328
- $menu.html( templates.menu( values ));
333
+ $menu.html( templates.menu(values, fields));
329
334
  $item = $menu.find(selector.item);
330
335
  },
331
336
  reference: function() {
@@ -382,7 +387,6 @@ $.fn.dropdown = function(parameters) {
382
387
  ;
383
388
  },
384
389
 
385
-
386
390
  toggle: function() {
387
391
  module.verbose('Toggling menu visibility');
388
392
  if( !module.is.active() ) {
@@ -400,19 +404,21 @@ $.fn.dropdown = function(parameters) {
400
404
  ;
401
405
  if( module.can.show() && !module.is.active() ) {
402
406
  module.debug('Showing dropdown');
403
- if(module.is.multiple()) {
404
- if(!module.has.search() && module.is.allFiltered()) {
405
- return true;
406
- }
407
+ if(module.is.multiple() && !module.has.search() && module.is.allFiltered()) {
408
+ return true;
409
+ }
410
+ if(module.has.message() && !module.has.maxSelections()) {
411
+ module.remove.message();
412
+ }
413
+ if(settings.onShow.call(element) !== false) {
414
+ module.animate.show(function() {
415
+ if( module.can.click() ) {
416
+ module.bind.intent();
417
+ }
418
+ module.set.visible();
419
+ callback.call(element);
420
+ });
407
421
  }
408
- module.animate.show(function() {
409
- if( module.can.click() ) {
410
- module.bind.intent();
411
- }
412
- module.set.visible();
413
- callback.call(element);
414
- });
415
- settings.onShow.call(element);
416
422
  }
417
423
  },
418
424
 
@@ -423,11 +429,12 @@ $.fn.dropdown = function(parameters) {
423
429
  ;
424
430
  if( module.is.active() ) {
425
431
  module.debug('Hiding dropdown');
426
- module.animate.hide(function() {
427
- module.remove.visible();
428
- callback.call(element);
429
- });
430
- settings.onHide.call(element);
432
+ if(settings.onHide.call(element) !== false) {
433
+ module.animate.hide(function() {
434
+ module.remove.visible();
435
+ callback.call(element);
436
+ });
437
+ }
431
438
  }
432
439
  },
433
440
 
@@ -456,8 +463,30 @@ $.fn.dropdown = function(parameters) {
456
463
  },
457
464
 
458
465
  bind: {
466
+ events: function() {
467
+ if(hasTouch) {
468
+ module.bind.touchEvents();
469
+ }
470
+ module.bind.keyboardEvents();
471
+ module.bind.inputEvents();
472
+ module.bind.mouseEvents();
473
+ },
474
+ touchEvents: function() {
475
+ module.debug('Touch device detected binding additional touch events');
476
+ if( module.is.searchSelection() ) {
477
+ // do nothing special yet
478
+ }
479
+ else if( module.is.single() ) {
480
+ $module
481
+ .on('touchstart' + eventNamespace, module.event.test.toggle)
482
+ ;
483
+ }
484
+ $menu
485
+ .on('touchstart' + eventNamespace, selector.item, module.event.item.mouseenter)
486
+ ;
487
+ },
459
488
  keyboardEvents: function() {
460
- module.debug('Binding keyboard events');
489
+ module.verbose('Binding keyboard events');
461
490
  $module
462
491
  .on('keydown' + eventNamespace, module.event.keydown)
463
492
  ;
@@ -472,25 +501,17 @@ $.fn.dropdown = function(parameters) {
472
501
  ;
473
502
  }
474
503
  },
475
- touchEvents: function() {
476
- module.debug('Touch device detected binding additional touch events');
477
- if( module.is.searchSelection() ) {
478
- // do nothing special yet
479
- }
480
- else if( module.is.single() ) {
481
- $module
482
- .on('touchstart' + eventNamespace, module.event.test.toggle)
483
- ;
484
- }
485
- $menu
486
- .on('touchstart' + eventNamespace, selector.item, module.event.item.mouseenter)
504
+ inputEvents: function() {
505
+ module.verbose('Binding input change events');
506
+ $module
507
+ .on('change' + eventNamespace, selector.input, module.event.change)
487
508
  ;
488
509
  },
489
510
  mouseEvents: function() {
490
- module.debug('Mouse detected binding mouse events');
511
+ module.verbose('Binding mouse events');
491
512
  if(module.is.multiple()) {
492
513
  $module
493
- .on('click' + eventNamespace, selector.label, module.event.label.click)
514
+ .on('click' + eventNamespace, selector.label, module.event.label.click)
494
515
  .on('click' + eventNamespace, selector.remove, module.event.remove.click)
495
516
  ;
496
517
  }
@@ -627,7 +648,6 @@ $.fn.dropdown = function(parameters) {
627
648
  apiSettings = {
628
649
  errorDuration : false,
629
650
  throttle : settings.throttle,
630
- cache : 'local',
631
651
  urlData : {
632
652
  query: query
633
653
  },
@@ -668,7 +688,7 @@ $.fn.dropdown = function(parameters) {
668
688
  beginsWithRegExp = new RegExp('^' + escapedTerm, 'igm')
669
689
  ;
670
690
  // avoid loop if we're matching nothing
671
- if(searchTerm === '') {
691
+ if( !module.has.query() ) {
672
692
  $results = $item;
673
693
  }
674
694
  else {
@@ -706,7 +726,6 @@ $.fn.dropdown = function(parameters) {
706
726
  })
707
727
  ;
708
728
  }
709
-
710
729
  module.debug('Showing only matched items', searchTerm);
711
730
  module.remove.filteredItem();
712
731
  $item
@@ -765,7 +784,7 @@ $.fn.dropdown = function(parameters) {
765
784
  : $activeItem,
766
785
  hasSelected = ($selectedItem.size() > 0)
767
786
  ;
768
- if(hasSelected) {
787
+ if( hasSelected && module.has.query() ) {
769
788
  module.debug('Forcing partial selection to selected item', $selectedItem);
770
789
  module.event.item.click.call($selectedItem);
771
790
  }
@@ -775,6 +794,12 @@ $.fn.dropdown = function(parameters) {
775
794
  },
776
795
 
777
796
  event: {
797
+ change: function() {
798
+ if(!internalChange) {
799
+ module.debug('Input changed, updating selection');
800
+ module.set.selected();
801
+ }
802
+ },
778
803
  focus: function() {
779
804
  if(settings.showOnFocus && !activated && module.is.hidden() && !pageLostFocus) {
780
805
  module.show();
@@ -827,6 +852,11 @@ $.fn.dropdown = function(parameters) {
827
852
  module.hide();
828
853
  }
829
854
  }
855
+ else if(pageLostFocus) {
856
+ if(settings.forceSelection) {
857
+ module.forceSelection();
858
+ }
859
+ }
830
860
  }
831
861
  },
832
862
  icon: {
@@ -903,7 +933,9 @@ $.fn.dropdown = function(parameters) {
903
933
  touch: function(event) {
904
934
  module.determine.eventOnElement(event, function() {
905
935
  if(event.type == 'touchstart') {
906
- module.timer = setTimeout(module.hide, settings.delay.touch);
936
+ module.timer = setTimeout(function() {
937
+ module.hide();
938
+ }, settings.delay.touch);
907
939
  }
908
940
  else if(event.type == 'touchmove') {
909
941
  clearTimeout(module.timer);
@@ -953,15 +985,17 @@ $.fn.dropdown = function(parameters) {
953
985
  }, settings.delay.hide);
954
986
  }
955
987
  },
988
+ touchend: function() {
989
+ },
956
990
  click: function (event) {
957
991
  var
958
- $choice = $(this),
959
- $target = (event)
992
+ $choice = $(this),
993
+ $target = (event)
960
994
  ? $(event.target)
961
995
  : $(''),
962
- $subMenu = $choice.find(selector.menu),
963
- text = module.get.choiceText($choice),
964
- value = module.get.choiceValue($choice, text),
996
+ $subMenu = $choice.find(selector.menu),
997
+ text = module.get.choiceText($choice),
998
+ value = module.get.choiceValue($choice, text),
965
999
  hasSubMenu = ($subMenu.length > 0),
966
1000
  isBubbledEvent = ($subMenu.find($target).length > 0)
967
1001
  ;
@@ -988,7 +1022,7 @@ $.fn.dropdown = function(parameters) {
988
1022
  var
989
1023
  $label = $module.find(selector.label),
990
1024
  $activeLabel = $label.filter('.' + className.active),
991
- activeValue = $activeLabel.data('value'),
1025
+ activeValue = $activeLabel.data(metadata.value),
992
1026
  labelIndex = $label.index($activeLabel),
993
1027
  labelCount = $label.length,
994
1028
  hasActiveLabel = ($activeLabel.length > 0),
@@ -1351,7 +1385,8 @@ $.fn.dropdown = function(parameters) {
1351
1385
  module.hideAndClear();
1352
1386
  },
1353
1387
 
1354
- hide: function() {
1388
+ hide: function(text, value) {
1389
+ module.set.value(value);
1355
1390
  module.hideAndClear();
1356
1391
  }
1357
1392
 
@@ -1361,6 +1396,15 @@ $.fn.dropdown = function(parameters) {
1361
1396
  id: function() {
1362
1397
  return id;
1363
1398
  },
1399
+ defaultText: function() {
1400
+ return $module.data(metadata.defaultText);
1401
+ },
1402
+ defaultValue: function() {
1403
+ return $module.data(metadata.defaultValue);
1404
+ },
1405
+ placeholderText: function() {
1406
+ return $module.data(metadata.placeholderText) || '';
1407
+ },
1364
1408
  text: function() {
1365
1409
  return $text.text();
1366
1410
  },
@@ -1509,8 +1553,8 @@ $.fn.dropdown = function(parameters) {
1509
1553
  return ($choice.data(metadata.text) !== undefined)
1510
1554
  ? $choice.data(metadata.text)
1511
1555
  : (preserveHTML)
1512
- ? $choice.html().trim()
1513
- : $choice.text().trim()
1556
+ ? $.trim($choice.html())
1557
+ : $.trim($choice.text())
1514
1558
  ;
1515
1559
  }
1516
1560
  },
@@ -1520,10 +1564,10 @@ $.fn.dropdown = function(parameters) {
1520
1564
  return false;
1521
1565
  }
1522
1566
  return ($choice.data(metadata.value) !== undefined)
1523
- ? $choice.data(metadata.value)
1567
+ ? String( $choice.data(metadata.value) )
1524
1568
  : (typeof choiceText === 'string')
1525
- ? choiceText.toLowerCase().trim()
1526
- : choiceText
1569
+ ? $.trim(choiceText.toLowerCase())
1570
+ : String(choiceText)
1527
1571
  ;
1528
1572
  },
1529
1573
  inputEvent: function() {
@@ -1626,7 +1670,7 @@ $.fn.dropdown = function(parameters) {
1626
1670
  ;
1627
1671
  shouldSearch = (isMultiple)
1628
1672
  ? (value.length > 0)
1629
- : (value !== undefined && value !== '' && value !== null)
1673
+ : (value !== undefined && value !== null)
1630
1674
  ;
1631
1675
  isMultiple = (module.is.multiple() && $.isArray(value));
1632
1676
  strict = (value === '' || value === 0)
@@ -1646,7 +1690,7 @@ $.fn.dropdown = function(parameters) {
1646
1690
  return;
1647
1691
  }
1648
1692
  if(isMultiple) {
1649
- if($.inArray(optionValue.toString(), value) !== -1 || $.inArray(optionText, value) !== -1) {
1693
+ if($.inArray( String(optionValue), value) !== -1 || $.inArray(optionText, value) !== -1) {
1650
1694
  $selectedItem = ($selectedItem)
1651
1695
  ? $selectedItem.add($choice)
1652
1696
  : $choice
@@ -1661,7 +1705,7 @@ $.fn.dropdown = function(parameters) {
1661
1705
  }
1662
1706
  }
1663
1707
  else {
1664
- if( optionValue.toString() == value.toString() || optionText == value) {
1708
+ if( String(optionValue) == String(value) || optionText == value) {
1665
1709
  module.verbose('Found select item by value', optionValue, value);
1666
1710
  $selectedItem = $choice;
1667
1711
  return true;
@@ -1711,15 +1755,21 @@ $.fn.dropdown = function(parameters) {
1711
1755
  },
1712
1756
  defaultText: function() {
1713
1757
  var
1714
- defaultText = $module.data(metadata.defaultText)
1758
+ defaultText = module.get.defaultText(),
1759
+ placeholderText = module.get.placeholderText
1715
1760
  ;
1716
- module.debug('Restoring default text', defaultText);
1717
- module.set.text(defaultText);
1718
- $text.addClass(className.placeholder);
1761
+ if(defaultText === placeholderText) {
1762
+ module.debug('Restoring default placeholder text', defaultText);
1763
+ module.set.placeholderText(defaultText);
1764
+ }
1765
+ else {
1766
+ module.debug('Restoring default text', defaultText);
1767
+ module.set.text(defaultText);
1768
+ }
1719
1769
  },
1720
1770
  defaultValue: function() {
1721
1771
  var
1722
- defaultValue = $module.data(metadata.defaultValue)
1772
+ defaultValue = module.get.defaultValue()
1723
1773
  ;
1724
1774
  if(defaultValue !== undefined) {
1725
1775
  module.debug('Restoring default value', defaultValue);
@@ -1831,7 +1881,7 @@ $.fn.dropdown = function(parameters) {
1831
1881
  var
1832
1882
  text
1833
1883
  ;
1834
- if($text.hasClass(className.placeholder)) {
1884
+ if(settings.placeholder !== false && $text.hasClass(className.placeholder)) {
1835
1885
  text = module.get.text();
1836
1886
  module.verbose('Saving placeholder text as', text);
1837
1887
  $module.data(metadata.placeholderText, text);
@@ -1865,8 +1915,8 @@ $.fn.dropdown = function(parameters) {
1865
1915
 
1866
1916
  scrollPage: function(direction, $selectedItem) {
1867
1917
  var
1868
- $selectedItem = $selectedItem || module.get.selectedItem(),
1869
- $menu = $selectedItem.closest(selector.menu),
1918
+ $currentItem = $selectedItem || module.get.selectedItem(),
1919
+ $menu = $currentItem.closest(selector.menu),
1870
1920
  menuHeight = $menu.outerHeight(),
1871
1921
  currentScroll = $menu.scrollTop(),
1872
1922
  itemHeight = $item.eq(0).outerHeight(),
@@ -1881,8 +1931,8 @@ $.fn.dropdown = function(parameters) {
1881
1931
  elementIndex
1882
1932
  ;
1883
1933
  elementIndex = (direction == 'up')
1884
- ? $selectableItem.index($selectedItem) - itemsPerPage
1885
- : $selectableItem.index($selectedItem) + itemsPerPage
1934
+ ? $selectableItem.index($currentItem) - itemsPerPage
1935
+ : $selectableItem.index($currentItem) + itemsPerPage
1886
1936
  ;
1887
1937
  isWithinRange = (direction == 'up')
1888
1938
  ? (elementIndex >= 0)
@@ -1896,7 +1946,7 @@ $.fn.dropdown = function(parameters) {
1896
1946
  ;
1897
1947
  if($nextSelectedItem.length > 0) {
1898
1948
  module.debug('Scrolling page', direction, $nextSelectedItem);
1899
- $selectedItem
1949
+ $currentItem
1900
1950
  .removeClass(className.selected)
1901
1951
  ;
1902
1952
  $nextSelectedItem
@@ -1938,12 +1988,10 @@ $.fn.dropdown = function(parameters) {
1938
1988
  $module.addClass(className.loading);
1939
1989
  },
1940
1990
  placeholderText: function(text) {
1941
- text = text || $module.data(metadata.placeholderText);
1942
- if(text) {
1943
- module.debug('Restoring placeholder text');
1944
- module.set.text(text);
1945
- $text.addClass(className.placeholder);
1946
- }
1991
+ text = text || module.get.placeholderText();
1992
+ module.debug('Setting placeholder text', text);
1993
+ module.set.text(text);
1994
+ $text.addClass(className.placeholder);
1947
1995
  },
1948
1996
  tabbable: function() {
1949
1997
  if( module.has.search() ) {
@@ -1972,6 +2020,14 @@ $.fn.dropdown = function(parameters) {
1972
2020
  module.verbose('Setting initial load');
1973
2021
  initialLoad = true;
1974
2022
  },
2023
+ activeItem: function($item) {
2024
+ if( settings.allowAdditions && $item.filter(selector.addition).length > 0 ) {
2025
+ $item.addClass(className.filtered);
2026
+ }
2027
+ else {
2028
+ $item.addClass(className.active);
2029
+ }
2030
+ },
1975
2031
  scrollPosition: function($item, forceScroll) {
1976
2032
  var
1977
2033
  edgeTolerance = 5,
@@ -2026,10 +2082,12 @@ $.fn.dropdown = function(parameters) {
2026
2082
  }
2027
2083
  }
2028
2084
  else {
2085
+ if(text !== module.get.placeholderText()) {
2086
+ $text.removeClass(className.placeholder);
2087
+ }
2029
2088
  module.debug('Changing text', text, $text);
2030
2089
  $text
2031
2090
  .removeClass(className.filtered)
2032
- .removeClass(className.placeholder)
2033
2091
  ;
2034
2092
  if(settings.preserveHTML) {
2035
2093
  $text.html(text);
@@ -2095,8 +2153,8 @@ $.fn.dropdown = function(parameters) {
2095
2153
  hasInput = ($input.length > 0),
2096
2154
  isAddition = !module.has.value(value),
2097
2155
  currentValue = module.get.values(),
2098
- stringValue = (typeof value == 'number')
2099
- ? value.toString()
2156
+ stringValue = (value !== undefined)
2157
+ ? String(value)
2100
2158
  : value,
2101
2159
  newValue
2102
2160
  ;
@@ -2113,15 +2171,22 @@ $.fn.dropdown = function(parameters) {
2113
2171
  module.add.optionValue(value);
2114
2172
  }
2115
2173
  module.debug('Updating input value', value, currentValue);
2174
+ internalChange = true;
2116
2175
  $input
2117
2176
  .val(value)
2118
- .trigger('change')
2119
2177
  ;
2178
+ if(settings.fireOnInit === false && module.is.initialLoad()) {
2179
+ module.debug('Input native change event ignored on initial load');
2180
+ }
2181
+ else {
2182
+ $input.trigger('change');
2183
+ }
2184
+ internalChange = false;
2120
2185
  }
2121
2186
  else {
2122
2187
  module.verbose('Storing value in metadata', value, $input);
2123
2188
  if(value !== currentValue) {
2124
- $module.data(metadata.value, value);
2189
+ $module.data(metadata.value, stringValue);
2125
2190
  }
2126
2191
  }
2127
2192
  if(settings.fireOnInit === false && module.is.initialLoad()) {
@@ -2188,14 +2253,14 @@ $.fn.dropdown = function(parameters) {
2188
2253
  if(settings.useLabels) {
2189
2254
  module.add.value(selectedValue, selectedText, $selected);
2190
2255
  module.add.label(selectedValue, selectedText, shouldAnimate);
2191
- $selected.addClass(className.active);
2256
+ module.set.activeItem($selected);
2192
2257
  module.filterActive();
2193
2258
  module.select.nextAvailable($selectedItem);
2194
2259
  }
2195
2260
  else {
2196
2261
  module.add.value(selectedValue, selectedText, $selected);
2197
2262
  module.set.text(module.add.variables(message.count));
2198
- $selected.addClass(className.active);
2263
+ module.set.activeItem($selected);
2199
2264
  }
2200
2265
  }
2201
2266
  else if(!isFiltered) {
@@ -2308,7 +2373,8 @@ $.fn.dropdown = function(parameters) {
2308
2373
  userSuggestion: function(value) {
2309
2374
  var
2310
2375
  $addition = $menu.children(selector.addition),
2311
- alreadyHasValue = module.get.item(value),
2376
+ $existingItem = module.get.item(value),
2377
+ alreadyHasValue = $existingItem && $existingItem.not(selector.addition).length,
2312
2378
  hasUserSuggestion = $addition.length > 0,
2313
2379
  html
2314
2380
  ;
@@ -2323,10 +2389,11 @@ $.fn.dropdown = function(parameters) {
2323
2389
  .removeClass(className.selected)
2324
2390
  ;
2325
2391
  if(hasUserSuggestion) {
2326
- html = settings.templates.addition(value);
2392
+ html = settings.templates.addition( module.add.variables(message.addResult, value) );
2327
2393
  $addition
2328
2394
  .html(html)
2329
- .data(metadata.value, value)
2395
+ .attr('data-' + metadata.value, value)
2396
+ .attr('data-' + metadata.text, value)
2330
2397
  .removeClass(className.filtered)
2331
2398
  .addClass(className.selected)
2332
2399
  ;
@@ -2341,7 +2408,7 @@ $.fn.dropdown = function(parameters) {
2341
2408
  module.verbose('Adding item choice to menu corresponding with user choice addition', $addition);
2342
2409
  }
2343
2410
  },
2344
- variables: function(message) {
2411
+ variables: function(message, term) {
2345
2412
  var
2346
2413
  hasCount = (message.search('{count}') !== -1),
2347
2414
  hasMaxCount = (message.search('{maxCount}') !== -1),
@@ -2360,7 +2427,7 @@ $.fn.dropdown = function(parameters) {
2360
2427
  message = message.replace('{maxCount}', settings.maxSelections);
2361
2428
  }
2362
2429
  if(hasTerm) {
2363
- query = module.get.query();
2430
+ query = term || module.get.query();
2364
2431
  message = message.replace('{term}', query);
2365
2432
  }
2366
2433
  return message;
@@ -2395,7 +2462,7 @@ $.fn.dropdown = function(parameters) {
2395
2462
  }
2396
2463
 
2397
2464
  if(settings.fireOnInit === false && module.is.initialLoad()) {
2398
- module.verbose('No callback on initial load', settings.onAdd);
2465
+ module.verbose('Skipping onadd callback on initial load', settings.onAdd);
2399
2466
  }
2400
2467
  else {
2401
2468
  settings.onAdd.call(element, addedValue, addedText, $selectedItem);
@@ -2432,7 +2499,7 @@ $.fn.dropdown = function(parameters) {
2432
2499
  if(settings.useLabels && module.has.maxSelections() ) {
2433
2500
  return;
2434
2501
  }
2435
- if(settings.useLabels) {
2502
+ if(settings.useLabels && module.is.multiple()) {
2436
2503
  $item.not('.' + className.active).removeClass(className.filtered);
2437
2504
  }
2438
2505
  else {
@@ -2493,7 +2560,12 @@ $.fn.dropdown = function(parameters) {
2493
2560
  }
2494
2561
  else {
2495
2562
  module.remove.value(selectedValue, selectedText, $selected);
2496
- module.set.text(module.add.variables(message.count));
2563
+ if(module.get.selectionCount() === 0) {
2564
+ module.set.placeholderText();
2565
+ }
2566
+ else {
2567
+ module.set.text(module.add.variables(message.count));
2568
+ }
2497
2569
  }
2498
2570
  }
2499
2571
  else {
@@ -2565,16 +2637,19 @@ $.fn.dropdown = function(parameters) {
2565
2637
  $labels
2566
2638
  .each(function(){
2567
2639
  var
2568
- value = $(this).data('value'),
2569
- isUserValue = module.is.userValue(value)
2640
+ value = $(this).data(metadata.value),
2641
+ stringValue = (value !== undefined)
2642
+ ? String(value)
2643
+ : value,
2644
+ isUserValue = module.is.userValue(stringValue)
2570
2645
  ;
2571
2646
  if(isUserValue) {
2572
- module.remove.value(value);
2573
- module.remove.label(value);
2647
+ module.remove.value(stringValue);
2648
+ module.remove.label(stringValue);
2574
2649
  }
2575
2650
  else {
2576
2651
  // selected will also remove label
2577
- module.remove.selected(value);
2652
+ module.remove.selected(stringValue);
2578
2653
  }
2579
2654
  })
2580
2655
  ;
@@ -2645,6 +2720,9 @@ $.fn.dropdown = function(parameters) {
2645
2720
  allResultsFiltered: function() {
2646
2721
  return ($item.filter(selector.unselectable).length === $item.length);
2647
2722
  },
2723
+ query: function() {
2724
+ return (module.get.query() !== '');
2725
+ },
2648
2726
  value: function(value) {
2649
2727
  var
2650
2728
  values = module.get.values(),
@@ -3225,6 +3303,13 @@ $.fn.dropdown.settings = {
3225
3303
  value : 'value'
3226
3304
  },
3227
3305
 
3306
+ // property names for remote query
3307
+ fields: {
3308
+ values : 'values', // grouping for all dropdown values
3309
+ name : 'name', // displayed dropdown text
3310
+ value : 'value' // actual dropdown value
3311
+ },
3312
+
3228
3313
  selector : {
3229
3314
  addition : '.addition',
3230
3315
  dropdown : '.ui.dropdown',
@@ -3295,13 +3380,13 @@ $.fn.dropdown.settings.templates = {
3295
3380
  },
3296
3381
 
3297
3382
  // generates just menu from select
3298
- menu: function(response) {
3383
+ menu: function(response, fields) {
3299
3384
  var
3300
3385
  values = response.values || {},
3301
3386
  html = ''
3302
3387
  ;
3303
- $.each(response.values, function(index, option) {
3304
- html += '<div class="item" data-value="' + option.value + '">' + option.name + '</div>';
3388
+ $.each(response[fields.values], function(index, option) {
3389
+ html += '<div class="item" data-value="' + option[fields.value] + '">' + option[fields.name] + '</div>';
3305
3390
  });
3306
3391
  return html;
3307
3392
  },