fomantic-ui 2.10.0-beta.1 → 2.10.0-beta.10

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 (287) hide show
  1. package/.all-contributorsrc +9 -0
  2. package/.eslintrc.js +0 -10
  3. package/CONTRIBUTING.md +4 -1
  4. package/CONTRIBUTORS.md +1 -0
  5. package/FAQ.md +7 -2
  6. package/README.md +5 -9
  7. package/ROADMAP.md +4 -4
  8. package/SECURITY.md +8 -7
  9. package/changelog-setup.js +64 -70
  10. package/dist/components/accordion.css +1 -1
  11. package/dist/components/accordion.js +103 -142
  12. package/dist/components/accordion.min.css +1 -1
  13. package/dist/components/accordion.min.js +2 -2
  14. package/dist/components/ad.css +1 -1
  15. package/dist/components/ad.min.css +1 -1
  16. package/dist/components/api.js +157 -210
  17. package/dist/components/api.min.js +2 -2
  18. package/dist/components/breadcrumb.css +1 -1
  19. package/dist/components/breadcrumb.min.css +1 -1
  20. package/dist/components/button.css +1 -2
  21. package/dist/components/button.min.css +2 -2
  22. package/dist/components/calendar.css +1 -2
  23. package/dist/components/calendar.js +314 -352
  24. package/dist/components/calendar.min.css +2 -2
  25. package/dist/components/calendar.min.js +2 -2
  26. package/dist/components/card.css +1 -1
  27. package/dist/components/card.min.css +1 -1
  28. package/dist/components/checkbox.css +1 -2
  29. package/dist/components/checkbox.js +85 -135
  30. package/dist/components/checkbox.min.css +2 -2
  31. package/dist/components/checkbox.min.js +2 -2
  32. package/dist/components/comment.css +1 -1
  33. package/dist/components/comment.min.css +1 -1
  34. package/dist/components/container.css +2 -4
  35. package/dist/components/container.min.css +2 -2
  36. package/dist/components/dimmer.css +1 -11
  37. package/dist/components/dimmer.js +61 -94
  38. package/dist/components/dimmer.min.css +2 -2
  39. package/dist/components/dimmer.min.js +2 -2
  40. package/dist/components/divider.css +1 -2
  41. package/dist/components/divider.min.css +2 -2
  42. package/dist/components/dropdown.css +30 -51
  43. package/dist/components/dropdown.js +736 -1055
  44. package/dist/components/dropdown.min.css +2 -2
  45. package/dist/components/dropdown.min.js +2 -2
  46. package/dist/components/embed.css +1 -1
  47. package/dist/components/embed.js +85 -114
  48. package/dist/components/embed.min.css +1 -1
  49. package/dist/components/embed.min.js +2 -2
  50. package/dist/components/emoji.css +3809 -7617
  51. package/dist/components/emoji.min.css +2 -2
  52. package/dist/components/feed.css +1 -1
  53. package/dist/components/feed.min.css +1 -1
  54. package/dist/components/flag.css +1 -1
  55. package/dist/components/flag.min.css +1 -1
  56. package/dist/components/flyout.css +2 -3
  57. package/dist/components/flyout.js +226 -355
  58. package/dist/components/flyout.min.css +2 -2
  59. package/dist/components/flyout.min.js +2 -2
  60. package/dist/components/form.css +5 -95
  61. package/dist/components/form.js +335 -444
  62. package/dist/components/form.min.css +2 -2
  63. package/dist/components/form.min.js +2 -2
  64. package/dist/components/grid.css +2 -58
  65. package/dist/components/grid.min.css +2 -2
  66. package/dist/components/header.css +1 -1
  67. package/dist/components/header.min.css +1 -1
  68. package/dist/components/icon.css +4 -4
  69. package/dist/components/icon.min.css +2 -2
  70. package/dist/components/image.css +1 -1
  71. package/dist/components/image.min.css +1 -1
  72. package/dist/components/input.css +1 -536
  73. package/dist/components/input.min.css +2 -2
  74. package/dist/components/item.css +1 -1
  75. package/dist/components/item.min.css +1 -1
  76. package/dist/components/label.css +1 -1
  77. package/dist/components/label.min.css +1 -1
  78. package/dist/components/list.css +1 -3
  79. package/dist/components/list.min.css +2 -2
  80. package/dist/components/loader.css +1 -1
  81. package/dist/components/loader.min.css +1 -1
  82. package/dist/components/menu.css +1 -9
  83. package/dist/components/menu.min.css +2 -2
  84. package/dist/components/message.css +1 -1
  85. package/dist/components/message.min.css +1 -1
  86. package/dist/components/modal.css +5 -9
  87. package/dist/components/modal.js +261 -384
  88. package/dist/components/modal.min.css +2 -2
  89. package/dist/components/modal.min.js +2 -2
  90. package/dist/components/nag.css +1 -1
  91. package/dist/components/nag.js +68 -98
  92. package/dist/components/nag.min.css +1 -1
  93. package/dist/components/nag.min.js +2 -2
  94. package/dist/components/placeholder.css +1 -1
  95. package/dist/components/placeholder.min.css +1 -1
  96. package/dist/components/popup.css +1 -2
  97. package/dist/components/popup.js +198 -271
  98. package/dist/components/popup.min.css +2 -2
  99. package/dist/components/popup.min.js +2 -2
  100. package/dist/components/progress.css +1 -1
  101. package/dist/components/progress.js +109 -144
  102. package/dist/components/progress.min.css +1 -1
  103. package/dist/components/progress.min.js +2 -2
  104. package/dist/components/rail.css +1 -1
  105. package/dist/components/rail.min.css +1 -1
  106. package/dist/components/rating.css +1 -1
  107. package/dist/components/rating.js +91 -123
  108. package/dist/components/rating.min.css +1 -1
  109. package/dist/components/rating.min.js +2 -2
  110. package/dist/components/reset.css +1 -1
  111. package/dist/components/reset.min.css +1 -1
  112. package/dist/components/reveal.css +1 -1
  113. package/dist/components/reveal.min.css +1 -1
  114. package/dist/components/search.css +2 -9
  115. package/dist/components/search.js +277 -379
  116. package/dist/components/search.min.css +2 -2
  117. package/dist/components/search.min.js +2 -2
  118. package/dist/components/segment.css +2 -7
  119. package/dist/components/segment.min.css +2 -2
  120. package/dist/components/shape.css +1 -2
  121. package/dist/components/shape.js +158 -224
  122. package/dist/components/shape.min.css +2 -2
  123. package/dist/components/shape.min.js +2 -2
  124. package/dist/components/sidebar.css +2 -3
  125. package/dist/components/sidebar.js +124 -206
  126. package/dist/components/sidebar.min.css +2 -2
  127. package/dist/components/sidebar.min.js +2 -2
  128. package/dist/components/site.css +9 -25
  129. package/dist/components/site.js +38 -57
  130. package/dist/components/site.min.css +2 -2
  131. package/dist/components/site.min.js +2 -2
  132. package/dist/components/slider.css +1 -1
  133. package/dist/components/slider.js +246 -329
  134. package/dist/components/slider.min.css +1 -1
  135. package/dist/components/slider.min.js +2 -2
  136. package/dist/components/state.js +70 -100
  137. package/dist/components/state.min.js +2 -2
  138. package/dist/components/statistic.css +1 -1
  139. package/dist/components/statistic.min.css +1 -1
  140. package/dist/components/step.css +1 -1
  141. package/dist/components/step.min.css +1 -1
  142. package/dist/components/sticky.css +1 -1
  143. package/dist/components/sticky.js +135 -180
  144. package/dist/components/sticky.min.css +1 -1
  145. package/dist/components/sticky.min.js +2 -2
  146. package/dist/components/tab.css +1 -1
  147. package/dist/components/tab.js +176 -244
  148. package/dist/components/tab.min.css +1 -1
  149. package/dist/components/tab.min.js +2 -2
  150. package/dist/components/table.css +3 -37
  151. package/dist/components/table.min.css +2 -2
  152. package/dist/components/text.css +1 -1
  153. package/dist/components/text.min.css +1 -1
  154. package/dist/components/toast.css +1 -3
  155. package/dist/components/toast.js +109 -147
  156. package/dist/components/toast.min.css +1 -1
  157. package/dist/components/toast.min.js +2 -2
  158. package/dist/components/transition.css +1 -1
  159. package/dist/components/transition.js +91 -146
  160. package/dist/components/transition.min.css +1 -1
  161. package/dist/components/transition.min.js +2 -2
  162. package/dist/components/visibility.js +146 -224
  163. package/dist/components/visibility.min.js +2 -2
  164. package/dist/semantic.css +3906 -8720
  165. package/dist/semantic.js +4397 -6155
  166. package/dist/semantic.min.css +2 -2
  167. package/dist/semantic.min.js +2 -2
  168. package/examples/assets/show-examples.js +2 -4
  169. package/gulpfile.js +5 -7
  170. package/package.json +3 -5
  171. package/scripts/nightly-version.js +7 -10
  172. package/src/README.md +3 -3
  173. package/src/definitions/behaviors/api.js +156 -209
  174. package/src/definitions/behaviors/form.js +334 -443
  175. package/src/definitions/behaviors/state.js +69 -99
  176. package/src/definitions/behaviors/visibility.js +145 -223
  177. package/src/definitions/collections/form.less +1 -13
  178. package/src/definitions/collections/grid.less +1 -61
  179. package/src/definitions/collections/menu.less +0 -11
  180. package/src/definitions/collections/table.less +1 -35
  181. package/src/definitions/elements/input.less +1 -61
  182. package/src/definitions/elements/segment.less +0 -6
  183. package/src/definitions/globals/site.js +37 -56
  184. package/src/definitions/globals/site.less +2 -18
  185. package/src/definitions/modules/accordion.js +102 -141
  186. package/src/definitions/modules/calendar.js +313 -351
  187. package/src/definitions/modules/checkbox.js +84 -134
  188. package/src/definitions/modules/dimmer.js +60 -93
  189. package/src/definitions/modules/dimmer.less +0 -9
  190. package/src/definitions/modules/dropdown.js +735 -1054
  191. package/src/definitions/modules/dropdown.less +31 -47
  192. package/src/definitions/modules/embed.js +84 -113
  193. package/src/definitions/modules/flyout.js +225 -354
  194. package/src/definitions/modules/modal.js +260 -383
  195. package/src/definitions/modules/modal.less +1 -1
  196. package/src/definitions/modules/nag.js +67 -97
  197. package/src/definitions/modules/popup.js +197 -270
  198. package/src/definitions/modules/progress.js +108 -143
  199. package/src/definitions/modules/rating.js +90 -122
  200. package/src/definitions/modules/search.js +276 -378
  201. package/src/definitions/modules/search.less +0 -3
  202. package/src/definitions/modules/shape.js +157 -223
  203. package/src/definitions/modules/sidebar.js +123 -205
  204. package/src/definitions/modules/slider.js +245 -328
  205. package/src/definitions/modules/slider.less +1 -1
  206. package/src/definitions/modules/sticky.js +134 -179
  207. package/src/definitions/modules/tab.js +175 -243
  208. package/src/definitions/modules/toast.js +108 -146
  209. package/src/definitions/modules/toast.less +1 -1
  210. package/src/definitions/modules/transition.js +90 -145
  211. package/src/theme.less +0 -13
  212. package/src/themes/basic/elements/icon.variables +1 -1
  213. package/src/themes/default/collections/grid.variables +0 -30
  214. package/src/themes/default/collections/table.variables +1 -5
  215. package/src/themes/default/elements/icon.variables +3 -3
  216. package/src/themes/default/globals/site.variables +8 -15
  217. package/src/themes/default/globals/variation.variables +1 -2
  218. package/src/themes/default/modules/dropdown.variables +1 -0
  219. package/src/themes/default/modules/slider.variables +1 -1
  220. package/src/themes/github/elements/icon.variables +1 -1
  221. package/src/themes/material/elements/icon.variables +1 -1
  222. package/tasks/README.md +1 -1
  223. package/tasks/admin/components/create.js +89 -122
  224. package/tasks/admin/components/init.js +34 -65
  225. package/tasks/admin/components/update.js +50 -61
  226. package/tasks/admin/distributions/create.js +71 -111
  227. package/tasks/admin/distributions/init.js +32 -63
  228. package/tasks/admin/distributions/update.js +49 -57
  229. package/tasks/admin/publish.js +1 -1
  230. package/tasks/admin/register.js +14 -19
  231. package/tasks/admin/release.js +2 -2
  232. package/tasks/build/assets.js +14 -18
  233. package/tasks/build/css.js +59 -68
  234. package/tasks/build/javascript.js +48 -56
  235. package/tasks/build.js +4 -6
  236. package/tasks/check-install.js +5 -8
  237. package/tasks/clean.js +5 -7
  238. package/tasks/collections/admin.js +14 -16
  239. package/tasks/collections/build.js +6 -8
  240. package/tasks/collections/docs.js +4 -6
  241. package/tasks/collections/install.js +2 -4
  242. package/tasks/collections/rtl.js +2 -4
  243. package/tasks/collections/various.js +2 -4
  244. package/tasks/config/admin/github.js +9 -19
  245. package/tasks/config/admin/templates/README.md +2 -2
  246. package/tasks/config/admin/templates/bower.json +2 -4
  247. package/tasks/config/admin/templates/composer.json +1 -1
  248. package/tasks/config/admin/templates/css-package.js +1 -4
  249. package/tasks/config/admin/templates/less-package.js +1 -3
  250. package/tasks/config/defaults.js +0 -1
  251. package/tasks/config/npm/gulpfile.js +4 -6
  252. package/tasks/config/project/config.js +27 -35
  253. package/tasks/config/project/install.js +64 -82
  254. package/tasks/config/project/release.js +7 -9
  255. package/tasks/config/tasks.js +10 -21
  256. package/tasks/config/user.js +14 -20
  257. package/tasks/docs/build.js +26 -31
  258. package/tasks/docs/metadata.js +30 -39
  259. package/tasks/docs/serve.js +23 -27
  260. package/tasks/install.js +94 -128
  261. package/tasks/rtl/build.js +2 -4
  262. package/tasks/rtl/watch.js +3 -5
  263. package/tasks/watch.js +13 -13
  264. package/test/meteor/fonts.js +1 -2
  265. package/test/modules/module.spec.js +16 -18
  266. package/types/fomantic-ui-calendar.d.ts +1 -1
  267. package/types/fomantic-ui-dropdown.d.ts +45 -1
  268. package/types/fomantic-ui-embed.d.ts +1 -1
  269. package/types/fomantic-ui-flyout.d.ts +1 -1
  270. package/types/fomantic-ui-form.d.ts +0 -7
  271. package/types/fomantic-ui-modal.d.ts +1 -1
  272. package/types/fomantic-ui-search.d.ts +12 -6
  273. package/types/fomantic-ui-toast.d.ts +1 -1
  274. package/src/themes/basic/assets/fonts/icons.woff +0 -0
  275. package/src/themes/default/assets/fonts/Lato-Bold.woff +0 -0
  276. package/src/themes/default/assets/fonts/Lato-BoldItalic.woff +0 -0
  277. package/src/themes/default/assets/fonts/Lato-Italic.woff +0 -0
  278. package/src/themes/default/assets/fonts/Lato-Regular.woff +0 -0
  279. package/src/themes/default/assets/fonts/LatoLatin-Bold.woff +0 -0
  280. package/src/themes/default/assets/fonts/LatoLatin-BoldItalic.woff +0 -0
  281. package/src/themes/default/assets/fonts/LatoLatin-Italic.woff +0 -0
  282. package/src/themes/default/assets/fonts/LatoLatin-Regular.woff +0 -0
  283. package/src/themes/default/assets/fonts/brand-icons.woff +0 -0
  284. package/src/themes/default/assets/fonts/icons.woff +0 -0
  285. package/src/themes/default/assets/fonts/outline-icons.woff +0 -0
  286. package/src/themes/github/assets/fonts/octicons.woff +0 -0
  287. package/src/themes/material/assets/fonts/icons.woff +0 -0
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * # Fomantic-UI 2.10.0-beta.1+bee406e - Dropdown
2
+ * # Fomantic-UI 2.10.0-beta.10+3ca268e - Dropdown
3
3
  * https://github.com/fomantic/Fomantic-UI/
4
4
  *
5
5
  *
@@ -20,91 +20,87 @@
20
20
  : globalThis;
21
21
 
