fomantic-ui 2.9.0-beta.23 → 2.9.0-beta.230

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 (270) hide show
  1. package/.all-contributorsrc +197 -3
  2. package/.github/workflows/ci.yml +4 -4
  3. package/.github/workflows/nightly.yml +4 -4
  4. package/.github/workflows/release.yml +30 -0
  5. package/CONTRIBUTORS.md +74 -37
  6. package/README.md +8 -8
  7. package/dist/components/accordion.css +162 -26
  8. package/dist/components/accordion.js +1 -1
  9. package/dist/components/accordion.min.css +2 -2
  10. package/dist/components/accordion.min.js +2 -2
  11. package/dist/components/ad.css +1 -1
  12. package/dist/components/ad.min.css +1 -1
  13. package/dist/components/api.js +30 -26
  14. package/dist/components/api.min.js +3 -3
  15. package/dist/components/breadcrumb.css +1 -1
  16. package/dist/components/breadcrumb.min.css +1 -1
  17. package/dist/components/button.css +176 -134
  18. package/dist/components/button.min.css +2 -2
  19. package/dist/components/calendar.css +18 -1
  20. package/dist/components/calendar.js +10 -9
  21. package/dist/components/calendar.min.css +2 -2
  22. package/dist/components/calendar.min.js +3 -3
  23. package/dist/components/card.css +26 -19
  24. package/dist/components/card.min.css +2 -2
  25. package/dist/components/checkbox.css +2 -1
  26. package/dist/components/checkbox.js +17 -11
  27. package/dist/components/checkbox.min.css +2 -2
  28. package/dist/components/checkbox.min.js +3 -3
  29. package/dist/components/comment.css +11 -11
  30. package/dist/components/comment.min.css +1 -1
  31. package/dist/components/container.css +77 -1
  32. package/dist/components/container.min.css +2 -2
  33. package/dist/components/dimmer.css +28 -14
  34. package/dist/components/dimmer.js +1 -1
  35. package/dist/components/dimmer.min.css +2 -2
  36. package/dist/components/dimmer.min.js +2 -2
  37. package/dist/components/divider.css +1 -1
  38. package/dist/components/divider.min.css +1 -1
  39. package/dist/components/dropdown.css +49 -13
  40. package/dist/components/dropdown.js +58 -33
  41. package/dist/components/dropdown.min.css +2 -2
  42. package/dist/components/dropdown.min.js +3 -3
  43. package/dist/components/embed.css +1 -1
  44. package/dist/components/embed.js +1 -1
  45. package/dist/components/embed.min.css +1 -1
  46. package/dist/components/embed.min.js +2 -2
  47. package/dist/components/emoji.css +2 -2
  48. package/dist/components/feed.css +28 -28
  49. package/dist/components/feed.min.css +2 -2
  50. package/dist/components/flag.css +731 -625
  51. package/dist/components/flag.min.css +2 -2
  52. package/dist/components/form.css +106 -55
  53. package/dist/components/form.js +30 -28
  54. package/dist/components/form.min.css +2 -2
  55. package/dist/components/form.min.js +3 -3
  56. package/dist/components/grid.css +11 -8
  57. package/dist/components/grid.min.css +2 -2
  58. package/dist/components/header.css +3 -1
  59. package/dist/components/header.min.css +2 -2
  60. package/dist/components/icon.css +126 -47
  61. package/dist/components/icon.min.css +2 -2
  62. package/dist/components/image.css +1 -1
  63. package/dist/components/image.min.css +1 -1
  64. package/dist/components/input.css +734 -17
  65. package/dist/components/input.min.css +2 -2
  66. package/dist/components/item.css +13 -13
  67. package/dist/components/item.min.css +1 -1
  68. package/dist/components/label.css +1 -1
  69. package/dist/components/label.min.css +1 -1
  70. package/dist/components/list.css +1 -1
  71. package/dist/components/list.min.css +1 -1
  72. package/dist/components/loader.css +1 -1
  73. package/dist/components/loader.min.css +1 -1
  74. package/dist/components/menu.css +29 -5
  75. package/dist/components/menu.min.css +1 -1
  76. package/dist/components/message.css +41 -41
  77. package/dist/components/message.min.css +2 -2
  78. package/dist/components/modal.css +13 -1
  79. package/dist/components/modal.js +121 -46
  80. package/dist/components/modal.min.css +2 -2
  81. package/dist/components/modal.min.js +3 -3
  82. package/dist/components/nag.css +1 -1
  83. package/dist/components/nag.js +1 -1
  84. package/dist/components/nag.min.css +1 -1
  85. package/dist/components/nag.min.js +2 -2
  86. package/dist/components/placeholder.css +1 -1
  87. package/dist/components/placeholder.min.css +1 -1
  88. package/dist/components/popup.css +1 -1
  89. package/dist/components/popup.js +1 -1
  90. package/dist/components/popup.min.css +1 -1
  91. package/dist/components/popup.min.js +2 -2
  92. package/dist/components/progress.css +1 -1
  93. package/dist/components/progress.js +4 -1
  94. package/dist/components/progress.min.css +1 -1
  95. package/dist/components/progress.min.js +3 -3
  96. package/dist/components/rail.css +1 -1
  97. package/dist/components/rail.min.css +1 -1
  98. package/dist/components/rating.css +7 -46
  99. package/dist/components/rating.js +1 -1
  100. package/dist/components/rating.min.css +2 -2
  101. package/dist/components/rating.min.js +2 -2
  102. package/dist/components/reset.css +1 -1
  103. package/dist/components/reset.min.css +1 -1
  104. package/dist/components/reveal.css +1 -1
  105. package/dist/components/reveal.min.css +1 -1
  106. package/dist/components/search.css +1 -1
  107. package/dist/components/search.js +1 -1
  108. package/dist/components/search.min.css +1 -1
  109. package/dist/components/search.min.js +2 -2
  110. package/dist/components/segment.css +90 -6
  111. package/dist/components/segment.min.css +2 -2
  112. package/dist/components/shape.css +1 -1
  113. package/dist/components/shape.js +1 -1
  114. package/dist/components/shape.min.css +1 -1
  115. package/dist/components/shape.min.js +2 -2
  116. package/dist/components/sidebar.css +4 -2
  117. package/dist/components/sidebar.js +1 -1
  118. package/dist/components/sidebar.min.css +2 -2
  119. package/dist/components/sidebar.min.js +2 -2
  120. package/dist/components/site.css +61 -39
  121. package/dist/components/site.js +1 -1
  122. package/dist/components/site.min.css +2 -2
  123. package/dist/components/site.min.js +2 -2
  124. package/dist/components/slider.js +1 -1
  125. package/dist/components/slider.min.js +2 -2
  126. package/dist/components/state.js +1 -1
  127. package/dist/components/state.min.js +2 -2
  128. package/dist/components/statistic.css +1 -1
  129. package/dist/components/statistic.min.css +1 -1
  130. package/dist/components/step.css +4 -4
  131. package/dist/components/step.min.css +2 -2
  132. package/dist/components/sticky.css +1 -1
  133. package/dist/components/sticky.js +1 -1
  134. package/dist/components/sticky.min.css +1 -1
  135. package/dist/components/sticky.min.js +2 -2
  136. package/dist/components/tab.css +1 -1
  137. package/dist/components/tab.js +23 -5
  138. package/dist/components/tab.min.css +1 -1
  139. package/dist/components/tab.min.js +3 -3
  140. package/dist/components/table.css +1168 -26
  141. package/dist/components/table.min.css +2 -2
  142. package/dist/components/text.css +1 -1
  143. package/dist/components/text.min.css +1 -1
  144. package/dist/components/toast.css +39 -1
  145. package/dist/components/toast.js +56 -28
  146. package/dist/components/toast.min.css +2 -2
  147. package/dist/components/toast.min.js +3 -3
  148. package/dist/components/transition.css +1 -1
  149. package/dist/components/transition.js +1 -1
  150. package/dist/components/transition.min.css +1 -1
  151. package/dist/components/transition.min.js +2 -2
  152. package/dist/components/visibility.js +1 -1
  153. package/dist/components/visibility.min.js +2 -2
  154. package/dist/semantic.css +4600 -1517
  155. package/dist/semantic.js +366 -204
  156. package/dist/semantic.min.css +3 -3
  157. package/dist/semantic.min.js +3 -3
  158. package/dist/themes/default/assets/fonts/brand-icons.eot +0 -0
  159. package/dist/themes/default/assets/fonts/brand-icons.svg +801 -654
  160. package/dist/themes/default/assets/fonts/brand-icons.ttf +0 -0
  161. package/dist/themes/default/assets/fonts/brand-icons.woff +0 -0
  162. package/dist/themes/default/assets/fonts/brand-icons.woff2 +0 -0
  163. package/dist/themes/default/assets/fonts/icons.eot +0 -0
  164. package/dist/themes/default/assets/fonts/icons.svg +1175 -1079
  165. package/dist/themes/default/assets/fonts/icons.ttf +0 -0
  166. package/dist/themes/default/assets/fonts/icons.woff +0 -0
  167. package/dist/themes/default/assets/fonts/icons.woff2 +0 -0
  168. package/dist/themes/default/assets/fonts/outline-icons.eot +0 -0
  169. package/dist/themes/default/assets/fonts/outline-icons.svg +93 -95
  170. package/dist/themes/default/assets/fonts/outline-icons.ttf +0 -0
  171. package/dist/themes/default/assets/fonts/outline-icons.woff +0 -0
  172. package/dist/themes/default/assets/fonts/outline-icons.woff2 +0 -0
  173. package/examples/assets/library/iframe-content.js +5 -5
  174. package/package.json +10 -9
  175. package/src/definitions/behaviors/api.js +29 -25
  176. package/src/definitions/behaviors/form.js +29 -27
  177. package/src/definitions/collections/form.less +193 -140
  178. package/src/definitions/collections/grid.less +716 -680
  179. package/src/definitions/collections/menu.less +173 -126
  180. package/src/definitions/collections/message.less +48 -46
  181. package/src/definitions/collections/table.less +849 -262
  182. package/src/definitions/elements/button.less +586 -449
  183. package/src/definitions/elements/container.less +126 -8
  184. package/src/definitions/elements/emoji.less +15 -9
  185. package/src/definitions/elements/flag.less +7 -17
  186. package/src/definitions/elements/header.less +44 -35
  187. package/src/definitions/elements/icon.less +38 -31
  188. package/src/definitions/elements/input.less +256 -21
  189. package/src/definitions/elements/label.less +92 -91
  190. package/src/definitions/elements/list.less +55 -45
  191. package/src/definitions/elements/loader.less +30 -29
  192. package/src/definitions/elements/segment.less +146 -27
  193. package/src/definitions/elements/step.less +52 -48
  194. package/src/definitions/elements/text.less +17 -15
  195. package/src/definitions/globals/site.less +23 -2
  196. package/src/definitions/modules/accordion.less +175 -24
  197. package/src/definitions/modules/calendar.js +9 -8
  198. package/src/definitions/modules/calendar.less +20 -0
  199. package/src/definitions/modules/checkbox.js +16 -10
  200. package/src/definitions/modules/checkbox.less +34 -178
  201. package/src/definitions/modules/dimmer.less +21 -8
  202. package/src/definitions/modules/dropdown.js +57 -32
  203. package/src/definitions/modules/dropdown.less +145 -94
  204. package/src/definitions/modules/modal.js +120 -45
  205. package/src/definitions/modules/modal.less +12 -0
  206. package/src/definitions/modules/nag.less +20 -19
  207. package/src/definitions/modules/progress.js +3 -0
  208. package/src/definitions/modules/progress.less +19 -18
  209. package/src/definitions/modules/rating.less +49 -42
  210. package/src/definitions/modules/search.less +32 -16
  211. package/src/definitions/modules/sidebar.less +33 -19
  212. package/src/definitions/modules/slider.less +39 -38
  213. package/src/definitions/modules/tab.js +22 -4
  214. package/src/definitions/modules/toast.js +55 -27
  215. package/src/definitions/modules/toast.less +48 -16
  216. package/src/definitions/views/card.less +402 -361
  217. package/src/definitions/views/comment.less +92 -81
  218. package/src/definitions/views/feed.less +164 -144
  219. package/src/definitions/views/item.less +249 -196
  220. package/src/definitions/views/statistic.less +90 -88
  221. package/src/themes/bookish/elements/header.overrides +1 -1
  222. package/src/themes/chubby/elements/button.overrides +1 -1
  223. package/src/themes/chubby/elements/header.overrides +1 -1
  224. package/src/themes/default/assets/fonts/brand-icons.eot +0 -0
  225. package/src/themes/default/assets/fonts/brand-icons.svg +801 -654
  226. package/src/themes/default/assets/fonts/brand-icons.ttf +0 -0
  227. package/src/themes/default/assets/fonts/brand-icons.woff +0 -0
  228. package/src/themes/default/assets/fonts/brand-icons.woff2 +0 -0
  229. package/src/themes/default/assets/fonts/icons.eot +0 -0
  230. package/src/themes/default/assets/fonts/icons.svg +1175 -1079
  231. package/src/themes/default/assets/fonts/icons.ttf +0 -0
  232. package/src/themes/default/assets/fonts/icons.woff +0 -0
  233. package/src/themes/default/assets/fonts/icons.woff2 +0 -0
  234. package/src/themes/default/assets/fonts/outline-icons.eot +0 -0
  235. package/src/themes/default/assets/fonts/outline-icons.svg +93 -95
  236. package/src/themes/default/assets/fonts/outline-icons.ttf +0 -0
  237. package/src/themes/default/assets/fonts/outline-icons.woff +0 -0
  238. package/src/themes/default/assets/fonts/outline-icons.woff2 +0 -0
  239. package/src/themes/default/collections/menu.variables +6 -0
  240. package/src/themes/default/collections/table.variables +52 -0
  241. package/src/themes/default/elements/button.variables +7 -1
  242. package/src/themes/default/elements/container.variables +8 -0
  243. package/src/themes/default/elements/flag.overrides +1635 -986
  244. package/src/themes/default/elements/flag.variables +7 -5
  245. package/src/themes/default/elements/icon.overrides +75 -48
  246. package/src/themes/default/elements/icon.variables +1 -0
  247. package/src/themes/default/elements/input.variables +15 -0
  248. package/src/themes/default/elements/segment.variables +8 -0
  249. package/src/themes/default/elements/step.overrides +1 -1
  250. package/src/themes/default/globals/site.variables +6 -0
  251. package/src/themes/default/globals/variation.variables +139 -6
  252. package/src/themes/default/modules/accordion.variables +49 -2
  253. package/src/themes/default/modules/calendar.variables +3 -0
  254. package/src/themes/default/modules/checkbox.variables +5 -5
  255. package/src/themes/default/modules/dimmer.variables +1 -1
  256. package/src/themes/default/modules/dropdown.variables +4 -10
  257. package/src/themes/default/modules/modal.variables +13 -0
  258. package/src/themes/default/modules/toast.variables +3 -0
  259. package/src/themes/famfamfam/elements/flag.overrides +1026 -0
  260. package/src/themes/famfamfam/elements/flag.variables +13 -0
  261. package/src/themes/instagram/views/card.overrides +1 -1
  262. package/src/themes/material/collections/menu.overrides +1 -1
  263. package/src/themes/material/elements/button.overrides +1 -1
  264. package/src/themes/material/elements/header.overrides +1 -1
  265. package/src/themes/material/modules/dropdown.overrides +1 -1
  266. package/src/themes/material/modules/modal.overrides +1 -1
  267. package/src/themes/rtl/globals/site.overrides +1 -1
  268. package/tasks/build/css.js +6 -1
  269. package/tasks/config/project/install.js +11 -5
  270. package/test/helpers/sinon.js +1 -1
