slim-select 1.27.1 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (155) hide show
  1. package/.nvmrc +1 -0
  2. package/.prettierrc +6 -0
  3. package/.vscode/extensions.json +3 -0
  4. package/.vscode/settings.json +15 -5
  5. package/README.md +2 -1
  6. package/dist/helper.d.ts +1 -4
  7. package/dist/index.d.ts +38 -58
  8. package/dist/render.d.ts +109 -0
  9. package/dist/select.d.ts +31 -20
  10. package/dist/settings.d.ts +33 -0
  11. package/dist/slimselect.cjs.js +2 -0
  12. package/dist/slimselect.cjs.js.map +1 -0
  13. package/dist/slimselect.css +1 -2
  14. package/dist/slimselect.css.map +1 -0
  15. package/dist/slimselect.es.js +2 -0
  16. package/dist/slimselect.es.js.map +1 -0
  17. package/dist/slimselect.global.js +2 -0
  18. package/dist/slimselect.global.js.map +1 -0
  19. package/dist/slimselect.js +2 -1970
  20. package/dist/slimselect.js.map +1 -0
  21. package/dist/slimselect.umd.js +2 -0
  22. package/dist/slimselect.umd.js.map +1 -0
  23. package/dist/store.d.ts +71 -0
  24. package/docs/assets/check-mark.svg +6 -0
  25. package/docs/assets/data.js +59 -0
  26. package/docs/assets/home.css +1 -0
  27. package/docs/assets/home.js +1 -0
  28. package/docs/assets/index.css +1 -0
  29. package/docs/assets/index.js +16 -0
  30. package/docs/assets/index2.js +274 -0
  31. package/docs/assets/index3.js +126 -0
  32. package/docs/assets/index4.js +60 -0
  33. package/docs/assets/install.js +34 -0
  34. package/docs/assets/selects.js +55 -0
  35. package/docs/index.html +18 -5
  36. package/docs.go +3 -1
  37. package/index.html +16 -0
  38. package/jest.config.js +7 -0
  39. package/package.json +39 -35
  40. package/src/docs/app.vue +185 -76
  41. package/src/docs/assets/scss/_variables.scss +26 -10
  42. package/src/docs/assets/scss/alert.scss +12 -0
  43. package/src/docs/assets/scss/animations.scss +5 -3
  44. package/src/docs/assets/scss/button.scss +21 -0
  45. package/src/docs/assets/scss/index.scss +8 -6
  46. package/src/docs/assets/scss/input.scss +2 -2
  47. package/src/docs/assets/scss/layout.scss +195 -65
  48. package/src/docs/assets/scss/misc.scss +144 -34
  49. package/src/docs/assets/scss/prism.scss +155 -153
  50. package/src/docs/env.d.ts +12 -0
  51. package/src/docs/images/check-mark.svg +6 -0
  52. package/src/docs/images/chrome.svg +22 -0
  53. package/src/docs/images/firefox.svg +58 -0
  54. package/src/docs/images/github.png +0 -0
  55. package/src/docs/images/ie.svg +11 -0
  56. package/src/docs/images/npm.png +0 -0
  57. package/src/docs/images/opera.svg +15 -0
  58. package/src/docs/images/safari.svg +22 -0
  59. package/src/docs/main.ts +27 -0
  60. package/src/docs/pages/data.vue +130 -0
  61. package/src/docs/pages/events/addable.vue +79 -0
  62. package/src/docs/pages/events/before_after_change.vue +140 -0
  63. package/src/docs/pages/events/before_after_open_close.vue +122 -0
  64. package/src/docs/pages/events/error.vue +59 -0
  65. package/src/docs/pages/events/index.vue +33 -0
  66. package/src/docs/pages/events/search.vue +154 -0
  67. package/src/docs/pages/events/search_filter.vue +45 -0
  68. package/src/docs/pages/home.vue +96 -116
  69. package/src/docs/pages/install.vue +47 -74
  70. package/src/docs/pages/methods/destroy.vue +66 -0
  71. package/src/docs/pages/methods/enable_disable.vue +70 -0
  72. package/src/docs/pages/methods/get_data.vue +81 -0
  73. package/src/docs/pages/methods/get_selected.vue +78 -0
  74. package/src/docs/pages/methods/index.vue +36 -0
  75. package/src/docs/pages/methods/open_close.vue +63 -0
  76. package/src/docs/pages/methods/search.vue +62 -0
  77. package/src/docs/pages/methods/set_data.vue +106 -0
  78. package/src/docs/pages/methods/set_selected.vue +70 -0
  79. package/src/docs/pages/selects.vue +108 -114
  80. package/src/docs/pages/settings/always_open.vue +88 -0
  81. package/src/docs/pages/settings/close_on_select.vue +69 -0
  82. package/src/docs/pages/settings/content_location.vue +64 -0
  83. package/src/docs/pages/settings/content_position.vue +86 -0
  84. package/src/docs/pages/settings/css.vue +73 -0
  85. package/src/docs/pages/settings/data_attributes.vue +39 -0
  86. package/src/docs/pages/settings/deselect.vue +69 -0
  87. package/src/docs/pages/settings/display.vue +88 -0
  88. package/src/docs/pages/settings/hide_selected.vue +73 -0
  89. package/src/docs/pages/settings/html.vue +86 -0
  90. package/src/docs/pages/settings/index.vue +73 -0
  91. package/src/docs/pages/settings/mandatory.vue +91 -0
  92. package/src/docs/pages/settings/min_max.vue +61 -0
  93. package/src/docs/pages/settings/open_position.vue +60 -0
  94. package/src/docs/pages/settings/placeholder.vue +72 -0
  95. package/src/docs/pages/settings/search.vue +140 -0
  96. package/src/docs/pages/settings/select.vue +32 -0
  97. package/src/docs/pages/settings/select_by_group.vue +46 -0
  98. package/src/docs/pages/settings/show_tooltip.vue +44 -0
  99. package/src/docs/pages/settings/styles.vue +51 -0
  100. package/src/docs/router.ts +41 -13
  101. package/src/slim-select/helper.ts +25 -86
  102. package/src/slim-select/index.ts +317 -420
  103. package/src/slim-select/render.test.ts +39 -0
  104. package/src/slim-select/render.ts +1129 -0
  105. package/src/slim-select/rollup.config.mjs +39 -0
  106. package/src/slim-select/select.test.ts +155 -0
  107. package/src/slim-select/select.ts +280 -108
  108. package/src/slim-select/settings.ts +68 -0
  109. package/src/slim-select/slimselect.scss +263 -278
  110. package/src/slim-select/store.test.ts +220 -0
  111. package/src/slim-select/store.ts +320 -0
  112. package/src/slim-select/tsconfig.json +11 -5
  113. package/src/vue/slimselect.vue +61 -0
  114. package/tsconfig.json +10 -29
  115. package/vite.config.ts +18 -0
  116. package/.browserslistrc +0 -4
  117. package/.postcssrc.js +0 -5
  118. package/.travis.yml +0 -22
  119. package/babel.config.js +0 -5
  120. package/dist/config.d.ts +0 -83
  121. package/dist/data.d.ts +0 -50
  122. package/dist/slim.d.ts +0 -50
  123. package/dist/slimselect.min.css +0 -1
  124. package/dist/slimselect.min.js +0 -1
  125. package/dist/slimselect.min.mjs +0 -1
  126. package/docs/css/app.d5840d21.css +0 -1
  127. package/docs/css/chunk-vendors.fa8199af.css +0 -1
  128. package/docs/css/home.57020178.css +0 -1
  129. package/docs/css/install.baa5d3fb.css +0 -1
  130. package/docs/css/methods.728c742a.css +0 -1
  131. package/docs/css/options.b28a32ef.css +0 -1
  132. package/docs/css/selects.1a7e1e6a.css +0 -1
  133. package/docs/js/app.238ee382.js +0 -2
  134. package/docs/js/app.238ee382.js.map +0 -1
  135. package/docs/js/chunk-vendors.5125e3d8.js +0 -21
  136. package/docs/js/chunk-vendors.5125e3d8.js.map +0 -1
  137. package/docs/js/home.e7b28581.js +0 -2
  138. package/docs/js/home.e7b28581.js.map +0 -1
  139. package/docs/js/install.d4300783.js +0 -2
  140. package/docs/js/install.d4300783.js.map +0 -1
  141. package/docs/js/methods.fa1608f1.js +0 -11
  142. package/docs/js/methods.fa1608f1.js.map +0 -1
  143. package/docs/js/options.2c4ceb87.js +0 -2
  144. package/docs/js/options.2c4ceb87.js.map +0 -1
  145. package/docs/js/selects.1eeba693.js +0 -2
  146. package/docs/js/selects.1eeba693.js.map +0 -1
  147. package/src/docs/pages/methods.vue +0 -427
  148. package/src/docs/pages/options.vue +0 -1480
  149. package/src/main.ts +0 -29
  150. package/src/shims-vue.d.ts +0 -8
  151. package/src/slim-select/config.ts +0 -118
  152. package/src/slim-select/data.ts +0 -377
  153. package/src/slim-select/slim.ts +0 -775
  154. package/tslint.json +0 -26
  155. package/vue.config.js +0 -23