22
22
  $.fn.dropdown = function (parameters) {
23
- var
24
- $allModules = $(this),
25
- $document = $(document),
26
-
27
- time = Date.now(),
28
- performance = [],
29
-
30
- query = arguments[0],
31
- methodInvoked = typeof query === 'string',
32
- queryArguments = [].slice.call(arguments, 1),
33
- contextCheck = function (context, win) {
34
- var $context;
35
- if ([window, document].indexOf(context) >= 0) {
36
- $context = $(context);
37
- } else {
38
- $context = $(win.document).find(context);
39
- if ($context.length === 0) {
40
- $context = win.frameElement ? contextCheck(context, win.parent) : window;
41
- }
23
+ let $allModules = $(this);
24
+ let $document = $(document);
25
+
26
+ let time = Date.now();
27
+ let performance = [];
28
+
29
+ let query = arguments[0];
30
+ let methodInvoked = typeof query === 'string';
31
+ let queryArguments = [].slice.call(arguments, 1);
32
+ let contextCheck = function (context, win) {
33
+ let $context;
34
+ if ([window, document].indexOf(context) >= 0) {
35
+ $context = $(context);
36
+ } else {
37
+ $context = $(win.document).find(context);
38
+ if ($context.length === 0) {
39
+ $context = win.frameElement ? contextCheck(context, win.parent) : window;
42
40
  }
41
+ }
43
42
 
44
- return $context;
45
- },
46
- returnedValue
47
- ;
43
+ return $context;
44
+ };
45
+ let returnedValue;
48
46
 
49
47
  $allModules.each(function (elementIndex) {
50
- var
51
- settings = $.isPlainObject(parameters)
52
- ? $.extend(true, {}, $.fn.dropdown.settings, parameters)
53
- : $.extend({}, $.fn.dropdown.settings),
54
-
55
- className = settings.className,
56
- message = settings.message,
57
- fields = settings.fields,
58
- keys = settings.keys,
59
- metadata = settings.metadata,
60
- namespace = settings.namespace,
61
- regExp = settings.regExp,
62
- selector = settings.selector,
63
- error = settings.error,
64
- templates = settings.templates,
65
-
66
- eventNamespace = '.' + namespace,
67
- moduleNamespace = 'module-' + namespace,
68
-
69
- $module = $(this),
70
- $context = contextCheck(settings.context, window),
71
- $text = $module.find(selector.text),
72
- $search = $module.find(selector.search),
73
- $sizer = $module.find(selector.sizer),
74
- $input = $module.find(selector.input),
75
- $icon = $module.find(selector.icon),
76
- $clear = $module.find(selector.clearIcon),
77
-
78
- $combo = $module.prev().find(selector.text).length > 0
79
- ? $module.prev().find(selector.text)
80
- : $module.prev(),
81
-
82
- $menu = $module.children(selector.menu),
83
- $item = $menu.find(selector.item),
84
- $divider = settings.hideDividers
85
- ? $item.parent().children(selector.divider)
86
- : $(),
87
-
88
- activated = false,
89
- itemActivated = false,
90
- internalChange = false,
91
- iconClicked = false,
92
- element = this,
93
- focused = false,
94
- instance = $module.data(moduleNamespace),
95
-
96
- selectActionActive,
97
- initialLoad,
98
- pageLostFocus,
99
- willRefocus,
100
- elementNamespace,
101
- id,
102
- selectObserver,
103
- menuObserver,
104
- classObserver,
105
- module,
106
- tempDisableApiCache = false
107
- ;
48
+ let settings = $.isPlainObject(parameters)
49
+ ? $.extend(true, {}, $.fn.dropdown.settings, parameters)
50
+ : $.extend({}, $.fn.dropdown.settings);
51
+
52
+ let className = settings.className;
53
+ let message = settings.message;
54
+ let fields = settings.fields;
55
+ let keys = settings.keys;
56
+ let metadata = settings.metadata;
57
+ let namespace = settings.namespace;
58
+ let regExp = settings.regExp;
59
+ let selector = settings.selector;
60
+ let error = settings.error;
61
+ let templates = settings.templates;
62
+
63
+ let eventNamespace = '.' + namespace;
64
+ let moduleNamespace = 'module-' + namespace;
65
+
66
+ let $module = $(this);
67
+ let $context = contextCheck(settings.context, window);
68
+ let $text = $module.find(selector.text);
69
+ let $search = $module.find(selector.search);
70
+ let $sizer = $module.find(selector.sizer);
71
+ let $input = $module.find(selector.input);
72
+ let $icon = $module.find(selector.icon);
73
+ let $clear = $module.find(selector.clearIcon);
74
+
75
+ let $combo = $module.prev().find(selector.text).length > 0
76
+ ? $module.prev().find(selector.text)
77
+ : $module.prev();
78
+
79
+ let $menu = $module.children(selector.menu);
80
+ let $item = $menu.find(selector.item);
81
+ let $divider = settings.hideDividers
82
+ ? $item.parent().children(selector.divider)
83
+ : $();
84
+
85
+ let activated = false;
86
+ let itemActivated = false;
87
+ let internalChange = false;
88
+ let iconClicked = false;
89
+ let element = this;
90
+ let focused = false;
91
+ let instance = $module.data(moduleNamespace);
92
+
93
+ let selectActionActive;
94
+ let initialLoad;
95
+ let pageLostFocus;
96
+ let willRefocus;
97
+ let elementNamespace;
98
+ let id;
99
+ let selectObserver;
100
+ let menuObserver;
101
+ let classObserver;
102
+ let module;
103
+ let tempDisableApiCache = false;
108
104
 
109
105
  module = {
110
106
 
@@ -114,11 +110,6 @@
114
110
  if (module.is.alreadySetup()) {
115
111
  module.setup.reference();
116
112
  } else {
117
- if (settings.ignoreDiacritics && !String.prototype.normalize) {
118
- settings.ignoreDiacritics = false;
119
- module.error(error.noNormalize, element);
120
- }
121
-
122
113
  module.create.id();
123
114
  module.setup.layout();
124
115
 
@@ -147,8 +138,7 @@
147
138
  module.verbose('Storing instance of dropdown', module);
148
139
  instance = module;
149
140
  $module
150
- .data(moduleNamespace, module)
151
- ;
141
+ .data(moduleNamespace, module);
152
142
  },
153
143
 
154
144
  destroy: function () {
@@ -159,29 +149,24 @@
159
149
  $menu.removeClass(className.visible).addClass(className.hidden);
160
150
  $module
161
151
  .off(eventNamespace)
162
- .removeData(moduleNamespace)
163
- ;
152
+ .removeData(moduleNamespace);
164
153
  $menu
165
- .off(eventNamespace)
166
- ;
154
+ .off(eventNamespace);
167
155
  $document
168
- .off(elementNamespace)
169
- ;
156
+ .off(elementNamespace);
170
157
  module.disconnect.menuObserver();
171
158
  module.disconnect.selectObserver();
172
159
  module.disconnect.classObserver();
173
160
  },
174
161
 
175
162
  observeChanges: function () {
176
- if ('MutationObserver' in window) {
177
- selectObserver = new MutationObserver(module.event.select.mutation);
178
- menuObserver = new MutationObserver(module.event.menu.mutation);
179
- classObserver = new MutationObserver(module.event.class.mutation);
180
- module.debug('Setting up mutation observer', selectObserver, menuObserver, classObserver);
181
- module.observe.select();
182
- module.observe.menu();
183
- module.observe.class();
184
- }
163
+ selectObserver = new MutationObserver(module.event.select.mutation);
164
+ menuObserver = new MutationObserver(module.event.menu.mutation);
165
+ classObserver = new MutationObserver(module.event.class.mutation);
166
+ module.debug('Setting up mutation observer', selectObserver, menuObserver, classObserver);
167
+ module.observe.select();
168
+ module.observe.menu();
169
+ module.observe.class();
185
170
  },
186
171
 
187
172
  disconnect: {
@@ -235,11 +220,9 @@
235
220
  module.verbose('Creating unique id for element', id);
236
221
  },
237
222
  userChoice: function (values) {
238
- var
239
- $userChoices,
240
- $userChoice,
241
- html
242
- ;
223
+ let $userChoices;
224
+ let $userChoice;
225
+ let html;
243
226
  values = values || module.get.userValues();
244
227
  if (!values) {
245
228
  return false;
@@ -255,8 +238,7 @@
255
238
  .attr('data-' + metadata.value, value)
256
239
  .attr('data-' + metadata.text, value)
257
240
  .addClass(className.addition)
258
- .addClass(className.item)
259
- ;
241
+ .addClass(className.item);
260
242
  if (settings.hideAdditions) {
261
243
  $userChoice.addClass(className.hidden);
262
244
  }
@@ -270,9 +252,7 @@
270
252
  return $userChoices;
271
253
  },
272
254
  userLabels: function (value) {
273
- var
274
- userValues = module.get.userValues()
275
- ;
255
+ let userValues = module.get.userValues();
276
256
  if (userValues) {
277
257
  module.debug('Adding user labels', userValues);
278
258
  $.each(userValues, function (index, value) {
@@ -284,14 +264,12 @@
284
264
  menu: function () {
285
265
  $menu = $('<div />')
286
266
  .addClass(className.menu)
287
- .appendTo($module)
288
- ;
267
+ .appendTo($module);
289
268
  },
290
269
  sizer: function () {
291
270
  $sizer = $('<span />')
292
271
  .addClass(className.sizer)
293
- .insertAfter($search)
294
- ;
272
+ .insertAfter($search);
295
273
  },
296
274
  },
297
275
 
@@ -317,16 +295,13 @@
317
295
  .not(selector.unselectable)
318
296
  .not(selector.addition + selector.hidden)
319
297
  .eq(0)
320
- .addClass(className.selected)
321
- ;
298
+ .addClass(className.selected);
322
299
  },
323
300
  nextAvailable: function ($selected) {
324
301
  $selected = $selected.eq(0);
325
- var
326
- $nextAvailable = $selected.nextAll(selector.item).not(selector.unselectable).eq(0),
327
- $prevAvailable = $selected.prevAll(selector.item).not(selector.unselectable).eq(0),
328
- hasNext = $nextAvailable.length > 0
329
- ;
302
+ let $nextAvailable = $selected.nextAll(selector.item).not(selector.unselectable).eq(0);
303
+ let $prevAvailable = $selected.prevAll(selector.item).not(selector.unselectable).eq(0);
304
+ let hasNext = $nextAvailable.length > 0;
330
305
  if (hasNext) {
331
306
  module.verbose('Moving selection to', $nextAvailable);
332
307
  $nextAvailable.addClass(className.selected);
@@ -339,20 +314,17 @@
339
314
 
340
315
  setup: {
341
316
  api: function () {
342
- var
343
- apiSettings = {
344
- debug: settings.debug,
345
- urlData: {
346
- value: module.get.value(),
347
- query: module.get.query(),
348
- },
349
- on: false,
350
- }
351
- ;
317
+ let apiSettings = {
318
+ debug: settings.debug,
319
+ urlData: {
320
+ value: module.get.value(),
321
+ query: module.get.query(),
322
+ },
323
+ on: false,
324
+ };
352
325
  module.verbose('First request, initializing API');
353
326
  $module
354
- .api(apiSettings)
355
- ;
327
+ .api(apiSettings);
356
328
  },
357
329
  layout: function () {
358
330
  if ($module.is('select')) {
@@ -366,18 +338,14 @@
366
338
  module.verbose('Adding clear icon');
367
339
  $clear = $('<i />')
368
340
  .addClass('remove icon')
369
- .insertAfter($icon)
370
- ;
341
+ .insertAfter($icon);
371
342
  }
372
343
  if (module.is.search() && !module.has.search()) {
373
344
  module.verbose('Adding search input');
374
- var
375
- labelNode = $module.prev('label')
376
- ;
345
+ let labelNode = $module.prev('label');
377
346
  $search = $('<input />')
378
347
  .addClass(className.search)
379
- .prop('autocomplete', module.is.chrome() ? 'fomantic-search' : 'off')
380
- ;
348
+ .prop('autocomplete', module.is.chrome() ? 'fomantic-search' : 'off');
381
349
  if (labelNode.length > 0) {
382
350
  if (!labelNode.attr('id')) {
383
351
  labelNode.attr('id', '_' + module.get.id() + '_formLabel');
@@ -394,9 +362,7 @@
394
362
  }
395
363
  },
396
364
  select: function () {
397
- var
398
- selectValues = module.get.selectValues()
399
- ;
365
+ let selectValues = module.get.selectValues();
400
366
  module.debug('Dropdown initialized on a select', selectValues);
401
367
  if ($module.is('select')) {
402
368
  $input = $module;
@@ -416,9 +382,8 @@
416
382
  .attr('class', $input.attr('class'))
417
383
  .addClass(className.selection)
418
384
  .addClass(className.dropdown)
419
- .html(templates.dropdown(selectValues, fields, settings.preserveHTML, settings.className))
420
- .insertBefore($input)
421
- ;
385
+ .html(templates.dropdown(selectValues, settings))
386
+ .insertBefore($input);
422
387
  if ($input.hasClass(className.multiple) && $input.prop('multiple') === false) {
423
388
  module.error(error.missingMultiple);
424
389
  $input.prop('multiple', true);
@@ -440,13 +405,12 @@
440
405
  .prop('required', false)
441
406
  .removeAttr('class')
442
407
  .detach()
443
- .prependTo($module)
444
- ;
408
+ .prependTo($module);
445
409
  }
446
410
  module.refresh();
447
411
  },
448
412
  menu: function (values) {
449
- $menu.html(templates.menu(values, fields, settings.preserveHTML, settings.className));
413
+ $menu.html(templates.menu(values, settings));
450
414
  $item = $menu.find(selector.item);
451
415
  $divider = settings.hideDividers ? $item.parent().children(selector.divider) : $();
452
416
  },
@@ -460,11 +424,9 @@
460
424
  module.setup.returnedObject();
461
425
  },
462
426
  returnedObject: function () {
463
- var
464
- $firstModules = $allModules.slice(0, elementIndex),
465
- $lastModules = $allModules.slice(elementIndex + 1)
466
- ;
467
- // adjust all modules to use correct reference
427
+ let $firstModules = $allModules.slice(0, elementIndex);
428
+ let $lastModules = $allModules.slice(elementIndex + 1);
429
+ // adjust all modules to use the correct reference
468
430
  $allModules = $firstModules.add($module).add($lastModules);
469
431
  },
470
432
  },
@@ -497,21 +459,18 @@
497
459
  module.verbose('Refreshing cached metadata');
498
460
  $item
499
461
  .removeData(metadata.text)
500
- .removeData(metadata.value)
501
- ;
462
+ .removeData(metadata.value);
502
463
  },
503
464
 
504
465
  clearData: function () {
505
466
  module.verbose('Clearing metadata');
506
467
  $item
507
468
  .removeData(metadata.text)
508
- .removeData(metadata.value)
509
- ;
469
+ .removeData(metadata.value);
510
470
  $module
511
471
  .removeData(metadata.defaultText)
512
472
  .removeData(metadata.defaultValue)
513
- .removeData(metadata.placeholderText)
514
- ;
473
+ .removeData(metadata.placeholderText);
515
474
  },
516
475
 
517
476
  clearItems: function () {
@@ -578,11 +537,11 @@
578
537
  });
579
538
  // Hide submenus explicitly. On some browsers (esp. mobile), they will not automatically receive a
580
539
  // mouseleave event
581
- var $subMenu = $module.find(selector.menu);
540
+ let $subMenu = $module.find(selector.menu);
582
541
  if ($subMenu.length > 0) {
583
542
  module.verbose('Hiding sub-menu', $subMenu);
584
543
  $subMenu.each(function () {
585
- var $sub = $(this);
544
+ let $sub = $(this);
586
545
  if (!module.is.animating($sub)) {
587
546
  module.animate.hide(false, $sub);
588
547
  }
@@ -601,8 +560,7 @@
601
560
  $allModules
602
561
  .not($module)
603
562
  .has(selector.menu + '.' + className.visible)
604
- .dropdown('hide')
605
- ;
563
+ .dropdown('hide');
606
564
  },
607
565
 
608
566
  hideMenu: function () {
@@ -613,9 +571,7 @@
613
571
  },
614
572
 
615
573
  hideSubMenus: function () {
616
- var
617
- $subMenus = $menu.children(selector.item).find(selector.menu)
618
- ;
574
+ let $subMenus = $menu.children(selector.item).find(selector.menu);
619
575
  module.verbose('Hiding sub menus', $subMenus);
620
576
  $subMenus.transition('hide');
621
577
  },
@@ -629,28 +585,23 @@
629
585
  keyboardEvents: function () {
630
586
  module.verbose('Binding keyboard events');
631
587
  $module
632
- .on('keydown' + eventNamespace, module.event.keydown)
633
- ;
588
+ .on('keydown' + eventNamespace, module.event.keydown);
634
589
  if (module.has.search()) {
635
590
  $module
636
- .on(module.get.inputEvent() + eventNamespace, selector.search, module.event.input)
637
- ;
591
+ .on(module.get.inputEvent() + eventNamespace, selector.search, module.event.input);
638
592
  }
639
593
  if (module.is.multiple()) {
640
594
  $document
641
- .on('keydown' + elementNamespace, module.event.document.keydown)
642
- ;
595
+ .on('keydown' + elementNamespace, module.event.document.keydown);
643
596
  }
644
597
  },
645
598
  inputEvents: function () {
646
599
  module.verbose('Binding input change events');
647
600
  $module
648
- .on('change' + eventNamespace, selector.input, module.event.change)
649
- ;
601
+ .on('change' + eventNamespace, selector.input, module.event.change);
650
602
  if (module.is.multiple() && module.is.searchSelection()) {
651
603
  $module
652
- .on('paste' + eventNamespace, selector.search, module.event.paste)
653
- ;
604
+ .on('paste' + eventNamespace, selector.search, module.event.paste);
654
605
  }
655
606
  },
656
607
  mouseEvents: function () {
@@ -658,8 +609,7 @@
658
609
  if (module.is.multiple()) {
659
610
  $module
660
611
  .on('click' + eventNamespace, selector.label, module.event.label.click)
661
- .on('click' + eventNamespace, selector.remove, module.event.remove.click)
662
- ;
612
+ .on('click' + eventNamespace, selector.remove, module.event.remove.click);
663
613
  }
664
614
  if (module.is.searchSelection()) {
665
615
  $module
@@ -672,60 +622,50 @@
672
622
  .on('focus' + eventNamespace, selector.search, module.event.search.focus)
673
623
  .on('click' + eventNamespace, selector.search, module.event.search.focus)
674
624
  .on('blur' + eventNamespace, selector.search, module.event.search.blur)
675
- .on('click' + eventNamespace, selector.text, module.event.text.focus)
676
- ;
625
+ .on('click' + eventNamespace, selector.text, module.event.text.focus);
677
626
  if (module.is.multiple()) {
678
627
  $module
679
628
  .on('click' + eventNamespace, module.event.click)
680
- .on('click' + eventNamespace, module.event.search.focus)
681
- ;
629
+ .on('click' + eventNamespace, module.event.search.focus);
682
630
  }
683
631
  } else {
684
632
  if (settings.on === 'click') {
685
633
  $module
686
634
  .on('click' + eventNamespace, selector.icon, module.event.icon.click)
687
- .on('click' + eventNamespace, module.event.test.toggle)
688
- ;
635
+ .on('click' + eventNamespace, module.event.test.toggle);
689
636
  } else if (settings.on === 'hover') {
690
637
  $module
691
638
  .on('mouseenter' + eventNamespace, module.delay.show)
692
639
  .on('mouseleave' + eventNamespace, module.delay.hide)
693
640
  .on('touchstart' + eventNamespace, module.event.test.toggle)
694
- .on('touchstart' + eventNamespace, selector.icon, module.event.icon.click)
695
- ;
641
+ .on('touchstart' + eventNamespace, selector.icon, module.event.icon.click);
696
642
  } else {
697
643
  $module
698
- .on(settings.on + eventNamespace, module.toggle)
699
- ;
644
+ .on(settings.on + eventNamespace, module.toggle);
700
645
  }
701
646
  $module
702
647
  .on('mousedown' + eventNamespace, module.event.mousedown)
703
648
  .on('mouseup' + eventNamespace, module.event.mouseup)
704
649
  .on('focus' + eventNamespace, module.event.focus)
705
- .on('click' + eventNamespace, selector.clearIcon, module.event.clearIcon.click)
706
- ;
650
+ .on('click' + eventNamespace, selector.clearIcon, module.event.clearIcon.click);
707
651
  if (module.has.menuSearch()) {
708
652
  $module
709
- .on('blur' + eventNamespace, selector.search, module.event.search.blur)
710
- ;
653
+ .on('blur' + eventNamespace, selector.search, module.event.search.blur);
711
654
  } else {
712
655
  $module
713
- .on('blur' + eventNamespace, module.event.blur)
714
- ;
656
+ .on('blur' + eventNamespace, module.event.blur);
715
657
  }
716
658
  }
717
659
  $menu
718
660
  .on('mouseenter' + eventNamespace, selector.item, module.event.item.mouseenter)
719
661
  .on('touchstart' + eventNamespace, selector.item, module.event.item.mouseenter)
720
662
  .on('mouseleave' + eventNamespace, selector.item, module.event.item.mouseleave)
721
- .on('click' + eventNamespace, selector.item, module.event.item.click)
722
- ;
663
+ .on('click' + eventNamespace, selector.item, module.event.item.click);
723
664
  },
724
665
  intent: function () {
725
666
  module.verbose('Binding hide intent event to document');
726
667
  $document
727
- .on('click' + elementNamespace, module.event.test.hide)
728
- ;
668
+ .on('click' + elementNamespace, module.event.test.hide);
729
669
  },
730
670
  },
731
671
 
@@ -733,52 +673,49 @@
733
673
  intent: function () {
734
674
  module.verbose('Removing hide intent event from document');
735
675
  $document
736
- .off('click' + elementNamespace)
737
- ;
676
+ .off('click' + elementNamespace);
738
677
  },
739
678
  },
740
679
 
741
680
  filter: function (query) {
742
- var
743
- searchTerm = query !== undefined
744
- ? query
745
- : module.get.query(),
746
- afterFiltered = function () {
747
- if (module.is.multiple()) {
748
- module.filterActive();
749
- }
750
- if (query || (!query && module.get.activeItem().length === 0)) {
751
- module.select.firstUnfiltered();
752
- }
753
- if (module.has.allResultsFiltered()) {
754
- if (settings.onNoResults.call(element, searchTerm)) {
755
- if (settings.allowAdditions) {
756
- if (settings.hideAdditions) {
757
- module.verbose('User addition with no menu, setting empty style');
758
- module.set.empty();
759
- module.hideMenu();
760
- }
761
- } else {
762
- module.verbose('All items filtered, showing message', searchTerm);
763
- module.add.message(message.noResults);
681
+ let searchTerm = query !== undefined
682
+ ? query
683
+ : module.get.query();
684
+ let afterFiltered = function () {
685
+ if (module.is.multiple()) {
686
+ module.filterActive();
687
+ }
688
+ if (query || (!query && module.get.activeItem().length === 0)) {
689
+ module.select.firstUnfiltered();
690
+ }
691
+ if (module.has.allResultsFiltered()) {
692
+ if (settings.onNoResults.call(element, searchTerm)) {
693
+ if (settings.allowAdditions) {
694
+ if (settings.hideAdditions) {
695
+ module.verbose('User addition with no menu, setting empty style');
696
+ module.set.empty();
697
+ module.hideMenu();
764
698
  }
765
699
  } else {
766
- module.verbose('All items filtered, hiding dropdown', searchTerm);
767
- module.set.empty();
768
- module.hideMenu();
700
+ module.verbose('All items filtered, showing message', searchTerm);
701
+ module.add.message(message.noResults);
769
702
  }
770
703
  } else {
771
- module.remove.empty();
772
- module.remove.message();
773
- }
774
- if (settings.allowAdditions) {
775
- module.add.userSuggestion(module.escape.htmlEntities(query));
776
- }
777
- if (module.is.searchSelection() && module.can.show() && module.is.focusedOnSearch() && !module.is.empty()) {
778
- module.show();
704
+ module.verbose('All items filtered, hiding dropdown', searchTerm);
705
+ module.set.empty();
706
+ module.hideMenu();
779
707
  }
708
+ } else {
709
+ module.remove.empty();
710
+ module.remove.message();
780
711
  }
781
- ;
712
+ if (settings.allowAdditions) {
713
+ module.add.userSuggestion(module.escape.htmlEntities(query));
714
+ }
715
+ if (module.is.searchSelection() && module.can.show() && module.is.focusedOnSearch() && !module.is.empty()) {
716
+ module.show();
717
+ }
718
+ };
782
719
  if (settings.useLabels && module.has.maxSelections()) {
783
720
  module.show();
784
721
 
@@ -790,15 +727,14 @@
790
727
  if (settings.filterRemoteData) {
791
728
  module.filterItems(searchTerm);
792
729
  }
793
- var preSelected = $input.val();
730
+ let preSelected = $input.val();
794
731
  if (!Array.isArray(preSelected)) {
795
732
  preSelected = preSelected && preSelected !== '' ? preSelected.split(settings.delimiter) : [];
796
733
  }
797
734
  if (module.is.multiple()) {
798
735
  $.each(preSelected, function (index, value) {
799
- $item.filter('[data-' + metadata.value + '="' + value + '"]')
800
- .addClass(className.filtered)
801
- ;
736
+ $item.filter('[data-' + metadata.value + '="' + CSS.escape(value) + '"]')
737
+ .addClass(className.filtered);
802
738
  });
803
739
  }
804
740
  module.focusSearch(true);
@@ -817,88 +753,81 @@
817
753
  if (!Array.isArray(callbackParameters)) {
818
754
  callbackParameters = [callbackParameters];
819
755
  }
820
- var
821
- apiSettings = {
822
- errorDuration: false,
823
- cache: 'local',
824
- throttle: settings.throttle,
825
- urlData: {
826
- query: query,
827
- },
756
+ let apiSettings = {
757
+ errorDuration: false,
758
+ cache: 'local',
759
+ throttle: settings.throttle,
760
+ urlData: {
761
+ query: query,
828
762
  },
829
- apiCallbacks = {
830
- onError: function (errorMessage, $module, xhr) {
831
- module.add.message(message.serverError);
832
- iconClicked = false;
833
- focused = false;
834
- callback.apply(null, callbackParameters);
835
- if (typeof settings.apiSettings.onError === 'function') {
836
- settings.apiSettings.onError.call(this, errorMessage, $module, xhr);
837
- }
838
- },
839
- onFailure: function (response, $module, xhr) {
840
- module.add.message(message.serverError);
841
- iconClicked = false;
842
- focused = false;
843
- callback.apply(null, callbackParameters);
844
- if (typeof settings.apiSettings.onFailure === 'function') {
845
- settings.apiSettings.onFailure.call(this, response, $module, xhr);
846
- }
847
- },
848
- onSuccess: function (response, $module, xhr) {
849
- var
850
- values = response[fields.remoteValues]
851
- ;
852
- if (!Array.isArray(values)) {
853
- values = [];
854
- }
855
- module.remove.message();
856
- var menuConfig = {};
857
- menuConfig[fields.values] = values;
858
- module.setup.menu(menuConfig);
763
+ };
764
+ let apiCallbacks = {
765
+ onError: function (errorMessage, $module, xhr) {
766
+ module.add.message(message.serverError);
767
+ iconClicked = false;
768
+ focused = false;
769
+ callback.apply(null, callbackParameters);
770
+ if (typeof settings.apiSettings.onError === 'function') {
771
+ settings.apiSettings.onError.call(this, errorMessage, $module, xhr);
772
+ }
773
+ },
774
+ onFailure: function (response, $module, xhr) {
775
+ module.add.message(message.serverError);
776
+ iconClicked = false;
777
+ focused = false;
778
+ callback.apply(null, callbackParameters);
779
+ if (typeof settings.apiSettings.onFailure === 'function') {
780
+ settings.apiSettings.onFailure.call(this, response, $module, xhr);
781
+ }
782
+ },
783
+ onSuccess: function (response, $module, xhr) {
784
+ let values = response[fields.remoteValues];
785
+ if (!Array.isArray(values)) {
786
+ values = [];
787
+ }
788
+ module.remove.message();
789
+ let menuConfig = {};
790
+ menuConfig[fields.values] = values;
791
+ module.setup.menu(menuConfig);
859
792
 
860
- if (values.length === 0 && !settings.allowAdditions) {
861
- module.add.message(message.noResults);
862
- } else {
863
- var value = module.is.multiple() ? module.get.values() : module.get.value();
864
- if (value !== '') {
865
- module.verbose('Value(s) present after click icon, select value(s) in items');
866
- module.set.selected(value, null, true, true);
867
- }
868
- }
869
- iconClicked = false;
870
- focused = false;
871
- callback.apply(null, callbackParameters);
872
- if (typeof settings.apiSettings.onSuccess === 'function') {
873
- settings.apiSettings.onSuccess.call(this, response, $module, xhr);
793
+ if (values.length === 0 && !settings.allowAdditions) {
794
+ module.add.message(message.noResults);
795
+ } else {
796
+ let value = module.is.multiple() ? module.get.values() : module.get.value();
797
+ if (value !== '') {
798
+ module.verbose('Value(s) present after click icon, select value(s) in items');
799
+ module.set.selected(value, null, true, true);
874
800
  }
875
- },
876
- }
877
- ;
801
+ }
802
+ iconClicked = false;
803
+ focused = false;
804
+ callback.apply(null, callbackParameters);
805
+ if (typeof settings.apiSettings.onSuccess === 'function') {
806
+ settings.apiSettings.onSuccess.call(this, response, $module, xhr);
807
+ }
808
+ },
809
+ };
878
810
  if (!$module.api('get request')) {
879
811
  module.setup.api();
880
812
  }
881
813
  apiSettings = $.extend(true, {}, apiSettings, settings.apiSettings, apiCallbacks, tempDisableApiCache ? { cache: false } : {});
882
814
  $module
883
815
  .api('setting', apiSettings)
884
- .api('query')
885
- ;
816
+ .api('query');
886
817
  tempDisableApiCache = false;
887
818
  },
888
819
 
889
820
  filterItems: function (query) {
890
- var
891
- searchTerm = module.remove.diacritics(
892
- query !== undefined
893
- ? query
894
- : module.get.query()
895
- ),
896
- results = null,
897
- escapedTerm = module.escape.string(searchTerm),
898
- regExpIgnore = settings.ignoreSearchCase ? 'i' : '',
899
- regExpFlags = regExpIgnore + 'gm',
900
- beginsWithRegExp = new RegExp('^' + escapedTerm, regExpFlags)
901
- ;
821
+ let searchTerm = module.remove.diacritics(
822
+ query !== undefined
823
+ ? query
824
+ : module.get.query()
825
+ );
826
+ let results = null;
827
+ let escapedTerm = module.escape.string(searchTerm);
828
+ let regExpIgnore = settings.ignoreSearchCase ? 'i' : '';
829
+ let regExpFlags = regExpIgnore + 'gm';
830
+ let beginsWithRegExp = new RegExp('^' + escapedTerm, regExpFlags);
902
831
  module.remove.filteredItem();
903
832
  // avoid loop if we're matching nothing
904
833
  if (module.has.query()) {
@@ -907,11 +836,9 @@
907
836
  module.verbose('Searching for matching values', searchTerm);
908
837
  $item
909
838
  .each(function () {
910
- var
911
- $choice = $(this),
912
- text,
913
- value
914
- ;
839
+ let $choice = $(this);
840
+ let text;
841
+ let value;
915
842
  if ($choice.hasClass(className.unfilterable)) {
916
843
  results.push(this);
917
844
 
@@ -939,32 +866,28 @@
939
866
  return true;
940
867
  }
941
868
  }
942
- })
943
- ;
869
+ });
944
870
  }
945
871
  module.debug('Showing only matched items', searchTerm);
946
872
  if (results) {
947
873
  $item
948
874
  .not(results)
949
- .addClass(className.filtered)
950
- ;
875
+ .addClass(className.filtered);
951
876
  if (settings.highlightMatches && (settings.match === 'both' || settings.match === 'text')) {
952
- var querySplit = query.split(''),
953
- diacriticReg = settings.ignoreDiacritics ? '[\u0300-\u036F]?' : '',
954
- htmlReg = '(?![^<]*>)',
955
- markedRegExp = new RegExp(htmlReg + '(' + querySplit.join(diacriticReg + ')(.*?)' + htmlReg + '(') + diacriticReg + ')', regExpIgnore),
956
- markedReplacer = function () {
957
- var args = [].slice.call(arguments, 1, querySplit.length * 2).map(function (x, i) {
958
- return i & 1 ? x : '<mark>' + x + '</mark>'; // eslint-disable-line no-bitwise
959
- });
877
+ let querySplit = query.split('');
878
+ let diacriticReg = settings.ignoreDiacritics ? '[\u0300-\u036F]?' : '';
879
+ let htmlReg = '(?![^<]*>)';
880
+ let markedRegExp = new RegExp(htmlReg + '(' + querySplit.join(diacriticReg + ')(.*?)' + htmlReg + '(') + diacriticReg + ')', regExpIgnore);
881
+ let markedReplacer = function () {
882
+ let args = [].slice.call(arguments, 1, querySplit.length * 2).map(function (x, i) {
883
+ return i & 1 ? x : '<mark>' + x + '</mark>'; // eslint-disable-line no-bitwise
884
+ });
960
885
 
961
- return args.join('');
962
- }
963
- ;
886
+ return args.join('');
887
+ };
964
888
  $.each(results, function (index, result) {
965
- var $result = $(result),
966
- markedHTML = module.get.choiceText($result, true)
967
- ;
889
+ let $result = $(result);
890
+ let markedHTML = module.get.choiceText($result, true);
968
891
  if (settings.ignoreDiacritics) {
969
892
  markedHTML = markedHTML.normalize('NFD');
970
893
  }
@@ -975,19 +898,17 @@
975
898
 
976
899
  if (!module.has.query()) {
977
900
  $divider
978
- .removeClass(className.hidden)
979
- ;
901
+ .removeClass(className.hidden);
980
902
  } else if (settings.hideDividers === true) {
981
903
  $divider
982
- .addClass(className.hidden)
983
- ;
904
+ .addClass(className.hidden);
984
905
  } else if (settings.hideDividers === 'empty') {
985
906
  $divider
986
907
  .removeClass(className.hidden)
987
908
  .filter(function () {
988
909
  // First find the last divider in this divider group
989
910
  // Dividers which are direct siblings are considered a group
990
- var $lastDivider = $(this).nextUntil(selector.item);
911
+ let $lastDivider = $(this).nextUntil(selector.item);
991
912
 
992
913
  return ($lastDivider.length > 0 ? $lastDivider : $(this))
993
914
  // Count all non-filtered items until the next divider (or end of the dropdown)
@@ -996,16 +917,13 @@
996
917
  // Hide divider if no items are found
997
918
  .length === 0;
998
919
  })
999
- .addClass(className.hidden)
1000
- ;
920
+ .addClass(className.hidden);
1001
921
  }
1002
922
  },
1003
923
 
1004
924
  fuzzySearch: function (query, term) {
1005
- var
1006
- termLength = term.length,
1007
- queryLength = query.length
1008
- ;
925
+ let termLength = term.length;
926
+ let queryLength = query.length;
1009
927
  if (settings.ignoreSearchCase) {
1010
928
  query = query.toLowerCase();
1011
929
  term = term.toLowerCase();
@@ -1016,11 +934,9 @@
1016
934
  if (queryLength === termLength) {
1017
935
  return query === term;
1018
936
  }
1019
- for (var characterIndex = 0, nextCharacterIndex = 0; characterIndex < queryLength; characterIndex++) {
1020
- var
1021
- continueSearch = false,
1022
- queryCharacter = query.charCodeAt(characterIndex)
1023
- ;
937
+ for (let characterIndex = 0, nextCharacterIndex = 0; characterIndex < queryLength; characterIndex++) {
938
+ let continueSearch = false;
939
+ let queryCharacter = query.charCodeAt(characterIndex);
1024
940
  while (nextCharacterIndex < termLength) {
1025
941
  if (term.charCodeAt(nextCharacterIndex++) === queryCharacter) {
1026
942
  continueSearch = true;
@@ -1045,8 +961,7 @@
1045
961
  filterActive: function () {
1046
962
  if (settings.useLabels) {
1047
963
  $item.filter('.' + className.active)
1048
- .addClass(className.filtered)
1049
- ;
964
+ .addClass(className.filtered);
1050
965
  }
1051
966
  },
1052
967
 
@@ -1069,14 +984,12 @@
1069
984
  },
1070
985
 
1071
986
  forceSelection: function () {
1072
- var
1073
- $currentlySelected = $item.not(className.filtered).filter('.' + className.selected).eq(0),
1074
- $activeItem = $item.not(className.filtered).filter('.' + className.active).eq(0),
1075
- $selectedItem = $currentlySelected.length > 0
1076
- ? $currentlySelected
1077
- : $activeItem,
1078
- hasSelected = $selectedItem.length > 0
1079
- ;
987
+ let $currentlySelected = $item.not(className.filtered).filter('.' + className.selected).eq(0);
988
+ let $activeItem = $item.not(className.filtered).filter('.' + className.active).eq(0);
989
+ let $selectedItem = $currentlySelected.length > 0
990
+ ? $currentlySelected
991
+ : $activeItem;
992
+ let hasSelected = $selectedItem.length > 0;
1080
993
  if (settings.allowAdditions || (hasSelected && !module.is.multiple())) {
1081
994
  module.debug('Forcing partial selection to selected item', $selectedItem);
1082
995
  module.event.item.click.call($selectedItem, {}, true);
@@ -1091,7 +1004,7 @@
1091
1004
  module.clear();
1092
1005
  }
1093
1006
  module.debug('Creating dropdown with specified values', values);
1094
- var menuConfig = {};
1007
+ let menuConfig = {};
1095
1008
  menuConfig[fields.values] = values;
1096
1009
  module.setup.menu(menuConfig);
1097
1010
  $.each(values, function (index, item) {
@@ -1109,13 +1022,11 @@
1109
1022
  $input.html('');
1110
1023
  $input.append('<option disabled selected value></option>');
1111
1024
  $.each(values, function (index, item) {
1112
- var
1113
- value = settings.templates.deQuote(item[fields.value]),
1114
- name = settings.templates.escape(
1115
- item[fields.name] || '',
1116
- settings.preserveHTML
1117
- )
1118
- ;
1025
+ let value = settings.templates.escape(item[fields.value]);
1026
+ let name = settings.templates.escape(
1027
+ item[fields.name] || '',
1028
+ settings
1029
+ );
1119
1030
  $input.append('<option value="' + value + '"' + (item.selected === true ? ' selected' : '') + '>' + name + '</option>');
1120
1031
  });
1121
1032
  module.observe.select();
@@ -1125,11 +1036,9 @@
1125
1036
 
1126
1037
  event: {
1127
1038
  paste: function (event) {
1128
- var
1129
- pasteValue = (event.originalEvent.clipboardData || window.clipboardData).getData('text'),
1130
- tokens = pasteValue.split(settings.delimiter),
1131
- notFoundTokens = []
1132
- ;
1039
+ let pasteValue = (event.originalEvent.clipboardData || window.clipboardData).getData('text');
1040
+ let tokens = pasteValue.split(settings.delimiter);
1041
+ let notFoundTokens = [];
1133
1042
  tokens.forEach(function (value) {
1134
1043
  if (module.set.selected(module.escape.htmlEntities(value.trim()), null, false, true) === false) {
1135
1044
  notFoundTokens.push(value.trim());
@@ -1137,13 +1046,12 @@
1137
1046
  });
1138
1047
  event.preventDefault();
1139
1048
  if (notFoundTokens.length > 0) {
1140
- var searchEl = $search[0],
1141
- startPos = searchEl.selectionStart,
1142
- endPos = searchEl.selectionEnd,
1143
- orgText = searchEl.value,
1144
- pasteText = notFoundTokens.join(settings.delimiter),
1145
- newEndPos = startPos + pasteText.length
1146
- ;
1049
+ let searchEl = $search[0];
1050
+ let startPos = searchEl.selectionStart;
1051
+ let endPos = searchEl.selectionEnd;
1052
+ let orgText = searchEl.value;
1053
+ let pasteText = notFoundTokens.join(settings.delimiter);
1054
+ let newEndPos = startPos + pasteText.length;
1147
1055
  $search.val(orgText.slice(0, startPos) + pasteText + orgText.slice(endPos));
1148
1056
  searchEl.selectionStart = newEndPos;
1149
1057
  searchEl.selectionEnd = newEndPos;
@@ -1171,7 +1079,7 @@
1171
1079
  },
1172
1080
  mousedown: function () {
1173
1081
  if (module.is.searchSelection(true)) {
1174
- // prevent menu hiding on immediate re-focus
1082
+ // prevent the menu hiding on immediate re-focus
1175
1083
  willRefocus = true;
1176
1084
  } else {
1177
1085
  // prevents focus callback from occurring on mousedown
@@ -1180,16 +1088,14 @@
1180
1088
  },
1181
1089
  mouseup: function () {
1182
1090
  if (module.is.searchSelection(true)) {
1183
- // prevent menu hiding on immediate re-focus
1091
+ // prevent the menu hiding on immediate re-focus
1184
1092
  willRefocus = false;
1185
1093
  } else {
1186
1094
  activated = false;
1187
1095
  }
1188
1096
  },
1189
1097
  click: function (event) {
1190
- var
1191
- $target = $(event.target)
1192
- ;
1098
+ let $target = $(event.target);
1193
1099
  // focus search
1194
1100
  if ($target.is($module)) {
1195
1101
  if (!module.is.focusedOnSearch()) {
@@ -1273,16 +1179,14 @@
1273
1179
  },
1274
1180
  label: {
1275
1181
  click: function (event) {
1276
- var
1277
- $label = $(this),
1278
- $labels = $module.find(selector.label),
1279
- $activeLabels = $labels.filter('.' + className.active),
1280
- $nextActive = $label.nextAll('.' + className.active),
1281
- $prevActive = $label.prevAll('.' + className.active),
1282
- $range = $nextActive.length > 0
1283
- ? $label.nextUntil($nextActive).add($activeLabels).add($label)
1284
- : $label.prevUntil($prevActive).add($activeLabels).add($label)
1285
- ;
1182
+ let $label = $(this);
1183
+ let $labels = $module.find(selector.label);
1184
+ let $activeLabels = $labels.filter('.' + className.active);
1185
+ let $nextActive = $label.nextAll('.' + className.active);
1186
+ let $prevActive = $label.prevAll('.' + className.active);
1187
+ let $range = $nextActive.length > 0
1188
+ ? $label.nextUntil($nextActive).add($activeLabels).add($label)
1189
+ : $label.prevUntil($prevActive).add($activeLabels).add($label);
1286
1190
  if (event.shiftKey) {
1287
1191
  $activeLabels.removeClass(className.active);
1288
1192
  $range.addClass(className.active);
@@ -1298,9 +1202,7 @@
1298
1202
  },
1299
1203
  remove: {
1300
1204
  click: function (event) {
1301
- var
1302
- $label = $(this).parent()
1303
- ;
1205
+ let $label = $(this).parent();
1304
1206
  if ($label.hasClass(className.active)) {
1305
1207
  // remove all selected labels
1306
1208
  module.remove.activeLabels();
@@ -1313,11 +1215,9 @@
1313
1215
  },
1314
1216
  test: {
1315
1217
  toggle: function (event) {
1316
- var
1317
- toggleBehavior = module.is.multiple()
1318
- ? module.show
1319
- : module.toggle
1320
- ;
1218
+ let toggleBehavior = module.is.multiple()
1219
+ ? module.show
1220
+ : module.toggle;
1321
1221
  if (module.is.bubbledLabelClick(event) || module.is.bubbledIconClick(event)) {
1322
1222
  return;
1323
1223
  }
@@ -1361,18 +1261,16 @@
1361
1261
  },
1362
1262
  menu: {
1363
1263
  mutation: function (mutations) {
1364
- var
1365
- mutation = mutations[0],
1366
- $addedNode = mutation.addedNodes
1367
- ? $(mutation.addedNodes[0])
1368
- : $(false),
1369
- $removedNode = mutation.removedNodes
1370
- ? $(mutation.removedNodes[0])
1371
- : $(false),
1372
- $changedNodes = $addedNode.add($removedNode),
1373
- isUserAddition = $changedNodes.is(selector.addition) || $changedNodes.closest(selector.addition).length > 0,
1374
- isMessage = $changedNodes.is(selector.message) || $changedNodes.closest(selector.message).length > 0
1375
- ;
1264
+ let mutation = mutations[0];
1265
+ let $addedNode = mutation.addedNodes
1266
+ ? $(mutation.addedNodes[0])
1267
+ : $(false);
1268
+ let $removedNode = mutation.removedNodes
1269
+ ? $(mutation.removedNodes[0])
1270
+ : $(false);
1271
+ let $changedNodes = $addedNode.add($removedNode);
1272
+ let isUserAddition = $changedNodes.is(selector.addition) || $changedNodes.closest(selector.addition).length > 0;
1273
+ let isMessage = $changedNodes.is(selector.message) || $changedNodes.closest(selector.message).length > 0;
1376
1274
  if (isUserAddition || isMessage) {
1377
1275
  module.debug('Updating item selector cache');
1378
1276
  module.refreshItems();
@@ -1390,14 +1288,12 @@
1390
1288
  },
1391
1289
  item: {
1392
1290
  mouseenter: function (event) {
1393
- var
1394
- $target = $(event.target),
1395
- $item = $(this),
1396
- $subMenu = $item.children(selector.menu),
1397
- $otherMenus = $item.siblings(selector.item).children(selector.menu),
1398
- hasSubMenu = $subMenu.length > 0,
1399
- isBubbledEvent = $subMenu.find($target).length > 0
1400
- ;
1291
+ let $target = $(event.target);
1292
+ let $item = $(this);
1293
+ let $subMenu = $item.children(selector.menu);
1294
+ let $otherMenus = $item.siblings(selector.item).children(selector.menu);
1295
+ let hasSubMenu = $subMenu.length > 0;
1296
+ let isBubbledEvent = $subMenu.find($target).length > 0;
1401
1297
  if (!isBubbledEvent && hasSubMenu) {
1402
1298
  clearTimeout(module.itemTimer);
1403
1299
  module.itemTimer = setTimeout(function () {
@@ -1411,9 +1307,7 @@
1411
1307
  }
1412
1308
  },
1413
1309
  mouseleave: function (event) {
1414
- var
1415
- $subMenu = $(this).find(selector.menu)
1416
- ;
1310
+ let $subMenu = $(this).find(selector.menu);
1417
1311
  if ($subMenu.length > 0) {
1418
1312
  clearTimeout(module.itemTimer);
1419
1313
  module.itemTimer = setTimeout(function () {
@@ -1425,18 +1319,15 @@
1425
1319
  }
1426
1320
  },
1427
1321
  click: function (event, skipRefocus) {
1428
- var
1429
- $choice = $(this),
1430
- $target = event
1431
- ? $(event.target || '')
1432
- : $(''),
1433
- $subMenu = $choice.find(selector.menu),
1434
- text = module.get.choiceText($choice),
1435
- value = module.get.choiceValue($choice, text),
1436
- hasSubMenu = $subMenu.length > 0,
1437
- isBubbledEvent = $subMenu.find($target).length > 0
1438
- ;
1439
- // prevents IE11 bug where menu receives focus even though `tabindex=-1`
1322
+ let $choice = $(this);
1323
+ let $target = event
1324
+ ? $(event.target || '')
1325
+ : $('');
1326
+ let $subMenu = $choice.find(selector.menu);
1327
+ let text = module.get.choiceText($choice);
1328
+ let value = module.get.choiceValue($choice, text);
1329
+ let hasSubMenu = $subMenu.length > 0;
1330
+ let isBubbledEvent = $subMenu.find($target).length > 0;
1440
1331
  if (document.activeElement.tagName.toLowerCase() !== 'input') {
1441
1332
  $(document.activeElement).trigger('blur');
1442
1333
  }
@@ -1468,29 +1359,25 @@
1468
1359
  },
1469
1360
 
1470
1361
  document: {
1471
- // label selection should occur even when element has no focus
1362
+ // label selection should occur even when the element has no focus
1472
1363
  keydown: function (event) {
1473
- var
1474
- pressedKey = event.which,
1475
- isShortcutKey = module.is.inObject(pressedKey, keys)
1476
- ;
1364
+ let pressedKey = event.which;
1365
+ let isShortcutKey = module.is.inObject(pressedKey, keys);
1477
1366
  if (isShortcutKey) {
1478
- var
1479
- $label = $module.find(selector.label),
1480
- $activeLabel = $label.filter('.' + className.active),
1481
- activeValue = $activeLabel.data(metadata.value),
1482
- labelIndex = $label.index($activeLabel),
1483
- labelCount = $label.length,
1484
- hasActiveLabel = $activeLabel.length > 0,
1485
- hasMultipleActive = $activeLabel.length > 1,
1486
- isFirstLabel = labelIndex === 0,
1487
- isLastLabel = labelIndex + 1 === labelCount,
1488
- isSearch = module.is.searchSelection(),
1489
- isFocusedOnSearch = module.is.focusedOnSearch(),
1490
- isFocused = module.is.focused(),
1491
- caretAtStart = isFocusedOnSearch && module.get.caretPosition(false) === 0,
1492
- isSelectedSearch = caretAtStart && module.get.caretPosition(true) !== 0
1493
- ;
1367
+ let $label = $module.find(selector.label);
1368
+ let $activeLabel = $label.filter('.' + className.active);
1369
+ let activeValue = $activeLabel.data(metadata.value);
1370
+ let labelIndex = $label.index($activeLabel);
1371
+ let labelCount = $label.length;
1372
+ let hasActiveLabel = $activeLabel.length > 0;
1373
+ let hasMultipleActive = $activeLabel.length > 1;
1374
+ let isFirstLabel = labelIndex === 0;
1375
+ let isLastLabel = labelIndex + 1 === labelCount;
1376
+ let isSearch = module.is.searchSelection();
1377
+ let isFocusedOnSearch = module.is.focusedOnSearch();
1378
+ let isFocused = module.is.focused();
1379
+ let caretAtStart = isFocusedOnSearch && module.get.caretPosition(false) === 0;
1380
+ let isSelectedSearch = caretAtStart && module.get.caretPosition(true) !== 0;
1494
1381
  if (isSearch && !hasActiveLabel && !isFocusedOnSearch) {
1495
1382
  return;
1496
1383
  }
@@ -1513,8 +1400,7 @@
1513
1400
  } else {
1514
1401
  $activeLabel.prev(selector.siblingLabel)
1515
1402
  .addClass(className.active)
1516
- .end()
1517
- ;
1403
+ .end();
1518
1404
  }
1519
1405
  event.preventDefault();
1520
1406
  }
@@ -1589,32 +1475,28 @@
1589
1475
  },
1590
1476
 
1591
1477
  keydown: function (event) {
1592
- var
1593
- pressedKey = event.which,
1594
- isShortcutKey = module.is.inObject(pressedKey, keys) || event.key === settings.delimiter
1595
- ;
1478
+ let pressedKey = event.which;
1479
+ let isShortcutKey = module.is.inObject(pressedKey, keys) || event.key === settings.delimiter;
1596
1480
  if (isShortcutKey) {
1597
- var
1598
- $currentlySelected = $item.not(selector.unselectable).filter('.' + className.selected).eq(0),
1599
- $activeItem = $menu.children('.' + className.active).eq(0),
1600
- $selectedItem = $currentlySelected.length > 0
1601
- ? $currentlySelected
1602
- : $activeItem,
1603
- $visibleItems = $selectedItem.length > 0
1604
- ? $selectedItem.siblings(':not(.' + className.filtered + ')').addBack()
1605
- : $menu.children(':not(.' + className.filtered + ')'),
1606
- $subMenu = $selectedItem.children(selector.menu),
1607
- $parentMenu = $selectedItem.closest(selector.menu),
1608
- inVisibleMenu = $parentMenu.hasClass(className.visible) || $parentMenu.hasClass(className.animating) || $parentMenu.parent(selector.menu).length > 0,
1609
- hasSubMenu = $subMenu.length > 0,
1610
- hasSelectedItem = $selectedItem.length > 0,
1611
- selectedIsSelectable = $selectedItem.not(selector.unselectable).length > 0,
1612
- delimiterPressed = event.key === settings.delimiter && module.is.multiple(),
1613
- isAdditionWithoutMenu = settings.allowAdditions && (pressedKey === keys.enter || delimiterPressed),
1614
- $nextItem,
1615
- isSubMenuItem
1616
- ;
1617
- // allow selection with menu closed
1481
+ let $currentlySelected = $item.not(selector.unselectable).filter('.' + className.selected).eq(0);
1482
+ let $activeItem = $menu.children('.' + className.active).eq(0);
1483
+ let $selectedItem = $currentlySelected.length > 0
1484
+ ? $currentlySelected
1485
+ : $activeItem;
1486
+ let $visibleItems = $selectedItem.length > 0
1487
+ ? $selectedItem.siblings(':not(.' + className.filtered + ')').addBack()
1488
+ : $menu.children(':not(.' + className.filtered + ')');
1489
+ let $subMenu = $selectedItem.children(selector.menu);
1490
+ let $parentMenu = $selectedItem.closest(selector.menu);
1491
+ let inVisibleMenu = $parentMenu.hasClass(className.visible) || $parentMenu.hasClass(className.animating) || $parentMenu.parent(selector.menu).length > 0;
1492
+ let hasSubMenu = $subMenu.length > 0;
1493
+ let hasSelectedItem = $selectedItem.length > 0;
1494
+ let selectedIsSelectable = $selectedItem.not(selector.unselectable).length > 0;
1495
+ let delimiterPressed = event.key === settings.delimiter && module.is.multiple();
1496
+ let isAdditionWithoutMenu = settings.allowAdditions && (pressedKey === keys.enter || delimiterPressed);
1497
+ let $nextItem;
1498
+ let isSubMenuItem;
1499
+ // allow selection with the menu closed
1618
1500
  if (isAdditionWithoutMenu) {
1619
1501
  if (selectedIsSelectable && settings.hideAdditions) {
1620
1502
  module.verbose('Selecting item from keyboard shortcut', $selectedItem);
@@ -1630,7 +1512,7 @@
1630
1512
 
1631
1513
  // visible menu keyboard shortcuts
1632
1514
  if (module.is.visible()) {
1633
- // enter (select or open sub-menu)
1515
+ // enter (select or open submenu)
1634
1516
  if (pressedKey === keys.enter || delimiterPressed) {
1635
1517
  if (pressedKey === keys.enter && hasSelectedItem && hasSubMenu && !settings.allowCategorySelection) {
1636
1518
  module.verbose('Pressed enter on unselectable category, opening sub menu');
@@ -1659,28 +1541,24 @@
1659
1541
  module.verbose('Left key pressed, closing sub-menu');
1660
1542
  module.animate.hide(false, $parentMenu);
1661
1543
  $selectedItem
1662
- .removeClass(className.selected)
1663
- ;
1544
+ .removeClass(className.selected);
1664
1545
  $parentMenu
1665
1546
  .closest(selector.item)
1666
- .addClass(className.selected)
1667
- ;
1547
+ .addClass(className.selected);
1668
1548
  event.preventDefault();
1669
1549
  }
1670
1550
  }
1671
1551
 
1672
- // right arrow (show sub-menu)
1552
+ // right arrow (show submenu)
1673
1553
  if (pressedKey === keys.rightArrow) {
1674
1554
  if (hasSubMenu) {
1675
1555
  module.verbose('Right key pressed, opening sub-menu');
1676
1556
  module.animate.show(false, $subMenu);
1677
1557
  $selectedItem
1678
- .removeClass(className.selected)
1679
- ;
1558
+ .removeClass(className.selected);
1680
1559
  $subMenu
1681
1560
  .find(selector.item).eq(0)
1682
- .addClass(className.selected)
1683
- ;
1561
+ .addClass(className.selected);
1684
1562
  event.preventDefault();
1685
1563
  }
1686
1564
  }
@@ -1700,11 +1578,9 @@
1700
1578
 
1701
1579
  module.verbose('Up key pressed, changing active item');
1702
1580
  $selectedItem
1703
- .removeClass(className.selected)
1704
- ;
1581
+ .removeClass(className.selected);
1705
1582
  $nextItem
1706
- .addClass(className.selected)
1707
- ;
1583
+ .addClass(className.selected);
1708
1584
  module.set.scrollPosition($nextItem);
1709
1585
  if (settings.selectOnKeydown && module.is.single() && !$nextItem.hasClass(className.actionable)) {
1710
1586
  module.set.selectedItem($nextItem);
@@ -1727,11 +1603,9 @@
1727
1603
 
1728
1604
  module.verbose('Down key pressed, changing active item');
1729
1605
  $item
1730
- .removeClass(className.selected)
1731
- ;
1606
+ .removeClass(className.selected);
1732
1607
  $nextItem
1733
- .addClass(className.selected)
1734
- ;
1608
+ .addClass(className.selected);
1735
1609
  module.set.scrollPosition($nextItem);
1736
1610
  if (settings.selectOnKeydown && module.is.single() && !$nextItem.hasClass(className.actionable)) {
1737
1611
  module.set.selectedItem($nextItem);
@@ -1763,6 +1637,7 @@
1763
1637
  }
1764
1638
  // down arrow (open menu)
1765
1639
  if (pressedKey === keys.downArrow && !module.is.visible()) {
1640
+ focused = true;
1766
1641
  module.verbose('Down key pressed, showing dropdown');
1767
1642
  module.show();
1768
1643
  event.preventDefault();
@@ -1778,11 +1653,9 @@
1778
1653
 
1779
1654
  trigger: {
1780
1655
  change: function () {
1781
- var
1782
- inputElement = $input[0]
1783
- ;
1656
+ let inputElement = $input[0];
1784
1657
  if (inputElement) {
1785
- var events = document.createEvent('HTMLEvents');
1658
+ let events = document.createEvent('HTMLEvents');
1786
1659
  module.verbose('Triggering native change event');
1787
1660
  events.initEvent('change', true, false);
1788
1661
  inputElement.dispatchEvent(events);
@@ -1806,11 +1679,9 @@
1806
1679
  selectActionActive = false;
1807
1680
  },
1808
1681
  eventInModule: function (event, callback) {
1809
- var
1810
- $target = $(event.target),
1811
- inDocument = $target.closest(document.documentElement).length > 0,
1812
- inModule = $target.closest($module).length > 0
1813
- ;
1682
+ let $target = $(event.target);
1683
+ let inDocument = $target.closest(document.documentElement).length > 0;
1684
+ let inModule = $target.closest($module).length > 0;
1814
1685
  callback = isFunction(callback)
1815
1686
  ? callback
1816
1687
  : function () {};
@@ -1826,13 +1697,11 @@
1826
1697
  return false;
1827
1698
  },
1828
1699
  eventOnElement: function (event, callback) {
1829
- var
1830
- $target = $(event.target),
1831
- $label = $target.closest(selector.siblingLabel),
1832
- inVisibleDOM = document.body.contains(event.target),
1833
- notOnLabel = $module.find($label).length === 0 || !(module.is.multiple() && settings.useLabels),
1834
- notInMenu = $target.closest($menu).length === 0
1835
- ;
1700
+ let $target = $(event.target);
1701
+ let $label = $target.closest(selector.siblingLabel);
1702
+ let inVisibleDOM = document.body.contains(event.target);
1703
+ let notOnLabel = $module.find($label).length === 0 || !(module.is.multiple() && settings.useLabels);
1704
+ let notInMenu = $target.closest($menu).length === 0;
1836
1705
  callback = isFunction(callback)
1837
1706
  ? callback
1838
1707
  : function () {};
@@ -1922,13 +1791,11 @@
1922
1791
  $sizer.text(value);
1923
1792
 
1924
1793
  // prevent rounding issues
1925
- return Math.ceil($sizer.width() + (module.is.edge() ? 3 : 1));
1794
+ return Math.ceil($sizer.width() + 1);
1926
1795
  },
1927
1796
  selectionCount: function () {
1928
- var
1929
- values = module.get.values(),
1930
- count
1931
- ;
1797
+ let values = module.get.values();
1798
+ let count;
1932
1799
  count = module.is.multiple()
1933
1800
  ? (Array.isArray(values) ? values.length : 0)
1934
1801
  : (module.get.value() !== '' ? 1 : 0);
@@ -1941,9 +1808,7 @@
1941
1808
  : settings.transition;
1942
1809
  },
1943
1810
  userValues: function () {
1944
- var
1945
- values = module.get.values(true)
1946
- ;
1811
+ let values = module.get.values(true);
1947
1812
  if (!values) {
1948
1813
  return false;
1949
1814
  }
@@ -1961,11 +1826,9 @@
1961
1826
  });
1962
1827
  },
1963
1828
  caretPosition: function (returnEndPos) {
1964
- var
1965
- input = $search[0],
1966
- range,
1967
- rangeLength
1968
- ;
1829
+ let input = $search[0];
1830
+ let range;
1831
+ let rangeLength;
1969
1832
  if (returnEndPos && 'selectionEnd' in input) {
1970
1833
  return input.selectionEnd;
1971
1834
  }
@@ -1985,22 +1848,18 @@
1985
1848
  }
1986
1849
  },
1987
1850
  value: function () {
1988
- var
1989
- value = $input.length > 0
1990
- ? $input.val()
1991
- : $module.data(metadata.value),
1992
- isEmptyMultiselect = Array.isArray(value) && value.length === 1 && value[0] === ''
1993
- ;
1994
-
1995
- // prevents placeholder element from being selected when multiple
1851
+ let value = $input.length > 0
1852
+ ? $input.val()
1853
+ : $module.data(metadata.value);
1854
+ let isEmptyMultiselect = Array.isArray(value) && value.length === 1 && value[0] === '';
1855
+
1856
+ // prevents the placeholder element from being selected when multiple
1996
1857
  return value === undefined || isEmptyMultiselect
1997
1858
  ? ''
1998
1859
  : value;
1999
1860
  },
2000
1861
  values: function (raw) {
2001
- var
2002
- value = module.get.value()
2003
- ;
1862
+ let value = module.get.value();
2004
1863
  if (value === '') {
2005
1864
  return '';
2006
1865
  }
@@ -2014,18 +1873,14 @@
2014
1873
  : value;
2015
1874
  },
2016
1875
  remoteValues: function () {
2017
- var
2018
- values = module.get.values(),
2019
- remoteValues = false
2020
- ;
1876
+ let values = module.get.values();
1877
+ let remoteValues = false;
2021
1878
  if (values) {
2022
1879
  if (typeof values === 'string') {
2023
1880
  values = [values];
2024
1881
  }
2025
1882
  $.each(values, function (index, value) {
2026
- var
2027
- name = module.read.remoteData(value)
2028
- ;
1883
+ let name = module.read.remoteData(value);
2029
1884
  module.verbose('Restoring value from session data', name, value);
2030
1885
  if (name) {
2031
1886
  if (!remoteValues) {
@@ -2074,9 +1929,7 @@
2074
1929
  : String(choiceText));
2075
1930
  },
2076
1931
  inputEvent: function () {
2077
- var
2078
- input = $search[0]
2079
- ;
1932
+ let input = $search[0];
2080
1933
  if (input) {
2081
1934
  return input.oninput !== undefined
2082
1935
  ? 'input'
@@ -2088,26 +1941,22 @@
2088
1941
  return false;
2089
1942
  },
2090
1943
  selectValues: function () {
2091
- var
2092
- select = {},
2093
- oldGroup = [],
2094
- values = []
2095
- ;
1944
+ let select = {};
1945
+ let oldGroup = [];
1946
+ let values = [];
2096
1947
  $module
2097
1948
  .find('option')
2098
1949
  .each(function () {
2099
- var
2100
- $option = $(this),
2101
- name = $option.html(),
2102
- disabled = $option.attr('disabled'),
2103
- value = $option.attr('value') !== undefined
2104
- ? $option.attr('value')
2105
- : name,
2106
- text = $option.data(metadata.text) !== undefined
2107
- ? $option.data(metadata.text)
2108
- : name,
2109
- group = $option.parent('optgroup')
2110
- ;
1950
+ let $option = $(this);
1951
+ let name = $option.html();
1952
+ let disabled = $option.attr('disabled');
1953
+ let value = $option.attr('value') !== undefined
1954
+ ? $option.attr('value')
1955
+ : name;
1956
+ let text = $option.data(metadata.text) !== undefined
1957
+ ? $option.data(metadata.text)
1958
+ : name;
1959
+ let group = $option.parent('optgroup');
2111
1960
  if (settings.placeholder === 'auto' && value === '') {
2112
1961
  select.placeholder = name;
2113
1962
  } else {
@@ -2126,8 +1975,7 @@
2126
1975
  disabled: disabled,
2127
1976
  });
2128
1977
  }
2129
- })
2130
- ;
1978
+ });
2131
1979
  if (settings.placeholder && settings.placeholder !== 'auto') {
2132
1980
  module.debug('Setting placeholder value to', settings.placeholder);
2133
1981
  select.placeholder = settings.placeholder;
@@ -2157,20 +2005,16 @@
2157
2005
  return $item.filter('.' + className.active);
2158
2006
  },
2159
2007
  selectedItem: function () {
2160
- var
2161
- $selectedItem = $item.not(selector.unselectable).filter('.' + className.selected)
2162
- ;
2008
+ let $selectedItem = $item.not(selector.unselectable).filter('.' + className.selected);
2163
2009
 
2164
2010
  return $selectedItem.length > 0
2165
2011
  ? $selectedItem
2166
2012
  : $item.eq(0);
2167
2013
  },
2168
2014
  itemWithAdditions: function (value) {
2169
- var
2170
- $items = module.get.item(value),
2171
- $userItems = module.create.userChoice(value),
2172
- hasUserItems = $userItems && $userItems.length > 0
2173
- ;
2015
+ let $items = module.get.item(value);
2016
+ let $userItems = module.create.userChoice(value);
2017
+ let hasUserItems = $userItems && $userItems.length > 0;
2174
2018
  if (hasUserItems) {
2175
2019
  $items = $items.length > 0
2176
2020
  ? $items.add($userItems)
@@ -2180,11 +2024,9 @@
2180
2024
  return $items;
2181
2025
  },
2182
2026
  item: function (value, strict) {
2183
- var
2184
- $selectedItem = false,
2185
- shouldSearch,
2186
- isMultiple
2187
- ;
2027
+ let $selectedItem = false;
2028
+ let shouldSearch;
2029
+ let isMultiple;
2188
2030
  value = value !== undefined
2189
2031
  ? value
2190
2032
  : (module.get.values() !== undefined
@@ -2200,11 +2042,9 @@
2200
2042
  if (shouldSearch) {
2201
2043
  $item
2202
2044
  .each(function () {
2203
- var
2204
- $choice = $(this),
2205
- optionText = module.get.choiceText($choice),
2206
- optionValue = module.get.choiceValue($choice, optionText)
2207
- ;
2045
+ let $choice = $(this);
2046
+ let optionText = module.get.choiceText($choice);
2047
+ let optionValue = module.get.choiceValue($choice, optionText);
2208
2048
  // safe early exit
2209
2049
  if (optionValue === null || optionValue === undefined) {
2210
2050
  return;
@@ -2234,8 +2074,7 @@
2234
2074
  return true;
2235
2075
  }
2236
2076
  }
2237
- })
2238
- ;
2077
+ });
2239
2078
  }
2240
2079
 
2241
2080
  return $selectedItem;
@@ -2285,10 +2124,8 @@
2285
2124
  module.restore.defaultValue();
2286
2125
  },
2287
2126
  defaultText: function () {
2288
- var
2289
- defaultText = module.get.defaultText(),
2290
- placeholderText = module.get.placeholderText
2291
- ;
2127
+ let defaultText = module.get.defaultText();
2128
+ let placeholderText = module.get.placeholderText;
2292
2129
  if (defaultText === placeholderText) {
2293
2130
  module.debug('Restoring default placeholder text', defaultText);
2294
2131
  module.set.placeholderText(defaultText);
@@ -2301,9 +2138,7 @@
2301
2138
  module.set.placeholderText();
2302
2139
  },
2303
2140
  defaultValue: function () {
2304
- var
2305
- defaultValue = module.get.defaultValue()
2306
- ;
2141
+ let defaultValue = module.get.defaultValue();
2307
2142
  if (defaultValue !== undefined) {
2308
2143
  module.debug('Restoring default value', defaultValue);
2309
2144
  if (defaultValue !== '') {
@@ -2336,14 +2171,14 @@
2336
2171
  }
2337
2172
  },
2338
2173
  values: function () {
2339
- // prevents callbacks from occurring on initial load
2174
+ // prevents callbacks from occurring on the initial load
2340
2175
  module.set.initialLoad();
2341
2176
  if (settings.apiSettings && settings.saveRemoteData && module.get.remoteValues()) {
2342
2177
  module.restore.remoteValues();
2343
2178
  } else {
2344
2179
  module.set.selected();
2345
2180
  }
2346
- var value = module.get.value();
2181
+ let value = module.get.value();
2347
2182
  if (value && value !== '' && !(Array.isArray(value) && value.length === 0)) {
2348
2183
  $input.removeClass(className.noselection);
2349
2184
  } else {
@@ -2352,9 +2187,7 @@
2352
2187
  module.remove.initialLoad();
2353
2188
  },
2354
2189
  remoteValues: function () {
2355
- var
2356
- values = module.get.remoteValues()
2357
- ;
2190
+ let values = module.get.remoteValues();
2358
2191
  module.debug('Recreating selected from session data', values);
2359
2192
  if (values) {
2360
2193
  if (module.is.single()) {
@@ -2372,9 +2205,7 @@
2372
2205
 
2373
2206
  read: {
2374
2207
  remoteData: function (value) {
2375
- var
2376
- name
2377
- ;
2208
+ let name;
2378
2209
  if (window.Storage === undefined) {
2379
2210
  module.error(error.noStorage);
2380
2211
 
@@ -2395,23 +2226,17 @@
2395
2226
  module.save.defaultValue();
2396
2227
  },
2397
2228
  defaultValue: function () {
2398
- var
2399
- value = module.get.value()
2400
- ;
2229
+ let value = module.get.value();
2401
2230
  module.verbose('Saving default value as', value);
2402
2231
  $module.data(metadata.defaultValue, value);
2403
2232
  },
2404
2233
  defaultText: function () {
2405
- var
2406
- text = module.get.text()
2407
- ;
2234
+ let text = module.get.text();
2408
2235
  module.verbose('Saving default text as', text);
2409
2236
  $module.data(metadata.defaultText, text);
2410
2237
  },
2411
2238
  placeholderText: function () {
2412
- var
2413
- text
2414
- ;
2239
+ let text;
2415
2240
  if (settings.placeholder !== false && $text.hasClass(className.placeholder)) {
2416
2241
  text = module.get.text();
2417
2242
  module.verbose('Saving placeholder text as', text);
@@ -2451,21 +2276,19 @@
2451
2276
  },
2452
2277
 
2453
2278
  scrollPage: function (direction, $selectedItem) {
2454
- var
2455
- $currentItem = $selectedItem || module.get.selectedItem(),
2456
- $menu = $currentItem.closest(selector.menu),
2457
- menuHeight = $menu.outerHeight(),
2458
- currentScroll = $menu.scrollTop(),
2459
- itemHeight = $item.eq(0).outerHeight(),
2460
- itemsPerPage = Math.floor(menuHeight / itemHeight),
2461
- newScroll = direction === 'up'
2462
- ? currentScroll - (itemHeight * itemsPerPage)
2463
- : currentScroll + (itemHeight * itemsPerPage),
2464
- $selectableItem = $item.not(selector.unselectable),
2465
- isWithinRange,
2466
- $nextSelectedItem,
2467
- elementIndex
2468
- ;
2279
+ let $currentItem = $selectedItem || module.get.selectedItem();
2280
+ let $menu = $currentItem.closest(selector.menu);
2281
+ let menuHeight = $menu.outerHeight();
2282
+ let currentScroll = $menu.scrollTop();
2283
+ let itemHeight = $item.eq(0).outerHeight();
2284
+ let itemsPerPage = Math.floor(menuHeight / itemHeight);
2285
+ let newScroll = direction === 'up'
2286
+ ? currentScroll - (itemHeight * itemsPerPage)
2287
+ : currentScroll + (itemHeight * itemsPerPage);
2288
+ let $selectableItem = $item.not(selector.unselectable);
2289
+ let isWithinRange;
2290
+ let $nextSelectedItem;
2291
+ let elementIndex;
2469
2292
  elementIndex = direction === 'up'
2470
2293
  ? $selectableItem.index($currentItem) - itemsPerPage
2471
2294
  : $selectableItem.index($currentItem) + itemsPerPage;
@@ -2480,33 +2303,28 @@
2480
2303
  if ($nextSelectedItem.length > 0) {
2481
2304
  module.debug('Scrolling page', direction, $nextSelectedItem);
2482
2305
  $currentItem
2483
- .removeClass(className.selected)
2484
- ;
2306
+ .removeClass(className.selected);
2485
2307
  $nextSelectedItem
2486
- .addClass(className.selected)
2487
- ;
2308
+ .addClass(className.selected);
2488
2309
  if (settings.selectOnKeydown && module.is.single() && !$nextSelectedItem.hasClass(className.actionable)) {
2489
2310
  module.set.selectedItem($nextSelectedItem);
2490
2311
  }
2491
2312
  $menu
2492
- .scrollTop(newScroll)
2493
- ;
2313
+ .scrollTop(newScroll);
2494
2314
  }
2495
2315
  },
2496
2316
 
2497
2317
  set: {
2498
2318
  filtered: function () {
2499
- var
2500
- isMultiple = module.is.multiple(),
2501
- isSearch = module.is.searchSelection(),
2502
- isSearchMultiple = isMultiple && isSearch,
2503
- searchValue = isSearch
2504
- ? module.get.query()
2505
- : '',
2506
- hasSearchValue = typeof searchValue === 'string' && searchValue.length > 0,
2507
- searchWidth = module.get.searchWidth(),
2508
- valueIsSet = searchValue !== ''
2509
- ;
2319
+ let isMultiple = module.is.multiple();
2320
+ let isSearch = module.is.searchSelection();
2321
+ let isSearchMultiple = isMultiple && isSearch;
2322
+ let searchValue = isSearch
2323
+ ? module.get.query()
2324
+ : '';
2325
+ let hasSearchValue = typeof searchValue === 'string' && searchValue.length > 0;
2326
+ let searchWidth = module.get.searchWidth();
2327
+ let valueIsSet = searchValue !== '';
2510
2328
  if (isMultiple && hasSearchValue) {
2511
2329
  module.verbose('Adjusting input width', searchWidth);
2512
2330
  $search.css('width', searchWidth + 'px');
@@ -2535,21 +2353,17 @@
2535
2353
  if (module.is.searchSelection()) {
2536
2354
  module.debug('Added tabindex to searchable dropdown');
2537
2355
  $search
2538
- .val('')
2539
- ;
2356
+ .val('');
2540
2357
  module.check.disabled();
2541
2358
  $menu
2542
- .attr('tabindex', -1)
2543
- ;
2359
+ .attr('tabindex', -1);
2544
2360
  } else {
2545
2361
  module.debug('Added tabindex to dropdown');
2546
2362
  if ($module.attr('tabindex') === undefined) {
2547
2363
  $module
2548
- .attr('tabindex', $input.attr('tabindex') || 0)
2549
- ;
2364
+ .attr('tabindex', $input.attr('tabindex') || 0);
2550
2365
  $menu
2551
- .attr('tabindex', -1)
2552
- ;
2366
+ .attr('tabindex', -1);
2553
2367
  }
2554
2368
  }
2555
2369
  $input.removeAttr('tabindex');
@@ -2566,24 +2380,20 @@
2566
2380
  }
2567
2381
  },
2568
2382
  partialSearch: function (text) {
2569
- var
2570
- length = module.get.query().length
2571
- ;
2383
+ let length = module.get.query().length;
2572
2384
  $search.val(text.slice(0, length));
2573
2385
  },
2574
2386
  scrollPosition: function ($item, forceScroll) {
2575
- var
2576
- edgeTolerance = 5,
2577
- $menu,
2578
- hasActive,
2579
- offset,
2580
- itemOffset,
2581
- menuOffset,
2582
- menuScroll,
2583
- menuHeight,
2584
- abovePage,
2585
- belowPage
2586
- ;
2387
+ let edgeTolerance = 5;
2388
+ let $menu;
2389
+ let hasActive;
2390
+ let offset;
2391
+ let itemOffset;
2392
+ let menuOffset;
2393
+ let menuScroll;
2394
+ let menuHeight;
2395
+ let abovePage;
2396
+ let belowPage;
2587
2397
 
2588
2398
  $item = $item || module.get.selectedItem();
2589
2399
  $menu = $item.closest(selector.menu);
@@ -2628,8 +2438,7 @@
2628
2438
  }
2629
2439
  module.debug('Changing text', text, $text);
2630
2440
  $text
2631
- .removeClass(className.filtered)
2632
- ;
2441
+ .removeClass(className.filtered);
2633
2442
  if (settings.preserveHTML) {
2634
2443
  $text.html(text);
2635
2444
  } else {
@@ -2638,11 +2447,9 @@
2638
2447
  }
2639
2448
  },
2640
2449
  selectedItem: function ($item) {
2641
- var
2642
- value = module.get.choiceValue($item),
2643
- searchText = module.get.choiceText($item, false),
2644
- text = module.get.choiceText($item)
2645
- ;
2450
+ let value = module.get.choiceValue($item);
2451
+ let searchText = module.get.choiceText($item, false);
2452
+ let text = module.get.choiceText($item);
2646
2453
  module.debug('Setting user selection to item', $item);
2647
2454
  module.remove.activeItem();
2648
2455
  module.set.partialSearch(searchText);
@@ -2651,13 +2458,11 @@
2651
2458
  module.set.text(text);
2652
2459
  },
2653
2460
  selectedLetter: function (letter) {
2654
- var
2655
- $selectedItem = $item.filter('.' + className.selected),
2656
- alreadySelectedLetter = $selectedItem.length > 0 && module.has.firstLetter($selectedItem, letter),
2657
- $nextValue = false,
2658
- $nextItem
2659
- ;
2660
- // check next of same letter
2461
+ let $selectedItem = $item.filter('.' + className.selected);
2462
+ let alreadySelectedLetter = $selectedItem.length > 0 && module.has.firstLetter($selectedItem, letter);
2463
+ let $nextValue = false;
2464
+ let $nextItem;
2465
+ // check next of the same letter
2661
2466
  if (alreadySelectedLetter) {
2662
2467
  $nextItem = $selectedItem.nextAll($item).eq(0);
2663
2468
  if (module.has.firstLetter($nextItem, letter)) {
@@ -2673,10 +2478,9 @@
2673
2478
 
2674
2479
  return false;
2675
2480
  }
2676
- })
2677
- ;
2481
+ });
2678
2482
  }
2679
- // set next value
2483
+ // set the next value
2680
2484
  if ($nextValue) {
2681
2485
  module.verbose('Scrolling to next value with letter', letter);
2682
2486
  module.set.scrollPosition($nextValue);
@@ -2693,7 +2497,7 @@
2693
2497
  if (!$menu) {
2694
2498
  module.remove.upward();
2695
2499
  } else if (module.is.upward($menu)) {
2696
- // we need make sure when make assertion openDownward for $menu, $menu does not have upward class
2500
+ // we need to make sure when make assertion openDownward for $menu, $menu does not have upward class
2697
2501
  module.remove.upward($menu);
2698
2502
  }
2699
2503
 
@@ -2710,11 +2514,11 @@
2710
2514
  }
2711
2515
  },
2712
2516
  upward: function ($currentMenu) {
2713
- var $element = $currentMenu || $module;
2517
+ let $element = $currentMenu || $module;
2714
2518
  $element.addClass(className.upward);
2715
2519
  },
2716
2520
  leftward: function ($currentMenu) {
2717
- var $element = $currentMenu || $menu;
2521
+ let $element = $currentMenu || $menu;
2718
2522
  $element.addClass(className.leftward);
2719
2523
  },
2720
2524
  value: function (value, text, $selected, preventChangeTrigger) {
@@ -2728,14 +2532,12 @@
2728
2532
  } else {
2729
2533
  $input.addClass(className.noselection);
2730
2534
  }
2731
- var
2732
- escapedValue = module.escape.value(value),
2733
- hasInput = $input.length > 0,
2734
- currentValue = module.get.values(),
2735
- stringValue = value !== undefined
2736
- ? String(value)
2737
- : value
2738
- ;
2535
+ let escapedValue = module.escape.value(value);
2536
+ let hasInput = $input.length > 0;
2537
+ let currentValue = module.get.values();
2538
+ let stringValue = value !== undefined
2539
+ ? String(value)
2540
+ : value;
2739
2541
  if (hasInput) {
2740
2542
  if (!settings.allowReselection && stringValue == currentValue) {
2741
2543
  module.verbose('Skipping value update already same value', value, currentValue);
@@ -2751,8 +2553,7 @@
2751
2553
  module.debug('Updating input value', escapedValue, currentValue);
2752
2554
  internalChange = true;
2753
2555
  $input
2754
- .val(escapedValue)
2755
- ;
2556
+ .val(escapedValue);
2756
2557
  if (settings.fireOnInit === false && module.is.initialLoad()) {
2757
2558
  module.debug('Input native change event ignored on initial load');
2758
2559
  } else if (preventChangeTrigger !== true) {
@@ -2773,8 +2574,7 @@
2773
2574
  },
2774
2575
  active: function () {
2775
2576
  $module
2776
- .addClass(className.active)
2777
- ;
2577
+ .addClass(className.active);
2778
2578
  },
2779
2579
  multiple: function () {
2780
2580
  $module.addClass(className.multiple);
@@ -2797,9 +2597,7 @@
2797
2597
  preventChangeTrigger = $selectedItem;
2798
2598
  $selectedItem = undefined;
2799
2599
  }
2800
- var
2801
- isMultiple = module.is.multiple()
2802
- ;
2600
+ let isMultiple = module.is.multiple();
2803
2601
  $selectedItem = settings.allowAdditions
2804
2602
  ? $selectedItem || module.get.itemWithAdditions(value)
2805
2603
  : $selectedItem || module.get.item(value);
@@ -2827,17 +2625,15 @@
2827
2625
  // select each item
2828
2626
  $selectedItem
2829
2627
  .each(function () {
2830
- var
2831
- $selected = $(this),
2832
- selectedText = module.get.choiceText($selected),
2833
- selectedValue = module.get.choiceValue($selected, selectedText),
2834
-
2835
- isFiltered = $selected.hasClass(className.filtered),
2836
- isActive = $selected.hasClass(className.active),
2837
- isActionable = $selected.hasClass(className.actionable),
2838
- isUserValue = $selected.hasClass(className.addition),
2839
- shouldAnimate = isMultiple && $selectedItem && $selectedItem.length === 1
2840
- ;
2628
+ let $selected = $(this);
2629
+ let selectedText = module.get.choiceText($selected);
2630
+ let selectedValue = module.get.choiceValue($selected, selectedText);
2631
+
2632
+ let isFiltered = $selected.hasClass(className.filtered);
2633
+ let isActive = $selected.hasClass(className.active);
2634
+ let isActionable = $selected.hasClass(className.actionable);
2635
+ let isUserValue = $selected.hasClass(className.addition);
2636
+ let shouldAnimate = isMultiple && $selectedItem && $selectedItem.length === 1;
2841
2637
  if (isActionable) {
2842
2638
  if ((!isMultiple || (!isActive || isUserValue)) && settings.apiSettings && settings.saveRemoteData) {
2843
2639
  module.save.remoteData(selectedText, selectedValue);
@@ -2873,11 +2669,9 @@
2873
2669
  module.set.value(selectedValue, selectedText, $selected, preventChangeTrigger);
2874
2670
  $selected
2875
2671
  .addClass(className.active)
2876
- .addClass(className.selected)
2877
- ;
2672
+ .addClass(className.selected);
2878
2673
  }
2879
- })
2880
- ;
2674
+ });
2881
2675
  if (!keepSearchTerm) {
2882
2676
  module.remove.searchTerm();
2883
2677
  }
@@ -2890,21 +2684,18 @@
2890
2684
 
2891
2685
  add: {
2892
2686
  label: function (value, text, shouldAnimate) {
2893
- var
2894
- $next = module.is.searchSelection()
2895
- ? $search
2896
- : $text,
2897
- escapedValue = module.escape.value(value),
2898
- $label
2899
- ;
2687
+ let $next = module.is.searchSelection()
2688
+ ? $search
2689
+ : $text;
2690
+ let escapedValue = module.escape.value(value);
2691
+ let $label;
2900
2692
  if (settings.ignoreCase) {
2901
2693
  escapedValue = escapedValue.toLowerCase();
2902
2694
  }
2903
2695
  $label = $('<a />')
2904
2696
  .addClass(className.label)
2905
2697
  .attr('data-' + metadata.value, escapedValue)
2906
- .html(templates.label(escapedValue, text, settings.preserveHTML, settings.className))
2907
- ;
2698
+ .html(templates.label(escapedValue, text, settings));
2908
2699
  $label = settings.onLabelCreate.call($label, escapedValue, text);
2909
2700
 
2910
2701
  if (module.has.label(value)) {
@@ -2926,38 +2717,30 @@
2926
2717
  verbose: settings.verbose,
2927
2718
  silent: settings.silent,
2928
2719
  duration: settings.label.duration,
2929
- })
2930
- ;
2720
+ });
2931
2721
  } else {
2932
2722
  module.debug('Adding selection label', $label);
2933
2723
  $label
2934
- .insertBefore($next)
2935
- ;
2724
+ .insertBefore($next);
2936
2725
  }
2937
2726
  },
2938
2727
  message: function (message) {
2939
- var
2940
- $message = $menu.children(selector.message),
2941
- html = settings.templates.message(module.add.variables(message))
2942
- ;
2728
+ let $message = $menu.children(selector.message);
2729
+ let html = settings.templates.message(module.add.variables(message));
2943
2730
  if ($message.length > 0) {
2944
2731
  $message
2945
- .html(html)
2946
- ;
2732
+ .html(html);
2947
2733
  } else {
2948
2734
  $('<div/>')
2949
2735
  .html(html)
2950
2736
  .addClass(className.message)
2951
- .appendTo($menu)
2952
- ;
2737
+ .appendTo($menu);
2953
2738
  }
2954
2739
  },
2955
2740
  optionValue: function (value) {
2956
- var
2957
- escapedValue = module.escape.value(value),
2958
- $option = $input.find('option[value="' + module.escape.string(escapedValue) + '"]'),
2959
- hasOption = $option.length > 0
2960
- ;
2741
+ let escapedValue = module.escape.value(value);
2742
+ let $option = $input.find('option[value="' + CSS.escape(escapedValue) + '"]');
2743
+ let hasOption = $option.length > 0;
2961
2744
  if (hasOption) {
2962
2745
  return;
2963
2746
  }
@@ -2971,19 +2754,16 @@
2971
2754
  .prop('value', escapedValue)
2972
2755
  .addClass(className.addition)
2973
2756
  .text(value)
2974
- .appendTo($input)
2975
- ;
2757
+ .appendTo($input);
2976
2758
  module.verbose('Adding user addition as an <option>', value);
2977
2759
  module.observe.select();
2978
2760
  },
2979
2761
  userSuggestion: function (value) {
2980
- var
2981
- $addition = $menu.children(selector.addition),
2982
- $existingItem = module.get.item(value),
2983
- alreadyHasValue = $existingItem && $existingItem.not(selector.addition).length > 0,
2984
- hasUserSuggestion = $addition.length > 0,
2985
- html
2986
- ;
2762
+ let $addition = $menu.children(selector.addition);
2763
+ let $existingItem = module.get.item(value);
2764
+ let alreadyHasValue = $existingItem && $existingItem.not(selector.addition).length > 0;
2765
+ let hasUserSuggestion = $addition.length > 0;
2766
+ let html;
2987
2767
  if (settings.useLabels && module.has.maxSelections()) {
2988
2768
  return;
2989
2769
  }
@@ -2998,38 +2778,32 @@
2998
2778
  .data(metadata.text, value)
2999
2779
  .attr('data-' + metadata.value, value)
3000
2780
  .attr('data-' + metadata.text, value)
3001
- .removeClass(className.filtered)
3002
- ;
2781
+ .removeClass(className.filtered);
3003
2782
  if (!settings.hideAdditions) {
3004
2783
  html = settings.templates.addition(module.add.variables(message.addResult, value));
3005
2784
  $addition
3006
- .html(html)
3007
- ;
2785
+ .html(html);
3008
2786
  }
3009
2787
  module.verbose('Replacing user suggestion with new value', $addition);
3010
2788
  } else {
3011
2789
  $addition = module.create.userChoice(value);
3012
2790
  $addition
3013
- .prependTo($menu)
3014
- ;
2791
+ .prependTo($menu);
3015
2792
  module.verbose('Adding item choice to menu corresponding with user choice addition', $addition);
3016
2793
  }
3017
2794
  if (!settings.hideAdditions || module.is.allFiltered()) {
3018
2795
  $addition
3019
2796
  .addClass(className.selected)
3020
2797
  .siblings()
3021
- .removeClass(className.selected)
3022
- ;
2798
+ .removeClass(className.selected);
3023
2799
  }
3024
2800
  module.refreshItems();
3025
2801
  },
3026
2802
  variables: function (message, term) {
3027
- var
3028
- hasCount = message.search('{count}') !== -1,
3029
- hasMaxCount = message.search('{maxCount}') !== -1,
3030
- hasTerm = message.search('{term}') !== -1,
3031
- query
3032
- ;
2803
+ let hasCount = message.search('{count}') !== -1;
2804
+ let hasMaxCount = message.search('{maxCount}') !== -1;
2805
+ let hasTerm = message.search('{term}') !== -1;
2806
+ let query;
3033
2807
  module.verbose('Adding templated variables to message', message);
3034
2808
  if (hasCount) {
3035
2809
  message = message.replace('{count}', module.get.selectionCount());
@@ -3050,10 +2824,8 @@
3050
2824
  $selectedItem = undefined;
3051
2825
  addedText = undefined;
3052
2826
  }
3053
- var
3054
- currentValue = module.get.values(true),
3055
- newValue
3056
- ;
2827
+ let currentValue = module.get.values(true);
2828
+ let newValue;
3057
2829
  if (module.has.value(addedValue)) {
3058
2830
  module.debug('Value already selected');
3059
2831
 
@@ -3109,11 +2881,11 @@
3109
2881
  initialLoad = false;
3110
2882
  },
3111
2883
  upward: function ($currentMenu) {
3112
- var $element = $currentMenu || $module;
2884
+ let $element = $currentMenu || $module;
3113
2885
  $element.removeClass(className.upward);
3114
2886
  },
3115
2887
  leftward: function ($currentMenu) {
3116
- var $element = $currentMenu || $menu;
2888
+ let $element = $currentMenu || $menu;
3117
2889
  $element.removeClass(className.leftward);
3118
2890
  },
3119
2891
  visible: function () {
@@ -3125,7 +2897,7 @@
3125
2897
  filteredItem: function () {
3126
2898
  if (settings.highlightMatches) {
3127
2899
  $.each($item, function (index, item) {
3128
- var $markItem = $(item);
2900
+ let $markItem = $(item);
3129
2901
  $markItem.html($markItem.html().replace(/<\/?mark>/g, ''));
3130
2902
  });
3131
2903
  }
@@ -3143,11 +2915,9 @@
3143
2915
  module.remove.empty();
3144
2916
  },
3145
2917
  optionValue: function (value) {
3146
- var
3147
- escapedValue = module.escape.value(value),
3148
- $option = $input.find('option[value="' + module.escape.string(escapedValue) + '"]'),
3149
- hasOption = $option.length > 0
3150
- ;
2918
+ let escapedValue = module.escape.value(value);
2919
+ let $option = $input.find('option[value="' + CSS.escape(escapedValue) + '"]');
2920
+ let hasOption = $option.length > 0;
3151
2921
  if (!hasOption || !$option.hasClass(className.addition)) {
3152
2922
  return;
3153
2923
  }
@@ -3182,11 +2952,9 @@
3182
2952
 
3183
2953
  $selectedItem
3184
2954
  .each(function () {
3185
- var
3186
- $selected = $(this),
3187
- selectedText = module.get.choiceText($selected),
3188
- selectedValue = module.get.choiceValue($selected, selectedText)
3189
- ;
2955
+ let $selected = $(this);
2956
+ let selectedText = module.get.choiceText($selected);
2957
+ let selectedValue = module.get.choiceValue($selected, selectedText);
3190
2958
  if (module.is.multiple()) {
3191
2959
  if (settings.useLabels) {
3192
2960
  module.remove.value(selectedValue, selectedText, $selected, preventChangeTrigger);
@@ -3204,22 +2972,18 @@
3204
2972
  }
3205
2973
  $selected
3206
2974
  .removeClass(className.filtered)
3207
- .removeClass(className.active)
3208
- ;
2975
+ .removeClass(className.active);
3209
2976
  if (settings.useLabels) {
3210
2977
  $selected.removeClass(className.selected);
3211
2978
  }
3212
- })
3213
- ;
2979
+ });
3214
2980
  },
3215
2981
  selectedItem: function () {
3216
2982
  $item.removeClass(className.selected);
3217
2983
  },
3218
2984
  value: function (removedValue, removedText, $removedItem, preventChangeTrigger) {
3219
- var
3220
- values = module.get.values(true),
3221
- newValue
3222
- ;
2985
+ let values = module.get.values(true);
2986
+ let newValue;
3223
2987
  if (module.has.selectInput()) {
3224
2988
  module.verbose('Input is <select> removing selected option', removedValue);
3225
2989
  newValue = module.remove.arrayValue(removedValue, values);
@@ -3249,11 +3013,9 @@
3249
3013
  return values;
3250
3014
  },
3251
3015
  label: function (value, shouldAnimate) {
3252
- var
3253
- escapedValue = module.escape.value(value),
3254
- $labels = $module.find(selector.label),
3255
- $removedLabel = $labels.filter('[data-' + metadata.value + '="' + module.escape.string(settings.ignoreCase ? escapedValue.toLowerCase() : escapedValue) + '"]')
3256
- ;
3016
+ let escapedValue = module.escape.value(value);
3017
+ let $labels = $module.find(selector.label);
3018
+ let $removedLabel = $labels.filter('[data-' + metadata.value + '="' + CSS.escape(settings.ignoreCase ? escapedValue.toLowerCase() : escapedValue) + '"]');
3257
3019
  module.verbose('Removing label', $removedLabel);
3258
3020
  $removedLabel.remove();
3259
3021
  },
@@ -3267,14 +3029,12 @@
3267
3029
  module.verbose('Removing labels', $labels);
3268
3030
  $labels
3269
3031
  .each(function () {
3270
- var
3271
- $label = $(this),
3272
- value = $label.data(metadata.value),
3273
- stringValue = value !== undefined
3274
- ? String(value)
3275
- : value,
3276
- isUserValue = module.is.userValue(stringValue)
3277
- ;
3032
+ let $label = $(this);
3033
+ let value = $label.data(metadata.value);
3034
+ let stringValue = value !== undefined
3035
+ ? String(value)
3036
+ : value;
3037
+ let isUserValue = module.is.userValue(stringValue);
3278
3038
  if (settings.onLabelRemove.call($label, value) === false) {
3279
3039
  module.debug('Label remove callback cancelled removal');
3280
3040
 
@@ -3288,26 +3048,21 @@
3288
3048
  // selected will also remove label
3289
3049
  module.remove.selected(stringValue, false, preventChangeTrigger);
3290
3050
  }
3291
- })
3292
- ;
3051
+ });
3293
3052
  },
3294
3053
  tabbable: function () {
3295
3054
  if (module.is.searchSelection()) {
3296
3055
  module.debug('Searchable dropdown initialized');
3297
3056
  $search
3298
- .removeAttr('tabindex')
3299
- ;
3057
+ .removeAttr('tabindex');
3300
3058
  $menu
3301
- .removeAttr('tabindex')
3302
- ;
3059
+ .removeAttr('tabindex');
3303
3060
  } else {
3304
3061
  module.debug('Simple selection dropdown initialized');
3305
3062
  $module
3306
- .removeAttr('tabindex')
3307
- ;
3063
+ .removeAttr('tabindex');
3308
3064
  $menu
3309
- .removeAttr('tabindex')
3310
- ;
3065
+ .removeAttr('tabindex');
3311
3066
  }
3312
3067
  },
3313
3068
  diacritics: function (text) {
@@ -3344,10 +3099,8 @@
3344
3099
  return true;
3345
3100
  },
3346
3101
  firstLetter: function ($item, letter) {
3347
- var
3348
- text,
3349
- firstLetter
3350
- ;
3102
+ let text;
3103
+ let firstLetter;
3351
3104
  if (!$item || $item.length === 0 || typeof letter !== 'string') {
3352
3105
  return false;
3353
3106
  }
@@ -3373,23 +3126,19 @@
3373
3126
  return $menu.children(selector.message).length > 0;
3374
3127
  },
3375
3128
  label: function (value) {
3376
- var
3377
- escapedValue = module.escape.value(value),
3378
- $labels = $module.find(selector.label)
3379
- ;
3129
+ let escapedValue = module.escape.value(value);
3130
+ let $labels = $module.find(selector.label);
3380
3131
  if (settings.ignoreCase) {
3381
3132
  escapedValue = escapedValue.toLowerCase();
3382
3133
  }
3383
3134
 
3384
- return $labels.filter('[data-' + metadata.value + '="' + module.escape.string(escapedValue) + '"]').length > 0;
3135
+ return $labels.filter('[data-' + metadata.value + '="' + CSS.escape(escapedValue) + '"]').length > 0;
3385
3136
  },
3386
3137
  maxSelections: function () {
3387
3138
  return settings.maxSelections && module.get.selectionCount() >= settings.maxSelections;
3388
3139
  },
3389
3140
  allResultsFiltered: function () {
3390
- var
3391
- $normalResults = $item.not(selector.addition)
3392
- ;
3141
+ let $normalResults = $item.not(selector.addition);
3393
3142
 
3394
3143
  return $normalResults.filter(selector.unselectable).length === $normalResults.length;
3395
3144
  },
@@ -3405,20 +3154,16 @@
3405
3154
  : module.has.valueMatchingCase(value);
3406
3155
  },
3407
3156
  valueMatchingCase: function (value) {
3408
- var
3409
- values = module.get.values(true),
3410
- hasValue = Array.isArray(values)
3411
- ? values && ($.inArray(value, values) !== -1)
3412
- : values == value
3413
- ;
3157
+ let values = module.get.values(true);
3158
+ let hasValue = Array.isArray(values)
3159
+ ? values && ($.inArray(value, values) !== -1)
3160
+ : values == value;
3414
3161
 
3415
3162
  return !!hasValue;
3416
3163
  },
3417
3164
  valueIgnoringCase: function (value) {
3418
- var
3419
- values = module.get.values(true),
3420
- hasValue = false
3421
- ;
3165
+ let values = module.get.values(true);
3166
+ let hasValue = false;
3422
3167
  if (!Array.isArray(values)) {
3423
3168
  values = [values];
3424
3169
  }
@@ -3450,9 +3195,6 @@
3450
3195
  bubbledIconClick: function (event) {
3451
3196
  return $(event.target).closest($icon).length > 0;
3452
3197
  },
3453
- edge: function () {
3454
- return !!window.chrome && !!window.StyleMedia;
3455
- },
3456
3198
  empty: function () {
3457
3199
  return $module.hasClass(className.empty);
3458
3200
  },
@@ -3468,12 +3210,12 @@
3468
3210
  : $menu.transition && $menu.transition('is animating');
3469
3211
  },
3470
3212
  leftward: function ($subMenu) {
3471
- var $selectedMenu = $subMenu || $menu;
3213
+ let $selectedMenu = $subMenu || $menu;
3472
3214
 
3473
3215
  return $selectedMenu.hasClass(className.leftward);
3474
3216
  },
3475
3217
  clearable: function () {
3476
- var hasClearableClass = $module.hasClass(className.clearable);
3218
+ let hasClearableClass = $module.hasClass(className.clearable);
3477
3219
  if (!hasClearableClass && settings.clearable) {
3478
3220
  $module.addClass(className.clearable);
3479
3221
  }
@@ -3499,9 +3241,7 @@
3499
3241
  return initialLoad;
3500
3242
  },
3501
3243
  inObject: function (needle, object) {
3502
- var
3503
- found = false
3504
- ;
3244
+ let found = false;
3505
3245
  $.each(object, function (index, property) {
3506
3246
  if (property == needle) {
3507
3247
  found = true;
@@ -3525,9 +3265,7 @@
3525
3265
  return !module.is.multiple();
3526
3266
  },
3527
3267
  selectMutation: function (mutations) {
3528
- var
3529
- selectChanged = false
3530
- ;
3268
+ let selectChanged = false;
3531
3269
  $.each(mutations, function (index, mutation) {
3532
3270
  if ($(mutation.target).is('option, optgroup') || $(mutation.addedNodes).is('select') || ($(mutation.target).is('select') && mutation.type !== 'attributes')) {
3533
3271
  selectChanged = true;
@@ -3551,7 +3289,7 @@
3551
3289
  return $.inArray(value, module.get.userValues()) !== -1;
3552
3290
  },
3553
3291
  upward: function ($menu) {
3554
- var $element = $menu || $module;
3292
+ let $element = $menu || $module;
3555
3293
 
3556
3294
  return $element.hasClass(className.upward);
3557
3295
  },
@@ -3561,20 +3299,16 @@
3561
3299
  : $menu.hasClass(className.visible);
3562
3300
  },
3563
3301
  verticallyScrollableContext: function () {
3564
- var
3565
- overflowY = $context[0] !== window
3566
- ? $context.css('overflow-y')
3567
- : false
3568
- ;
3302
+ let overflowY = $context[0] !== window
3303
+ ? $context.css('overflow-y')
3304
+ : false;
3569
3305
 
3570
3306
  return overflowY === 'auto' || overflowY === 'scroll';
3571
3307
  },
3572
3308
  horizontallyScrollableContext: function () {
3573
- var
3574
- overflowX = $context[0] !== window
3575
- ? $context.css('overflow-X')
3576
- : false
3577
- ;
3309
+ let overflowX = $context[0] !== window
3310
+ ? $context.css('overflow-X')
3311
+ : false;
3578
3312
 
3579
3313
  return overflowX === 'auto' || overflowX === 'scroll';
3580
3314
  },
@@ -3589,15 +3323,12 @@
3589
3323
  );
3590
3324
  },
3591
3325
  openDownward: function ($subMenu) {
3592
- var
3593
- $currentMenu = $subMenu || $menu,
3594
- canOpenDownward,
3595
- onScreen,
3596
- calculations
3597
- ;
3326
+ let $currentMenu = $subMenu || $menu;
3327
+ let canOpenDownward;
3328
+ let onScreen;
3329
+ let calculations;
3598
3330
  $currentMenu
3599
- .addClass(className.loading)
3600
- ;
3331
+ .addClass(className.loading);
3601
3332
  calculations = {
3602
3333
  context: {
3603
3334
  offset: $context[0] === window
@@ -3636,15 +3367,12 @@
3636
3367
  return canOpenDownward;
3637
3368
  },
3638
3369
  openRightward: function ($subMenu) {
3639
- var
3640
- $currentMenu = $subMenu || $menu,
3641
- canOpenRightward = true,
3642
- isOffscreenRight = false,
3643
- calculations
3644
- ;
3370
+ let $currentMenu = $subMenu || $menu;
3371
+ let canOpenRightward = true;
3372
+ let isOffscreenRight = false;
3373
+ let calculations;
3645
3374
  $currentMenu
3646
- .addClass(className.loading)
3647
- ;
3375
+ .addClass(className.loading);
3648
3376
  calculations = {
3649
3377
  context: {
3650
3378
  offset: $context[0] === window
@@ -3691,17 +3419,15 @@
3691
3419
 
3692
3420
  animate: {
3693
3421
  show: function (callback, $subMenu) {
3694
- var
3695
- $currentMenu = $subMenu || $menu,
3696
- start = $subMenu
3697
- ? function () {}
3698
- : function () {
3699
- module.hideSubMenus();
3700
- module.hideOthers();
3701
- module.set.active();
3702
- },
3703
- transition
3704
- ;
3422
+ let $currentMenu = $subMenu || $menu;
3423
+ let start = $subMenu
3424
+ ? function () {}
3425
+ : function () {
3426
+ module.hideSubMenus();
3427
+ module.hideOthers();
3428
+ module.set.active();
3429
+ };
3430
+ let transition;
3705
3431
  callback = isFunction(callback)
3706
3432
  ? callback
3707
3433
  : function () {};
@@ -3732,22 +3458,19 @@
3732
3458
  onComplete: function () {
3733
3459
  callback.call(element);
3734
3460
  },
3735
- })
3736
- ;
3461
+ });
3737
3462
  }
3738
3463
  }
3739
3464
  },
3740
3465
  hide: function (callback, $subMenu) {
3741
- var
3742
- $currentMenu = $subMenu || $menu,
3743
- start = $subMenu
3744
- ? function () {}
3745
- : function () {
3746
- module.unbind.intent();
3747
- module.remove.active();
3748
- },
3749
- transition = settings.transition.hideMethod || module.get.transition($subMenu)
3750
- ;
3466
+ let $currentMenu = $subMenu || $menu;
3467
+ let start = $subMenu
3468
+ ? function () {}
3469
+ : function () {
3470
+ module.unbind.intent();
3471
+ module.remove.active();
3472
+ };
3473
+ let transition = settings.transition.hideMethod || module.get.transition($subMenu);
3751
3474
  callback = isFunction(callback)
3752
3475
  ? callback
3753
3476
  : function () {};
@@ -3774,8 +3497,7 @@
3774
3497
  onComplete: function () {
3775
3498
  callback.call(element);
3776
3499
  },
3777
- })
3778
- ;
3500
+ });
3779
3501
  } else {
3780
3502
  module.error(error.transition);
3781
3503
  }
@@ -3816,13 +3538,11 @@
3816
3538
 
3817
3539
  escape: {
3818
3540
  value: function (value) {
3819
- var
3820
- multipleValues = Array.isArray(value),
3821
- stringValue = typeof value === 'string',
3822
- isUnparsable = !stringValue && !multipleValues,
3823
- hasQuotes = stringValue && value.search(regExp.quote) !== -1,
3824
- values = []
3825
- ;
3541
+ let multipleValues = Array.isArray(value);
3542
+ let stringValue = typeof value === 'string';
3543
+ let isUnparsable = !stringValue && !multipleValues;
3544
+ let hasQuotes = stringValue && value.search(regExp.quote) !== -1;
3545
+ let values = [];
3826
3546
  if (isUnparsable || !hasQuotes) {
3827
3547
  return value;
3828
3548
  }
@@ -3844,26 +3564,19 @@
3844
3564
  },
3845
3565
  htmlEntities: function (string, forceAmpersand) {
3846
3566
  forceAmpersand = typeof forceAmpersand === 'number' ? false : forceAmpersand;
3847
- var
3848
- badChars = /["'<>`]/g,
3849
- shouldEscape = /["&'<>`]/,
3850
- escape = {
3851
- '<': '&lt;',
3852
- '>': '&gt;',
3853
- '"': '&quot;',
3854
- "'": '&#x27;',
3855
- '`': '&#x60;',
3856
- },
3857
- escapedChar = function (chr) {
3858
- return escape[chr];
3859
- }
3860
- ;
3861
- if (shouldEscape.test(string)) {
3862
- string = string.replace(forceAmpersand ? /&/g : /&(?![\d#a-z]{1,12};)/gi, '&amp;');
3863
- string = string.replace(badChars, escapedChar);
3864
- }
3865
3567
 
3866
- return string;
3568
+ const badChars = forceAmpersand
3569
+ ? /["&'<>]/g
3570
+ : /["'<>]|&(?![\d#A-Za-z]{1,12};)/g;
3571
+ const escape = {
3572
+ '"': '&quot;',
3573
+ '&': '&amp;',
3574
+ "'": '&apos;',
3575
+ '<': '&lt;',
3576
+ '>': '&gt;',
3577
+ };
3578
+
3579
+ return String(string).replace(badChars, (chr) => escape[chr]);
3867
3580
  },
3868
3581
  },
3869
3582
 
@@ -3918,11 +3631,9 @@
3918
3631
  },
3919
3632
  performance: {
3920
3633
  log: function (message) {
3921
- var
3922
- currentTime,
3923
- executionTime,
3924
- previousTime
3925
- ;
3634
+ let currentTime;
3635
+ let executionTime;
3636
+ let previousTime;
3926
3637
  if (settings.performance) {
3927
3638
  currentTime = Date.now();
3928
3639
  previousTime = time || currentTime;
@@ -3941,10 +3652,8 @@
3941
3652
  }, 500);
3942
3653
  },
3943
3654
  display: function () {
3944
- var
3945
- title = settings.name + ':',
3946
- totalTime = 0
3947
- ;
3655
+ let title = settings.name + ':';
3656
+ let totalTime = 0;
3948
3657
  time = false;
3949
3658
  clearTimeout(module.performance.timer);
3950
3659
  $.each(performance, function (index, data) {
@@ -3966,22 +3675,19 @@
3966
3675
  },
3967
3676
  },
3968
3677
  invoke: function (query, passedArguments, context) {
3969
- var
3970
- object = instance,
3971
- maxDepth,
3972
- found,
3973
- response
3974
- ;
3678
+ let object = instance;
3679
+ let maxDepth;
3680
+ let found;
3681
+ let response;
3975
3682
  passedArguments = passedArguments || queryArguments;
3976
3683
  context = context || element;
3977
3684
  if (typeof query === 'string' && object !== undefined) {
3978
3685
  query = query.split(/[ .]/);
3979
3686
  maxDepth = query.length - 1;
3980
3687
  $.each(query, function (depth, value) {
3981
- var camelCaseValue = depth !== maxDepth
3688
+ let camelCaseValue = depth !== maxDepth
3982
3689
  ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
3983
- : query
3984
- ;
3690
+ : query;
3985
3691
  if ($.isPlainObject(object[camelCaseValue]) && (depth !== maxDepth)) {
3986
3692
  object = object[camelCaseValue];
3987
3693
  } else if (object[camelCaseValue] !== undefined) {
@@ -4066,33 +3772,33 @@
4066
3772
  match: 'both', // what to match against with search selection (both, text, or label)
4067
3773
  fullTextSearch: 'exact', // search anywhere in value (set to 'exact' to require exact matches)
4068
3774
  highlightMatches: false, // Whether search result should highlight matching strings
4069
- 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...)
3775
+ 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...)
4070
3776
  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)
4071
3777
 
4072
- placeholder: 'auto', // whether to convert blank <select> values to placeholder text
4073
- preserveHTML: true, // preserve html when selecting value
3778
+ placeholder: 'auto', // whether to convert blank <select> values to the placeholder text
3779
+ preserveHTML: false, // preserve HTML when selecting value
4074
3780
  sortSelect: false, // sort selection on init
4075
3781
 
4076
3782
  forceSelection: false, // force a choice on blur with search selection
4077
3783
 
4078
3784
  allowAdditions: false, // whether multiple select should allow user added values
4079
- keepSearchTerm: false, // whether the search value should be kept and menu stays filtered on item selection
3785
+ keepSearchTerm: false, // whether the search value should be kept, and the menu stays filtered on item selection
4080
3786
  ignoreCase: false, // whether to consider case sensitivity when creating labels
4081
3787
  ignoreSearchCase: true, // whether to consider case sensitivity when filtering items
4082
- hideAdditions: true, // whether or not to hide special message prompting a user they can enter a value
3788
+ hideAdditions: true, // whether to hide a special message prompting a user, they can enter a value
4083
3789
 
4084
- maxSelections: false, // When set to a number limits the number of selections to this count
3790
+ maxSelections: false, // When set to a number, limits the number of selections to this count
4085
3791
  useLabels: true, // whether multiple select should filter currently active selections from choices
4086
- delimiter: ',', // when multiselect uses normal <input> the values will be delimited with this character
3792
+ delimiter: ',', // when multiselect uses normal <input >, the values will be delimited with this character
4087
3793
 
4088
- showOnFocus: false, // show menu on focus
3794
+ showOnFocus: false, // show the menu on focus
4089
3795
  allowReselection: false, // whether current value should trigger callbacks when reselected
4090
- allowTab: true, // add tabindex to element
4091
- allowCategorySelection: false, // allow elements with sub-menus to be selected
3796
+ allowTab: true, // add tabindex to the element
3797
+ allowCategorySelection: false, // allow elements with submenus to be selected
4092
3798
 
4093
3799
  fireOnInit: false, // Whether callbacks should fire when initializing dropdown values
4094
3800
 
4095
- transition: 'auto', // auto transition will slide down or up based on direction
3801
+ transition: 'auto', // auto transition will slide down or up based on the direction
4096
3802
  duration: 200, // duration of transition
4097
3803
  displayType: false, // displayType of transition
4098
3804
 
@@ -4156,7 +3862,6 @@
4156
3862
  noAPI: 'The API module is required to load resources remotely',
4157
3863
  noStorage: 'Saving remote data requires session storage',
4158
3864
  noElement: 'This module requires ui {element}',
4159
- noNormalize: '"ignoreDiacritics" setting will be ignored. Browser does not support String().normalize(). You may consider including <https://cdn.jsdelivr.net/npm/unorm@1.4.1/lib/unorm.min.js> as a polyfill.',
4160
3865
  },
4161
3866
 
4162
3867
  regExp: {
@@ -4172,23 +3877,23 @@
4172
3877
  value: 'value',
4173
3878
  },
4174
3879
 
4175
- // property names for remote query
3880
+ // property names for the remote query
4176
3881
  fields: {
4177
3882
  remoteValues: 'results', // grouping for api results
4178
3883
  values: 'values', // grouping for all dropdown values
4179
3884
  disabled: 'disabled', // whether value should be disabled
4180
- name: 'name', // displayed dropdown text
3885
+ name: 'name', // the displayed dropdown text
4181
3886
  description: 'description', // displayed dropdown description
4182
3887
  descriptionVertical: 'descriptionVertical', // whether description should be vertical
4183
3888
  value: 'value', // actual dropdown value
4184
- text: 'text', // displayed text when selected
3889
+ text: 'text', // the displayed text when selected
4185
3890
  data: 'data', // custom data attributes
4186
3891
  type: 'type', // type of dropdown element
4187
3892
  image: 'image', // optional image path
4188
3893
  imageClass: 'imageClass', // optional individual class for image
4189
3894
  alt: 'alt', // optional alt text for image
4190
3895
  icon: 'icon', // optional icon name
4191
- iconClass: 'iconClass', // optional individual class for icon (for example to use flag instead)
3896
+ iconClass: 'iconClass', // optional individual class for icon (for example, to use a flag instead)
4192
3897
  class: 'class', // optional individual class for item/header
4193
3898
  divider: 'divider', // optional divider append for group headers
4194
3899
  actionable: 'actionable', // optional actionable item
@@ -4270,137 +3975,115 @@
4270
3975
 
4271
3976
  /* Templates */
4272
3977
  $.fn.dropdown.settings.templates = {
4273
- deQuote: function (string, encode) {
4274
- return String(string).replace(/"/g, encode ? '&quot;' : '');
4275
- },
4276
- escape: function (string, preserveHTML) {
4277
- if (preserveHTML) {
3978
+ escape: function (string, settings) {
3979
+ if (settings !== undefined && settings.preserveHTML) {
4278
3980
  return string;
4279
3981
  }
4280
- var
4281
- badChars = /["'<>`]/g,
4282
- shouldEscape = /["&'<>`]/,
4283
- escape = {
4284
- '<': '&lt;',
4285
- '>': '&gt;',
4286
- '"': '&quot;',
4287
- "'": '&#x27;',
4288
- '`': '&#x60;',
4289
- },
4290
- escapedChar = function (chr) {
4291
- return escape[chr];
4292
- }
4293
- ;
4294
- if (shouldEscape.test(string)) {
4295
- string = string.replace(/&(?![\d#a-z]{1,12};)/gi, '&amp;');
4296
- string = string.replace(badChars, escapedChar);
4297
- }
4298
3982
 
4299
- return string;
3983
+ const badChars = /["'<>]|&(?![\d#A-Za-z]{1,12};)/g;
3984
+ const escape = {
3985
+ '"': '&quot;',
3986
+ '&': '&amp;',
3987
+ "'": '&apos;',
3988
+ '<': '&lt;',
3989
+ '>': '&gt;',
3990
+ };
3991
+
3992
+ return String(string).replace(badChars, (chr) => escape[chr]);
4300
3993
  },
4301
3994
  // generates dropdown from select values
4302
- dropdown: function (select, fields, preserveHTML, className) {
4303
- var
4304
- placeholder = select.placeholder || false,
4305
- html = '',
4306
- escape = $.fn.dropdown.settings.templates.escape,
4307
- deQuote = $.fn.dropdown.settings.templates.deQuote
4308
- ;
3995
+ dropdown: function (select, settings) {
3996
+ let placeholder = select.placeholder || false;
3997
+ let html = '';
3998
+ let className = settings.className;
3999
+ let escape = settings.templates.escape;
4309
4000
  html += '<i class="dropdown icon"></i>';
4310
4001
  html += placeholder
4311
- ? '<div class="default text">' + escape(placeholder, preserveHTML) + '</div>'
4002
+ ? '<div class="default text">' + escape(placeholder, settings) + '</div>'
4312
4003
  : '<div class="text"></div>';
4313
- html += '<div class="' + deQuote(className.menu) + '">';
4314
- html += $.fn.dropdown.settings.templates.menu(select, fields, preserveHTML, className);
4004
+ html += '<div class="' + escape(className.menu) + '">';
4005
+ html += settings.templates.menu(select, settings);
4315
4006
  html += '</div>';
4316
4007
 
4317
4008
  return html;
4318
4009
  },
4319
4010
 
4320
4011
  // generates just menu from select
4321
- menu: function (response, fields, preserveHTML, className) {
4322
- var
4323
- values = response[fields.values] || [],
4324
- html = '',
4325
- escape = $.fn.dropdown.settings.templates.escape,
4326
- deQuote = $.fn.dropdown.settings.templates.deQuote
4327
- ;
4012
+ menu: function (response, settings) {
4013
+ let fields = settings.fields;
4014
+ let values = response[fields.values] || [];
4015
+ let html = '';
4016
+ let className = settings.className;
4017
+ let escape = settings.templates.escape;
4328
4018
  $.each(values, function (index, option) {
4329
- var
4330
- itemType = option[fields.type] || 'item',
4331
- isMenu = itemType.indexOf('menu') !== -1,
4332
- maybeData = '',
4333
- dataObject = option[fields.data]
4334
- ;
4019
+ let itemType = option[fields.type] || 'item';
4020
+ let isMenu = itemType.indexOf('menu') !== -1;
4021
+ let maybeData = '';
4022
+ let dataObject = option[fields.data];
4335
4023
  if (dataObject) {
4336
- var dataKey,
4337
- dataKeyEscaped
4338
- ;
4024
+ let dataKey;
4025
+ let dataKeyEscaped;
4339
4026
  for (dataKey in dataObject) {
4340
4027
  dataKeyEscaped = String(dataKey).replace(/\W/g, '');
4341
4028
  if (Object.prototype.hasOwnProperty.call(dataObject, dataKey) && ['text', 'value'].indexOf(dataKeyEscaped.toLowerCase()) === -1) {
4342
- maybeData += ' data-' + dataKeyEscaped + '="' + deQuote(String(dataObject[dataKey])) + '"';
4029
+ maybeData += ' data-' + dataKeyEscaped + '="' + escape(String(dataObject[dataKey])) + '"';
4343
4030
  }
4344
4031
  }
4345
4032
  }
4346
4033
  if (itemType === 'item' || isMenu) {
4347
- var
4348
- maybeText = option[fields.text]
4349
- ? ' data-text="' + deQuote(option[fields.text], true) + '"'
4350
- : '',
4351
- maybeActionable = option[fields.actionable]
4352
- ? className.actionable + ' '
4353
- : '',
4354
- maybeDisabled = option[fields.disabled]
4355
- ? className.disabled + ' '
4356
- : '',
4357
- maybeDescriptionVertical = option[fields.descriptionVertical]
4358
- ? className.descriptionVertical + ' '
4359
- : '',
4360
- hasDescription = escape(option[fields.description] || '', preserveHTML) !== ''
4361
- ;
4362
- html += '<div class="' + deQuote(maybeActionable + maybeDisabled + maybeDescriptionVertical + (option[fields.class] || className.item)) + '" data-value="' + deQuote(option[fields.value], true) + '"' + maybeText + maybeData + '>';
4034
+ let maybeText = option[fields.text]
4035
+ ? ' data-text="' + escape(option[fields.text]) + '"'
4036
+ : '';
4037
+ let maybeActionable = option[fields.actionable]
4038
+ ? className.actionable + ' '
4039
+ : '';
4040
+ let maybeDisabled = option[fields.disabled]
4041
+ ? className.disabled + ' '
4042
+ : '';
4043
+ let maybeDescriptionVertical = option[fields.descriptionVertical]
4044
+ ? className.descriptionVertical + ' '
4045
+ : '';
4046
+ let hasDescription = escape(option[fields.description] || '', settings) !== '';
4047
+ html += '<div class="' + escape(maybeActionable + maybeDisabled + maybeDescriptionVertical + (option[fields.class] || className.item)) + '" data-value="' + escape(option[fields.value]) + '"' + maybeText + maybeData + '>';
4363
4048
  if (isMenu) {
4364
4049
  html += '<i class="' + (itemType.indexOf('left') !== -1 ? 'left' : '') + ' dropdown icon"></i>';
4365
4050
  }
4366
4051
  if (option[fields.image]) {
4367
- html += '<img class="' + deQuote(option[fields.imageClass] || className.image) + '" src="' + deQuote(option[fields.image]) + (option[fields.alt] ? '" alt="' + deQuote(option[fields.alt]) : '') + '">';
4052
+ html += '<img class="' + escape(option[fields.imageClass] || className.image) + '" src="' + escape(option[fields.image]) + '"' + (option[fields.alt] ? ' alt="' + escape(option[fields.alt]) + '"' : '') + '>';
4368
4053
  }
4369
4054
  if (option[fields.icon]) {
4370
- html += '<i class="' + deQuote(option[fields.icon] + ' ' + (option[fields.iconClass] || className.icon)) + '"></i>';
4055
+ html += '<i class="' + escape(option[fields.icon] + ' ' + (option[fields.iconClass] || className.icon)) + '"></i>';
4371
4056
  }
4372
4057
  if (hasDescription) {
4373
- html += '<span class="' + deQuote(className.description) + '">' + escape(option[fields.description] || '', preserveHTML) + '</span>';
4374
- html += !isMenu ? '<span class="' + deQuote(className.text) + '">' : '';
4058
+ html += '<span class="' + escape(className.description) + '">' + escape(option[fields.description] || '', settings) + '</span>';
4059
+ html += !isMenu ? '<span class="' + escape(className.text) + '">' : '';
4375
4060
  }
4376
4061
  if (isMenu) {
4377
- html += '<span class="' + deQuote(className.text) + '">';
4062
+ html += '<span class="' + escape(className.text) + '">';
4378
4063
  }
4379
- html += escape(option[fields.name] || '', preserveHTML);
4064
+ html += escape(option[fields.name] || '', settings);
4380
4065
  if (isMenu) {
4381
4066
  html += '</span>';
4382
- html += '<div class="' + deQuote(itemType) + '">';
4383
- html += $.fn.dropdown.settings.templates.menu(option, fields, preserveHTML, className);
4067
+ html += '<div class="' + escape(itemType) + '">';
4068
+ html += settings.templates.menu(option, settings);
4384
4069
  html += '</div>';
4385
4070
  } else if (hasDescription) {
4386
4071
  html += '</span>';
4387
4072
  }
4388
4073
  html += '</div>';
4389
4074
  } else if (itemType === 'header') {
4390
- var
4391
- groupName = escape(option[fields.name] || '', preserveHTML),
4392
- groupIcon = deQuote(option[fields.icon] || className.groupIcon)
4393
- ;
4075
+ let groupName = option[fields.name] || '';
4076
+ let groupIcon = option[fields.icon] || className.groupIcon;
4394
4077
  if (groupName !== '' || groupIcon !== '') {
4395
- html += '<div class="' + deQuote(option[fields.class] || className.header) + '">';
4078
+ html += '<div class="' + escape(option[fields.class] || className.header) + '">';
4396
4079
  if (groupIcon !== '') {
4397
- html += '<i class="' + deQuote(groupIcon + ' ' + (option[fields.iconClass] || className.icon)) + '"></i>';
4080
+ html += '<i class="' + escape(groupIcon + ' ' + (option[fields.iconClass] || className.icon)) + '"></i>';
4398
4081
  }
4399
- html += groupName;
4082
+ html += escape(groupName, settings);
4400
4083
  html += '</div>';
4401
4084
  }
4402
4085
  if (option[fields.divider]) {
4403
- html += '<div class="' + deQuote(className.divider) + '"></div>';
4086
+ html += '<div class="' + escape(className.divider) + '"></div>';
4404
4087
  }
4405
4088
  }
4406
4089
  });
@@ -4409,13 +4092,11 @@
4409
4092
  },
4410
4093
 
4411
4094
  // generates label for multiselect
4412
- label: function (value, text, preserveHTML, className) {
4413
- var
4414
- escape = $.fn.dropdown.settings.templates.escape,
4415
- deQuote = $.fn.dropdown.settings.templates.deQuote
4416
- ;
4095
+ label: function (value, text, settings) {
4096
+ let className = settings.className;
4097
+ let escape = settings.templates.escape;
4417
4098
 
4418
- return escape(text, preserveHTML) + '<i class="' + deQuote(className.delete) + ' icon"></i>';
4099
+ return escape(text, settings) + '<i class="' + escape(className.delete) + ' icon"></i>';
4419
4100
  },
4420
4101
 
4421
4102
  // generates messages like "No results"
@@ -4423,7 +4104,7 @@
4423
4104
  return message;
4424
4105
  },
4425
4106
 
4426
- // generates user addition to selection menu
4107
+ // generates user addition to the selection menu
4427
4108
  addition: function (choice) {
4428
4109
  return choice;
4429
4110
  },