package/dist/semantic.js CHANGED
@@ -1,15 +1,15 @@
1
1
  /*
2
- * # Fomantic UI - 2.9.0-beta.23
2
+ * # Fomantic UI - 2.9.0-beta.230
3
3
  * https://github.com/fomantic/Fomantic-UI
4
4
  * http://fomantic-ui.com/
5
5
  *
6
- * Copyright 2021 Contributors
6
+ * Copyright 2022 Contributors
7
7
  * Released under the MIT license
8
8
  * http://opensource.org/licenses/MIT
9
9
  *
10
10
  */
11
11
  /*!
12
- * # Fomantic-UI 2.9.0-beta.23 - Site
12
+ * # Fomantic-UI 2.9.0-beta.230 - Site
13
13
  * http://github.com/fomantic/Fomantic-UI/
14
14
  *
15
15
  *
@@ -503,7 +503,7 @@ $.extend($.expr[ ":" ], {
503
503
  })( jQuery, window, document );
504
504
 
505
505
  /*!
506
- * # Fomantic-UI 2.9.0-beta.23 - Form Validation
506
+ * # Fomantic-UI 2.9.0-beta.230 - Form Validation
507
507
  * http://github.com/fomantic/Fomantic-UI/
508
508
  *
509
509
  *
@@ -923,6 +923,7 @@ $.fn.form = function(parameters) {
923
923
  $field.one('keyup' + eventNamespace, module.event.field.keyup);
924
924
  module.submit();
925
925
  module.debug('Enter pressed on input submitting form');
926
+ event.preventDefault();
926
927
  }
927
928
  keyHeldDown = true;
928
929
  }
@@ -1047,7 +1048,7 @@ $.fn.form = function(parameters) {
1047
1048
  parts,
1048
1049
  suffixPrompt
1049
1050
  ;
1050
- if(ancillary && ancillary.indexOf('..') >= 0) {
1051
+ if(ancillary && ['integer', 'decimal', 'number'].indexOf(ruleName) >= 0 && ancillary.indexOf('..') >= 0) {
1051
1052
  parts = ancillary.split('..', 2);
1052
1053
  if(!rule.prompt) {
1053
1054
  suffixPrompt = (
@@ -1089,7 +1090,7 @@ $.fn.form = function(parameters) {
1089
1090
  if(isLegacySettings) {
1090
1091
  // 1.x (ducktyped)
1091
1092
  settings = $.extend(true, {}, $.fn.form.settings, legacyParameters);
1092
- validation = $.extend({}, $.fn.form.settings.defaults, parameters);
1093
+ validation = $.extend(true, {}, $.fn.form.settings.defaults, parameters);
1093
1094
  module.error(settings.error.oldSyntax, element);
1094
1095
  module.verbose('Extending settings from legacy parameters', validation, settings);
1095
1096
  }
@@ -1099,13 +1100,13 @@ $.fn.form = function(parameters) {
1099
1100
  parameters.fields = module.get.fieldsFromShorthand(parameters.fields);
1100
1101
  }
1101
1102
  settings = $.extend(true, {}, $.fn.form.settings, parameters);
1102
- validation = $.extend({}, $.fn.form.settings.defaults, settings.fields);
1103
+ validation = $.extend(true, {}, $.fn.form.settings.defaults, settings.fields);
1103
1104
  module.verbose('Extending settings', validation, settings);
1104
1105
  }
1105
1106
  }
1106
1107
  else {
1107
- settings = $.fn.form.settings;
1108
- validation = $.fn.form.settings.defaults;
1108
+ settings = $.extend(true, {}, $.fn.form.settings);
1109
+ validation = $.extend(true, {}, $.fn.form.settings.defaults);
1109
1110
  module.verbose('Using default form validation', validation, settings);
1110
1111
  }
1111
1112
 
@@ -1369,7 +1370,7 @@ $.fn.form = function(parameters) {
1369
1370
  module.debug('Adding rules', newValidation.rules, validation);
1370
1371
  },
1371
1372
  fields: function(fields) {
1372
- validation = $.extend({}, validation, module.get.fieldsFromShorthand(fields));
1373
+ validation = $.extend(true, {}, validation, module.get.fieldsFromShorthand(fields));
1373
1374
  },
1374
1375
  prompt: function(identifier, errors, internal) {
1375
1376
  var
@@ -1390,13 +1391,13 @@ $.fn.form = function(parameters) {
1390
1391
  }
1391
1392
  if(settings.inline) {
1392
1393
  if(!promptExists) {
1393
- $prompt = settings.templates.prompt(errors, className.label);
1394
+ $prompt = $('<div/>').addClass(className.label);
1394
1395
  $prompt
1395
1396
  .appendTo($fieldGroup)
1396
1397
  ;
1397
1398
  }
1398
1399
  $prompt
1399
- .html(errors[0])
1400
+ .html(settings.templates.prompt(errors))
1400
1401
  ;
1401
1402
  if(!promptExists) {
1402
1403
  if(settings.transition && module.can.useElement('transition') && $module.transition('is supported')) {
@@ -1589,12 +1590,15 @@ $.fn.form = function(parameters) {
1589
1590
  }
1590
1591
  else if(isCheckbox) {
1591
1592
  module.verbose('Setting checkbox value', value, $element);
1592
- if(value === true || value === 1) {
1593
+ if(value === true || value === 1 || value === 'on') {
1593
1594
  $element.checkbox('check');
1594
1595
  }
1595
1596
  else {
1596
1597
  $element.checkbox('uncheck');
1597
1598
  }
1599
+ if(typeof value === 'string') {
1600
+ $field.val(value);
1601
+ }
1598
1602
  }
1599
1603
  else if(isDropdown) {
1600
1604
  module.verbose('Setting dropdown value', value, $element);
@@ -1707,7 +1711,7 @@ $.fn.form = function(parameters) {
1707
1711
  if(event && $module.data('moduleApi') !== undefined) {
1708
1712
  event.stopImmediatePropagation();
1709
1713
  }
1710
- if(settings.errorFocus) {
1714
+ if(settings.errorFocus && ignoreCallbacks !== true) {
1711
1715
  var focusElement, hasTabIndex = true;
1712
1716
  if (typeof settings.errorFocus === 'string') {
1713
1717
  focusElement = $(settings.errorFocus);
@@ -2030,7 +2034,7 @@ $.fn.form.settings = {
2030
2034
 
2031
2035
  autoCheckRequired : false,
2032
2036
  preventLeaving : false,
2033
- errorFocus : false,
2037
+ errorFocus : true,
2034
2038
  dateHandling : 'date', // 'date', 'input', 'formatter'
2035
2039
 
2036
2040
  onValid : function() {},
@@ -2086,7 +2090,6 @@ $.fn.form.settings = {
2086
2090
  doesntContain : '{name} cannot contain "{ruleValue}"',
2087
2091
  doesntContainExactly : '{name} cannot contain exactly "{ruleValue}"',
2088
2092
  minLength : '{name} must be at least {ruleValue} characters',
2089
- length : '{name} must be at least {ruleValue} characters',
2090
2093
  exactLength : '{name} must be exactly {ruleValue} characters',
2091
2094
  maxLength : '{name} cannot be longer than {ruleValue} characters',
2092
2095
  match : '{name} must match {ruleValue} field',
@@ -2100,7 +2103,7 @@ $.fn.form.settings = {
2100
2103
  selector : {
2101
2104
  checkbox : 'input[type="checkbox"], input[type="radio"]',
2102
2105
  clear : '.clear',
2103
- field : 'input:not(.search):not([type="file"]), textarea, select',
2106
+ field : 'input:not(.search):not([type="file"]):not([type="reset"]):not([type="button"]):not([type="submit"]), textarea, select',
2104
2107
  group : '.field',
2105
2108
  input : 'input:not([type="file"])',
2106
2109
  message : '.error.message',
@@ -2141,15 +2144,22 @@ $.fn.form.settings = {
2141
2144
  html += '<li>' + value + '</li>';
2142
2145
  });
2143
2146
  html += '</ul>';
2144
- return $(html);
2147
+ return html;
2145
2148
  },
2146
2149
 
2147
- // template that produces label
2148
- prompt: function(errors, labelClasses) {
2149
- return $('<div/>')
2150
- .addClass(labelClasses)
2151
- .html(errors[0])
2150
+ // template that produces label content
2151
+ prompt: function(errors) {
2152
+ if(errors.length === 1){
2153
+ return errors[0];
2154
+ }
2155
+ var
2156
+ html = '<ul class="ui list">'
2152
2157
  ;
2158
+ $.each(errors, function(index, value) {
2159
+ html += '<li>' + value + '</li>';
2160
+ });
2161
+ html += '</ul>';
2162
+ return html;
2153
2163
  }
2154
2164
  },
2155
2165
 
@@ -2359,14 +2369,6 @@ $.fn.form.settings = {
2359
2369
  ;
2360
2370
  },
2361
2371
 
2362
- // see rls notes for 2.0.6 (this is a duplicate of minLength)
2363
- length: function(value, requiredLength) {
2364
- return (value !== undefined)
2365
- ? (value.length >= requiredLength)
2366
- : false
2367
- ;
2368
- },
2369
-
2370
2372
  // is exactly length
2371
2373
  exactLength: function(value, requiredLength) {
2372
2374
  return (value !== undefined)
@@ -2575,7 +2577,7 @@ $.fn.form.settings = {
2575
2577
  })( jQuery, window, document );
2576
2578
 
2577
2579
  /*!
2578
- * # Fomantic-UI 2.9.0-beta.23 - Accordion
2580
+ * # Fomantic-UI 2.9.0-beta.230 - Accordion
2579
2581
  * http://github.com/fomantic/Fomantic-UI/
2580
2582
  *
2581
2583
  *
@@ -3194,7 +3196,7 @@ $.extend( $.easing, {
3194
3196
 
3195
3197
 
3196
3198
  /*!
3197
- * # Fomantic-UI 2.9.0-beta.23 - Calendar
3199
+ * # Fomantic-UI 2.9.0-beta.230 - Calendar
3198
3200
  * http://github.com/fomantic/Fomantic-UI/
3199
3201
  *
3200
3202
  *
@@ -3317,7 +3319,7 @@ $.fn.calendar = function(parameters) {
3317
3319
  module.set.maxDate($module.data(metadata.maxDate));
3318
3320
  }
3319
3321
  module.setting('type', module.get.type());
3320
- module.setting('on', settings.on || ($input.length ? 'focus' : 'click'));
3322
+ module.setting('on', settings.on || 'click');
3321
3323
  },
3322
3324
  popup: function () {
3323
3325
  if (settings.inline) {
@@ -3348,7 +3350,10 @@ $.fn.calendar = function(parameters) {
3348
3350
  module.refreshTooltips();
3349
3351
  return settings.onVisible.apply($container, arguments);
3350
3352
  };
3351
- var onHidden = settings.onHidden;
3353
+ var onHidden = function () {
3354
+ module.blur();
3355
+ return settings.onHidden.apply($container, arguments)
3356
+ }
3352
3357
  if (!$input.length) {
3353
3358
  //no input, $container has to handle focus/blur
3354
3359
  $container.attr('tabindex', '0');
@@ -3357,10 +3362,6 @@ $.fn.calendar = function(parameters) {
3357
3362
  module.focus();
3358
3363
  return settings.onVisible.apply($container, arguments);
3359
3364
  };
3360
- onHidden = function () {
3361
- module.blur();
3362
- return settings.onHidden.apply($container, arguments);
3363
- };
3364
3365
  }
3365
3366
  var onShow = function () {
3366
3367
  //reset the focus date onShow
@@ -3942,7 +3943,7 @@ $.fn.calendar = function(parameters) {
3942
3943
  return $module.data(metadata.maxDate) || null;
3943
3944
  },
3944
3945
  monthOffset: function () {
3945
- return $module.data(metadata.monthOffset) || 0;
3946
+ return $module.data(metadata.monthOffset) || settings.monthOffset || 0;
3946
3947
  },
3947
3948
  mode: function () {
3948
3949
  //only returns valid modes for the current settings
@@ -4648,6 +4649,7 @@ $.fn.calendar.settings = {
4648
4649
  startCalendar : null, // jquery object or selector for another calendar that represents the start date of a date range
4649
4650
  endCalendar : null, // jquery object or selector for another calendar that represents the end date of a date range
4650
4651
  multiMonth : 1, // show multiple months when in 'day' mode
4652
+ monthOffset : 0, // position current month by offset when multimonth > 1
4651
4653
  minTimeGap : 5,
4652
4654
  showWeekNumbers : null, // show Number of Week at the very first column of a dayView
4653
4655
  disabledHours : [], // specific hour(s) which won't be selectable and contain additional information.
@@ -4663,6 +4665,7 @@ $.fn.calendar.settings = {
4663
4665
  position: 'bottom left',
4664
4666
  lastResort: 'bottom left',
4665
4667
  prefer: 'opposite',
4668
+ observeChanges: false,
4666
4669
  hideOnScroll: false
4667
4670
  },
4668
4671
 
@@ -4754,7 +4757,7 @@ $.fn.calendar.settings = {
4754
4757
  if (!text) {
4755
4758
  return null;
4756
4759
  }
4757
- text = String(text).trim();
4760
+ text = String(text).replace(/\s/g,'');
4758
4761
  if (text.length === 0) {
4759
4762
  return null;
4760
4763
  }
@@ -5067,7 +5070,7 @@ $.fn.calendar.settings = {
5067
5070
  })(jQuery, window, document);
5068
5071
 
5069
5072
  /*!
5070
- * # Fomantic-UI 2.9.0-beta.23 - Checkbox
5073
+ * # Fomantic-UI 2.9.0-beta.230 - Checkbox
5071
5074
  * http://github.com/fomantic/Fomantic-UI/
5072
5075
  *
5073
5076
  *
@@ -5307,18 +5310,26 @@ $.fn.checkbox = function(parameters) {
5307
5310
  }
5308
5311
  }
5309
5312
 
5313
+ shortcutPressed = false;
5310
5314
  if(key == keyCode.escape) {
5311
5315
  module.verbose('Escape key pressed blurring field');
5312
5316
  $input.blur();
5313
5317
  shortcutPressed = true;
5314
5318
  }
5315
- else if(!event.ctrlKey && ( key == keyCode.space || (key == keyCode.enter && settings.enableEnterKey)) ) {
5316
- module.verbose('Enter/space key pressed, toggling checkbox');
5317
- module.toggle();
5318
- shortcutPressed = true;
5319
- }
5320
- else {
5321
- shortcutPressed = false;
5319
+ else if(!event.ctrlKey && module.can.change()) {
5320
+ if( key == keyCode.space || (key == keyCode.enter && settings.enableEnterKey) ) {
5321
+ module.verbose('Enter/space key pressed, toggling checkbox');
5322
+ module.toggle();
5323
+ shortcutPressed = true;
5324
+ } else if($module.is('.toggle, .slider') && !module.is.radio()) {
5325
+ if(key == keyCode.left && module.is.checked()) {
5326
+ module.uncheck();
5327
+ shortcutPressed = true;
5328
+ } else if(key == keyCode.right && module.is.unchecked()) {
5329
+ module.check();
5330
+ shortcutPressed = true;
5331
+ }
5332
+ }
5322
5333
  }
5323
5334
  },
5324
5335
  keyup: function(event) {
@@ -5391,7 +5402,6 @@ $.fn.checkbox = function(parameters) {
5391
5402
  settings.onEnable.call(input);
5392
5403
  // preserve legacy callbacks
5393
5404
  settings.onEnabled.call(input);
5394
- module.trigger.change();
5395
5405
  }
5396
5406
  },
5397
5407
 
@@ -5406,7 +5416,6 @@ $.fn.checkbox = function(parameters) {
5406
5416
  settings.onDisable.call(input);
5407
5417
  // preserve legacy callbacks
5408
5418
  settings.onDisabled.call(input);
5409
- module.trigger.change();
5410
5419
  }
5411
5420
  },
5412
5421
 
@@ -5934,7 +5943,7 @@ $.fn.checkbox.settings = {
5934
5943
 
5935
5944
  selector : {
5936
5945
  checkbox : '.ui.checkbox',
5937
- label : 'label, .box',
5946
+ label : 'label',
5938
5947
  input : 'input[type="checkbox"], input[type="radio"]',
5939
5948
  link : 'a[href]'
5940
5949
  }
@@ -5944,7 +5953,7 @@ $.fn.checkbox.settings = {
5944
5953
  })( jQuery, window, document );
5945
5954
 
5946
5955
  /*!
5947
- * # Fomantic-UI 2.9.0-beta.23 - Dimmer
5956
+ * # Fomantic-UI 2.9.0-beta.230 - Dimmer
5948
5957
  * http://github.com/fomantic/Fomantic-UI/
5949
5958
  *
5950
5959
  *
@@ -6701,7 +6710,7 @@ $.fn.dimmer.settings = {
6701
6710
  })( jQuery, window, document );
6702
6711
 
6703
6712
  /*!
6704
- * # Fomantic-UI 2.9.0-beta.23 - Dropdown
6713
+ * # Fomantic-UI 2.9.0-beta.230 - Dropdown
6705
6714
  * http://github.com/fomantic/Fomantic-UI/
6706
6715
  *
6707
6716
  *
@@ -6902,6 +6911,7 @@ $.fn.dropdown = function(parameters) {
6902
6911
  select: function() {
6903
6912
  if(module.has.input() && selectObserver) {
6904
6913
  selectObserver.observe($module[0], {
6914
+ attributes: true,
6905
6915
  childList : true,
6906
6916
  subtree : true
6907
6917
  });
@@ -7123,6 +7133,9 @@ $.fn.dropdown = function(parameters) {
7123
7133
  module.debug('Disabling dropdown');
7124
7134
  $module.addClass(className.disabled);
7125
7135
  }
7136
+ if($input.is('[required]')) {
7137
+ settings.forceSelection = true;
7138
+ }
7126
7139
  $input
7127
7140
  .removeAttr('required')
7128
7141
  .removeAttr('class')
@@ -7327,6 +7340,11 @@ $.fn.dropdown = function(parameters) {
7327
7340
  $module
7328
7341
  .on('change' + eventNamespace, selector.input, module.event.change)
7329
7342
  ;
7343
+ if(module.is.multiple() && module.is.searchSelection()) {
7344
+ $module
7345
+ .on('paste' + eventNamespace, selector.search, module.event.paste)
7346
+ ;
7347
+ }
7330
7348
  },
7331
7349
  mouseEvents: function() {
7332
7350
  module.verbose('Binding mouse events');
@@ -7546,7 +7564,7 @@ $.fn.dropdown = function(parameters) {
7546
7564
  var value = module.is.multiple() ? module.get.values() : module.get.value();
7547
7565
  if (value !== '') {
7548
7566
  module.verbose('Value(s) present after click icon, select value(s) in items');
7549
- module.set.selected(value, null, null, true);
7567
+ module.set.selected(value, null, true, true);
7550
7568
  }
7551
7569
  }
7552
7570
  iconClicked = false;
@@ -7775,6 +7793,15 @@ $.fn.dropdown = function(parameters) {
7775
7793
  },
7776
7794
 
7777
7795
  event: {
7796
+ paste: function(event) {
7797
+ var pasteValue = (event.originalEvent.clipboardData || window.clipboardData).getData('text'),
7798
+ tokens = pasteValue.split(settings.delimiter)
7799
+ ;
7800
+ tokens.forEach(function(value){
7801
+ module.set.selected(module.escape.htmlEntities(value.trim()), null, true, true);
7802
+ });
7803
+ event.preventDefault();
7804
+ },
7778
7805
  change: function() {
7779
7806
  if(!internalChange) {
7780
7807
  module.debug('Input changed, updating selection');
@@ -7987,8 +8014,8 @@ $.fn.dropdown = function(parameters) {
7987
8014
  },
7988
8015
  select: {
7989
8016
  mutation: function(mutations) {
7990
- module.debug('<select> modified, recreating menu');
7991
8017
  if(module.is.selectMutation(mutations)) {
8018
+ module.debug('<select> modified, recreating menu');
7992
8019
  module.disconnect.selectObserver();
7993
8020
  module.refresh();
7994
8021
  module.setup.select();
@@ -8233,7 +8260,7 @@ $.fn.dropdown = function(parameters) {
8233
8260
  hasSubMenu = ($subMenu.length> 0),
8234
8261
  hasSelectedItem = ($selectedItem.length > 0),
8235
8262
  selectedIsSelectable = ($selectedItem.not(selector.unselectable).length > 0),
8236
- delimiterPressed = (pressedKey == keys.delimiter && settings.allowAdditions && module.is.multiple()),
8263
+ delimiterPressed = (pressedKey == keys.delimiter && module.is.multiple()),
8237
8264
  isAdditionWithoutMenu = (settings.allowAdditions && settings.hideAdditions && (pressedKey == keys.enter || delimiterPressed) && selectedIsSelectable),
8238
8265
  $nextItem,
8239
8266
  isSubMenuItem,
@@ -8331,7 +8358,7 @@ $.fn.dropdown = function(parameters) {
8331
8358
  .addClass(className.selected)
8332
8359
  ;
8333
8360
  module.set.scrollPosition($nextItem);
8334
- if(settings.selectOnKeydown && module.is.single()) {
8361
+ if(settings.selectOnKeydown && module.is.single() && !$nextItem.hasClass(className.actionable)) {
8335
8362
  module.set.selectedItem($nextItem);
8336
8363
  }
8337
8364
  }
@@ -8358,7 +8385,7 @@ $.fn.dropdown = function(parameters) {
8358
8385
  .addClass(className.selected)
8359
8386
  ;
8360
8387
  module.set.scrollPosition($nextItem);
8361
- if(settings.selectOnKeydown && module.is.single()) {
8388
+ if(settings.selectOnKeydown && module.is.single() && !$nextItem.hasClass(className.actionable)) {
8362
8389
  module.set.selectedItem($nextItem);
8363
8390
  }
8364
8391
  }
@@ -8489,7 +8516,7 @@ $.fn.dropdown = function(parameters) {
8489
8516
  ;
8490
8517
  if( module.can.activate( $(element) ) ) {
8491
8518
  module.set.selected(value, $(element));
8492
- if(!module.is.multiple()) {
8519
+ if(!module.is.multiple() && !(!settings.collapseOnActionable && $(element).hasClass(className.actionable))) {
8493
8520
  module.hideAndClear();
8494
8521
  }
8495
8522
  }
@@ -8502,7 +8529,7 @@ $.fn.dropdown = function(parameters) {
8502
8529
  ;
8503
8530
  if( module.can.activate( $(element) ) ) {
8504
8531
  module.set.value(value, text, $(element));
8505
- if(!module.is.multiple()) {
8532
+ if(!module.is.multiple() && !(!settings.collapseOnActionable && $(element).hasClass(className.actionable))) {
8506
8533
  module.hideAndClear();
8507
8534
  }
8508
8535
  }
@@ -9022,7 +9049,7 @@ $.fn.dropdown = function(parameters) {
9022
9049
  module.error(error.noStorage);
9023
9050
  return;
9024
9051
  }
9025
- name = sessionStorage.getItem(value);
9052
+ name = sessionStorage.getItem(value + elementNamespace);
9026
9053
  return (name !== undefined)
9027
9054
  ? name
9028
9055
  : false
@@ -9066,7 +9093,7 @@ $.fn.dropdown = function(parameters) {
9066
9093
  return;
9067
9094
  }
9068
9095
  module.verbose('Saving remote data to session storage', value, name);
9069
- sessionStorage.setItem(value, name);
9096
+ sessionStorage.setItem(value + elementNamespace, name);
9070
9097
  }
9071
9098
  },
9072
9099
 
@@ -9126,7 +9153,7 @@ $.fn.dropdown = function(parameters) {
9126
9153
  $nextSelectedItem
9127
9154
  .addClass(className.selected)
9128
9155
  ;
9129
- if(settings.selectOnKeydown && module.is.single()) {
9156
+ if(settings.selectOnKeydown && module.is.single() && !$nextItem.hasClass(className.actionable)) {
9130
9157
  module.set.selectedItem($nextSelectedItem);
9131
9158
  }
9132
9159
  $menu
@@ -9329,7 +9356,7 @@ $.fn.dropdown = function(parameters) {
9329
9356
  module.set.scrollPosition($nextValue);
9330
9357
  $selectedItem.removeClass(className.selected);
9331
9358
  $nextValue.addClass(className.selected);
9332
- if(settings.selectOnKeydown && module.is.single()) {
9359
+ if(settings.selectOnKeydown && module.is.single() && !$nextItem.hasClass(className.actionable)) {
9333
9360
  module.set.selectedItem($nextValue);
9334
9361
  }
9335
9362
  }
@@ -9467,17 +9494,24 @@ $.fn.dropdown = function(parameters) {
9467
9494
 
9468
9495
  isFiltered = $selected.hasClass(className.filtered),
9469
9496
  isActive = $selected.hasClass(className.active),
9497
+ isActionable = $selected.hasClass(className.actionable),
9470
9498
  isUserValue = $selected.hasClass(className.addition),
9471
9499
  shouldAnimate = (isMultiple && $selectedItem.length == 1)
9472
9500
  ;
9473
- if(isMultiple) {
9501
+ if(isActionable){
9502
+ if((!isMultiple || (!isActive || isUserValue)) && settings.apiSettings && settings.saveRemoteData) {
9503
+ module.save.remoteData(selectedText, selectedValue);
9504
+ }
9505
+ settings.onActionable.call(element, selectedValue, selectedText, $selected);
9506
+ }
9507
+ else if(isMultiple) {
9474
9508
  if(!isActive || isUserValue) {
9475
9509
  if(settings.apiSettings && settings.saveRemoteData) {
9476
9510
  module.save.remoteData(selectedText, selectedValue);
9477
9511
  }
9478
9512
  if(settings.useLabels) {
9479
- module.add.label(selectedValue, selectedText, shouldAnimate);
9480
9513
  module.add.value(selectedValue, selectedText, $selected);
9514
+ module.add.label(selectedValue, selectedText, shouldAnimate);
9481
9515
  module.set.activeItem($selected);
9482
9516
  module.filterActive();
9483
9517
  module.select.nextAvailable($selectedItem);
@@ -9497,7 +9531,7 @@ $.fn.dropdown = function(parameters) {
9497
9531
  if(settings.apiSettings && settings.saveRemoteData) {
9498
9532
  module.save.remoteData(selectedText, selectedValue);
9499
9533
  }
9500
- if (!keepSearchTerm) {
9534
+ if (!keepSearchTerm && !$selected.hasClass(className.actionable)) {
9501
9535
  module.set.text(selectedText);
9502
9536
  }
9503
9537
  module.set.value(selectedValue, selectedText, $selected, preventChangeTrigger);
@@ -9687,7 +9721,7 @@ $.fn.dropdown = function(parameters) {
9687
9721
  }
9688
9722
  // extend current array
9689
9723
  if(Array.isArray(currentValue)) {
9690
- newValue = currentValue.concat([addedValue]);
9724
+ newValue = $selectedItem.hasClass(className.actionable) ? currentValue : currentValue.concat([addedValue]);
9691
9725
  newValue = module.get.uniqueArray(newValue);
9692
9726
  }
9693
9727
  else {
@@ -9771,18 +9805,10 @@ $.fn.dropdown = function(parameters) {
9771
9805
  return;
9772
9806
  }
9773
9807
  // temporarily disconnect observer
9774
- if(selectObserver) {
9775
- selectObserver.disconnect();
9776
- module.verbose('Temporarily disconnecting mutation observer');
9777
- }
9808
+ module.disconnect.selectObserver();
9778
9809
  $option.remove();
9779
9810
  module.verbose('Removing user addition as an <option>', escapedValue);
9780
- if(selectObserver) {
9781
- selectObserver.observe($input[0], {
9782
- childList : true,
9783
- subtree : true
9784
- });
9785
- }
9811
+ module.observe.select();
9786
9812
  },
9787
9813
  message: function() {
9788
9814
  $menu.children(selector.message).remove();
@@ -10147,7 +10173,7 @@ $.fn.dropdown = function(parameters) {
10147
10173
  selectChanged = false
10148
10174
  ;
10149
10175
  $.each(mutations, function(index, mutation) {
10150
- if($(mutation.target).is('select') || $(mutation.addedNodes).is('select')) {
10176
+ if($(mutation.target).is('select, option, optgroup') || $(mutation.addedNodes).is('select')) {
10151
10177
  selectChanged = true;
10152
10178
  return false;
10153
10179
  }
@@ -10692,7 +10718,7 @@ $.fn.dropdown.settings = {
10692
10718
  keepOnScreen : true, // Whether dropdown should check whether it is on screen before showing
10693
10719
 
10694
10720
  match : 'both', // what to match against with search selection (both, text, or label)
10695
- fullTextSearch : false, // search anywhere in value (set to 'exact' to require exact matches)
10721
+ fullTextSearch : 'exact', // search anywhere in value (set to 'exact' to require exact matches)
10696
10722
  ignoreDiacritics : false, // match results also if they contain diacritics of the same base character (for example searching for "a" will also match "á" or "â" or "à", etc...)
10697
10723
  hideDividers : false, // Whether to hide any divider elements (specified in selector.divider) that are sibling to any items when searched (set to true will hide all dividers, set to 'empty' will hide them when they are not followed by a visible item)
10698
10724
 
@@ -10700,7 +10726,7 @@ $.fn.dropdown.settings = {
10700
10726
  preserveHTML : true, // preserve html when selecting value
10701
10727
  sortSelect : false, // sort selection on init
10702
10728
 
10703
- forceSelection : true, // force a choice on blur with search selection
10729
+ forceSelection : false, // force a choice on blur with search selection
10704
10730
 
10705
10731
  allowAdditions : false, // whether multiple select should allow user added values
10706
10732
  ignoreCase : false, // whether to consider case sensitivity when creating labels
@@ -10711,7 +10737,7 @@ $.fn.dropdown.settings = {
10711
10737
  useLabels : true, // whether multiple select should filter currently active selections from choices
10712
10738
  delimiter : ',', // when multiselect uses normal <input> the values will be delimited with this character
10713
10739
 
10714
- showOnFocus : true, // show menu on focus
10740
+ showOnFocus : false, // show menu on focus
10715
10741
  allowReselection : false, // whether current value should trigger callbacks when reselected
10716
10742
  allowTab : true, // add tabindex to element
10717
10743
  allowCategorySelection : false, // allow elements with sub-menus to be selected
@@ -10726,6 +10752,8 @@ $.fn.dropdown.settings = {
10726
10752
 
10727
10753
  headerDivider : true, // whether option headers should have an additional divider line underneath when converted from <select> <optgroup>
10728
10754
 
10755
+ collapseOnActionable : true, // whether the dropdown should collapse upon selection of an actionable item
10756
+
10729
10757
  // label settings on multi-select
10730
10758
  label: {
10731
10759
  transition : 'scale',
@@ -10745,6 +10773,7 @@ $.fn.dropdown.settings = {
10745
10773
  onChange : function(value, text, $selected){},
10746
10774
  onAdd : function(value, text, $selected){},
10747
10775
  onRemove : function(value, text, $selected){},
10776
+ onActionable : function(value, text, $selected){},
10748
10777
  onSearch : function(searchTerm){},
10749
10778
 
10750
10779
  onLabelSelect : function($selectedLabels){},
@@ -10807,7 +10836,8 @@ $.fn.dropdown.settings = {
10807
10836
  icon : 'icon', // optional icon name
10808
10837
  iconClass : 'iconClass', // optional individual class for icon (for example to use flag instead)
10809
10838
  class : 'class', // optional individual class for item/header
10810
- divider : 'divider' // optional divider append for group headers
10839
+ divider : 'divider', // optional divider append for group headers
10840
+ actionable : 'actionable' // optional actionable item
10811
10841
  },
10812
10842
 
10813
10843
  keys : {
@@ -10879,7 +10909,8 @@ $.fn.dropdown.settings = {
10879
10909
  header : 'header',
10880
10910
  divider : 'divider',
10881
10911
  groupIcon : '',
10882
- unfilterable : 'unfilterable'
10912
+ unfilterable : 'unfilterable',
10913
+ actionable : 'actionable'
10883
10914
  }
10884
10915
 
10885
10916
  };
@@ -10954,6 +10985,9 @@ $.fn.dropdown.settings.templates = {
10954
10985
  maybeText = (option[fields.text])
10955
10986
  ? ' data-text="' + deQuote(option[fields.text],true) + '"'
10956
10987
  : '',
10988
+ maybeActionable = (option[fields.actionable])
10989
+ ? className.actionable+' '
10990
+ : '',
10957
10991
  maybeDisabled = (option[fields.disabled])
10958
10992
  ? className.disabled+' '
10959
10993
  : '',
@@ -10962,7 +10996,7 @@ $.fn.dropdown.settings.templates = {
10962
10996
  : '',
10963
10997
  hasDescription = (escape(option[fields.description] || '', preserveHTML) != '')
10964
10998
  ;
10965
- html += '<div class="'+ maybeDisabled + maybeDescriptionVertical + (option[fields.class] ? deQuote(option[fields.class]) : className.item)+'" data-value="' + deQuote(option[fields.value],true) + '"' + maybeText + '>';
10999
+ html += '<div class="'+ maybeActionable + maybeDisabled + maybeDescriptionVertical + (option[fields.class] ? deQuote(option[fields.class]) : className.item)+'" data-value="' + deQuote(option[fields.value],true) + '"' + maybeText + '>';
10966
11000
  if (isMenu) {
10967
11001
  html += '<i class="'+ (itemType.indexOf('left') !== -1 ? 'left' : '') + ' dropdown icon"></i>';
10968
11002
  }
@@ -11032,7 +11066,7 @@ $.fn.dropdown.settings.templates = {
11032
11066
  })( jQuery, window, document );
11033
11067
 
11034
11068
  /*!
11035
- * # Fomantic-UI 2.9.0-beta.23 - Embed
11069
+ * # Fomantic-UI 2.9.0-beta.230 - Embed
11036
11070
  * http://github.com/fomantic/Fomantic-UI/
11037
11071
  *
11038
11072
  *
@@ -11742,7 +11776,7 @@ $.fn.embed.settings = {
11742
11776
  })( jQuery, window, document );
11743
11777
 
11744
11778
  /*!
11745
- * # Fomantic-UI 2.9.0-beta.23 - Modal
11779
+ * # Fomantic-UI 2.9.0-beta.230 - Modal
11746
11780
  * http://github.com/fomantic/Fomantic-UI/
11747
11781
  *
11748
11782
  *
@@ -11809,7 +11843,8 @@ $.fn.modal = function(parameters) {
11809
11843
 
11810
11844
  $module = $(this),
11811
11845
  $context = $(settings.context),
11812
- $close = $module.find(selector.close),
11846
+ $closeIcon = $module.find(selector.closeIcon),
11847
+ $inputs,
11813
11848
 
11814
11849
  $allModals,
11815
11850
  $otherModals,
@@ -11835,6 +11870,7 @@ $.fn.modal = function(parameters) {
11835
11870
  module = {
11836
11871
 
11837
11872
  initialize: function() {
11873
+ module.create.id();
11838
11874
  if(!$module.hasClass('modal')) {
11839
11875
  module.create.modal();
11840
11876
  if(!$.isFunction(settings.onHidden)) {
@@ -11859,15 +11895,17 @@ $.fn.modal = function(parameters) {
11859
11895
  $actions.empty();
11860
11896
  }
11861
11897
  settings.actions.forEach(function (el) {
11862
- var icon = el[fields.icon] ? '<i class="' + module.helpers.deQuote(el[fields.icon]) + ' icon"></i>' : '',
11898
+ var icon = el[fields.icon] ? '<i '+(el[fields.text] ? 'aria-hidden="true"' : '')+' class="' + module.helpers.deQuote(el[fields.icon]) + ' icon"></i>' : '',
11863
11899
  text = module.helpers.escape(el[fields.text] || '', settings.preserveHTML),
11864
11900
  cls = module.helpers.deQuote(el[fields.class] || ''),
11865
11901
  click = el[fields.click] && $.isFunction(el[fields.click]) ? el[fields.click] : function () {};
11866
11902
  $actions.append($('<button/>', {
11867
11903
  html: icon + text,
11904
+ 'aria-label': $('<div>'+(el[fields.text] || el[fields.icon] || '')+'</div>').text(),
11868
11905
  class: className.button + ' ' + cls,
11869
11906
  click: function () {
11870
- if (click.call(element, $module) === false) {
11907
+ var button = $(this);
11908
+ if (button.is(selector.approve) || button.is(selector.deny) || click.call(element, $module) === false) {
11871
11909
  return;
11872
11910
  }
11873
11911
  module.hide();
@@ -11878,7 +11916,6 @@ $.fn.modal = function(parameters) {
11878
11916
  module.cache = {};
11879
11917
  module.verbose('Initializing dimmer', $context);
11880
11918
 
11881
- module.create.id();
11882
11919
  module.create.dimmer();
11883
11920
 
11884
11921
  if ( settings.allowMultiple ) {
@@ -11888,11 +11925,9 @@ $.fn.modal = function(parameters) {
11888
11925
  $module.addClass('top aligned');
11889
11926
  }
11890
11927
  module.refreshModals();
11891
-
11928
+ module.refreshInputs();
11892
11929
  module.bind.events();
11893
- if(settings.observeChanges) {
11894
- module.observeChanges();
11895
- }
11930
+ module.observeChanges();
11896
11931
  module.instantiate();
11897
11932
  if(settings.autoShow){
11898
11933
  module.show();
@@ -11909,16 +11944,20 @@ $.fn.modal = function(parameters) {
11909
11944
 
11910
11945
  create: {
11911
11946
  modal: function() {
11912
- $module = $('<div/>', {class: className.modal});
11947
+ $module = $('<div/>', {class: className.modal, role: 'dialog', 'aria-modal': true});
11913
11948
  if (settings.closeIcon) {
11914
- $close = $('<i/>', {class: className.close})
11915
- $module.append($close);
11949
+ $closeIcon = $('<i/>', {class: className.close, role: 'button', tabindex: 0, 'aria-label': settings.text.close})
11950
+ $module.append($closeIcon);
11916
11951
  }
11917
11952
  if (settings.title !== '') {
11918
- $('<div/>', {class: className.title}).appendTo($module);
11953
+ var titleId = '_' + module.get.id() + 'title';
11954
+ $module.attr('aria-labelledby', titleId);
11955
+ $('<div/>', {class: className.title, id: titleId}).appendTo($module);
11919
11956
  }
11920
11957
  if (settings.content !== '') {
11921
- $('<div/>', {class: className.content}).appendTo($module);
11958
+ var descId = '_' + module.get.id() + 'desc';
11959
+ $module.attr('aria-describedby', descId);
11960
+ $('<div/>', {class: className.content, id: descId}).appendTo($module);
11922
11961
  }
11923
11962
  if (module.has.configActions()) {
11924
11963
  $('<div/>', {class: className.actions}).appendTo($module);
@@ -11954,8 +11993,8 @@ $.fn.modal = function(parameters) {
11954
11993
  module.verbose('Creating unique id for element', id);
11955
11994
  },
11956
11995
  innerDimmer: function() {
11957
- if ( $module.find(selector.dimmer).length == 0 ) {
11958
- $module.prepend('<div class="ui inverted dimmer"></div>');
11996
+ if ( $module.find(selector.dimmer).length === 0 ) {
11997
+ $('<div/>', {class: className.innerDimmer}).prependTo($module);
11959
11998
  }
11960
11999
  }
11961
12000
  },
@@ -11971,15 +12010,21 @@ $.fn.modal = function(parameters) {
11971
12010
  ;
11972
12011
  $window.off(elementEventNamespace);
11973
12012
  $dimmer.off(elementEventNamespace);
11974
- $close.off(eventNamespace);
12013
+ $closeIcon.off(elementEventNamespace);
12014
+ if($inputs) {
12015
+ $inputs.off(elementEventNamespace);
12016
+ }
11975
12017
  $context.dimmer('destroy');
11976
12018
  },
11977
12019
 
11978
12020
  observeChanges: function() {
11979
12021
  if('MutationObserver' in window) {
11980
12022
  observer = new MutationObserver(function(mutations) {
11981
- module.debug('DOM tree modified, refreshing');
11982
- module.refresh();
12023
+ if(settings.observeChanges) {
12024
+ module.debug('DOM tree modified, refreshing');
12025
+ module.refresh();
12026
+ }
12027
+ module.refreshInputs();
11983
12028
  });
11984
12029
  observer.observe(element, {
11985
12030
  childList : true,
@@ -12004,6 +12049,23 @@ $.fn.modal = function(parameters) {
12004
12049
  $allModals = $otherModals.add($module);
12005
12050
  },
12006
12051
 
12052
+ refreshInputs: function(){
12053
+ if($inputs){
12054
+ $inputs
12055
+ .off('keydown' + elementEventNamespace)
12056
+ ;
12057
+ }
12058
+ $inputs = $module.find('[tabindex], :input').filter(':visible').filter(function() {
12059
+ return $(this).closest('.disabled').length === 0;
12060
+ });
12061
+ $inputs.first()
12062
+ .on('keydown' + elementEventNamespace, module.event.inputKeyDown.first)
12063
+ ;
12064
+ $inputs.last()
12065
+ .on('keydown' + elementEventNamespace, module.event.inputKeyDown.last)
12066
+ ;
12067
+ },
12068
+
12007
12069
  attachEvents: function(selector, event) {
12008
12070
  var
12009
12071
  $toggle = $(selector)
@@ -12032,6 +12094,9 @@ $.fn.modal = function(parameters) {
12032
12094
  .on('click' + eventNamespace, selector.approve, module.event.approve)
12033
12095
  .on('click' + eventNamespace, selector.deny, module.event.deny)
12034
12096
  ;
12097
+ $closeIcon
12098
+ .on('keyup' + elementEventNamespace, module.event.closeKeyUp)
12099
+ ;
12035
12100
  $window
12036
12101
  .on('resize' + elementEventNamespace, module.event.resize)
12037
12102
  ;
@@ -12050,7 +12115,7 @@ $.fn.modal = function(parameters) {
12050
12115
 
12051
12116
  get: {
12052
12117
  id: function() {
12053
- return (Math.random().toString(16) + '000000000').substr(2, 8);
12118
+ return id;
12054
12119
  },
12055
12120
  element: function() {
12056
12121
  return $module;
@@ -12089,10 +12154,38 @@ $.fn.modal = function(parameters) {
12089
12154
  close: function() {
12090
12155
  module.hide();
12091
12156
  },
12157
+ closeKeyUp: function(event){
12158
+ var
12159
+ keyCode = event.which
12160
+ ;
12161
+ if ((keyCode === settings.keys.enter || keyCode === settings.keys.space) && $module.hasClass(className.front)) {
12162
+ module.hide();
12163
+ }
12164
+ },
12165
+ inputKeyDown: {
12166
+ first: function(event) {
12167
+ var
12168
+ keyCode = event.which
12169
+ ;
12170
+ if (keyCode === settings.keys.tab && event.shiftKey) {
12171
+ $inputs.last().focus();
12172
+ event.preventDefault();
12173
+ }
12174
+ },
12175
+ last: function(event) {
12176
+ var
12177
+ keyCode = event.which
12178
+ ;
12179
+ if (keyCode === settings.keys.tab && !event.shiftKey) {
12180
+ $inputs.first().focus();
12181
+ event.preventDefault();
12182
+ }
12183
+ }
12184
+ },
12092
12185
  mousedown: function(event) {
12093
12186
  var
12094
12187
  $target = $(event.target),
12095
- isRtl = module.is.rtl();
12188
+ isRtl = module.is.rtl()
12096
12189
  ;
12097
12190
  initialMouseDownInModal = ($target.closest(selector.modal).length > 0);
12098
12191
  if(initialMouseDownInModal) {
@@ -12140,10 +12233,9 @@ $.fn.modal = function(parameters) {
12140
12233
  },
12141
12234
  keyboard: function(event) {
12142
12235
  var
12143
- keyCode = event.which,
12144
- escapeKey = 27
12236
+ keyCode = event.which
12145
12237
  ;
12146
- if(keyCode == escapeKey) {
12238
+ if(keyCode === settings.keys.escape) {
12147
12239
  if(settings.closable) {
12148
12240
  module.debug('Escape key pressed hiding modal');
12149
12241
  if ( $module.hasClass(className.front) ) {
@@ -12458,7 +12550,7 @@ $.fn.modal = function(parameters) {
12458
12550
  $module
12459
12551
  .off('mousedown' + elementEventNamespace)
12460
12552
  ;
12461
- }
12553
+ }
12462
12554
  $dimmer
12463
12555
  .off('mousedown' + elementEventNamespace)
12464
12556
  ;
@@ -12643,13 +12735,10 @@ $.fn.modal = function(parameters) {
12643
12735
  set: {
12644
12736
  autofocus: function() {
12645
12737
  var
12646
- $inputs = $module.find('[tabindex], :input').filter(':visible').filter(function() {
12647
- return $(this).closest('.disabled').length === 0;
12648
- }),
12649
12738
  $autofocus = $inputs.filter('[autofocus]'),
12650
12739
  $input = ($autofocus.length > 0)
12651
12740
  ? $autofocus.first()
12652
- : $inputs.first()
12741
+ : ($inputs.length > 1 ? $inputs.filter(':not(i.close)') : $inputs).first()
12653
12742
  ;
12654
12743
  if($input.length > 0) {
12655
12744
  $input.focus();
@@ -12731,7 +12820,7 @@ $.fn.modal = function(parameters) {
12731
12820
  ? $(document).scrollTop() + settings.padding
12732
12821
  : $(document).scrollTop() + (module.cache.contextHeight - module.cache.height - settings.padding),
12733
12822
  marginLeft: -(module.cache.width / 2)
12734
- })
12823
+ })
12735
12824
  ;
12736
12825
  } else {
12737
12826
  $module
@@ -12740,7 +12829,7 @@ $.fn.modal = function(parameters) {
12740
12829
  ? -(module.cache.height / 2)
12741
12830
  : settings.padding / 2,
12742
12831
  marginLeft: -(module.cache.width / 2)
12743
- })
12832
+ })
12744
12833
  ;
12745
12834
  }
12746
12835
  module.verbose('Setting modal offset for legacy mode');
@@ -13066,11 +13155,19 @@ $.fn.modal.settings = {
13066
13155
  // called after deny selector match
13067
13156
  onDeny : function(){ return true; },
13068
13157
 
13158
+ keys : {
13159
+ space : 32,
13160
+ enter : 13,
13161
+ escape : 27,
13162
+ tab : 9,
13163
+ },
13164
+
13069
13165
  selector : {
13070
13166
  title : '> .header',
13071
13167
  content : '> .content',
13072
13168
  actions : '> .actions',
13073
13169
  close : '> .close',
13170
+ closeIcon: '> .close',
13074
13171
  approve : '.actions .positive, .actions .approve, .actions .ok',
13075
13172
  deny : '.actions .negative, .actions .deny, .actions .cancel',
13076
13173
  modal : '.ui.modal',
@@ -13102,11 +13199,13 @@ $.fn.modal.settings = {
13102
13199
  template : 'ui tiny modal',
13103
13200
  ok : 'positive',
13104
13201
  cancel : 'negative',
13105
- prompt : 'ui fluid input'
13202
+ prompt : 'ui fluid input',
13203
+ innerDimmer: 'ui inverted dimmer'
13106
13204
  },
13107
13205
  text: {
13108
13206
  ok : 'Ok',
13109
- cancel: 'Cancel'
13207
+ cancel: 'Cancel',
13208
+ close : 'Close'
13110
13209
  }
13111
13210
  };
13112
13211
 
@@ -13132,33 +13231,39 @@ $.fn.modal.settings.templates = {
13132
13231
  },
13133
13232
  alert: function () {
13134
13233
  var settings = this.get.settings(),
13135
- args = settings.templates.getArguments(arguments)
13234
+ args = settings.templates.getArguments(arguments),
13235
+ approveFn = args.handler
13136
13236
  ;
13137
13237
  return {
13138
13238
  title : args.title,
13139
13239
  content: args.content,
13240
+ onApprove: approveFn,
13140
13241
  actions: [{
13141
13242
  text : settings.text.ok,
13142
13243
  class: settings.className.ok,
13143
- click: args.handler
13244
+ click: approveFn
13144
13245
  }]
13145
13246
  }
13146
13247
  },
13147
13248
  confirm: function () {
13148
13249
  var settings = this.get.settings(),
13149
- args = settings.templates.getArguments(arguments)
13250
+ args = settings.templates.getArguments(arguments),
13251
+ approveFn = function(){args.handler(true)},
13252
+ denyFn = function(){args.handler(false)}
13150
13253
  ;
13151
13254
  return {
13152
13255
  title : args.title,
13153
13256
  content: args.content,
13257
+ onApprove: approveFn,
13258
+ onDeny: denyFn,
13154
13259
  actions: [{
13155
13260
  text : settings.text.ok,
13156
13261
  class: settings.className.ok,
13157
- click: function(){args.handler(true)}
13262
+ click: approveFn
13158
13263
  },{
13159
13264
  text: settings.text.cancel,
13160
13265
  class: settings.className.cancel,
13161
- click: function(){args.handler(false)}
13266
+ click: denyFn
13162
13267
  }]
13163
13268
  }
13164
13269
  },
@@ -13166,7 +13271,14 @@ $.fn.modal.settings.templates = {
13166
13271
  var $this = this,
13167
13272
  settings = this.get.settings(),
13168
13273
  args = settings.templates.getArguments(arguments),
13169
- input = $($.parseHTML(args.content)).filter('.ui.input')
13274
+ input = $($.parseHTML(args.content)).filter('.ui.input'),
13275
+ approveFn = function(){
13276
+ var settings = $this.get.settings(),
13277
+ inputField = $this.get.element().find(settings.selector.prompt)[0]
13278
+ ;
13279
+ args.handler($(inputField).val());
13280
+ },
13281
+ denyFn = function(){args.handler(null)}
13170
13282
  ;
13171
13283
  if (input.length === 0) {
13172
13284
  args.content += '<p><div class="'+settings.className.prompt+'"><input placeholder="'+this.helpers.deQuote(args.placeholder || '')+'" type="text" value="'+this.helpers.deQuote(args.defaultValue || '')+'"></div></p>';
@@ -13174,19 +13286,16 @@ $.fn.modal.settings.templates = {
13174
13286
  return {
13175
13287
  title : args.title,
13176
13288
  content: args.content,
13289
+ onApprove: approveFn,
13290
+ onDeny: denyFn,
13177
13291
  actions: [{
13178
13292
  text: settings.text.ok,
13179
13293
  class: settings.className.ok,
13180
- click: function(){
13181
- var settings = $this.get.settings(),
13182
- inputField = $this.get.element().find(settings.selector.prompt)[0]
13183
- ;
13184
- args.handler($(inputField).val());
13185
- }
13294
+ click: approveFn
13186
13295
  },{
13187
13296
  text: settings.text.cancel,
13188
13297
  class: settings.className.cancel,
13189
- click: function(){args.handler(null)}
13298
+ click: denyFn
13190
13299
  }]
13191
13300
  }
13192
13301
  }
@@ -13195,7 +13304,7 @@ $.fn.modal.settings.templates = {
13195
13304
  })( jQuery, window, document );
13196
13305
 
13197
13306
  /*!
13198
- * # Fomantic-UI 2.9.0-beta.23 - Nag
13307
+ * # Fomantic-UI 2.9.0-beta.230 - Nag
13199
13308
  * http://github.com/fomantic/Fomantic-UI/
13200
13309
  *
13201
13310
  *
@@ -13754,7 +13863,7 @@ $.extend( $.easing, {
13754
13863
  })( jQuery, window, document );
13755
13864
 
13756
13865
  /*!
13757
- * # Fomantic-UI 2.9.0-beta.23 - Popup
13866
+ * # Fomantic-UI 2.9.0-beta.230 - Popup
13758
13867
  * http://github.com/fomantic/Fomantic-UI/
13759
13868
  *
13760
13869
  *
@@ -15296,7 +15405,7 @@ $.fn.popup.settings = {
15296
15405
  })( jQuery, window, document );
15297
15406
 
15298
15407
  /*!
15299
- * # Fomantic-UI 2.9.0-beta.23 - Progress
15408
+ * # Fomantic-UI 2.9.0-beta.230 - Progress
15300
15409
  * http://github.com/fomantic/Fomantic-UI/
15301
15410
  *
15302
15411
  *
@@ -15904,6 +16013,9 @@ $.fn.progress = function(parameters) {
15904
16013
  }
15905
16014
  else {
15906
16015
  module.remove.active();
16016
+ module.remove.warning();
16017
+ module.remove.error();
16018
+ module.remove.success();
15907
16019
  module.set.label(settings.text.active);
15908
16020
  }
15909
16021
  },
@@ -16330,7 +16442,7 @@ $.fn.progress.settings = {
16330
16442
  })( jQuery, window, document );
16331
16443
 
16332
16444
  /*!
16333
- * # Fomantic-UI 2.9.0-beta.23 - Slider
16445
+ * # Fomantic-UI 2.9.0-beta.230 - Slider
16334
16446
  * http://github.com/fomantic/Fomantic-UI/
16335
16447
  *
16336
16448
  *
@@ -17669,7 +17781,7 @@ $.fn.slider.settings = {
17669
17781
  })( jQuery, window, document );
17670
17782
 
17671
17783
  /*!
17672
- * # Fomantic-UI 2.9.0-beta.23 - Rating
17784
+ * # Fomantic-UI 2.9.0-beta.230 - Rating
17673
17785
  * http://github.com/fomantic/Fomantic-UI/
17674
17786
  *
17675
17787
  *
@@ -18224,7 +18336,7 @@ $.fn.rating.settings = {
18224
18336
  })( jQuery, window, document );
18225
18337
 
18226
18338
  /*!
18227
- * # Fomantic-UI 2.9.0-beta.23 - Search
18339
+ * # Fomantic-UI 2.9.0-beta.230 - Search
18228
18340
  * http://github.com/fomantic/Fomantic-UI/
18229
18341
  *
18230
18342
  *
@@ -19792,7 +19904,7 @@ $.fn.search.settings = {
19792
19904
  })( jQuery, window, document );
19793
19905
 
19794
19906
  /*!
19795
- * # Fomantic-UI 2.9.0-beta.23 - Shape
19907
+ * # Fomantic-UI 2.9.0-beta.230 - Shape
19796
19908
  * http://github.com/fomantic/Fomantic-UI/
19797
19909
  *
19798
19910
  *
@@ -20641,7 +20753,7 @@ $.fn.shape.settings = {
20641
20753
  })( jQuery, window, document );
20642
20754
 
20643
20755
  /*!
20644
- * # Fomantic-UI 2.9.0-beta.23 - Sidebar
20756
+ * # Fomantic-UI 2.9.0-beta.230 - Sidebar
20645
20757
  * http://github.com/fomantic/Fomantic-UI/
20646
20758
  *
20647
20759
  *
@@ -21678,7 +21790,7 @@ $.fn.sidebar.settings = {
21678
21790
  })( jQuery, window, document );
21679
21791
 
21680
21792
  /*!
21681
- * # Fomantic-UI 2.9.0-beta.23 - Sticky
21793
+ * # Fomantic-UI 2.9.0-beta.230 - Sticky
21682
21794
  * http://github.com/fomantic/Fomantic-UI/
21683
21795
  *
21684
21796
  *
@@ -22636,7 +22748,7 @@ $.fn.sticky.settings = {
22636
22748
  })( jQuery, window, document );
22637
22749
 
22638
22750
  /*!
22639
- * # Fomantic-UI 2.9.0-beta.23 - Tab
22751
+ * # Fomantic-UI 2.9.0-beta.230 - Tab
22640
22752
  * http://github.com/fomantic/Fomantic-UI/
22641
22753
  *
22642
22754
  *
@@ -22737,10 +22849,18 @@ $.fn.tab = function(parameters) {
22737
22849
  initializedHistory = true;
22738
22850
  }
22739
22851
 
22740
- if(settings.autoTabActivation && instance === undefined && module.determine.activeTab() == null) {
22741
- module.debug('No active tab detected, setting first tab active', module.get.initialPath());
22742
- module.changeTab(settings.autoTabActivation === true ? module.get.initialPath() : settings.autoTabActivation);
22743
- };
22852
+ var activeTab = module.determine.activeTab();
22853
+ if(settings.autoTabActivation && instance === undefined && activeTab == null) {
22854
+ activeTab = settings.autoTabActivation === true ? module.get.initialPath() : settings.autoTabActivation;
22855
+ module.debug('No active tab detected, setting tab active', activeTab);
22856
+ module.changeTab(activeTab);
22857
+ }
22858
+ if(activeTab != null && settings.history) {
22859
+ var autoUpdate = $.address.autoUpdate();
22860
+ $.address.autoUpdate(false);
22861
+ $.address.value(activeTab);
22862
+ $.address.autoUpdate(autoUpdate);
22863
+ }
22744
22864
 
22745
22865
  module.instantiate();
22746
22866
  },
@@ -22840,6 +22960,7 @@ $.fn.tab = function(parameters) {
22840
22960
  .history(true)
22841
22961
  .state(settings.path)
22842
22962
  ;
22963
+ $(window).trigger('popstate');
22843
22964
  }
22844
22965
  else {
22845
22966
  module.error(error.path);
@@ -23007,6 +23128,10 @@ $.fn.tab = function(parameters) {
23007
23128
  module.verbose('Tab parameters found', nextPathArray);
23008
23129
  }
23009
23130
  }
23131
+ if (settings.onBeforeChange.call(element, currentPath) === false) {
23132
+ module.debug('onBeforeChange returned false, cancelling tab change', $tab);
23133
+ return false;
23134
+ }
23010
23135
  if(isLastTab && remoteContent) {
23011
23136
  if(!shouldIgnoreLoad) {
23012
23137
  module.activate.navigation(currentPath);
@@ -23043,6 +23168,10 @@ $.fn.tab = function(parameters) {
23043
23168
  // if anchor exists use parent tab
23044
23169
  if($anchor && $anchor.length > 0 && currentPath) {
23045
23170
  module.debug('Anchor link used, opening parent tab', $tab, $anchor);
23171
+ if (settings.onBeforeChange.call(element, currentPath) === false) {
23172
+ module.debug('onBeforeChange returned false, cancelling tab change', $tab);
23173
+ return false;
23174
+ }
23046
23175
  if( !$tab.hasClass(className.active) ) {
23047
23176
  setTimeout(function() {
23048
23177
  module.scrollTo($anchor);
@@ -23596,6 +23725,7 @@ $.fn.tab.settings = {
23596
23725
  onLoad : function(tabPath, parameterArray, historyEvent) {}, // called on every load
23597
23726
  onVisible : function(tabPath, parameterArray, historyEvent) {}, // called every time tab visible
23598
23727
  onRequest : function(tabPath, parameterArray, historyEvent) {}, // called ever time a tab beings loading remote content
23728
+ onBeforeChange: function(tabPath) {}, // called before a tab is about to be changed. Returning false will cancel the tab change
23599
23729
 
23600
23730
  templates : {
23601
23731
  determineTitle: function(tabArray) {} // returns page title for path
@@ -23638,7 +23768,7 @@ $.fn.tab.settings = {
23638
23768
  })( jQuery, window, document );
23639
23769
 
23640
23770
  /*!
23641
- * # Fomantic-UI 2.9.0-beta.23 - Toast
23771
+ * # Fomantic-UI 2.9.0-beta.230 - Toast
23642
23772
  * http://github.com/fomantic/Fomantic-UI/
23643
23773
  *
23644
23774
  *
@@ -23708,12 +23838,14 @@ $.fn.toast = function(parameters) {
23708
23838
  element = this,
23709
23839
  instance = isToastComponent ? $module.data(moduleNamespace) : undefined,
23710
23840
 
23841
+ id,
23711
23842
  module
23712
23843
  ;
23713
23844
  module = {
23714
23845
 
23715
23846
  initialize: function() {
23716
23847
  module.verbose('Initializing element');
23848
+ module.create.id();
23717
23849
  if (!module.has.container()) {
23718
23850
  module.create.container();
23719
23851
  }
@@ -23763,17 +23895,22 @@ $.fn.toast = function(parameters) {
23763
23895
  },
23764
23896
 
23765
23897
  show: function(callback) {
23766
- callback = callback || function(){};
23767
- module.debug('Showing toast');
23768
23898
  if(settings.onShow.call($toastBox, element) === false) {
23769
23899
  module.debug('onShow callback returned false, cancelling toast animation');
23770
23900
  return;
23771
23901
  }
23902
+ callback = callback || function(){};
23903
+ module.debug('Showing toast');
23772
23904
  module.animate.show(callback);
23773
23905
  },
23774
23906
 
23775
23907
  close: function(callback) {
23908
+ if(settings.onHide.call($toastBox, element) === false) {
23909
+ module.debug('onHide callback returned false, cancelling toast animation');
23910
+ return;
23911
+ }
23776
23912
  callback = callback || function(){};
23913
+ module.debug('Closing toast');
23777
23914
  module.remove.visible();
23778
23915
  module.unbind.events();
23779
23916
  module.animate.close(callback);
@@ -23785,12 +23922,16 @@ $.fn.toast = function(parameters) {
23785
23922
  module.verbose('Creating container');
23786
23923
  $context.append($('<div/>',{class: settings.position + ' ' + className.container + ' ' +(settings.horizontal ? className.horizontal : '')}));
23787
23924
  },
23925
+ id: function() {
23926
+ id = (Math.random().toString(16) + '000000000').substr(2, 8);
23927
+ module.verbose('Creating unique id for element', id);
23928
+ },
23788
23929
  toast: function() {
23789
23930
  $toastBox = $('<div/>', {class: className.box});
23790
23931
  var iconClass = module.get.iconClass();
23791
23932
  if (!isToastComponent) {
23792
23933
  module.verbose('Creating toast');
23793
- $toast = $('<div/>');
23934
+ $toast = $('<div/>', {role: 'alert'});
23794
23935
  var $content = $('<div/>', {class: className.content});
23795
23936
  if (iconClass !== '') {
23796
23937
  $toast.append($('<i/>', {class: iconClass + ' ' + className.icon}));
@@ -23803,13 +23944,21 @@ $.fn.toast = function(parameters) {
23803
23944
  }));
23804
23945
  }
23805
23946
  if (settings.title !== '') {
23947
+ var titleId = '_' + module.get.id() + 'title';
23948
+ $toast.attr('aria-labelledby', titleId);
23806
23949
  $content.append($('<div/>', {
23807
23950
  class: className.title,
23808
- text: settings.title
23951
+ id: titleId,
23952
+ html: module.helpers.escape(settings.title, settings.preserveHTML)
23809
23953
  }));
23810
23954
  }
23811
-
23812
- $content.append($('<div/>', {class: className.message, html: module.helpers.escape(settings.message, settings.preserveHTML)}));
23955
+ var descId = '_' + module.get.id() + 'desc';
23956
+ $toast.attr('aria-describedby', descId);
23957
+ $content.append($('<div/>', {
23958
+ class: className.message,
23959
+ id: descId,
23960
+ html: module.helpers.escape(settings.message, settings.preserveHTML)
23961
+ }));
23813
23962
 
23814
23963
  $toast
23815
23964
  .addClass(settings.class + ' ' + className.toast)
@@ -23817,7 +23966,7 @@ $.fn.toast = function(parameters) {
23817
23966
  ;
23818
23967
  $toast.css('opacity', settings.opacity);
23819
23968
  if (settings.closeIcon) {
23820
- $close = $('<i/>', {class: className.close + ' ' + (typeof settings.closeIcon === 'string' ? settings.closeIcon : '')});
23969
+ $close = $('<i/>', {class: className.close + ' ' + (typeof settings.closeIcon === 'string' ? settings.closeIcon : ''), role: 'button', tabindex: 0, 'aria-label': settings.text.close});
23821
23970
  if($close.hasClass(className.left)) {
23822
23971
  $toast.prepend($close);
23823
23972
  } else {
@@ -23860,15 +24009,17 @@ $.fn.toast = function(parameters) {
23860
24009
  }
23861
24010
  }
23862
24011
  settings.actions.forEach(function (el) {
23863
- var icon = el[fields.icon] ? '<i class="' + module.helpers.deQuote(el[fields.icon]) + ' icon"></i>' : '',
24012
+ var icon = el[fields.icon] ? '<i '+(el[fields.text] ? 'aria-hidden="true"' : '')+' class="' + module.helpers.deQuote(el[fields.icon]) + ' icon"></i>' : '',
23864
24013
  text = module.helpers.escape(el[fields.text] || '', settings.preserveHTML),
23865
24014
  cls = module.helpers.deQuote(el[fields.class] || ''),
23866
24015
  click = el[fields.click] && $.isFunction(el[fields.click]) ? el[fields.click] : function () {};
23867
24016
  $actions.append($('<button/>', {
23868
24017
  html: icon + text,
24018
+ 'aria-label': $('<div>'+(el[fields.text] || el[fields.icon] || '')+'</div>').text(),
23869
24019
  class: className.button + ' ' + cls,
23870
24020
  click: function () {
23871
- if (click.call(element, $module) === false) {
24021
+ var button = $(this);
24022
+ if (button.is(selector.approve) || button.is(selector.deny) || click.call(element, $module) === false) {
23872
24023
  return;
23873
24024
  }
23874
24025
  module.close();
@@ -23968,13 +24119,12 @@ $.fn.toast = function(parameters) {
23968
24119
  bind: {
23969
24120
  events: function() {
23970
24121
  module.debug('Binding events to toast');
23971
- if(settings.closeOnClick || settings.closeIcon) {
23972
- (settings.closeIcon ? $close : $toast)
23973
- .on('click' + eventNamespace, module.event.click)
23974
- ;
24122
+ if(settings.closeIcon) {
24123
+ $close.on('click' + eventNamespace, module.event.close);
23975
24124
  }
24125
+ $toast.on('click' + eventNamespace, module.event.click);
23976
24126
  if($animationObject) {
23977
- $animationObject.on('animationend' + eventNamespace, module.close);
24127
+ $animationObject.on('animationend' + eventNamespace, module.event.close);
23978
24128
  }
23979
24129
  $toastBox
23980
24130
  .on('click' + eventNamespace, selector.approve, module.event.approve)
@@ -23986,11 +24136,10 @@ $.fn.toast = function(parameters) {
23986
24136
  unbind: {
23987
24137
  events: function() {
23988
24138
  module.debug('Unbinding events to toast');
23989
- if(settings.closeOnClick || settings.closeIcon) {
23990
- (settings.closeIcon ? $close : $toast)
23991
- .off('click' + eventNamespace)
23992
- ;
24139
+ if(settings.closeIcon) {
24140
+ $close.off('click' + eventNamespace);
23993
24141
  }
24142
+ $toast.off('click' + eventNamespace);
23994
24143
  if($animationObject) {
23995
24144
  $animationObject.off('animationend' + eventNamespace);
23996
24145
  }
@@ -24022,11 +24171,6 @@ $.fn.toast = function(parameters) {
24022
24171
  },
24023
24172
  close: function(callback) {
24024
24173
  callback = $.isFunction(callback) ? callback : function(){};
24025
- module.debug('Closing toast');
24026
- if(settings.onHide.call($toastBox, element) === false) {
24027
- module.debug('onHide callback returned false, cancelling toast animation');
24028
- return;
24029
- }
24030
24174
  if(settings.transition && $.fn.transition !== undefined && $module.transition('is supported')) {
24031
24175
  $toastBox
24032
24176
  .transition({
@@ -24082,7 +24226,7 @@ $.fn.toast = function(parameters) {
24082
24226
  has: {
24083
24227
  container: function() {
24084
24228
  module.verbose('Determining if there is already a container');
24085
- return ($context.find(module.helpers.toClass(settings.position) + selector.container + (settings.horizontal ? module.helpers.toClass(className.horizontal) : '')).length > 0);
24229
+ return ($context.find(module.helpers.toClass(settings.position) + selector.container + (settings.horizontal ? module.helpers.toClass(className.horizontal) : ':not('+module.helpers.toClass(className.horizontal)+')')).length > 0);
24086
24230
  },
24087
24231
  toast: function(){
24088
24232
  return !!module.get.toast();
@@ -24096,8 +24240,11 @@ $.fn.toast = function(parameters) {
24096
24240
  },
24097
24241
 
24098
24242
  get: {
24243
+ id: function() {
24244
+ return id;
24245
+ },
24099
24246
  container: function() {
24100
- return ($context.find(module.helpers.toClass(settings.position) + selector.container)[0]);
24247
+ return ($context.find(module.helpers.toClass(settings.position) + selector.container + (settings.horizontal ? module.helpers.toClass(className.horizontal) : ':not('+module.helpers.toClass(className.horizontal)+')'))[0]);
24101
24248
  },
24102
24249
  toastBox: function() {
24103
24250
  return $toastBox || null;
@@ -24129,9 +24276,15 @@ $.fn.toast = function(parameters) {
24129
24276
  },
24130
24277
 
24131
24278
  event: {
24279
+ close: function(){
24280
+ module.close();
24281
+ },
24132
24282
  click: function(event) {
24133
- if($(event.target).closest('a').length === 0) {
24134
- settings.onClick.call($toastBox, element);
24283
+ if($(event.target).closest(selector.clickable).length === 0) {
24284
+ if(settings.onClick.call($toastBox, element) === false || !settings.closeOnClick) {
24285
+ module.verbose('Click callback returned false or close denied by setting cancelling close');
24286
+ return;
24287
+ }
24135
24288
  module.close();
24136
24289
  }
24137
24290
  },
@@ -24472,6 +24625,10 @@ $.fn.toast.settings = {
24472
24625
  unclickable : 'unclickable'
24473
24626
  },
24474
24627
 
24628
+ text: {
24629
+ close : 'Close'
24630
+ },
24631
+
24475
24632
  icons : {
24476
24633
  info : 'info',
24477
24634
  success : 'checkmark',
@@ -24488,6 +24645,7 @@ $.fn.toast.settings = {
24488
24645
  image : '> img.image, > .image > img',
24489
24646
  icon : '> i.icon',
24490
24647
  input : 'input:not([type="hidden"]), textarea, select, button, .ui.button, ui.dropdown',
24648
+ clickable : 'a, details, .ui.accordion',
24491
24649
  approve : '.actions .positive, .actions .approve, .actions .ok',
24492
24650
  deny : '.actions .negative, .actions .deny, .actions .cancel'
24493
24651
  },
@@ -24531,7 +24689,7 @@ $.extend( $.easing, {
24531
24689
  })( jQuery, window, document );
24532
24690
 
24533
24691
  /*!
24534
- * # Fomantic-UI 2.9.0-beta.23 - Transition
24692
+ * # Fomantic-UI 2.9.0-beta.230 - Transition
24535
24693
  * http://github.com/fomantic/Fomantic-UI/
24536
24694
  *
24537
24695
  *
@@ -25641,7 +25799,7 @@ $.fn.transition.settings = {
25641
25799
  })( jQuery, window, document );
25642
25800
 
25643
25801
  /*!
25644
- * # Fomantic-UI 2.9.0-beta.23 - API
25802
+ * # Fomantic-UI 2.9.0-beta.230 - API
25645
25803
  * http://github.com/fomantic/Fomantic-UI/
25646
25804
  *
25647
25805
  *
@@ -25716,6 +25874,7 @@ $.api = $.fn.api = function(parameters) {
25716
25874
  url,
25717
25875
  data,
25718
25876
  requestStartTime,
25877
+ originalData,
25719
25878
 
25720
25879
  // standard module
25721
25880
  element = this,
@@ -25728,6 +25887,7 @@ $.api = $.fn.api = function(parameters) {
25728
25887
 
25729
25888
  initialize: function() {
25730
25889
  if(!methodInvoked) {
25890
+ originalData = settings.data;
25731
25891
  module.bind.events();
25732
25892
  }
25733
25893
  module.instantiate();
@@ -25790,8 +25950,8 @@ $.api = $.fn.api = function(parameters) {
25790
25950
  module.error(error.noStorage);
25791
25951
  return;
25792
25952
  }
25793
- response = sessionStorage.getItem(url);
25794
- module.debug('Using cached response', url, response);
25953
+ response = sessionStorage.getItem(url + module.get.normalizedData());
25954
+ module.debug('Using cached response', url, settings.data, response);
25795
25955
  response = module.decode.json(response);
25796
25956
  return response;
25797
25957
  }
@@ -25809,8 +25969,8 @@ $.api = $.fn.api = function(parameters) {
25809
25969
  if( $.isPlainObject(response) ) {
25810
25970
  response = JSON.stringify(response);
25811
25971
  }
25812
- sessionStorage.setItem(url, response);
25813
- module.verbose('Storing cached response for url', url, response);
25972
+ sessionStorage.setItem(url + module.get.normalizedData(), response);
25973
+ module.verbose('Storing cached response for url', url, settings.data, response);
25814
25974
  }
25815
25975
  },
25816
25976
 
@@ -25839,7 +25999,7 @@ $.api = $.fn.api = function(parameters) {
25839
25999
 
25840
26000
  // Add form content
25841
26001
  if(settings.serializeForm) {
25842
- settings.data = module.add.formData(settings.data);
26002
+ settings.data = module.add.formData(originalData || settings.data);
25843
26003
  }
25844
26004
 
25845
26005
  // call beforesend and get any settings changes
@@ -25976,10 +26136,6 @@ $.api = $.fn.api = function(parameters) {
25976
26136
  cancelled: function() {
25977
26137
  return (module.cancelled || false);
25978
26138
  },
25979
- succesful: function() {
25980
- module.verbose('This behavior will be deleted due to typo. Use "was successful" instead.');
25981
- return module.was.successful();
25982
- },
25983
26139
  successful: function() {
25984
26140
  return (module.request && module.request.state() == 'resolved');
25985
26141
  },
@@ -26071,25 +26227,29 @@ $.api = $.fn.api = function(parameters) {
26071
26227
  },
26072
26228
  formData: function(data) {
26073
26229
  var
26074
- canSerialize = ($.fn.serializeObject !== undefined),
26075
- formData = (canSerialize)
26076
- ? $form.serializeObject()
26077
- : $form.serialize(),
26230
+ formData = {},
26078
26231
  hasOtherData
26079
26232
  ;
26080
- data = data || settings.data;
26233
+ data = data || originalData || settings.data;
26081
26234
  hasOtherData = $.isPlainObject(data);
26082
26235
 
26083
- if(hasOtherData) {
26084
- if(canSerialize) {
26085
- module.debug('Extending existing data with form data', data, formData);
26086
- data = $.extend(true, {}, data, formData);
26087
- }
26088
- else {
26089
- module.error(error.missingSerialize);
26090
- module.debug('Cant extend data. Replacing data with form data', data, formData);
26091
- data = formData;
26236
+ $.each($form.serializeArray(), function (i, element) {
26237
+ var node = formData[element.name];
26238
+
26239
+ if ('undefined' !== typeof node && node !== null) {
26240
+ if (Array.isArray(node)) {
26241
+ node.push(element.value);
26242
+ } else {
26243
+ formData[element.name] = [node, element.value];
26244
+ }
26245
+ } else {
26246
+ formData[element.name] = element.value;
26092
26247
  }
26248
+ });
26249
+
26250
+ if(hasOtherData) {
26251
+ module.debug('Extending existing data with form data', data, formData);
26252
+ data = $.extend(true, {}, data, formData);
26093
26253
  }
26094
26254
  else {
26095
26255
  module.debug('Adding form data', formData);
@@ -26340,6 +26500,9 @@ $.api = $.fn.api = function(parameters) {
26340
26500
  },
26341
26501
 
26342
26502
  get: {
26503
+ normalizedData: function(){
26504
+ return typeof settings.data === "string" ? settings.data : JSON.stringify(settings.data, Object.keys(settings.data).sort());
26505
+ },
26343
26506
  responseFromXHR: function(xhr) {
26344
26507
  return $.isPlainObject(xhr)
26345
26508
  ? (module.is.expectingJSON())
@@ -26747,7 +26910,7 @@ $.api.settings = {
26747
26910
  responseAsync : false,
26748
26911
 
26749
26912
  // whether onResponse should work with response value without force converting into an object
26750
- rawResponse : false,
26913
+ rawResponse : true,
26751
26914
 
26752
26915
  // callbacks before request
26753
26916
  beforeSend : function(settings) { return settings; },
@@ -26783,7 +26946,6 @@ $.api.settings = {
26783
26946
  legacyParameters : 'You are using legacy API success callback names',
26784
26947
  method : 'The method you called is not defined',
26785
26948
  missingAction : 'API action used but no url was defined',
26786
- missingSerialize : 'jquery-serialize-object is required to add form data to an existing data object',
26787
26949
  missingURL : 'No URL specified for api event',
26788
26950
  noReturnedValue : 'The beforeSend callback must return a settings object, beforeSend ignored.',
26789
26951
  noStorage : 'Caching responses locally requires session storage',
@@ -26819,7 +26981,7 @@ $.api.settings = {
26819
26981
  })( jQuery, window, document );
26820
26982
 
26821
26983
  /*!
26822
- * # Fomantic-UI 2.9.0-beta.23 - State
26984
+ * # Fomantic-UI 2.9.0-beta.230 - State
26823
26985
  * http://github.com/fomantic/Fomantic-UI/
26824
26986
  *
26825
26987
  *
@@ -27531,7 +27693,7 @@ $.fn.state.settings = {
27531
27693
  })( jQuery, window, document );
27532
27694
 
27533
27695
  /*!
27534
- * # Fomantic-UI 2.9.0-beta.23 - Visibility
27696
+ * # Fomantic-UI 2.9.0-beta.230 - Visibility
27535
27697
  * http://github.com/fomantic/Fomantic-UI/
27536
27698
  *
27537
27699
  *