@@ -1,1970 +1,2 @@
1
- (function webpackUniversalModuleDefinition(root, factory) {
2
- if(typeof exports === 'object' && typeof module === 'object')
3
- module.exports = factory();
4
- else if(typeof define === 'function' && define.amd)
5
- define([], factory);
6
- else if(typeof exports === 'object')
7
- exports["SlimSelect"] = factory();
8
- else
9
- root["SlimSelect"] = factory();
10
- })(window, function() {
11
- return /******/ (function(modules) { // webpackBootstrap
12
- /******/ // The module cache
13
- /******/ var installedModules = {};
14
- /******/
15
- /******/ // The require function
16
- /******/ function __webpack_require__(moduleId) {
17
- /******/
18
- /******/ // Check if module is in cache
19
- /******/ if(installedModules[moduleId]) {
20
- /******/ return installedModules[moduleId].exports;
21
- /******/ }
22
- /******/ // Create a new module (and put it into the cache)
23
- /******/ var module = installedModules[moduleId] = {
24
- /******/ i: moduleId,
25
- /******/ l: false,
26
- /******/ exports: {}
27
- /******/ };
28
- /******/
29
- /******/ // Execute the module function
30
- /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
31
- /******/
32
- /******/ // Flag the module as loaded
33
- /******/ module.l = true;
34
- /******/
35
- /******/ // Return the exports of the module
36
- /******/ return module.exports;
37
- /******/ }
38
- /******/
39
- /******/
40
- /******/ // expose the modules object (__webpack_modules__)
41
- /******/ __webpack_require__.m = modules;
42
- /******/
43
- /******/ // expose the module cache
44
- /******/ __webpack_require__.c = installedModules;
45
- /******/
46
- /******/ // define getter function for harmony exports
47
- /******/ __webpack_require__.d = function(exports, name, getter) {
48
- /******/ if(!__webpack_require__.o(exports, name)) {
49
- /******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
50
- /******/ }
51
- /******/ };
52
- /******/
53
- /******/ // define __esModule on exports
54
- /******/ __webpack_require__.r = function(exports) {
55
- /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
56
- /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
57
- /******/ }
58
- /******/ Object.defineProperty(exports, '__esModule', { value: true });
59
- /******/ };
60
- /******/
61
- /******/ // create a fake namespace object
62
- /******/ // mode & 1: value is a module id, require it
63
- /******/ // mode & 2: merge all properties of value into the ns
64
- /******/ // mode & 4: return value when already ns object
65
- /******/ // mode & 8|1: behave like require
66
- /******/ __webpack_require__.t = function(value, mode) {
67
- /******/ if(mode & 1) value = __webpack_require__(value);
68
- /******/ if(mode & 8) return value;
69
- /******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
70
- /******/ var ns = Object.create(null);
71
- /******/ __webpack_require__.r(ns);
72
- /******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
73
- /******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
74
- /******/ return ns;
75
- /******/ };
76
- /******/
77
- /******/ // getDefaultExport function for compatibility with non-harmony modules
78
- /******/ __webpack_require__.n = function(module) {
79
- /******/ var getter = module && module.__esModule ?
80
- /******/ function getDefault() { return module['default']; } :
81
- /******/ function getModuleExports() { return module; };
82
- /******/ __webpack_require__.d(getter, 'a', getter);
83
- /******/ return getter;
84
- /******/ };
85
- /******/
86
- /******/ // Object.prototype.hasOwnProperty.call
87
- /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
88
- /******/
89
- /******/ // __webpack_public_path__
90
- /******/ __webpack_require__.p = "";
91
- /******/
92
- /******/
93
- /******/ // Load entry module and return exports
94
- /******/ return __webpack_require__(__webpack_require__.s = 2);
95
- /******/ })
96
- /************************************************************************/
97
- /******/ ([
98
- /* 0 */
99
- /***/ (function(module, exports, __webpack_require__) {
100
-
101
- "use strict";
102
-
103
- exports.__esModule = true;
104
- exports.kebabCase = exports.highlight = exports.isValueInArrayOfObjects = exports.debounce = exports.putContent = exports.ensureElementInView = exports.hasClassInTree = void 0;
105
- function hasClassInTree(element, className) {
106
- function hasClass(e, c) {
107
- if (!(!c || !e || !e.classList || !e.classList.contains(c))) {
108
- return e;
109
- }
110
- return null;
111
- }
112
- function parentByClass(e, c) {
113
- if (!e || e === document) {
114
- return null;
115
- }
116
- else if (hasClass(e, c)) {
117
- return e;
118
- }
119
- else {
120
- return parentByClass(e.parentNode, c);
121
- }
122
- }
123
- return hasClass(element, className) || parentByClass(element, className);
124
- }
125
- exports.hasClassInTree = hasClassInTree;
126
- function ensureElementInView(container, element) {
127
- var cTop = container.scrollTop + container.offsetTop;
128
- var cBottom = cTop + container.clientHeight;
129
- var eTop = element.offsetTop;
130
- var eBottom = eTop + element.clientHeight;
131
- if (eTop < cTop) {
132
- container.scrollTop -= (cTop - eTop);
133
- }
134
- else if (eBottom > cBottom) {
135
- container.scrollTop += (eBottom - cBottom);
136
- }
137
- }
138
- exports.ensureElementInView = ensureElementInView;
139
- function putContent(el, currentPosition, isOpen) {
140
- var height = el.offsetHeight;
141
- var rect = el.getBoundingClientRect();
142
- var elemTop = (isOpen ? rect.top : rect.top - height);
143
- var elemBottom = (isOpen ? rect.bottom : rect.bottom + height);
144
- if (elemTop <= 0) {
145
- return 'below';
146
- }
147
- if (elemBottom >= window.innerHeight) {
148
- return 'above';
149
- }
150
- return (isOpen ? currentPosition : 'below');
151
- }
152
- exports.putContent = putContent;
153
- function debounce(func, wait, immediate) {
154
- if (wait === void 0) { wait = 100; }
155
- if (immediate === void 0) { immediate = false; }
156
- var timeout;
157
- return function () {
158
- var args = [];
159
- for (var _i = 0; _i < arguments.length; _i++) {
160
- args[_i] = arguments[_i];
161
- }
162
- var context = self;
163
- var later = function () {
164
- timeout = null;
165
- if (!immediate) {
166
- func.apply(context, args);
167
- }
168
- };
169
- var callNow = immediate && !timeout;
170
- clearTimeout(timeout);
171
- timeout = setTimeout(later, wait);
172
- if (callNow) {
173
- func.apply(context, args);
174
- }
175
- };
176
- }
177
- exports.debounce = debounce;
178
- function isValueInArrayOfObjects(selected, key, value) {
179
- if (!Array.isArray(selected)) {
180
- return selected[key] === value;
181
- }
182
- for (var _i = 0, selected_1 = selected; _i < selected_1.length; _i++) {
183
- var s = selected_1[_i];
184
- if (s && s[key] && s[key] === value) {
185
- return true;
186
- }
187
- }
188
- return false;
189
- }
190
- exports.isValueInArrayOfObjects = isValueInArrayOfObjects;
191
- function highlight(str, search, className) {
192
- var completedString = str;
193
- var regex = new RegExp('(' + search.trim() + ')(?![^<]*>[^<>]*</)', 'i');
194
- if (!str.match(regex)) {
195
- return str;
196
- }
197
- var matchStartPosition = str.match(regex).index;
198
- var matchEndPosition = matchStartPosition + str.match(regex)[0].toString().length;
199
- var originalTextFoundByRegex = str.substring(matchStartPosition, matchEndPosition);
200
- completedString = completedString.replace(regex, "<mark class=\"".concat(className, "\">").concat(originalTextFoundByRegex, "</mark>"));
201
- return completedString;
202
- }
203
- exports.highlight = highlight;
204
- function kebabCase(str) {
205
- var result = str.replace(/[A-Z\u00C0-\u00D6\u00D8-\u00DE]/g, function (match) { return '-' + match.toLowerCase(); });
206
- return (str[0] === str[0].toUpperCase())
207
- ? result.substring(1)
208
- : result;
209
- }
210
- exports.kebabCase = kebabCase;
211
- (function () {
212
- var w = window;
213
- if (typeof w.CustomEvent === 'function') {
214
- return;
215
- }
216
- function CustomEvent(event, params) {
217
- params = params || { bubbles: false, cancelable: false, detail: undefined };
218
- var evt = document.createEvent('CustomEvent');
219
- evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);
220
- return evt;
221
- }
222
- CustomEvent.prototype = w.Event.prototype;
223
- w.CustomEvent = CustomEvent;
224
- })();
225
-
226
-
227
- /***/ }),
228
- /* 1 */
229
- /***/ (function(module, exports, __webpack_require__) {
230
-
231
- "use strict";
232
-
233
- exports.__esModule = true;
234
- exports.validateOption = exports.validateData = exports.Data = void 0;
235
- var Data = (function () {
236
- function Data(info) {
237
- this.contentOpen = false;
238
- this.contentPosition = 'below';
239
- this.isOnChangeEnabled = true;
240
- this.main = info.main;
241
- this.searchValue = '';
242
- this.data = [];
243
- this.filtered = null;
244
- this.parseSelectData();
245
- this.setSelectedFromSelect();
246
- }
247
- Data.prototype.newOption = function (info) {
248
- return {
249
- id: (info.id ? info.id : String(Math.floor(Math.random() * 100000000))),
250
- value: (info.value ? info.value : ''),
251
- text: (info.text ? info.text : ''),
252
- innerHTML: (info.innerHTML ? info.innerHTML : ''),
253
- selected: (info.selected ? info.selected : false),
254
- display: (info.display !== undefined ? info.display : true),
255
- disabled: (info.disabled ? info.disabled : false),
256
- placeholder: (info.placeholder ? info.placeholder : false),
257
- "class": (info["class"] ? info["class"] : undefined),
258
- data: (info.data ? info.data : {}),
259
- mandatory: (info.mandatory ? info.mandatory : false)
260
- };
261
- };
262
- Data.prototype.add = function (data) {
263
- this.data.push({
264
- id: String(Math.floor(Math.random() * 100000000)),
265
- value: data.value,
266
- text: data.text,
267
- innerHTML: '',
268
- selected: false,
269
- display: true,
270
- disabled: false,
271
- placeholder: false,
272
- "class": undefined,
273
- mandatory: data.mandatory,
274
- data: {}
275
- });
276
- };
277
- Data.prototype.parseSelectData = function () {
278
- this.data = [];
279
- var nodes = this.main.select.element.childNodes;
280
- for (var _i = 0, nodes_1 = nodes; _i < nodes_1.length; _i++) {
281
- var n = nodes_1[_i];
282
- if (n.nodeName === 'OPTGROUP') {
283
- var node = n;
284
- var optgroup = {
285
- label: node.label,
286
- options: []
287
- };
288
- var options = n.childNodes;
289
- for (var _a = 0, options_1 = options; _a < options_1.length; _a++) {
290
- var o = options_1[_a];
291
- if (o.nodeName === 'OPTION') {
292
- var option = this.pullOptionData(o);
293
- optgroup.options.push(option);
294
- if (option.placeholder && option.text.trim() !== '') {
295
- this.main.config.placeholderText = option.text;
296
- }
297
- }
298
- }
299
- this.data.push(optgroup);
300
- }
301
- else if (n.nodeName === 'OPTION') {
302
- var option = this.pullOptionData(n);
303
- this.data.push(option);
304
- if (option.placeholder && option.text.trim() !== '') {
305
- this.main.config.placeholderText = option.text;
306
- }
307
- }
308
- }
309
- };
310
- Data.prototype.pullOptionData = function (option) {
311
- return {
312
- id: (option.dataset ? option.dataset.id : false) || String(Math.floor(Math.random() * 100000000)),
313
- value: option.value,
314
- text: option.text,
315
- innerHTML: option.innerHTML,
316
- selected: option.selected,
317
- disabled: option.disabled,
318
- placeholder: option.dataset.placeholder === 'true',
319
- "class": option.className,
320
- style: option.style.cssText,
321
- data: option.dataset,
322
- mandatory: (option.dataset ? option.dataset.mandatory === 'true' : false)
323
- };
324
- };
325
- Data.prototype.setSelectedFromSelect = function () {
326
- if (this.main.config.isMultiple) {
327
- var options = this.main.select.element.options;
328
- var newSelected = [];
329
- for (var _i = 0, options_2 = options; _i < options_2.length; _i++) {
330
- var o = options_2[_i];
331
- if (o.selected) {
332
- var newOption = this.getObjectFromData(o.value, 'value');
333
- if (newOption && newOption.id) {
334
- newSelected.push(newOption.id);
335
- }
336
- }
337
- }
338
- this.setSelected(newSelected, 'id');
339
- }
340
- else {
341
- var element = this.main.select.element;
342
- if (element.selectedIndex !== -1) {
343
- var option = element.options[element.selectedIndex];
344
- var value = option.value;
345
- this.setSelected(value, 'value');
346
- }
347
- }
348
- };
349
- Data.prototype.setSelected = function (value, type) {
350
- if (type === void 0) { type = 'id'; }
351
- for (var _i = 0, _a = this.data; _i < _a.length; _i++) {
352
- var d = _a[_i];
353
- if (d.hasOwnProperty('label')) {
354
- if (d.hasOwnProperty('options')) {
355
- var options = d.options;
356
- if (options) {
357
- for (var _b = 0, options_3 = options; _b < options_3.length; _b++) {
358
- var o = options_3[_b];
359
- if (o.placeholder) {
360
- continue;
361
- }
362
- o.selected = this.shouldBeSelected(o, value, type);
363
- }
364
- }
365
- }
366
- }
367
- else {
368
- d.selected = this.shouldBeSelected(d, value, type);
369
- }
370
- }
371
- };
372
- Data.prototype.shouldBeSelected = function (option, value, type) {
373
- if (type === void 0) { type = 'id'; }
374
- if (Array.isArray(value)) {
375
- for (var _i = 0, value_1 = value; _i < value_1.length; _i++) {
376
- var v = value_1[_i];
377
- if (type in option && String(option[type]) === String(v)) {
378
- return true;
379
- }
380
- }
381
- }
382
- else {
383
- if (type in option && String(option[type]) === String(value)) {
384
- return true;
385
- }
386
- }
387
- return false;
388
- };
389
- Data.prototype.getSelected = function () {
390
- var value = { text: '', placeholder: this.main.config.placeholderText };
391
- var values = [];
392
- for (var _i = 0, _a = this.data; _i < _a.length; _i++) {
393
- var d = _a[_i];
394
- if (d.hasOwnProperty('label')) {
395
- if (d.hasOwnProperty('options')) {
396
- var options = d.options;
397
- if (options) {
398
- for (var _b = 0, options_4 = options; _b < options_4.length; _b++) {
399
- var o = options_4[_b];
400
- if (o.selected) {
401
- if (!this.main.config.isMultiple) {
402
- value = o;
403
- }
404
- else {
405
- values.push(o);
406
- }
407
- }
408
- }
409
- }
410
- }
411
- }
412
- else {
413
- if (d.selected) {
414
- if (!this.main.config.isMultiple) {
415
- value = d;
416
- }
417
- else {
418
- values.push(d);
419
- }
420
- }
421
- }
422
- }
423
- if (this.main.config.isMultiple) {
424
- return values;
425
- }
426
- return value;
427
- };
428
- Data.prototype.addToSelected = function (value, type) {
429
- if (type === void 0) { type = 'id'; }
430
- if (this.main.config.isMultiple) {
431
- var values = [];
432
- var selected = this.getSelected();
433
- if (Array.isArray(selected)) {
434
- for (var _i = 0, selected_1 = selected; _i < selected_1.length; _i++) {
435
- var s = selected_1[_i];
436
- values.push(s[type]);
437
- }
438
- }
439
- values.push(value);
440
- this.setSelected(values, type);
441
- }
442
- };
443
- Data.prototype.removeFromSelected = function (value, type) {
444
- if (type === void 0) { type = 'id'; }
445
- if (this.main.config.isMultiple) {
446
- var values = [];
447
- var selected = this.getSelected();
448
- for (var _i = 0, selected_2 = selected; _i < selected_2.length; _i++) {
449
- var s = selected_2[_i];
450
- if (String(s[type]) !== String(value)) {
451
- values.push(s[type]);
452
- }
453
- }
454
- this.setSelected(values, type);
455
- }
456
- };
457
- Data.prototype.onDataChange = function () {
458
- if (this.main.onChange && this.isOnChangeEnabled) {
459
- this.main.onChange(JSON.parse(JSON.stringify(this.getSelected())));
460
- }
461
- };
462
- Data.prototype.getObjectFromData = function (value, type) {
463
- if (type === void 0) { type = 'id'; }
464
- for (var _i = 0, _a = this.data; _i < _a.length; _i++) {
465
- var d = _a[_i];
466
- if (type in d && String(d[type]) === String(value)) {
467
- return d;
468
- }
469
- if (d.hasOwnProperty('options')) {
470
- var optgroupObject = d;
471
- if (optgroupObject.options) {
472
- for (var _b = 0, _c = optgroupObject.options; _b < _c.length; _b++) {
473
- var oo = _c[_b];
474
- if (String(oo[type]) === String(value)) {
475
- return oo;
476
- }
477
- }
478
- }
479
- }
480
- }
481
- return null;
482
- };
483
- Data.prototype.search = function (search) {
484
- this.searchValue = search;
485
- if (search.trim() === '') {
486
- this.filtered = null;
487
- return;
488
- }
489
- var searchFilter = this.main.config.searchFilter;
490
- var valuesArray = this.data.slice(0);
491
- search = search.trim();
492
- var filtered = valuesArray.map(function (obj) {
493
- if (obj.hasOwnProperty('options')) {
494
- var optgroupObj = obj;
495
- var options = [];
496
- if (optgroupObj.options) {
497
- options = optgroupObj.options.filter(function (opt) {
498
- return searchFilter(opt, search);
499
- });
500
- }
501
- if (options.length !== 0) {
502
- var optgroup = Object.assign({}, optgroupObj);
503
- optgroup.options = options;
504
- return optgroup;
505
- }
506
- }
507
- if (obj.hasOwnProperty('text')) {
508
- var optionObj = obj;
509
- if (searchFilter(optionObj, search)) {
510
- return obj;
511
- }
512
- }
513
- return null;
514
- });
515
- this.filtered = filtered.filter(function (info) { return info; });
516
- };
517
- return Data;
518
- }());
519
- exports.Data = Data;
520
- function validateData(data) {
521
- if (!data) {
522
- console.error('Data must be an array of objects');
523
- return false;
524
- }
525
- var isValid = false;
526
- var errorCount = 0;
527
- for (var _i = 0, data_1 = data; _i < data_1.length; _i++) {
528
- var d = data_1[_i];
529
- if (d.hasOwnProperty('label')) {
530
- if (d.hasOwnProperty('options')) {
531
- var optgroup = d;
532
- var options = optgroup.options;
533
- if (options) {
534
- for (var _a = 0, options_5 = options; _a < options_5.length; _a++) {
535
- var o = options_5[_a];
536
- isValid = validateOption(o);
537
- if (!isValid) {
538
- errorCount++;
539
- }
540
- }
541
- }
542
- }
543
- }
544
- else {
545
- var option = d;
546
- isValid = validateOption(option);
547
- if (!isValid) {
548
- errorCount++;
549
- }
550
- }
551
- }
552
- return errorCount === 0;
553
- }
554
- exports.validateData = validateData;
555
- function validateOption(option) {
556
- if (option.text === undefined) {
557
- console.error('Data object option must have at least have a text value. Check object: ' + JSON.stringify(option));
558
- return false;
559
- }
560
- return true;
561
- }
562
- exports.validateOption = validateOption;
563
-
564
-
565
- /***/ }),
566
- /* 2 */
567
- /***/ (function(module, exports, __webpack_require__) {
568
-
569
- "use strict";
570
-
571
- exports.__esModule = true;
572
- var config_1 = __webpack_require__(3);
573
- var select_1 = __webpack_require__(4);
574
- var slim_1 = __webpack_require__(5);
575
- var data_1 = __webpack_require__(1);
576
- var helper_1 = __webpack_require__(0);
577
- var SlimSelect = (function () {
578
- function SlimSelect(info) {
579
- var _this = this;
580
- this.ajax = null;
581
- this.addable = null;
582
- this.beforeOnChange = null;
583
- this.onChange = null;
584
- this.beforeOpen = null;
585
- this.afterOpen = null;
586
- this.beforeClose = null;
587
- this.afterClose = null;
588
- this.windowScroll = (0, helper_1.debounce)(function (e) {
589
- if (_this.data.contentOpen) {
590
- if ((0, helper_1.putContent)(_this.slim.content, _this.data.contentPosition, _this.data.contentOpen) === 'above') {
591
- _this.moveContentAbove();
592
- }
593
- else {
594
- _this.moveContentBelow();
595
- }
596
- }
597
- });
598
- this.documentClick = function (e) {
599
- if (e.target && !(0, helper_1.hasClassInTree)(e.target, _this.config.id)) {
600
- _this.close();
601
- }
602
- };
603
- var selectElement = this.validate(info);
604
- if (selectElement.dataset.ssid) {
605
- this.destroy(selectElement.dataset.ssid);
606
- }
607
- if (info.ajax) {
608
- this.ajax = info.ajax;
609
- }
610
- if (info.addable) {
611
- this.addable = info.addable;
612
- }
613
- this.config = new config_1.Config({
614
- select: selectElement,
615
- isAjax: (info.ajax ? true : false),
616
- showSearch: info.showSearch,
617
- searchPlaceholder: info.searchPlaceholder,
618
- searchText: info.searchText,
619
- searchingText: info.searchingText,
620
- searchFocus: info.searchFocus,
621
- searchHighlight: info.searchHighlight,
622
- searchFilter: info.searchFilter,
623
- closeOnSelect: info.closeOnSelect,
624
- showContent: info.showContent,
625
- placeholderText: info.placeholder,
626
- allowDeselect: info.allowDeselect,
627
- allowDeselectOption: info.allowDeselectOption,
628
- hideSelectedOption: info.hideSelectedOption,
629
- deselectLabel: info.deselectLabel,
630
- isEnabled: info.isEnabled,
631
- valuesUseText: info.valuesUseText,
632
- showOptionTooltips: info.showOptionTooltips,
633
- selectByGroup: info.selectByGroup,
634
- limit: info.limit,
635
- timeoutDelay: info.timeoutDelay,
636
- addToBody: info.addToBody
637
- });
638
- this.select = new select_1.Select({
639
- select: selectElement,
640
- main: this
641
- });
642
- this.data = new data_1.Data({ main: this });
643
- this.slim = new slim_1.Slim({ main: this });
644
- if (this.select.element.parentNode) {
645
- this.select.element.parentNode.insertBefore(this.slim.container, this.select.element.nextSibling);
646
- }
647
- if (info.data) {
648
- this.setData(info.data);
649
- }
650
- else {
651
- this.render();
652
- }
653
- document.addEventListener('click', this.documentClick);
654
- if (this.config.showContent === 'auto') {
655
- window.addEventListener('scroll', this.windowScroll, false);
656
- }
657
- if (info.beforeOnChange) {
658
- this.beforeOnChange = info.beforeOnChange;
659
- }
660
- if (info.onChange) {
661
- this.onChange = info.onChange;
662
- }
663
- if (info.beforeOpen) {
664
- this.beforeOpen = info.beforeOpen;
665
- }
666
- if (info.afterOpen) {
667
- this.afterOpen = info.afterOpen;
668
- }
669
- if (info.beforeClose) {
670
- this.beforeClose = info.beforeClose;
671
- }
672
- if (info.afterClose) {
673
- this.afterClose = info.afterClose;
674
- }
675
- if (!this.config.isEnabled) {
676
- this.disable();
677
- }
678
- }
679
- SlimSelect.prototype.validate = function (info) {
680
- var select = (typeof info.select === 'string' ? document.querySelector(info.select) : info.select);
681
- if (!select) {
682
- throw new Error('Could not find select element');
683
- }
684
- if (select.tagName !== 'SELECT') {
685
- throw new Error('Element isnt of type select');
686
- }
687
- return select;
688
- };
689
- SlimSelect.prototype.selected = function () {
690
- if (this.config.isMultiple) {
691
- var selected = this.data.getSelected();
692
- var outputSelected = [];
693
- for (var _i = 0, selected_1 = selected; _i < selected_1.length; _i++) {
694
- var s = selected_1[_i];
695
- outputSelected.push(s.value);
696
- }
697
- return outputSelected;
698
- }
699
- else {
700
- var selected = this.data.getSelected();
701
- return (selected ? selected.value : '');
702
- }
703
- };
704
- SlimSelect.prototype.set = function (value, type, close, render) {
705
- if (type === void 0) { type = 'value'; }
706
- if (close === void 0) { close = true; }
707
- if (render === void 0) { render = true; }
708
- if (this.config.isMultiple && !Array.isArray(value)) {
709
- this.data.addToSelected(value, type);
710
- }
711
- else {
712
- this.data.setSelected(value, type);
713
- }
714
- this.select.setValue();
715
- this.data.onDataChange();
716
- this.render();
717
- if (this.config.hideSelectedOption && this.config.isMultiple && this.data.getSelected().length === this.data.data.length) {
718
- close = true;
719
- }
720
- if (close) {
721
- this.close();
722
- }
723
- };
724
- SlimSelect.prototype.setSelected = function (value, type, close, render) {
725
- if (type === void 0) { type = 'value'; }
726
- if (close === void 0) { close = true; }
727
- if (render === void 0) { render = true; }
728
- this.set(value, type, close, render);
729
- };
730
- SlimSelect.prototype.setData = function (data) {
731
- var isValid = (0, data_1.validateData)(data);
732
- if (!isValid) {
733
- console.error('Validation problem on: #' + this.select.element.id);
734
- return;
735
- }
736
- var newData = JSON.parse(JSON.stringify(data));
737
- var selected = this.data.getSelected();
738
- for (var i = 0; i < newData.length; i++) {
739
- if (!newData[i].value && !newData[i].placeholder) {
740
- newData[i].value = newData[i].text;
741
- }
742
- }
743
- if (this.config.isAjax && selected) {
744
- if (this.config.isMultiple) {
745
- var reverseSelected = selected.reverse();
746
- for (var _i = 0, reverseSelected_1 = reverseSelected; _i < reverseSelected_1.length; _i++) {
747
- var r = reverseSelected_1[_i];
748
- newData.unshift(r);
749
- }
750
- }
751
- else {
752
- newData.unshift(selected);
753
- for (var i = 0; i < newData.length; i++) {
754
- if (!newData[i].placeholder && newData[i].value === selected.value && newData[i].text === selected.text) {
755
- newData.splice(i, 1);
756
- }
757
- }
758
- var hasPlaceholder = false;
759
- for (var i = 0; i < newData.length; i++) {
760
- if (newData[i].placeholder) {
761
- hasPlaceholder = true;
762
- }
763
- }
764
- if (!hasPlaceholder) {
765
- newData.unshift({ text: '', placeholder: true });
766
- }
767
- }
768
- }
769
- this.select.create(newData);
770
- this.data.parseSelectData();
771
- this.data.setSelectedFromSelect();
772
- };
773
- SlimSelect.prototype.addData = function (data) {
774
- var isValid = (0, data_1.validateData)([data]);
775
- if (!isValid) {
776
- console.error('Validation problem on: #' + this.select.element.id);
777
- return;
778
- }
779
- this.data.add(this.data.newOption(data));
780
- this.select.create(this.data.data);
781
- this.data.parseSelectData();
782
- this.data.setSelectedFromSelect();
783
- this.render();
784
- };
785
- SlimSelect.prototype.open = function () {
786
- var _this = this;
787
- if (!this.config.isEnabled) {
788
- return;
789
- }
790
- if (this.data.contentOpen) {
791
- return;
792
- }
793
- if (this.config.hideSelectedOption && this.config.isMultiple && this.data.getSelected().length === this.data.data.length) {
794
- return;
795
- }
796
- if (this.beforeOpen) {
797
- this.beforeOpen();
798
- }
799
- if (this.config.isMultiple && this.slim.multiSelected) {
800
- this.slim.multiSelected.plus.classList.add('ss-cross');
801
- }
802
- else if (this.slim.singleSelected) {
803
- this.slim.singleSelected.arrowIcon.arrow.classList.remove('arrow-down');
804
- this.slim.singleSelected.arrowIcon.arrow.classList.add('arrow-up');
805
- }
806
- this.slim[(this.config.isMultiple ? 'multiSelected' : 'singleSelected')].container.classList.add((this.data.contentPosition === 'above' ? this.config.openAbove : this.config.openBelow));
807
- if (this.config.addToBody) {
808
- var containerRect = this.slim.container.getBoundingClientRect();
809
- this.slim.content.style.top = (containerRect.top + containerRect.height + window.scrollY) + 'px';
810
- this.slim.content.style.left = (containerRect.left + window.scrollX) + 'px';
811
- this.slim.content.style.width = containerRect.width + 'px';
812
- }
813
- this.slim.content.classList.add(this.config.open);
814
- if (this.config.showContent.toLowerCase() === 'up') {
815
- this.moveContentAbove();
816
- }
817
- else if (this.config.showContent.toLowerCase() === 'down') {
818
- this.moveContentBelow();
819
- }
820
- else {
821
- if ((0, helper_1.putContent)(this.slim.content, this.data.contentPosition, this.data.contentOpen) === 'above') {
822
- this.moveContentAbove();
823
- }
824
- else {
825
- this.moveContentBelow();
826
- }
827
- }
828
- if (!this.config.isMultiple) {
829
- var selected = this.data.getSelected();
830
- if (selected) {
831
- var selectedId = selected.id;
832
- var selectedOption = this.slim.list.querySelector('[data-id="' + selectedId + '"]');
833
- if (selectedOption) {
834
- (0, helper_1.ensureElementInView)(this.slim.list, selectedOption);
835
- }
836
- }
837
- }
838
- setTimeout(function () {
839
- _this.data.contentOpen = true;
840
- if (_this.config.searchFocus) {
841
- _this.slim.search.input.focus();
842
- }
843
- if (_this.afterOpen) {
844
- _this.afterOpen();
845
- }
846
- }, this.config.timeoutDelay);
847
- };
848
- SlimSelect.prototype.close = function () {
849
- var _this = this;
850
- if (!this.data.contentOpen) {
851
- return;
852
- }
853
- if (this.beforeClose) {
854
- this.beforeClose();
855
- }
856
- if (this.config.isMultiple && this.slim.multiSelected) {
857
- this.slim.multiSelected.container.classList.remove(this.config.openAbove);
858
- this.slim.multiSelected.container.classList.remove(this.config.openBelow);
859
- this.slim.multiSelected.plus.classList.remove('ss-cross');
860
- }
861
- else if (this.slim.singleSelected) {
862
- this.slim.singleSelected.container.classList.remove(this.config.openAbove);
863
- this.slim.singleSelected.container.classList.remove(this.config.openBelow);
864
- this.slim.singleSelected.arrowIcon.arrow.classList.add('arrow-down');
865
- this.slim.singleSelected.arrowIcon.arrow.classList.remove('arrow-up');
866
- }
867
- this.slim.content.classList.remove(this.config.open);
868
- this.data.contentOpen = false;
869
- this.search('');
870
- setTimeout(function () {
871
- _this.slim.content.removeAttribute('style');
872
- _this.data.contentPosition = 'below';
873
- if (_this.config.isMultiple && _this.slim.multiSelected) {
874
- _this.slim.multiSelected.container.classList.remove(_this.config.openAbove);
875
- _this.slim.multiSelected.container.classList.remove(_this.config.openBelow);
876
- }
877
- else if (_this.slim.singleSelected) {
878
- _this.slim.singleSelected.container.classList.remove(_this.config.openAbove);
879
- _this.slim.singleSelected.container.classList.remove(_this.config.openBelow);
880
- }
881
- _this.slim.search.input.blur();
882
- if (_this.afterClose) {
883
- _this.afterClose();
884
- }
885
- }, this.config.timeoutDelay);
886
- };
887
- SlimSelect.prototype.moveContentAbove = function () {
888
- var selectHeight = 0;
889
- if (this.config.isMultiple && this.slim.multiSelected) {
890
- selectHeight = this.slim.multiSelected.container.offsetHeight;
891
- }
892
- else if (this.slim.singleSelected) {
893
- selectHeight = this.slim.singleSelected.container.offsetHeight;
894
- }
895
- var contentHeight = this.slim.content.offsetHeight;
896
- var height = selectHeight + contentHeight - 1;
897
- this.slim.content.style.margin = '-' + height + 'px 0 0 0';
898
- this.slim.content.style.height = (height - selectHeight + 1) + 'px';
899
- this.slim.content.style.transformOrigin = 'center bottom';
900
- this.data.contentPosition = 'above';
901
- if (this.config.isMultiple && this.slim.multiSelected) {
902
- this.slim.multiSelected.container.classList.remove(this.config.openBelow);
903
- this.slim.multiSelected.container.classList.add(this.config.openAbove);
904
- }
905
- else if (this.slim.singleSelected) {
906
- this.slim.singleSelected.container.classList.remove(this.config.openBelow);
907
- this.slim.singleSelected.container.classList.add(this.config.openAbove);
908
- }
909
- };
910
- SlimSelect.prototype.moveContentBelow = function () {
911
- this.data.contentPosition = 'below';
912
- if (this.config.isMultiple && this.slim.multiSelected) {
913
- this.slim.multiSelected.container.classList.remove(this.config.openAbove);
914
- this.slim.multiSelected.container.classList.add(this.config.openBelow);
915
- }
916
- else if (this.slim.singleSelected) {
917
- this.slim.singleSelected.container.classList.remove(this.config.openAbove);
918
- this.slim.singleSelected.container.classList.add(this.config.openBelow);
919
- }
920
- };
921
- SlimSelect.prototype.enable = function () {
922
- this.config.isEnabled = true;
923
- if (this.config.isMultiple && this.slim.multiSelected) {
924
- this.slim.multiSelected.container.classList.remove(this.config.disabled);
925
- }
926
- else if (this.slim.singleSelected) {
927
- this.slim.singleSelected.container.classList.remove(this.config.disabled);
928
- }
929
- this.select.triggerMutationObserver = false;
930
- this.select.element.disabled = false;
931
- this.slim.search.input.disabled = false;
932
- this.select.triggerMutationObserver = true;
933
- };
934
- SlimSelect.prototype.disable = function () {
935
- this.config.isEnabled = false;
936
- if (this.config.isMultiple && this.slim.multiSelected) {
937
- this.slim.multiSelected.container.classList.add(this.config.disabled);
938
- }
939
- else if (this.slim.singleSelected) {
940
- this.slim.singleSelected.container.classList.add(this.config.disabled);
941
- }
942
- this.select.triggerMutationObserver = false;
943
- this.select.element.disabled = true;
944
- this.slim.search.input.disabled = true;
945
- this.select.triggerMutationObserver = true;
946
- };
947
- SlimSelect.prototype.search = function (value) {
948
- if (this.data.searchValue === value) {
949
- return;
950
- }
951
- this.slim.search.input.value = value;
952
- if (this.config.isAjax) {
953
- var master_1 = this;
954
- this.config.isSearching = true;
955
- this.render();
956
- if (this.ajax) {
957
- this.ajax(value, function (info) {
958
- master_1.config.isSearching = false;
959
- if (Array.isArray(info)) {
960
- info.unshift({ text: '', placeholder: true });
961
- master_1.setData(info);
962
- master_1.data.search(value);
963
- master_1.render();
964
- }
965
- else if (typeof info === 'string') {
966
- master_1.slim.options(info);
967
- }
968
- else {
969
- master_1.render();
970
- }
971
- });
972
- }
973
- }
974
- else {
975
- this.data.search(value);
976
- this.render();
977
- }
978
- };
979
- SlimSelect.prototype.setSearchText = function (text) {
980
- this.config.searchText = text;
981
- };
982
- SlimSelect.prototype.render = function () {
983
- if (this.config.isMultiple) {
984
- this.slim.values();
985
- }
986
- else {
987
- this.slim.placeholder();
988
- this.slim.deselect();
989
- }
990
- this.slim.options();
991
- };
992
- SlimSelect.prototype.destroy = function (id) {
993
- if (id === void 0) { id = null; }
994
- var slim = (id ? document.querySelector('.' + id + '.ss-main') : this.slim.container);
995
- var select = (id ? document.querySelector("[data-ssid=".concat(id, "]")) : this.select.element);
996
- if (!slim || !select) {
997
- return;
998
- }
999
- document.removeEventListener('click', this.documentClick);
1000
- if (this.config.showContent === 'auto') {
1001
- window.removeEventListener('scroll', this.windowScroll, false);
1002
- }
1003
- select.style.display = '';
1004
- delete select.dataset.ssid;
1005
- var el = select;
1006
- el.slim = null;
1007
- if (slim.parentElement) {
1008
- slim.parentElement.removeChild(slim);
1009
- }
1010
- if (this.config.addToBody) {
1011
- var slimContent = (id ? document.querySelector('.' + id + '.ss-content') : this.slim.content);
1012
- if (!slimContent) {
1013
- return;
1014
- }
1015
- document.body.removeChild(slimContent);
1016
- }
1017
- };
1018
- return SlimSelect;
1019
- }());
1020
- exports["default"] = SlimSelect;
1021
-
1022
-
1023
- /***/ }),
1024
- /* 3 */
1025
- /***/ (function(module, exports, __webpack_require__) {
1026
-
1027
- "use strict";
1028
-
1029
- exports.__esModule = true;
1030
- exports.Config = void 0;
1031
- var Config = (function () {
1032
- function Config(info) {
1033
- this.id = '';
1034
- this.isMultiple = false;
1035
- this.isAjax = false;
1036
- this.isSearching = false;
1037
- this.showSearch = true;
1038
- this.searchFocus = true;
1039
- this.searchHighlight = false;
1040
- this.closeOnSelect = true;
1041
- this.showContent = 'auto';
1042
- this.searchPlaceholder = 'Search';
1043
- this.searchText = 'No Results';
1044
- this.searchingText = 'Searching...';
1045
- this.placeholderText = 'Select Value';
1046
- this.allowDeselect = false;
1047
- this.allowDeselectOption = false;
1048
- this.hideSelectedOption = false;
1049
- this.deselectLabel = 'x';
1050
- this.isEnabled = true;
1051
- this.valuesUseText = false;
1052
- this.showOptionTooltips = false;
1053
- this.selectByGroup = false;
1054
- this.limit = 0;
1055
- this.timeoutDelay = 200;
1056
- this.addToBody = false;
1057
- this.main = 'ss-main';
1058
- this.singleSelected = 'ss-single-selected';
1059
- this.arrow = 'ss-arrow';
1060
- this.multiSelected = 'ss-multi-selected';
1061
- this.add = 'ss-add';
1062
- this.plus = 'ss-plus';
1063
- this.values = 'ss-values';
1064
- this.value = 'ss-value';
1065
- this.valueText = 'ss-value-text';
1066
- this.valueDelete = 'ss-value-delete';
1067
- this.content = 'ss-content';
1068
- this.open = 'ss-open';
1069
- this.openAbove = 'ss-open-above';
1070
- this.openBelow = 'ss-open-below';
1071
- this.search = 'ss-search';
1072
- this.searchHighlighter = 'ss-search-highlight';
1073
- this.addable = 'ss-addable';
1074
- this.list = 'ss-list';
1075
- this.optgroup = 'ss-optgroup';
1076
- this.optgroupLabel = 'ss-optgroup-label';
1077
- this.optgroupLabelSelectable = 'ss-optgroup-label-selectable';
1078
- this.option = 'ss-option';
1079
- this.optionSelected = 'ss-option-selected';
1080
- this.highlighted = 'ss-highlighted';
1081
- this.disabled = 'ss-disabled';
1082
- this.hide = 'ss-hide';
1083
- this.id = 'ss-' + Math.floor(Math.random() * 100000);
1084
- this.style = info.select.style.cssText;
1085
- this["class"] = info.select.className.split(' ');
1086
- this.isMultiple = info.select.multiple;
1087
- this.isAjax = info.isAjax;
1088
- this.showSearch = (info.showSearch === false ? false : true);
1089
- this.searchFocus = (info.searchFocus === false ? false : true);
1090
- this.searchHighlight = (info.searchHighlight === true ? true : false);
1091
- this.closeOnSelect = (info.closeOnSelect === false ? false : true);
1092
- if (info.showContent) {
1093
- this.showContent = info.showContent;
1094
- }
1095
- this.isEnabled = (info.isEnabled === false ? false : true);
1096
- if (info.searchPlaceholder) {
1097
- this.searchPlaceholder = info.searchPlaceholder;
1098
- }
1099
- if (info.searchText) {
1100
- this.searchText = info.searchText;
1101
- }
1102
- if (info.searchingText) {
1103
- this.searchingText = info.searchingText;
1104
- }
1105
- if (info.placeholderText) {
1106
- this.placeholderText = info.placeholderText;
1107
- }
1108
- this.allowDeselect = (info.allowDeselect === true ? true : false);
1109
- this.allowDeselectOption = (info.allowDeselectOption === true ? true : false);
1110
- this.hideSelectedOption = (info.hideSelectedOption === true ? true : false);
1111
- if (info.deselectLabel) {
1112
- this.deselectLabel = info.deselectLabel;
1113
- }
1114
- if (info.valuesUseText) {
1115
- this.valuesUseText = info.valuesUseText;
1116
- }
1117
- if (info.showOptionTooltips) {
1118
- this.showOptionTooltips = info.showOptionTooltips;
1119
- }
1120
- if (info.selectByGroup) {
1121
- this.selectByGroup = info.selectByGroup;
1122
- }
1123
- if (info.limit) {
1124
- this.limit = info.limit;
1125
- }
1126
- if (info.searchFilter) {
1127
- this.searchFilter = info.searchFilter;
1128
- }
1129
- if (info.timeoutDelay != null) {
1130
- this.timeoutDelay = info.timeoutDelay;
1131
- }
1132
- this.addToBody = (info.addToBody === true ? true : false);
1133
- }
1134
- Config.prototype.searchFilter = function (opt, search) {
1135
- return opt.text.toLowerCase().indexOf(search.toLowerCase()) !== -1;
1136
- };
1137
- return Config;
1138
- }());
1139
- exports.Config = Config;
1140
-
1141
-
1142
- /***/ }),
1143
- /* 4 */
1144
- /***/ (function(module, exports, __webpack_require__) {
1145
-
1146
- "use strict";
1147
-
1148
- exports.__esModule = true;
1149
- exports.Select = void 0;
1150
- var helper_1 = __webpack_require__(0);
1151
- var Select = (function () {
1152
- function Select(info) {
1153
- this.triggerMutationObserver = true;
1154
- this.element = info.select;
1155
- this.main = info.main;
1156
- if (this.element.disabled) {
1157
- this.main.config.isEnabled = false;
1158
- }
1159
- this.addAttributes();
1160
- this.addEventListeners();
1161
- this.mutationObserver = null;
1162
- this.addMutationObserver();
1163
- var el = this.element;
1164
- el.slim = info.main;
1165
- }
1166
- Select.prototype.setValue = function () {
1167
- if (!this.main.data.getSelected()) {
1168
- return;
1169
- }
1170
- if (this.main.config.isMultiple) {
1171
- var selected = this.main.data.getSelected();
1172
- var options = this.element.options;
1173
- for (var _i = 0, options_1 = options; _i < options_1.length; _i++) {
1174
- var o = options_1[_i];
1175
- o.selected = false;
1176
- for (var _a = 0, selected_1 = selected; _a < selected_1.length; _a++) {
1177
- var s = selected_1[_a];
1178
- if (s.value === o.value) {
1179
- o.selected = true;
1180
- }
1181
- }
1182
- }
1183
- }
1184
- else {
1185
- var selected = this.main.data.getSelected();
1186
- this.element.value = (selected ? selected.value : '');
1187
- }
1188
- this.main.data.isOnChangeEnabled = false;
1189
- this.element.dispatchEvent(new CustomEvent('change', { bubbles: true }));
1190
- this.main.data.isOnChangeEnabled = true;
1191
- };
1192
- Select.prototype.addAttributes = function () {
1193
- this.element.tabIndex = -1;
1194
- this.element.style.display = 'none';
1195
- this.element.dataset.ssid = this.main.config.id;
1196
- this.element.setAttribute('aria-hidden', 'true');
1197
- };
1198
- Select.prototype.addEventListeners = function () {
1199
- var _this = this;
1200
- this.element.addEventListener('change', function (e) {
1201
- _this.main.data.setSelectedFromSelect();
1202
- _this.main.render();
1203
- });
1204
- };
1205
- Select.prototype.addMutationObserver = function () {
1206
- var _this = this;
1207
- if (this.main.config.isAjax) {
1208
- return;
1209
- }
1210
- this.mutationObserver = new MutationObserver(function (mutations) {
1211
- if (!_this.triggerMutationObserver) {
1212
- return;
1213
- }
1214
- _this.main.data.parseSelectData();
1215
- _this.main.data.setSelectedFromSelect();
1216
- _this.main.render();
1217
- mutations.forEach(function (mutation) {
1218
- if (mutation.attributeName === 'class') {
1219
- _this.main.slim.updateContainerDivClass(_this.main.slim.container);
1220
- }
1221
- });
1222
- });
1223
- this.observeMutationObserver();
1224
- };
1225
- Select.prototype.observeMutationObserver = function () {
1226
- if (!this.mutationObserver) {
1227
- return;
1228
- }
1229
- this.mutationObserver.observe(this.element, {
1230
- attributes: true,
1231
- childList: true,
1232
- characterData: true
1233
- });
1234
- };
1235
- Select.prototype.disconnectMutationObserver = function () {
1236
- if (this.mutationObserver) {
1237
- this.mutationObserver.disconnect();
1238
- }
1239
- };
1240
- Select.prototype.create = function (data) {
1241
- this.element.innerHTML = '';
1242
- for (var _i = 0, data_1 = data; _i < data_1.length; _i++) {
1243
- var d = data_1[_i];
1244
- if (d.hasOwnProperty('options')) {
1245
- var optgroupObject = d;
1246
- var optgroupEl = document.createElement('optgroup');
1247
- optgroupEl.label = optgroupObject.label;
1248
- if (optgroupObject.options) {
1249
- for (var _a = 0, _b = optgroupObject.options; _a < _b.length; _a++) {
1250
- var oo = _b[_a];
1251
- optgroupEl.appendChild(this.createOption(oo));
1252
- }
1253
- }
1254
- this.element.appendChild(optgroupEl);
1255
- }
1256
- else {
1257
- this.element.appendChild(this.createOption(d));
1258
- }
1259
- }
1260
- };
1261
- Select.prototype.createOption = function (info) {
1262
- var optionEl = document.createElement('option');
1263
- optionEl.value = info.value !== '' ? info.value : info.text;
1264
- optionEl.innerHTML = info.innerHTML || info.text;
1265
- if (info.selected) {
1266
- optionEl.selected = info.selected;
1267
- }
1268
- if (info.display === false) {
1269
- optionEl.style.display = 'none';
1270
- }
1271
- if (info.disabled) {
1272
- optionEl.disabled = true;
1273
- }
1274
- if (info.placeholder) {
1275
- optionEl.setAttribute('data-placeholder', 'true');
1276
- }
1277
- if (info.mandatory) {
1278
- optionEl.setAttribute('data-mandatory', 'true');
1279
- }
1280
- if (info["class"]) {
1281
- info["class"].split(' ').forEach(function (optionClass) {
1282
- optionEl.classList.add(optionClass);
1283
- });
1284
- }
1285
- if (info.data && typeof info.data === 'object') {
1286
- Object.keys(info.data).forEach(function (key) {
1287
- optionEl.setAttribute('data-' + (0, helper_1.kebabCase)(key), info.data[key]);
1288
- });
1289
- }
1290
- return optionEl;
1291
- };
1292
- return Select;
1293
- }());
1294
- exports.Select = Select;
1295
-
1296
-
1297
- /***/ }),
1298
- /* 5 */
1299
- /***/ (function(module, exports, __webpack_require__) {
1300
-
1301
- "use strict";
1302
-
1303
- exports.__esModule = true;
1304
- exports.Slim = void 0;
1305
- var helper_1 = __webpack_require__(0);
1306
- var data_1 = __webpack_require__(1);
1307
- var Slim = (function () {
1308
- function Slim(info) {
1309
- this.main = info.main;
1310
- this.container = this.containerDiv();
1311
- this.content = this.contentDiv();
1312
- this.search = this.searchDiv();
1313
- this.list = this.listDiv();
1314
- this.options();
1315
- this.singleSelected = null;
1316
- this.multiSelected = null;
1317
- if (this.main.config.isMultiple) {
1318
- this.multiSelected = this.multiSelectedDiv();
1319
- if (this.multiSelected) {
1320
- this.container.appendChild(this.multiSelected.container);
1321
- }
1322
- }
1323
- else {
1324
- this.singleSelected = this.singleSelectedDiv();
1325
- this.container.appendChild(this.singleSelected.container);
1326
- }
1327
- if (this.main.config.addToBody) {
1328
- this.content.classList.add(this.main.config.id);
1329
- document.body.appendChild(this.content);
1330
- }
1331
- else {
1332
- this.container.appendChild(this.content);
1333
- }
1334
- this.content.appendChild(this.search.container);
1335
- this.content.appendChild(this.list);
1336
- }
1337
- Slim.prototype.containerDiv = function () {
1338
- var container = document.createElement('div');
1339
- container.style.cssText = this.main.config.style;
1340
- this.updateContainerDivClass(container);
1341
- return container;
1342
- };
1343
- Slim.prototype.updateContainerDivClass = function (container) {
1344
- this.main.config["class"] = this.main.select.element.className.split(' ');
1345
- container.className = '';
1346
- container.classList.add(this.main.config.id);
1347
- container.classList.add(this.main.config.main);
1348
- for (var _i = 0, _a = this.main.config["class"]; _i < _a.length; _i++) {
1349
- var c = _a[_i];
1350
- if (c.trim() !== '') {
1351
- container.classList.add(c);
1352
- }
1353
- }
1354
- };
1355
- Slim.prototype.singleSelectedDiv = function () {
1356
- var _this = this;
1357
- var container = document.createElement('div');
1358
- container.classList.add(this.main.config.singleSelected);
1359
- var placeholder = document.createElement('span');
1360
- placeholder.classList.add('placeholder');
1361
- container.appendChild(placeholder);
1362
- var deselect = document.createElement('span');
1363
- deselect.innerHTML = this.main.config.deselectLabel;
1364
- deselect.classList.add('ss-deselect');
1365
- deselect.onclick = function (e) {
1366
- e.stopPropagation();
1367
- if (!_this.main.config.isEnabled) {
1368
- return;
1369
- }
1370
- _this.main.set('');
1371
- };
1372
- container.appendChild(deselect);
1373
- var arrowContainer = document.createElement('span');
1374
- arrowContainer.classList.add(this.main.config.arrow);
1375
- var arrowIcon = document.createElement('span');
1376
- arrowIcon.classList.add('arrow-down');
1377
- arrowContainer.appendChild(arrowIcon);
1378
- container.appendChild(arrowContainer);
1379
- container.onclick = function () {
1380
- if (!_this.main.config.isEnabled) {
1381
- return;
1382
- }
1383
- _this.main.data.contentOpen ? _this.main.close() : _this.main.open();
1384
- };
1385
- return {
1386
- container: container,
1387
- placeholder: placeholder,
1388
- deselect: deselect,
1389
- arrowIcon: {
1390
- container: arrowContainer,
1391
- arrow: arrowIcon
1392
- }
1393
- };
1394
- };
1395
- Slim.prototype.placeholder = function () {
1396
- var selected = this.main.data.getSelected();
1397
- if (selected === null || (selected && selected.placeholder)) {
1398
- var placeholder = document.createElement('span');
1399
- placeholder.classList.add(this.main.config.disabled);
1400
- placeholder.innerHTML = this.main.config.placeholderText;
1401
- if (this.singleSelected) {
1402
- this.singleSelected.placeholder.innerHTML = placeholder.outerHTML;
1403
- }
1404
- }
1405
- else {
1406
- var selectedValue = '';
1407
- if (selected) {
1408
- selectedValue = selected.innerHTML && this.main.config.valuesUseText !== true ? selected.innerHTML : selected.text;
1409
- }
1410
- if (this.singleSelected) {
1411
- this.singleSelected.placeholder.innerHTML = (selected ? selectedValue : '');
1412
- }
1413
- }
1414
- };
1415
- Slim.prototype.deselect = function () {
1416
- if (this.singleSelected) {
1417
- if (!this.main.config.allowDeselect) {
1418
- this.singleSelected.deselect.classList.add('ss-hide');
1419
- return;
1420
- }
1421
- if (this.main.selected() === '') {
1422
- this.singleSelected.deselect.classList.add('ss-hide');
1423
- }
1424
- else {
1425
- this.singleSelected.deselect.classList.remove('ss-hide');
1426
- }
1427
- }
1428
- };
1429
- Slim.prototype.multiSelectedDiv = function () {
1430
- var _this = this;
1431
- var container = document.createElement('div');
1432
- container.classList.add(this.main.config.multiSelected);
1433
- var values = document.createElement('div');
1434
- values.classList.add(this.main.config.values);
1435
- container.appendChild(values);
1436
- var add = document.createElement('div');
1437
- add.classList.add(this.main.config.add);
1438
- var plus = document.createElement('span');
1439
- plus.classList.add(this.main.config.plus);
1440
- plus.onclick = function (e) {
1441
- if (_this.main.data.contentOpen) {
1442
- _this.main.close();
1443
- e.stopPropagation();
1444
- }
1445
- };
1446
- add.appendChild(plus);
1447
- container.appendChild(add);
1448
- container.onclick = function (e) {
1449
- if (!_this.main.config.isEnabled) {
1450
- return;
1451
- }
1452
- var target = e.target;
1453
- if (!target.classList.contains(_this.main.config.valueDelete)) {
1454
- _this.main.data.contentOpen ? _this.main.close() : _this.main.open();
1455
- }
1456
- };
1457
- return {
1458
- container: container,
1459
- values: values,
1460
- add: add,
1461
- plus: plus
1462
- };
1463
- };
1464
- Slim.prototype.values = function () {
1465
- if (!this.multiSelected) {
1466
- return;
1467
- }
1468
- var currentNodes = this.multiSelected.values.childNodes;
1469
- var selected = this.main.data.getSelected();
1470
- var exists;
1471
- var nodesToRemove = [];
1472
- for (var _i = 0, currentNodes_1 = currentNodes; _i < currentNodes_1.length; _i++) {
1473
- var c = currentNodes_1[_i];
1474
- exists = true;
1475
- for (var _a = 0, selected_1 = selected; _a < selected_1.length; _a++) {
1476
- var s = selected_1[_a];
1477
- if (String(s.id) === String(c.dataset.id)) {
1478
- exists = false;
1479
- }
1480
- }
1481
- if (exists) {
1482
- nodesToRemove.push(c);
1483
- }
1484
- }
1485
- for (var _b = 0, nodesToRemove_1 = nodesToRemove; _b < nodesToRemove_1.length; _b++) {
1486
- var n = nodesToRemove_1[_b];
1487
- n.classList.add('ss-out');
1488
- this.multiSelected.values.removeChild(n);
1489
- }
1490
- currentNodes = this.multiSelected.values.childNodes;
1491
- for (var s = 0; s < selected.length; s++) {
1492
- exists = false;
1493
- for (var _c = 0, currentNodes_2 = currentNodes; _c < currentNodes_2.length; _c++) {
1494
- var c = currentNodes_2[_c];
1495
- if (String(selected[s].id) === String(c.dataset.id)) {
1496
- exists = true;
1497
- }
1498
- }
1499
- if (!exists) {
1500
- if (currentNodes.length === 0 || !HTMLElement.prototype.insertAdjacentElement) {
1501
- this.multiSelected.values.appendChild(this.valueDiv(selected[s]));
1502
- }
1503
- else if (s === 0) {
1504
- this.multiSelected.values.insertBefore(this.valueDiv(selected[s]), currentNodes[s]);
1505
- }
1506
- else {
1507
- currentNodes[s - 1].insertAdjacentElement('afterend', this.valueDiv(selected[s]));
1508
- }
1509
- }
1510
- }
1511
- if (selected.length === 0) {
1512
- var placeholder = document.createElement('span');
1513
- placeholder.classList.add(this.main.config.disabled);
1514
- placeholder.innerHTML = this.main.config.placeholderText;
1515
- this.multiSelected.values.innerHTML = placeholder.outerHTML;
1516
- }
1517
- };
1518
- Slim.prototype.valueDiv = function (optionObj) {
1519
- var _this = this;
1520
- var value = document.createElement('div');
1521
- value.classList.add(this.main.config.value);
1522
- value.dataset.id = optionObj.id;
1523
- var text = document.createElement('span');
1524
- text.classList.add(this.main.config.valueText);
1525
- text.innerHTML = (optionObj.innerHTML && this.main.config.valuesUseText !== true ? optionObj.innerHTML : optionObj.text);
1526
- value.appendChild(text);
1527
- if (!optionObj.mandatory) {
1528
- var deleteSpan = document.createElement('span');
1529
- deleteSpan.classList.add(this.main.config.valueDelete);
1530
- deleteSpan.innerHTML = this.main.config.deselectLabel;
1531
- deleteSpan.onclick = function (e) {
1532
- e.preventDefault();
1533
- e.stopPropagation();
1534
- var shouldUpdate = false;
1535
- if (!_this.main.beforeOnChange) {
1536
- shouldUpdate = true;
1537
- }
1538
- if (_this.main.beforeOnChange) {
1539
- var selected = _this.main.data.getSelected();
1540
- var currentValues = JSON.parse(JSON.stringify(selected));
1541
- for (var i = 0; i < currentValues.length; i++) {
1542
- if (currentValues[i].id === optionObj.id) {
1543
- currentValues.splice(i, 1);
1544
- }
1545
- }
1546
- var beforeOnchange = _this.main.beforeOnChange(currentValues);
1547
- if (beforeOnchange !== false) {
1548
- shouldUpdate = true;
1549
- }
1550
- }
1551
- if (shouldUpdate) {
1552
- _this.main.data.removeFromSelected(optionObj.id, 'id');
1553
- _this.main.render();
1554
- _this.main.select.setValue();
1555
- _this.main.data.onDataChange();
1556
- }
1557
- };
1558
- value.appendChild(deleteSpan);
1559
- }
1560
- return value;
1561
- };
1562
- Slim.prototype.contentDiv = function () {
1563
- var container = document.createElement('div');
1564
- container.classList.add(this.main.config.content);
1565
- return container;
1566
- };
1567
- Slim.prototype.searchDiv = function () {
1568
- var _this = this;
1569
- var container = document.createElement('div');
1570
- var input = document.createElement('input');
1571
- var addable = document.createElement('div');
1572
- container.classList.add(this.main.config.search);
1573
- var searchReturn = {
1574
- container: container,
1575
- input: input
1576
- };
1577
- if (!this.main.config.showSearch) {
1578
- container.classList.add(this.main.config.hide);
1579
- input.readOnly = true;
1580
- }
1581
- input.type = 'search';
1582
- input.placeholder = this.main.config.searchPlaceholder;
1583
- input.tabIndex = 0;
1584
- input.setAttribute('aria-label', this.main.config.searchPlaceholder);
1585
- input.setAttribute('autocapitalize', 'off');
1586
- input.setAttribute('autocomplete', 'off');
1587
- input.setAttribute('autocorrect', 'off');
1588
- input.onclick = function (e) {
1589
- setTimeout(function () {
1590
- var target = e.target;
1591
- if (target.value === '') {
1592
- _this.main.search('');
1593
- }
1594
- }, 10);
1595
- };
1596
- input.onkeydown = function (e) {
1597
- if (e.key === 'ArrowUp') {
1598
- _this.main.open();
1599
- _this.highlightUp();
1600
- e.preventDefault();
1601
- }
1602
- else if (e.key === 'ArrowDown') {
1603
- _this.main.open();
1604
- _this.highlightDown();
1605
- e.preventDefault();
1606
- }
1607
- else if (e.key === 'Tab') {
1608
- if (!_this.main.data.contentOpen) {
1609
- setTimeout(function () { _this.main.close(); }, _this.main.config.timeoutDelay);
1610
- }
1611
- else {
1612
- _this.main.close();
1613
- }
1614
- }
1615
- else if (e.key === 'Enter') {
1616
- e.preventDefault();
1617
- }
1618
- };
1619
- input.onkeyup = function (e) {
1620
- var target = e.target;
1621
- if (e.key === 'Enter') {
1622
- if (_this.main.addable && e.ctrlKey) {
1623
- addable.click();
1624
- e.preventDefault();
1625
- e.stopPropagation();
1626
- return;
1627
- }
1628
- var highlighted = _this.list.querySelector('.' + _this.main.config.highlighted);
1629
- if (highlighted) {
1630
- highlighted.click();
1631
- }
1632
- }
1633
- else if (e.key === 'ArrowUp' || e.key === 'ArrowDown') {
1634
- }
1635
- else if (e.key === 'Escape') {
1636
- _this.main.close();
1637
- }
1638
- else {
1639
- if (_this.main.config.showSearch && _this.main.data.contentOpen) {
1640
- _this.main.search(target.value);
1641
- }
1642
- else {
1643
- input.value = '';
1644
- }
1645
- }
1646
- e.preventDefault();
1647
- e.stopPropagation();
1648
- };
1649
- input.onfocus = function () { _this.main.open(); };
1650
- container.appendChild(input);
1651
- if (this.main.addable) {
1652
- addable.classList.add(this.main.config.addable);
1653
- addable.innerHTML = '+';
1654
- addable.onclick = function (e) {
1655
- if (_this.main.addable) {
1656
- e.preventDefault();
1657
- e.stopPropagation();
1658
- var inputValue = _this.search.input.value;
1659
- if (inputValue.trim() === '') {
1660
- _this.search.input.focus();
1661
- return;
1662
- }
1663
- var addableValue = _this.main.addable(inputValue);
1664
- var addableValueStr_1 = '';
1665
- if (!addableValue) {
1666
- return;
1667
- }
1668
- if (typeof addableValue === 'object') {
1669
- var validValue = (0, data_1.validateOption)(addableValue);
1670
- if (validValue) {
1671
- _this.main.addData(addableValue);
1672
- addableValueStr_1 = (addableValue.value ? addableValue.value : addableValue.text);
1673
- }
1674
- }
1675
- else {
1676
- _this.main.addData(_this.main.data.newOption({
1677
- text: addableValue,
1678
- value: addableValue
1679
- }));
1680
- addableValueStr_1 = addableValue;
1681
- }
1682
- _this.main.search('');
1683
- setTimeout(function () {
1684
- _this.main.set(addableValueStr_1, 'value', false, false);
1685
- }, 100);
1686
- if (_this.main.config.closeOnSelect) {
1687
- setTimeout(function () {
1688
- _this.main.close();
1689
- }, 100);
1690
- }
1691
- }
1692
- };
1693
- container.appendChild(addable);
1694
- searchReturn.addable = addable;
1695
- }
1696
- return searchReturn;
1697
- };
1698
- Slim.prototype.highlightUp = function () {
1699
- var highlighted = this.list.querySelector('.' + this.main.config.highlighted);
1700
- var prev = null;
1701
- if (highlighted) {
1702
- prev = highlighted.previousSibling;
1703
- while (prev !== null) {
1704
- if (prev.classList.contains(this.main.config.disabled)) {
1705
- prev = prev.previousSibling;
1706
- continue;
1707
- }
1708
- else {
1709
- break;
1710
- }
1711
- }
1712
- }
1713
- else {
1714
- var allOptions = this.list.querySelectorAll('.' + this.main.config.option + ':not(.' + this.main.config.disabled + ')');
1715
- prev = allOptions[allOptions.length - 1];
1716
- }
1717
- if (prev && prev.classList.contains(this.main.config.optgroupLabel)) {
1718
- prev = null;
1719
- }
1720
- if (prev === null) {
1721
- var parent_1 = highlighted.parentNode;
1722
- if (parent_1.classList.contains(this.main.config.optgroup)) {
1723
- if (parent_1.previousSibling) {
1724
- var prevNodes = parent_1.previousSibling.querySelectorAll('.' + this.main.config.option + ':not(.' + this.main.config.disabled + ')');
1725
- if (prevNodes.length) {
1726
- prev = prevNodes[prevNodes.length - 1];
1727
- }
1728
- }
1729
- }
1730
- }
1731
- if (prev) {
1732
- if (highlighted) {
1733
- highlighted.classList.remove(this.main.config.highlighted);
1734
- }
1735
- prev.classList.add(this.main.config.highlighted);
1736
- (0, helper_1.ensureElementInView)(this.list, prev);
1737
- }
1738
- };
1739
- Slim.prototype.highlightDown = function () {
1740
- var highlighted = this.list.querySelector('.' + this.main.config.highlighted);
1741
- var next = null;
1742
- if (highlighted) {
1743
- next = highlighted.nextSibling;
1744
- while (next !== null) {
1745
- if (next.classList.contains(this.main.config.disabled)) {
1746
- next = next.nextSibling;
1747
- continue;
1748
- }
1749
- else {
1750
- break;
1751
- }
1752
- }
1753
- }
1754
- else {
1755
- next = this.list.querySelector('.' + this.main.config.option + ':not(.' + this.main.config.disabled + ')');
1756
- }
1757
- if (next === null && highlighted !== null) {
1758
- var parent_2 = highlighted.parentNode;
1759
- if (parent_2.classList.contains(this.main.config.optgroup)) {
1760
- if (parent_2.nextSibling) {
1761
- var sibling = parent_2.nextSibling;
1762
- next = sibling.querySelector('.' + this.main.config.option + ':not(.' + this.main.config.disabled + ')');
1763
- }
1764
- }
1765
- }
1766
- if (next) {
1767
- if (highlighted) {
1768
- highlighted.classList.remove(this.main.config.highlighted);
1769
- }
1770
- next.classList.add(this.main.config.highlighted);
1771
- (0, helper_1.ensureElementInView)(this.list, next);
1772
- }
1773
- };
1774
- Slim.prototype.listDiv = function () {
1775
- var list = document.createElement('div');
1776
- list.classList.add(this.main.config.list);
1777
- list.setAttribute('role', 'listbox');
1778
- return list;
1779
- };
1780
- Slim.prototype.options = function (content) {
1781
- if (content === void 0) { content = ''; }
1782
- var data = this.main.data.filtered || this.main.data.data;
1783
- this.list.innerHTML = '';
1784
- if (content !== '') {
1785
- var searching = document.createElement('div');
1786
- searching.classList.add(this.main.config.option);
1787
- searching.classList.add(this.main.config.disabled);
1788
- searching.innerHTML = content;
1789
- this.list.appendChild(searching);
1790
- return;
1791
- }
1792
- if (this.main.config.isAjax && this.main.config.isSearching) {
1793
- var searching = document.createElement('div');
1794
- searching.classList.add(this.main.config.option);
1795
- searching.classList.add(this.main.config.disabled);
1796
- searching.innerHTML = this.main.config.searchingText;
1797
- this.list.appendChild(searching);
1798
- return;
1799
- }
1800
- if (data.length === 0) {
1801
- var noResults = document.createElement('div');
1802
- noResults.classList.add(this.main.config.option);
1803
- noResults.classList.add(this.main.config.disabled);
1804
- noResults.innerHTML = this.main.config.searchText;
1805
- this.list.appendChild(noResults);
1806
- return;
1807
- }
1808
- var _loop_1 = function (d) {
1809
- if (d.hasOwnProperty('label')) {
1810
- var item = d;
1811
- var optgroupEl_1 = document.createElement('div');
1812
- optgroupEl_1.classList.add(this_1.main.config.optgroup);
1813
- var optgroupLabel = document.createElement('div');
1814
- optgroupLabel.classList.add(this_1.main.config.optgroupLabel);
1815
- if (this_1.main.config.selectByGroup && this_1.main.config.isMultiple) {
1816
- optgroupLabel.classList.add(this_1.main.config.optgroupLabelSelectable);
1817
- }
1818
- optgroupLabel.innerHTML = item.label;
1819
- optgroupEl_1.appendChild(optgroupLabel);
1820
- var options = item.options;
1821
- if (options) {
1822
- for (var _a = 0, options_1 = options; _a < options_1.length; _a++) {
1823
- var o = options_1[_a];
1824
- optgroupEl_1.appendChild(this_1.option(o));
1825
- }
1826
- if (this_1.main.config.selectByGroup && this_1.main.config.isMultiple) {
1827
- var master_1 = this_1;
1828
- optgroupLabel.addEventListener('click', function (e) {
1829
- e.preventDefault();
1830
- e.stopPropagation();
1831
- for (var _i = 0, _a = optgroupEl_1.children; _i < _a.length; _i++) {
1832
- var childEl = _a[_i];
1833
- if (childEl.className.indexOf(master_1.main.config.option) !== -1) {
1834
- childEl.click();
1835
- }
1836
- }
1837
- });
1838
- }
1839
- }
1840
- this_1.list.appendChild(optgroupEl_1);
1841
- }
1842
- else {
1843
- this_1.list.appendChild(this_1.option(d));
1844
- }
1845
- };
1846
- var this_1 = this;
1847
- for (var _i = 0, data_2 = data; _i < data_2.length; _i++) {
1848
- var d = data_2[_i];
1849
- _loop_1(d);
1850
- }
1851
- };
1852
- Slim.prototype.option = function (data) {
1853
- if (data.placeholder) {
1854
- var placeholder = document.createElement('div');
1855
- placeholder.classList.add(this.main.config.option);
1856
- placeholder.classList.add(this.main.config.hide);
1857
- return placeholder;
1858
- }
1859
- var optionEl = document.createElement('div');
1860
- optionEl.classList.add(this.main.config.option);
1861
- optionEl.setAttribute('role', 'option');
1862
- if (data["class"]) {
1863
- data["class"].split(' ').forEach(function (dataClass) {
1864
- optionEl.classList.add(dataClass);
1865
- });
1866
- }
1867
- if (data.style) {
1868
- optionEl.style.cssText = data.style;
1869
- }
1870
- var selected = this.main.data.getSelected();
1871
- optionEl.dataset.id = data.id;
1872
- if (this.main.config.searchHighlight && this.main.slim && data.innerHTML && this.main.slim.search.input.value.trim() !== '') {
1873
- optionEl.innerHTML = (0, helper_1.highlight)(data.innerHTML, this.main.slim.search.input.value, this.main.config.searchHighlighter);
1874
- }
1875
- else if (data.innerHTML) {
1876
- optionEl.innerHTML = data.innerHTML;
1877
- }
1878
- if (this.main.config.showOptionTooltips && optionEl.textContent) {
1879
- optionEl.setAttribute('title', optionEl.textContent);
1880
- }
1881
- var master = this;
1882
- optionEl.addEventListener('click', function (e) {
1883
- e.preventDefault();
1884
- e.stopPropagation();
1885
- var element = this;
1886
- var elementID = element.dataset.id;
1887
- if (data.selected === true && master.main.config.allowDeselectOption) {
1888
- var shouldUpdate = false;
1889
- if (!master.main.beforeOnChange || !master.main.config.isMultiple) {
1890
- shouldUpdate = true;
1891
- }
1892
- if (master.main.beforeOnChange && master.main.config.isMultiple) {
1893
- var selectedValues = master.main.data.getSelected();
1894
- var currentValues = JSON.parse(JSON.stringify(selectedValues));
1895
- for (var i = 0; i < currentValues.length; i++) {
1896
- if (currentValues[i].id === elementID) {
1897
- currentValues.splice(i, 1);
1898
- }
1899
- }
1900
- var beforeOnchange = master.main.beforeOnChange(currentValues);
1901
- if (beforeOnchange !== false) {
1902
- shouldUpdate = true;
1903
- }
1904
- }
1905
- if (shouldUpdate) {
1906
- if (master.main.config.isMultiple) {
1907
- master.main.data.removeFromSelected(elementID, 'id');
1908
- master.main.render();
1909
- master.main.select.setValue();
1910
- master.main.data.onDataChange();
1911
- }
1912
- else {
1913
- master.main.set('');
1914
- }
1915
- }
1916
- }
1917
- else {
1918
- if (data.disabled || data.selected) {
1919
- return;
1920
- }
1921
- if (master.main.config.limit && Array.isArray(selected) && master.main.config.limit <= selected.length) {
1922
- return;
1923
- }
1924
- if (master.main.beforeOnChange) {
1925
- var value = void 0;
1926
- var objectInfo = JSON.parse(JSON.stringify(master.main.data.getObjectFromData(elementID)));
1927
- objectInfo.selected = true;
1928
- if (master.main.config.isMultiple) {
1929
- value = JSON.parse(JSON.stringify(selected));
1930
- value.push(objectInfo);
1931
- }
1932
- else {
1933
- value = JSON.parse(JSON.stringify(objectInfo));
1934
- }
1935
- var beforeOnchange = master.main.beforeOnChange(value);
1936
- if (beforeOnchange !== false) {
1937
- master.main.set(elementID, 'id', master.main.config.closeOnSelect);
1938
- }
1939
- }
1940
- else {
1941
- master.main.set(elementID, 'id', master.main.config.closeOnSelect);
1942
- }
1943
- }
1944
- });
1945
- var isSelected = selected && (0, helper_1.isValueInArrayOfObjects)(selected, 'id', data.id);
1946
- if (data.disabled || isSelected) {
1947
- optionEl.onclick = null;
1948
- if (!master.main.config.allowDeselectOption) {
1949
- optionEl.classList.add(this.main.config.disabled);
1950
- }
1951
- if (master.main.config.hideSelectedOption) {
1952
- optionEl.classList.add(this.main.config.hide);
1953
- }
1954
- }
1955
- if (isSelected) {
1956
- optionEl.classList.add(this.main.config.optionSelected);
1957
- }
1958
- else {
1959
- optionEl.classList.remove(this.main.config.optionSelected);
1960
- }
1961
- return optionEl;
1962
- };
1963
- return Slim;
1964
- }());
1965
- exports.Slim = Slim;
1966
-
1967
-
1968
- /***/ })
1969
- /******/ ])["default"];
1970
- });
1
+ function e(){return Math.random().toString(36).substring(2,10)}function t(e,t){function s(e,s){return s&&e&&e.classList&&e.classList.contains(s)||s&&e&&e.dataset&&e.dataset.id&&e.dataset.id===t?e:null}return s(e,t)||function e(t,i){return t&&t!==document?s(t,i)?t:e(t.parentNode,i):null}(e,t)}function s(e,t=50,s=!1){let i;return function(...n){const a=self,l=s&&!i;clearTimeout(i),i=setTimeout((()=>{i=null,s||e.apply(a,n)}),t),l&&e.apply(a,n)}}function i(e){const t=e.replace(/[A-Z\u00C0-\u00D6\u00D8-\u00DE]/g,(e=>"-"+e.toLowerCase()));return e[0]===e[0].toUpperCase()?t.substring(1):t}class n{constructor(t){if(this.id=t.id&&""!==t.id?t.id:e(),this.label=t.label||"",this.options=[],t.options)for(const e of t.options)this.options.push(new a(e))}}class a{constructor(t){this.id=t.id&&""!==t.id?t.id:e(),this.value=void 0===t.value?t.text:t.value,this.text=t.text||"",this.html=t.html||"",this.selected=void 0!==t.selected&&t.selected,this.display=void 0===t.display||t.display,this.disabled=void 0!==t.disabled&&t.disabled,this.mandatory=void 0!==t.mandatory&&t.mandatory,this.placeholder=void 0!==t.placeholder&&t.placeholder,this.class=t.class||"",this.style=t.style||"",this.data=t.data||{}}}class l{constructor(e,t){this.selectType="single",this.data=[],this.selectType=e,this.setData(t)}validateDataArray(e){if(!Array.isArray(e))return new Error("Data must be an array");for(let t of e){if(!(t instanceof n||"label"in t))return t instanceof a||"text"in t?this.validateOption(t):new Error("Data object must be a valid optgroup or option");if(!("label"in t))return new Error("Optgroup must have a label");if("options"in t&&t.options)for(let e of t.options)return this.validateOption(e)}return null}validateOption(e){return"text"in e?null:new Error("Option must have a text")}partialToFullData(e){let t=[];return e.forEach((e=>{if(e instanceof n||"label"in e){let s=[];"options"in e&&e.options&&e.options.forEach((e=>{s.push(new a(e))})),s.length>0&&t.push(new n(e))}(e instanceof a||"text"in e)&&t.push(new a(e))})),t}setData(e){this.data=this.partialToFullData(e),"single"===this.selectType&&this.setSelectedBy("value",this.getSelected())}getData(){return this.filter(null,!0)}getDataOptions(){return this.filter(null,!1)}addOption(e){this.setData(this.getData().concat(new a(e)))}setSelectedBy(e,t){let s=null,i=!1;for(let l of this.data){if(l instanceof n)for(let n of l.options)s||(s=n),n.selected=!i&&t.includes(n[e]),n.selected&&"single"===this.selectType&&(i=!0);l instanceof a&&(s||(s=l),l.selected=!i&&t.includes(l[e]),l.selected&&"single"===this.selectType&&(i=!0))}"single"===this.selectType&&s&&!i&&(s.selected=!0)}getSelected(){let e=this.getSelectedOptions(),t=[];return e.forEach((e=>{t.push(e.value)})),t}getSelectedOptions(){return this.filter((e=>e.selected),!1)}getSelectedIDs(){let e=this.getSelectedOptions(),t=[];return e.forEach((e=>{t.push(e.id)})),t}getOptionByID(e){let t=this.filter((t=>t.id===e),!1);return t.length?t[0]:null}search(e,t){return""===(e=e.trim())?this.getData():this.filter((s=>t(s,e)),!0)}filter(e,t){const s=[];return this.data.forEach((i=>{if(i instanceof n)if(t){let t=[];i.options.forEach((s=>{e&&!e(s)||t.push(new a(s))})),t.length>0&&s.push(new n({id:i.id,label:i.label,options:t}))}else i.options.forEach((t=>{e&&e(t)&&s.push(t)}));i instanceof a&&(e&&!e(i)||s.push(new a(i)))})),s}}class o{constructor(e,t,s){this.classes={main:"ss-main",placeholder:"ss-placeholder",values:"ss-values",single:"ss-single",value:"ss-value",valueText:"ss-value-text",valueDelete:"ss-value-delete",valueOut:"ss-value-out",deselect:"ss-deselect",deselectPath:"M10,10 L90,90 M10,90 L90,10",arrow:"ss-arrow",arrowClose:"M10,30 L50,70 L90,30",arrowOpen:"M10,70 L50,30 L90,70",content:"ss-content",openAbove:"ss-open-above",openBelow:"ss-open-below",search:"ss-search",searchHighlighter:"ss-search-highlight",searching:"ss-searching",addable:"ss-addable",addablePath:"M50,10 L50,90 M10,50 L90,50",list:"ss-list",optgroup:"ss-optgroup",optgroupLabel:"ss-optgroup-label",optgroupSelectable:"ss-optgroup-selectable",option:"ss-option",optionSelected:"ss-option-selected",optionDelete:"M10,10 L90,90 M10,90 L90,10",highlighted:"ss-highlighted",error:"ss-error",disabled:"ss-disabled",hide:"ss-hide"},this.store=t,this.settings=e,this.callbacks=s,this.main=this.mainDiv(),this.content=this.contentDiv(),this.renderValues(),this.renderOptions(this.store.getData()),this.settings.contentLocation.appendChild(this.content.main)}enable(){this.main.main.classList.remove(this.classes.disabled),this.content.search.input.disabled=!1}disable(){this.main.main.classList.add(this.classes.disabled),this.content.search.input.disabled=!0}open(){this.main.arrow.path.setAttribute("d",this.classes.arrowOpen),this.main.main.classList.add("up"===this.settings.openPosition?this.classes.openAbove:this.classes.openBelow),this.moveContent(),this.renderOptions(this.store.getData()),"relative"===this.settings.contentPosition?this.moveContentBelow():"up"===this.settings.openPosition.toLowerCase()?this.moveContentAbove():"down"===this.settings.openPosition.toLowerCase()?this.moveContentBelow():"up"===this.putContent(this.content.main,this.settings.isOpen)?this.moveContentAbove():this.moveContentBelow();const e=this.store.getSelectedOptions();if(e.length){const t=e[e.length-1].id,s=this.content.list.querySelector('[data-id="'+t+'"]');s&&this.ensureElementInView(this.content.list,s)}}close(){this.main.main.classList.remove(this.classes.openAbove),this.main.main.classList.remove(this.classes.openBelow),this.content.main.classList.remove(this.classes.openAbove),this.content.main.classList.remove(this.classes.openBelow),this.main.arrow.path.setAttribute("d",this.classes.arrowClose)}mainDiv(){const e=document.createElement("div");if(e.tabIndex=0,e.style.cssText=""!==this.settings.style?this.settings.style:"",e.className="",e.classList.add(this.settings.id),e.classList.add(this.classes.main),this.settings.class)for(const t of this.settings.class)""!==t.trim()&&e.classList.add(t.trim());e.onfocus=()=>{this.settings.triggerFocus&&this.callbacks.open()},e.onkeydown=e=>{switch(e.key){case"ArrowUp":case"ArrowDown":return this.callbacks.open(),"ArrowDown"===e.key?this.highlight("down"):this.highlight("up"),!1;case"Tab":return this.callbacks.close(),!0;case"Enter":const t=this.content.list.querySelector("."+this.classes.highlighted);return t&&t.click(),!1;case"Escape":return this.callbacks.close(),!1}},e.onclick=e=>{this.settings.isEnabled&&(this.settings.isOpen?this.callbacks.close():this.callbacks.open())};const t=document.createElement("div");t.classList.add(this.classes.values),e.appendChild(t);const s=document.createElement("div");s.classList.add(this.classes.deselect),this.settings.allowDeselect&&!this.settings.isMultiple||s.classList.add(this.classes.hide),s.onclick=e=>{e.stopPropagation(),this.settings.isEnabled&&this.callbacks.setSelected([""])};const i=document.createElementNS("http://www.w3.org/2000/svg","svg");i.setAttribute("viewBox","0 0 100 100");const n=document.createElementNS("http://www.w3.org/2000/svg","path");n.setAttribute("d",this.classes.deselectPath),i.appendChild(n),s.appendChild(i),e.appendChild(s);const a=document.createElementNS("http://www.w3.org/2000/svg","svg");a.classList.add(this.classes.arrow),a.setAttribute("viewBox","0 0 100 100");const l=document.createElementNS("http://www.w3.org/2000/svg","path");return l.setAttribute("d",this.classes.arrowClose),this.settings.alwaysOpen&&a.classList.add(this.classes.hide),a.appendChild(l),e.appendChild(a),{main:e,values:t,deselect:{main:s,svg:i,path:n},arrow:{main:a,path:l}}}mainFocus(e){e||(this.settings.triggerFocus=!1),this.main.main.focus({preventScroll:!0}),this.settings.triggerFocus=!0}placeholder(){const e=this.store.filter((e=>e.placeholder),!1);let t=this.settings.placeholderText;e.length&&(""!==e[0].html?t=e[0].html:""!==e[0].text&&(t=e[0].text));const s=document.createElement("div");return s.classList.add(this.classes.placeholder),s.innerHTML=t,s}renderValues(){this.settings.isMultiple?this.renderMultipleValues():this.renderSingleValue()}renderSingleValue(){const e=this.store.filter((e=>e.selected&&!e.placeholder),!1),t=e.length>0?e[0]:null;if(t){const e=document.createElement("div");e.classList.add(this.classes.single),e.innerHTML=t.html?t.html:t.text,this.main.values.innerHTML=e.outerHTML}else this.main.values.innerHTML=this.placeholder().outerHTML;this.settings.allowDeselect&&e.length?this.main.deselect.main.classList.remove(this.classes.hide):this.main.deselect.main.classList.add(this.classes.hide)}renderMultipleValues(){let e=this.main.values.childNodes,t=this.store.filter((e=>e.selected&&e.display),!1);if(0===t.length)return void(this.main.values.innerHTML=this.placeholder().outerHTML);{const e=this.main.values.querySelector("."+this.classes.placeholder);e&&e.remove()}let s=[];for(let i=0;i<e.length;i++){const n=e[i],a=n.getAttribute("data-id");if(a){t.filter((e=>e.id===a),!1).length||s.push(n)}}for(const e of s)e.classList.add(this.classes.valueOut),setTimeout((()=>{this.main.values.removeChild(e)}),100);e=this.main.values.childNodes;for(let s=0;s<t.length;s++){let i=!0;for(let n=0;n<e.length;n++)t[s].id===String(e[n].dataset.id)&&(i=!1);i&&(0===e.length?this.main.values.appendChild(this.multipleValue(t[s])):0===s?this.main.values.insertBefore(this.multipleValue(t[s]),e[s]):e[s-1].insertAdjacentElement("afterend",this.multipleValue(t[s])))}}multipleValue(e){const t=document.createElement("div");t.classList.add(this.classes.value),t.dataset.id=e.id;const s=document.createElement("div");if(s.classList.add(this.classes.valueText),s.innerHTML=e.text,t.appendChild(s),!e.mandatory){const s=document.createElement("div");s.classList.add(this.classes.valueDelete),s.onclick=t=>{t.preventDefault(),t.stopPropagation();let s=!0;const i=this.store.getSelectedOptions(),l=i.filter((t=>t.selected&&t.id!==e.id),!0);if(!(this.settings.minSelected&&l.length<this.settings.minSelected)&&(this.callbacks.beforeChange&&(s=!0===this.callbacks.beforeChange(l,i)),s)){let e=[];for(const t of l){if(t instanceof n)for(const s of t.options)e.push(s.value);t instanceof a&&e.push(t.value)}this.callbacks.setSelected(e),this.settings.closeOnSelect&&this.callbacks.close(),this.callbacks.afterChange&&this.callbacks.afterChange(l)}};const i=document.createElementNS("http://www.w3.org/2000/svg","svg");i.setAttribute("viewBox","0 0 100 100");const l=document.createElementNS("http://www.w3.org/2000/svg","path");l.setAttribute("d",this.classes.optionDelete),i.appendChild(l),s.appendChild(i),t.appendChild(s)}return t}contentDiv(){const e=document.createElement("div");if(e.classList.add(this.classes.content),e.dataset.id=this.settings.id,""!==this.settings.style&&(e.style.cssText=this.settings.style),"relative"===this.settings.contentPosition&&e.classList.add("ss-"+this.settings.contentPosition),this.settings.class.length)for(const t of this.settings.class)""!==t.trim()&&e.classList.add(t.trim());const t=this.searchDiv();e.appendChild(t.main);const s=this.listDiv();return e.appendChild(s),{main:e,search:t,list:s}}moveContent(){if("relative"===this.settings.contentPosition)return;const e=this.main.main.getBoundingClientRect();this.content.main.style.top=e.top+e.height+window.scrollY+"px",this.content.main.style.left=e.left+window.scrollX+"px",this.content.main.style.width=e.width+"px"}searchDiv(){const e=document.createElement("div"),t=document.createElement("input"),i=document.createElement("div");e.classList.add(this.classes.search);const n={main:e,input:t};if(this.settings.showSearch||(e.classList.add(this.classes.hide),t.readOnly=!0),t.type="search",t.placeholder=this.settings.searchPlaceholder,t.tabIndex=-1,t.setAttribute("aria-label",this.settings.searchPlaceholder),t.setAttribute("autocapitalize","off"),t.setAttribute("autocomplete","off"),t.setAttribute("autocorrect","off"),t.oninput=s((e=>{this.callbacks.search(e.target.value)}),100),t.onkeydown=e=>{switch(e.key){case"ArrowUp":case"ArrowDown":return this.callbacks.open(),"ArrowDown"===e.key?this.highlight("down"):this.highlight("up"),!1;case"Tab":return this.callbacks.close(),!0;case"Escape":return this.callbacks.close(),!1;case"Enter":if(this.callbacks.addable&&e.ctrlKey)i.click();else{const e=this.content.list.querySelector("."+this.classes.highlighted);e&&e.click()}return!1}},t.onfocus=()=>{this.settings.isOpen||this.callbacks.open()},e.appendChild(t),this.callbacks.addable){i.classList.add(this.classes.addable);const t=document.createElementNS("http://www.w3.org/2000/svg","svg");t.setAttribute("viewBox","0 0 100 100");const s=document.createElementNS("http://www.w3.org/2000/svg","path");s.setAttribute("d",this.classes.addablePath),t.appendChild(s),i.appendChild(t),i.onclick=e=>{if(e.preventDefault(),e.stopPropagation(),!this.callbacks.addable)return;const t=this.content.search.input.value.trim();if(""===t)return void this.content.search.input.focus();const s=this.callbacks.addable(t);"string"==typeof s?this.callbacks.addOption(new a({text:s,value:s})):this.callbacks.addOption(new a(s)),this.callbacks.setSelected([t]),this.callbacks.search(""),this.settings.closeOnSelect&&setTimeout((()=>{this.callbacks.close()}),100)},e.appendChild(i),n.addable={main:i,svg:t,path:s}}return n}searchFocus(e){e||(this.settings.triggerFocus=!1),this.content.search.input.focus(),this.settings.triggerFocus=!0}getOptions(e=!1,t=!1,s=!1){let i="."+this.classes.option;return e&&(i+=":not(."+this.classes.placeholder+")"),t&&(i+=":not(."+this.classes.disabled+")"),s&&(i+=":not(."+this.classes.hide+")"),Array.from(this.content.list.querySelectorAll(i))}highlight(e){const t=this.getOptions(!0,!0,!0);if(0!==t.length)if(1!==t.length||t[0].classList.contains(this.classes.highlighted)){for(let s=0;s<t.length;s++)if(t[s].classList.contains(this.classes.highlighted))return t[s].classList.remove(this.classes.highlighted),void("down"===e?s+1<t.length?(t[s+1].classList.add(this.classes.highlighted),this.ensureElementInView(this.content.list,t[s+1])):(t[0].classList.add(this.classes.highlighted),this.ensureElementInView(this.content.list,t[0])):s-1>=0?(t[s-1].classList.add(this.classes.highlighted),this.ensureElementInView(this.content.list,t[s-1])):(t[t.length-1].classList.add(this.classes.highlighted),this.ensureElementInView(this.content.list,t[t.length-1])));t["down"===e?0:t.length-1].classList.add(this.classes.highlighted),this.ensureElementInView(this.content.list,t["down"===e?0:t.length-1])}else t[0].classList.add(this.classes.highlighted)}listDiv(){const e=document.createElement("div");return e.classList.add(this.classes.list),e.setAttribute("role","listbox"),e}renderError(e){this.content.list.innerHTML="";const t=document.createElement("div");t.classList.add(this.classes.error),t.textContent=e,this.content.list.appendChild(t)}renderSearching(){this.content.list.innerHTML="";const e=document.createElement("div");e.classList.add(this.classes.searching),e.textContent=this.settings.searchingText,this.content.list.appendChild(e)}renderOptions(e){if(this.content.list.innerHTML="",0===e.length){const e=document.createElement("div");return e.classList.add(this.classes.option),e.classList.add(this.classes.disabled),e.innerHTML=this.settings.searchText,void this.content.list.appendChild(e)}for(const t of e){if(t instanceof n){const e=document.createElement("div");e.classList.add(this.classes.optgroup);const s=document.createElement("div");s.classList.add(this.classes.optgroupLabel),s.innerHTML=t.label,this.settings.selectByGroup&&this.settings.isMultiple&&(s.classList.add(this.classes.optgroupSelectable),s.addEventListener("click",(t=>{t.preventDefault(),t.stopPropagation();for(const t of e.children)-1!==t.className.indexOf(this.classes.option)&&t.click()}))),e.appendChild(s);for(const s of t.options)e.appendChild(this.option(s));this.content.list.appendChild(e)}t instanceof a&&this.content.list.appendChild(this.option(t))}}option(e){if(e.placeholder){const e=document.createElement("div");return e.classList.add(this.classes.option),e.classList.add(this.classes.hide),e}const t=document.createElement("div");if(t.dataset.id=e.id,t.classList.add(this.classes.option),t.setAttribute("role","option"),e.class&&e.class.split(" ").forEach((e=>{t.classList.add(e)})),e.style&&(t.style.cssText=e.style),this.settings.searchHighlight&&""!==this.content.search.input.value.trim()){const s=""!==e.html?e.html:e.text;t.innerHTML=this.highlightText(s,this.content.search.input.value,this.classes.searchHighlighter)}else""!==e.html?t.innerHTML=e.html:t.textContent=e.text;return this.settings.showOptionTooltips&&t.textContent&&t.setAttribute("title",t.textContent),(e.selected&&!this.settings.allowDeselect||e.disabled&&!this.settings.allowDeselect)&&t.classList.add(this.classes.disabled),e.selected&&this.settings.hideSelected&&t.classList.add(this.classes.hide),e.selected?t.classList.add(this.classes.optionSelected):t.classList.remove(this.classes.optionSelected),t.addEventListener("click",(t=>{t.preventDefault(),t.stopPropagation();const s=this.store.getSelected(),i=t.currentTarget,n=String(i.dataset.id);if(e.disabled||e.selected&&!this.settings.allowDeselect)return;if(this.settings.isMultiple&&Array.isArray(s)&&this.settings.maxSelected<=s.length)return;let a=!1;const l=this.store.getSelectedOptions();let o=[];this.settings.isMultiple&&(o=e.selected?l.filter((e=>e.id!==n)):l.concat(e)),this.settings.isMultiple||(o=e.selected?[]:[e]),this.callbacks.beforeChange||(a=!0),this.callbacks.beforeChange&&(a=!1!==this.callbacks.beforeChange(o,l)),a&&(this.store.getOptionByID(n)||this.callbacks.addOption(e),this.callbacks.setSelected(o.map((e=>e.value))),this.settings.closeOnSelect&&this.callbacks.close(),this.callbacks.afterChange&&this.callbacks.afterChange(o))})),t}destroy(){this.main.main.remove(),this.content.main.remove()}highlightText(e,t,s){let i=e;const n=new RegExp("("+t.trim()+")(?![^<]*>[^<>]*</)","i");if(!e.match(n))return e;const a=e.match(n).index,l=a+e.match(n)[0].toString().length,o=e.substring(a,l);return i=i.replace(n,`<mark class="${s}">${o}</mark>`),i}moveContentAbove(){const e=this.main.main.offsetHeight+this.content.main.offsetHeight-1;this.content.main.style.margin="-"+e+"px 0px 0px 0px",this.content.main.style.transformOrigin="center bottom",this.main.main.classList.remove(this.classes.openBelow),this.main.main.classList.add(this.classes.openAbove),this.content.main.classList.remove(this.classes.openBelow),this.content.main.classList.add(this.classes.openAbove)}moveContentBelow(){this.content.main.style.margin="-1px 0px 0px 0px",this.content.main.style.transformOrigin="center top",this.main.main.classList.remove(this.classes.openAbove),this.main.main.classList.add(this.classes.openBelow),this.content.main.classList.remove(this.classes.openAbove),this.content.main.classList.add(this.classes.openBelow)}ensureElementInView(e,t){const s=e.scrollTop+e.offsetTop,i=s+e.clientHeight,n=t.offsetTop,a=n+t.clientHeight;n<s?e.scrollTop-=s-n:a>i&&(e.scrollTop+=a-i)}putContent(e,t){const s=e.offsetHeight,i=e.getBoundingClientRect(),n=t?i.top:i.top-s,a=t?i.bottom:i.bottom+s;return n<=0?"down":a>=window.innerHeight?"up":"down"}}class h{constructor(e){this.listen=!1,this.observer=null,this.select=e}enable(){this.disconnectObserver(),this.select.disabled=!1,this.connectObserver()}disable(){this.disconnectObserver(),this.select.disabled=!0,this.connectObserver()}hideUI(){this.select.tabIndex=-1,this.select.style.display="none",this.select.setAttribute("aria-hidden","true")}showUI(){this.select.removeAttribute("tabindex"),this.select.style.display="",this.select.removeAttribute("aria-hidden")}changeListen(e){this.listen=e,this.listen?this.connectObserver():this.disconnectObserver()}addSelectChangeListener(e){this.onSelectChange=e,this.addObserver(),this.connectObserver(),this.changeListen(!0)}removeSelectChangeListener(){this.changeListen(!1),this.onSelectChange=void 0}addValueChangeListener(e){this.onValueChange=e,this.select.addEventListener("change",this.valueChange.bind(this))}removeValueChangeListener(){this.onValueChange=void 0,this.select.removeEventListener("change",this.valueChange.bind(this))}valueChange(e){this.onValueChange&&this.onValueChange(this.getSelectedValues())}observeWrapper(e){this.onSelectChange&&this.onSelectChange(this.getData())}addObserver(){this.observer&&(this.disconnectObserver(),this.observer=null),this.observer=new MutationObserver(this.observeWrapper)}connectObserver(){this.observer&&this.observer.observe(this.select,{attributes:!0,childList:!0,characterData:!0,subtree:!0})}disconnectObserver(){this.observer&&this.observer.disconnect()}getData(){let e=[];const t=this.select.childNodes;for(const s of t)"OPTGROUP"===s.nodeName&&e.push(this.getDataFromOptgroup(s)),"OPTION"===s.nodeName&&e.push(this.getDataFromOption(s));return e}getDataFromOptgroup(e){let t={id:"",label:e.label,options:[]};const s=e.childNodes;for(const e of s)"OPTION"===e.nodeName&&t.options.push(this.getDataFromOption(e));return t}getSelectedValues(){let e=[];const t=this.select.childNodes;for(const s of t){if("OPTGROUP"===s.nodeName){const t=s.childNodes;for(const s of t)if("OPTION"===s.nodeName){const t=s;t.selected&&e.push(t.value)}}if("OPTION"===s.nodeName){const t=s;t.selected&&e.push(t.value)}}return e}getDataFromOption(t){return{id:!!t.dataset&&t.dataset.id||e(),value:t.value,text:t.text,html:t.innerHTML,selected:t.selected,display:"none"!==t.style.display,disabled:t.disabled,mandatory:!!t.dataset&&"true"===t.dataset.mandatory,placeholder:"true"===t.dataset.placeholder,class:t.className,style:t.style.cssText,data:t.dataset}}setSelected(e){const t=this.select.childNodes;for(const s of t){if("OPTGROUP"===s.nodeName){const t=s.childNodes;for(const s of t)if("OPTION"===s.nodeName){const t=s;t.selected=e.includes(t.value)}}if("OPTION"===s.nodeName){const t=s;t.selected=e.includes(t.value)}}}updateSelect(e,t,s){this.changeListen(!1),e&&(this.select.id=e),t&&(this.select.style.cssText=t),s&&(this.select.className="",s.forEach((e=>{""!==e.trim()&&this.select.classList.add(e.trim())}))),this.changeListen(!0)}updateOptions(e){this.changeListen(!1),this.select.innerHTML="";for(const t of e)t instanceof n&&this.select.appendChild(this.createOptgroup(t)),t instanceof a&&this.select.appendChild(this.createOption(t));this.changeListen(!0)}createOptgroup(e){const t=document.createElement("optgroup");if(t.id=e.id,t.label=e.label,e.options)for(const s of e.options)t.appendChild(this.createOption(s));return t}createOption(e){const t=document.createElement("option");return t.value=""!==e.value?e.value:e.text,t.innerHTML=e.html||e.text,e.selected&&(t.selected=e.selected),e.disabled&&(t.disabled=!0),!1===e.display&&(t.style.display="none"),e.placeholder&&t.setAttribute("data-placeholder","true"),e.mandatory&&t.setAttribute("data-mandatory","true"),e.class&&e.class.split(" ").forEach((e=>{t.classList.add(e)})),e.data&&"object"==typeof e.data&&Object.keys(e.data).forEach((s=>{t.setAttribute("data-"+i(s),e.data[s])})),t}destroy(){this.changeListen(!1),this.disconnectObserver(),this.removeSelectChangeListener(),this.removeValueChangeListener(),this.showUI()}}class c{constructor(t){this.id="",this.style="",this.class=[],this.isMultiple=!1,this.isOpen=!1,this.triggerFocus=!0,this.intervalMove=null,this.mainHeight=30,this.contentHeight=0,t||(t={}),this.id="ss-"+e(),this.style=t.style||"",this.class=t.class||[],this.isEnabled=void 0===t.isEnabled||t.isEnabled,this.alwaysOpen=void 0!==t.alwaysOpen&&t.alwaysOpen,this.showSearch=void 0===t.showSearch||t.showSearch,this.searchPlaceholder=t.searchPlaceholder||"Search",this.searchText=t.searchText||"No Results",this.searchingText=t.searchingText||"Searching...",this.searchHighlight=void 0!==t.searchHighlight&&t.searchHighlight,this.closeOnSelect=void 0===t.closeOnSelect||t.closeOnSelect,this.contentLocation=t.contentLocation||document.body,this.contentPosition=t.contentPosition||"absolute",this.openPosition=t.openPosition||"auto",this.placeholderText=t.placeholderText||"Select Value",this.allowDeselect=void 0!==t.allowDeselect&&t.allowDeselect,this.hideSelected=void 0!==t.hideSelected&&t.hideSelected,this.showOptionTooltips=void 0!==t.showOptionTooltips&&t.showOptionTooltips,this.selectByGroup=void 0!==t.selectByGroup&&t.selectByGroup,this.minSelected=t.minSelected||0,this.maxSelected=t.maxSelected||1e3,this.timeoutDelay=t.timeoutDelay||200}}class r{constructor(e){if(this.events={search:void 0,searchFilter:(e,t)=>-1!==e.text.toLowerCase().indexOf(t.toLowerCase()),addable:void 0,beforeChange:void 0,afterChange:void 0,beforeOpen:void 0,afterOpen:void 0,beforeClose:void 0,afterClose:void 0},this.windowResize=s((()=>{this.settings.isOpen&&this.render.moveContent()})),this.windowScroll=s((()=>{this.settings.isOpen&&("down"!==this.settings.openPosition?"up"!==this.settings.openPosition?"relative"===this.settings.contentPosition?this.render.moveContentBelow():"up"===this.render.putContent(this.render.content.main,this.settings.isOpen)?this.render.moveContentAbove():this.render.moveContentBelow():this.render.moveContentAbove():this.render.moveContentBelow())})),this.documentClick=e=>{this.settings.isOpen&&e.target&&!t(e.target,this.settings.id)&&this.close()},this.selectEl="string"==typeof e.select?document.querySelector(e.select):e.select,!this.selectEl)return void(e.events&&e.events.error&&e.events.error(new Error("Could not find select element")));if("SELECT"!==this.selectEl.tagName)return void(e.events&&e.events.error&&e.events.error(new Error("Element isnt of type select")));this.selectEl.dataset.ssid&&this.destroy(),this.settings=new c(e.settings);for(const t in e.events)e.events.hasOwnProperty(t)&&(this.events[t]=e.events[t]);this.settings.isMultiple=this.selectEl.multiple,this.settings.style=this.selectEl.style.cssText,this.settings.class=this.selectEl.className.split(" "),this.select=new h(this.selectEl),this.select.updateSelect(this.settings.id,this.settings.style,this.settings.class),this.select.hideUI(),this.select.addSelectChangeListener((e=>{this.setData(e)})),this.select.addValueChangeListener((e=>{this.setSelected(e)})),this.store=new l(this.settings.isMultiple?"multiple":"single",e.data?e.data:this.select.getData()),e.data&&this.select.updateOptions(this.store.getData());const i={open:this.open.bind(this),close:this.close.bind(this),addable:this.events.addable?this.events.addable:void 0,setSelected:this.setSelected.bind(this),addOption:this.addOption.bind(this),search:this.search.bind(this),beforeChange:this.events.beforeChange,afterChange:this.events.afterChange};this.render=new o(this.settings,this.store,i),this.selectEl.parentNode&&this.selectEl.parentNode.insertBefore(this.render.main.main,this.selectEl.nextSibling),document.addEventListener("click",this.documentClick),window.addEventListener("resize",this.windowResize,!1),"auto"===this.settings.openPosition&&window.addEventListener("scroll",this.windowScroll,!1),this.settings.isEnabled||this.disable(),this.settings.alwaysOpen&&this.open(),this.selectEl.slim=this}enable(){this.settings.isEnabled=!0,this.select.enable(),this.render.enable()}disable(){this.settings.isEnabled=!1,this.select.disable(),this.render.disable()}getData(){return this.store.getData()}setData(e){const t=this.store.validateDataArray(e);if(t)return void(this.events.error&&this.events.error(t));this.store.setData(e);const s=this.store.getData();this.select.updateOptions(s),this.render.renderValues(),this.render.renderOptions(s)}getSelected(){return this.store.getSelected()}setSelected(e){this.store.setSelectedBy("value",Array.isArray(e)?e:[e]);const t=this.store.getData();this.select.updateOptions(t),this.render.renderValues(),this.render.renderOptions(t)}addOption(e){this.store.addOption(e);const t=this.store.getData();this.select.updateOptions(t),this.render.renderValues(),this.render.renderOptions(t)}open(){this.settings.isEnabled&&!this.settings.isOpen&&(this.events.beforeOpen&&this.events.beforeOpen(),this.render.open(),this.settings.showSearch&&this.render.searchFocus(!1),setTimeout((()=>{this.events.afterOpen&&this.events.afterOpen(),this.settings.isOpen=!0}),this.settings.timeoutDelay),this.settings.intervalMove&&clearInterval(this.settings.intervalMove),this.settings.intervalMove=setInterval(this.render.moveContent.bind(this.render),500))}close(){this.settings.isOpen&&!this.settings.alwaysOpen&&(this.events.beforeClose&&this.events.beforeClose(),this.render.close(),this.search(""),this.render.mainFocus(!1),setTimeout((()=>{this.events.afterClose&&this.events.afterClose(),this.settings.isOpen=!1}),this.settings.timeoutDelay),this.settings.intervalMove&&clearInterval(this.settings.intervalMove))}search(e){if(this.render.content.search.input.value!==e&&(this.render.content.search.input.value=e),!this.events.search)return void this.render.renderOptions(""===e?this.store.getData():this.store.search(e,this.events.searchFilter));this.render.renderSearching();const t=this.events.search(e,this.store.getSelectedOptions());t instanceof Promise?t.then((e=>{this.render.renderOptions(this.store.partialToFullData(e))})).catch((e=>{this.render.renderError("string"==typeof e?e:e.message)})):Array.isArray(t)?this.render.renderOptions(this.store.partialToFullData(t)):this.render.renderError("Search event must return a promise or an array of data")}destroy(){document.removeEventListener("click",this.documentClick),window.removeEventListener("resize",this.windowResize,!1),"auto"===this.settings.openPosition&&window.removeEventListener("scroll",this.windowScroll,!1),this.store.setData([]),this.render.destroy(),this.select.destroy()}}export{n as Optgroup,a as Option,o as Render,h as Select,c as Settings,l as Store,s as debounce,r as default,e as generateID,t as hasClassInTree,i as kebabCase};
2
+ //# sourceMappingURL=slimselect.js.map