@finqu/cool 1.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 (199) hide show
  1. package/README.md +1 -0
  2. package/build/.eslintrc.json +10 -0
  3. package/build/banner.js +14 -0
  4. package/build/build-plugins.js +92 -0
  5. package/build/rollup.config.js +78 -0
  6. package/dist/css/cool-grid.css +3672 -0
  7. package/dist/css/cool-grid.css.map +30 -0
  8. package/dist/css/cool-grid.min.css +7 -0
  9. package/dist/css/cool-grid.min.css.map +1 -0
  10. package/dist/css/cool-reboot.css +281 -0
  11. package/dist/css/cool-reboot.css.map +58 -0
  12. package/dist/css/cool-reboot.min.css +7 -0
  13. package/dist/css/cool-reboot.min.css.map +1 -0
  14. package/dist/css/cool.css +14841 -0
  15. package/dist/css/cool.css.map +144 -0
  16. package/dist/css/cool.min.css +7 -0
  17. package/dist/css/cool.min.css.map +1 -0
  18. package/dist/js/cool.bundle.js +15304 -0
  19. package/dist/js/cool.bundle.js.map +1 -0
  20. package/dist/js/cool.bundle.min.js +45 -0
  21. package/dist/js/cool.bundle.min.js.map +1 -0
  22. package/dist/js/cool.esm.js +4766 -0
  23. package/dist/js/cool.esm.js.map +1 -0
  24. package/dist/js/cool.esm.min.js +7 -0
  25. package/dist/js/cool.esm.min.js.map +1 -0
  26. package/dist/js/cool.js +4948 -0
  27. package/dist/js/cool.js.map +1 -0
  28. package/dist/js/cool.min.js +7 -0
  29. package/dist/js/cool.min.js.map +1 -0
  30. package/html/index.html +892 -0
  31. package/js/dist/collapse.js +321 -0
  32. package/js/dist/collapse.js.map +1 -0
  33. package/js/dist/common.js +1474 -0
  34. package/js/dist/common.js.map +1 -0
  35. package/js/dist/cooldropdown.js +467 -0
  36. package/js/dist/cooldropdown.js.map +1 -0
  37. package/js/dist/coolpopover.js +391 -0
  38. package/js/dist/coolpopover.js.map +1 -0
  39. package/js/dist/coolsectiontabs.js +256 -0
  40. package/js/dist/coolsectiontabs.js.map +1 -0
  41. package/js/dist/coolselect.js +796 -0
  42. package/js/dist/coolselect.js.map +1 -0
  43. package/js/dist/cooltooltip.js +360 -0
  44. package/js/dist/cooltooltip.js.map +1 -0
  45. package/js/dist/coolui.js +73 -0
  46. package/js/dist/coolui.js.map +1 -0
  47. package/js/dist/dropdown.js +1716 -0
  48. package/js/dist/dropdown.js.map +1 -0
  49. package/js/dist/popover.js +587 -0
  50. package/js/dist/popover.js.map +1 -0
  51. package/js/dist/sectiontabs.js +263 -0
  52. package/js/dist/sectiontabs.js.map +1 -0
  53. package/js/dist/select.js +2029 -0
  54. package/js/dist/select.js.map +1 -0
  55. package/js/dist/tooltip.js +555 -0
  56. package/js/dist/tooltip.js.map +1 -0
  57. package/js/index.esm.js +21 -0
  58. package/js/index.umd.js +21 -0
  59. package/js/src/abstract-ui-component.js +70 -0
  60. package/js/src/collapse.js +258 -0
  61. package/js/src/common.js +280 -0
  62. package/js/src/dialog.js +570 -0
  63. package/js/src/dropdown.js +443 -0
  64. package/js/src/popover.js +615 -0
  65. package/js/src/section-tabs.js +204 -0
  66. package/js/src/select.js +832 -0
  67. package/js/src/toast.js +581 -0
  68. package/js/src/tooltip.js +575 -0
  69. package/js/src/util/animate-css.js +22 -0
  70. package/js/src/util/index.js +112 -0
  71. package/js/src/util/perfect-scrollbar.js +1316 -0
  72. package/less/alert.less +345 -0
  73. package/less/badge.less +38 -0
  74. package/less/bootstrap-noconflict.less +23 -0
  75. package/less/bootstrap.less +23 -0
  76. package/less/button-group.less +153 -0
  77. package/less/buttons.less +287 -0
  78. package/less/dialog-noconflict.less +174 -0
  79. package/less/dialog.less +203 -0
  80. package/less/dropdown.less +209 -0
  81. package/less/forms.less +770 -0
  82. package/less/images.less +242 -0
  83. package/less/input-group.less +163 -0
  84. package/less/list-group.less +73 -0
  85. package/less/mixins/aspect-ratio.less +23 -0
  86. package/less/mixins/border-radius.less +24 -0
  87. package/less/mixins/box-shadow.less +4 -0
  88. package/less/mixins/buttons.less +17 -0
  89. package/less/mixins/caret.less +51 -0
  90. package/less/mixins/clearfix.less +10 -0
  91. package/less/mixins/gradients.less +34 -0
  92. package/less/mixins/nav-divider.less +7 -0
  93. package/less/mixins/object-fit.less +13 -0
  94. package/less/mixins/reset-text.less +16 -0
  95. package/less/mixins.less +11 -0
  96. package/less/package.json +11 -0
  97. package/less/pagination.less +69 -0
  98. package/less/popover.less +143 -0
  99. package/less/project.sublime-workspace +774 -0
  100. package/less/reboot.less +235 -0
  101. package/less/section.less +793 -0
  102. package/less/select.less +150 -0
  103. package/less/tables.less +737 -0
  104. package/less/tabs.less +162 -0
  105. package/less/tooltip.less +87 -0
  106. package/less/type.less +71 -0
  107. package/less/utilities/align.less +27 -0
  108. package/less/utilities/animate.less +3512 -0
  109. package/less/utilities/background.less +70 -0
  110. package/less/utilities/borders.less +16 -0
  111. package/less/utilities/color.less +70 -0
  112. package/less/utilities/cursor.less +8 -0
  113. package/less/utilities/display.less +38 -0
  114. package/less/utilities/embed.less +61 -0
  115. package/less/utilities/flex.less +76 -0
  116. package/less/utilities/jquery-ui.less +116 -0
  117. package/less/utilities/lazyload.less +29 -0
  118. package/less/utilities/overflow.less +11 -0
  119. package/less/utilities/pace.less +25 -0
  120. package/less/utilities/placeholder.less +60 -0
  121. package/less/utilities/position.less +42 -0
  122. package/less/utilities/scrollbar.less +152 -0
  123. package/less/utilities/spacing.less +197 -0
  124. package/less/utilities/text.less +68 -0
  125. package/less/utilities/transform.less +7 -0
  126. package/less/utilities.less +21 -0
  127. package/less/variables.less +343 -0
  128. package/package.json +71 -0
  129. package/scss/LISENCE +15 -0
  130. package/scss/_alert.scss +125 -0
  131. package/scss/_badge.scss +58 -0
  132. package/scss/_button-group.scss +124 -0
  133. package/scss/_buttons.scss +206 -0
  134. package/scss/_custom-forms.scss +423 -0
  135. package/scss/_dialog.scss +149 -0
  136. package/scss/_dropdown.scss +234 -0
  137. package/scss/_forms.scss +257 -0
  138. package/scss/_frame.scss +523 -0
  139. package/scss/_functions.scss +114 -0
  140. package/scss/_grid.scss +35 -0
  141. package/scss/_images.scss +312 -0
  142. package/scss/_input-group.scss +245 -0
  143. package/scss/_list-group.scss +82 -0
  144. package/scss/_mixins.scss +32 -0
  145. package/scss/_navbar.scss +214 -0
  146. package/scss/_pagination.scss +79 -0
  147. package/scss/_popover.scss +165 -0
  148. package/scss/_reboot.scss +279 -0
  149. package/scss/_root.scss +15 -0
  150. package/scss/_section.scss +851 -0
  151. package/scss/_select.scss +166 -0
  152. package/scss/_tables.scss +707 -0
  153. package/scss/_tabs.scss +175 -0
  154. package/scss/_toast.scss +182 -0
  155. package/scss/_tooltip.scss +101 -0
  156. package/scss/_type.scss +90 -0
  157. package/scss/_utilities.scss +21 -0
  158. package/scss/_variables.scss +697 -0
  159. package/scss/cool-grid.scss +29 -0
  160. package/scss/cool-reboot.scss +11 -0
  161. package/scss/cool.scss +36 -0
  162. package/scss/mixins/_alert-variant.scss +40 -0
  163. package/scss/mixins/_aspect-ratio.scss +29 -0
  164. package/scss/mixins/_background-variant.scss +25 -0
  165. package/scss/mixins/_badge-variant.scss +13 -0
  166. package/scss/mixins/_breakpoints.scss +102 -0
  167. package/scss/mixins/_buttons.scss +104 -0
  168. package/scss/mixins/_caret.scss +80 -0
  169. package/scss/mixins/_clearfix.scss +10 -0
  170. package/scss/mixins/_float.scss +14 -0
  171. package/scss/mixins/_forms.scss +51 -0
  172. package/scss/mixins/_gradients.scss +40 -0
  173. package/scss/mixins/_grid-framework.scss +72 -0
  174. package/scss/mixins/_grid.scss +60 -0
  175. package/scss/mixins/_nav-divider.scss +9 -0
  176. package/scss/mixins/_object-fit.scss +16 -0
  177. package/scss/mixins/_reset-text.scss +19 -0
  178. package/scss/mixins/_text-emphasis.scss +21 -0
  179. package/scss/mixins/_text-hide.scss +10 -0
  180. package/scss/mixins/_text-truncate.scss +8 -0
  181. package/scss/project.sublime-workspace +491 -0
  182. package/scss/utilities/_align.scss +41 -0
  183. package/scss/utilities/_animate.scss +3512 -0
  184. package/scss/utilities/_background.scss +14 -0
  185. package/scss/utilities/_borders.scss +146 -0
  186. package/scss/utilities/_clearfix.scss +6 -0
  187. package/scss/utilities/_collapse.scss +33 -0
  188. package/scss/utilities/_cursor.scss +10 -0
  189. package/scss/utilities/_display.scss +16 -0
  190. package/scss/utilities/_embed.scss +78 -0
  191. package/scss/utilities/_flex.scss +50 -0
  192. package/scss/utilities/_lazyload.scss +31 -0
  193. package/scss/utilities/_overflow.scss +6 -0
  194. package/scss/utilities/_perfect-scrollbar.scss +154 -0
  195. package/scss/utilities/_placeholder.scss +76 -0
  196. package/scss/utilities/_position.scss +30 -0
  197. package/scss/utilities/_sizing.scss +32 -0
  198. package/scss/utilities/_spacing.scss +92 -0
  199. package/scss/utilities/_text.scss +97 -0
@@ -0,0 +1,832 @@
1
+ import 'jquery';
2
+ import PerfectScrollbar from './util/perfect-scrollbar';
3
+ import { debounce, touchEvents } from './util/index';
4
+ import AbstractUIComponent from './abstract-ui-component';
5
+
6
+ const NAME = 'coolSelect';
7
+ const DATA_KEY = 'plugin_coolSelect';
8
+
9
+ class Select extends AbstractUIComponent {
10
+
11
+ constructor(el, opts) {
12
+
13
+ super();
14
+
15
+ this.opts = {};
16
+
17
+ if (window.Cool.settings.select) {
18
+
19
+ $.extend(true, this.opts, $.fn[NAME].defaults, window.Cool.settings.select, opts);
20
+
21
+ } else {
22
+
23
+ $.extend(true, this.opts, $.fn[NAME].defaults, opts);
24
+ }
25
+
26
+ this.el = el;
27
+ this.debug = this.opts.debug;
28
+ this.init();
29
+ }
30
+
31
+ // Init plugin
32
+ init() {
33
+
34
+ $.when(this.buildCache()).then(() => {
35
+
36
+ this.buildScroll();
37
+ this.bindEvents();
38
+
39
+ if (this.data[this.name].length > 0) {
40
+ this.setData();
41
+ }
42
+
43
+ this.onInit();
44
+ });
45
+ }
46
+
47
+ // Remove plugin instance completely
48
+ destroy() {
49
+
50
+ this.unbindEvents();
51
+ this.$el.removeData(DATA_KEY);
52
+ this.onDestroy();
53
+ }
54
+
55
+ // Update plugin data
56
+ update() {
57
+
58
+ this.buildCache();
59
+ this.bindEvents();
60
+ this.onUpdate();
61
+ }
62
+
63
+ // Cache DOM nodes for performance
64
+ buildCache() {
65
+
66
+ this.$el = $(this.el);
67
+ this.$selectHeader = this.$el.find('.select-header');
68
+ this.$selectIconContainer = this.$selectHeader.find('.select-icon');
69
+ this.name = this.$el.data('name') ? this.$el.data('name') : this.opts.name;
70
+ this.scrollContentHeight = this.$el.data('scrollContentHeight') ? this.$el.data('scrollContentHeight') : this.opts.scrollContentHeight;
71
+ this.items = this.$el.data('items') ? this.$el.data('items') : this.opts.items;
72
+ this.data = {}
73
+ this.data[this.name] = [];
74
+ this.searchData = [];
75
+ this.searchApi = this.$el.data('searchApi') ? this.$el.data('searchApi') : this.opts.searchApi;
76
+ this.type = this.$el.data('type') ? this.$el.data('type') : this.opts.type;
77
+ this.contentOpen = false;
78
+
79
+ if (this.$el.data('setData') && this.$el.data('setData') != '') {
80
+ this.data = this.$el.data('setData');
81
+ }
82
+
83
+ if (this.$el.find('.select-search')) {
84
+ this.showSearch = true;
85
+ } else {
86
+ this.showSearch = this.$el.data('showSearch') ? this.$el.data('showSearch') : this.opts.showSearch;
87
+ }
88
+
89
+ if (this.$el.find('.select-footer')) {
90
+ this.showFooter = true;
91
+ } else {
92
+ this.showFooter = this.$el.data('showFooter') ? this.$el.data('showFooter') : this.opts.showFooter;
93
+ }
94
+
95
+ if (this.items.length) {
96
+
97
+ let items = this._renderItemList(this.items);
98
+
99
+ this.$select = $(`
100
+ <div class="select-content">
101
+
102
+ ${this._renderSearch()}
103
+
104
+ <div class="select-scrollable-content">${items}</div>
105
+
106
+ ${this._renderFooter()}
107
+
108
+ </div>
109
+ `);
110
+
111
+ this.$el.append(this.$select);
112
+
113
+ this.$scrollableContent = this.$select.find('.select-scrollable-content') ? this.$select.find('.select-scrollable-content') : false;
114
+ this.$selectItems = this.$select.find('.select-item');
115
+ this.$selectLabels = this.$select.find('[data-label]');
116
+
117
+ if (this.showSearch) {
118
+
119
+ this.$searchContainer = this.$select.find('.select-search');
120
+ this.$searchInput = this.$select.find('[name="select-search"]');
121
+ this.$searchIconContainer = this.$select.find('.select-search-icon');
122
+ this.$clearSearchButton = this.$select.find('[data-clear-search]');
123
+ }
124
+
125
+ if (this.showFooter) {
126
+
127
+ this.$footerContainer = this.$select.find('.select-footer');
128
+ this.$closeButton = this.$select.find('[data-select-close]');
129
+ }
130
+
131
+ $.each(this.$selectLabels, function(i, el) {
132
+
133
+ this.searchData.push({
134
+ id: i,
135
+ val: $(el).text().trim()
136
+ });
137
+ });
138
+
139
+ this.log(this.$el);
140
+ this.log(this.$select);
141
+ this.log(this.$scrollableContent);
142
+ this.log('Name: '+this.name);
143
+ this.log('Show search: '+this.showSearch);
144
+ this.log('Show footer: '+this.showFooter);
145
+ this.log('Scroll content height: '+this.scrollContentHeight+'px');
146
+ this.log(this.items);
147
+ this.log(this.searchData);
148
+
149
+ } else {
150
+
151
+ this.$select = this.$el.find('.select-content');
152
+ this.$scrollableContent = this.$select.find('.select-scrollable-content');
153
+ this.$selectItems = this.$select.find('.select-item');
154
+ this.$selectLabels = this.$select.find('[data-label]');
155
+
156
+ if (this.showSearch) {
157
+ this.$searchContainer = this.$select.find('.select-search');
158
+ this.$searchInput = this.$select.find('[name="select-search"]');
159
+ this.$searchIconContainer = this.$select.find('.select-search-icon');
160
+ this.$clearSearchButton = this.$select.find('[data-clear-search]');
161
+ }
162
+
163
+ if (this.showFooter) {
164
+ this.$footerContainer = this.$select.find('.select-footer');
165
+ this.$closeButton = this.$select.find('[data-select-close]');
166
+ }
167
+
168
+ $.each(this.$selectLabels, (i, el) => {
169
+
170
+ this.searchData.push({
171
+ id: i,
172
+ val: $(el).text().trim()
173
+ });
174
+ });
175
+
176
+ this.log(this.$el);
177
+ this.log(this.$select);
178
+ this.log(this.$scrollableContent);
179
+ this.log('Name: '+this.name);
180
+ this.log('Show search: '+this.showSearch);
181
+ this.log('Show footer: '+this.showFooter);
182
+ this.log('Scroll content height: '+this.scrollContentHeight+'px');
183
+ this.log(this.items);
184
+ this.log(this.searchData);
185
+
186
+ return true;
187
+ }
188
+ }
189
+
190
+ // Build scroll
191
+ buildScroll() {
192
+
193
+ if (this.$scrollableContent.length > 0) {
194
+
195
+ let scrollContentHeight = this.scrollContentHeight;
196
+
197
+ if (this.showSearch) {
198
+ scrollContentHeight = scrollContentHeight - (this.$searchContainer.outerHeight(true) || 0);
199
+ }
200
+
201
+ if (this.showFooter) {
202
+ scrollContentHeight = scrollContentHeight - (this.$footerContainer.outerHeight(true) || 0);
203
+ }
204
+
205
+ this.$scrollableContent.css({
206
+ 'max-height': (scrollContentHeight - parseInt(this.$scrollableContent.css('marginTop'), 10) - parseInt(this.$scrollableContent.css('marginBottom'), 10)) +'px'
207
+ });
208
+
209
+ if (touchEvents()) {
210
+
211
+ this.$scrollableContent.css({
212
+ 'overflow-y': 'auto'
213
+ });
214
+
215
+ } else {
216
+
217
+ this.$scrollableContent.addClass('ps-dark');
218
+ this.scroll = new PerfectScrollbar(this.$scrollableContent[0], {
219
+ wheelSpeed: 1,
220
+ wheelPropagation: false,
221
+ minScrollbarLength: 20,
222
+ scrollYMarginOffset : -1,
223
+ suppressScrollY: true,
224
+ suppressScrollX: true,
225
+ });
226
+
227
+ if (this.$scrollableContent[0].offsetHeight < this.$scrollableContent[0].scrollHeight) {
228
+
229
+ this.$scrollableContent.addClass('ps-show-rail-y');
230
+ this.scroll.settings.suppressScrollY = false;
231
+ }
232
+ }
233
+ }
234
+ }
235
+
236
+ // Bind events that trigger methods
237
+ bindEvents() {
238
+
239
+ let self = this;
240
+
241
+ this.$selectHeader.on('click'+'.'+NAME, () => {
242
+
243
+ if (this.contentOpen) {
244
+ this.close();
245
+ } else {
246
+ this.show();
247
+ }
248
+ });
249
+
250
+ this.$el.on('change'+'.'+NAME, 'input[type="checkbox"]', function() {
251
+
252
+ let val = $(this).val();
253
+
254
+ if (this.checked) {
255
+ self.data[self.name].indexOf(val) === -1 ? self.data[self.name].push(val) : false;
256
+ } else {
257
+ self.data[self.name] = self.data[self.name].filter(n => n != val);
258
+ }
259
+
260
+ self.onSelect(this);
261
+ });
262
+
263
+ this.$el.on('change'+'.'+NAME, 'input[type="radio"]', function() {
264
+
265
+ let val = $(this).val();
266
+
267
+ if (this.checked) {
268
+
269
+ self.data[self.name] = val;
270
+ self.$select.find('input[type="radio"]').not($(this)).prop('checked', false);
271
+ self.$select.find('input[type="radio"]').not($(this)).removeClass('checked');
272
+
273
+ } else {
274
+
275
+ self.data[self.name] = [];
276
+ }
277
+ });
278
+
279
+ this.$el.on('click'+'.'+NAME, 'input[type="radio"]', function() {
280
+
281
+ if ($(this).hasClass('checked')) {
282
+
283
+ self.data[plugin.name] = [];
284
+ $(this).prop('checked', false);
285
+ $(this).removeClass('checked');
286
+
287
+ } else {
288
+
289
+ $(this).addClass('checked');
290
+ }
291
+
292
+ self.onSelect(this);
293
+ });
294
+
295
+ if (this.scroll) {
296
+
297
+ this.$scrollableContent.find('.ps__thumb-y').mousedown(function() {
298
+ self.$scrollableContent.addClass('ps-mousedown-scroll');
299
+ });
300
+
301
+ $(document).mouseup(function() {
302
+
303
+ if (self.$scrollableContent.hasClass('ps-mousedown-scroll')) {
304
+ self.$scrollableContent.removeClass('ps-mousedown-scroll');
305
+ }
306
+ });
307
+ }
308
+
309
+ if (this.showSearch) {
310
+
311
+ this.$searchInput.on('keydown'+'.'+NAME, debounce(function () {
312
+
313
+ self.searchString = $(this).val().trim();
314
+ self.search.call(self);
315
+
316
+ }, 250));
317
+
318
+ this.$searchInput.on('focusin'+'.'+NAME, function () {
319
+
320
+ self.$searchContainer.addClass('focused');
321
+ });
322
+
323
+ this.$searchInput.on('focusout'+'.'+NAME, function () {
324
+
325
+ self.$searchContainer.removeClass('focused');
326
+ });
327
+
328
+ this.$clearSearchButton.on('click'+'.'+NAME, function() {
329
+
330
+ if (self.searchString.length) {
331
+
332
+ self.$searchInput.val('');
333
+ self.searchString = '';
334
+
335
+ self.search.call(self);
336
+
337
+ } else {
338
+
339
+ return;
340
+ }
341
+ });
342
+ }
343
+
344
+ if (this.showFooter) {
345
+
346
+ this.$closeButton.on('click'+'.'+NAME, () => {
347
+
348
+ this.close();
349
+ });
350
+ }
351
+
352
+ $(document).on('touchstart click', function(e) {
353
+
354
+ if (!self.$el.is(e.target) && self.$el.has(e.target).length === 0 && self.contentOpen) {
355
+
356
+ self.close.call(self);
357
+ }
358
+ });
359
+ }
360
+
361
+ // Unbind events that trigger methods
362
+ unbindEvents() {
363
+
364
+ this.$el.off('.'+NAME);
365
+ }
366
+
367
+ // Get data
368
+ getData(data) {
369
+
370
+ if (data) {
371
+ return this.data[data];
372
+ } else {
373
+ return this.data;
374
+ }
375
+ }
376
+
377
+ // Set data
378
+ setData() {
379
+
380
+ let self = this;
381
+ let type = null;
382
+ let faNameSpace = this.opts.faPro ? 'fal' : 'fas';
383
+
384
+ this.$selectIconContainer.html(`<i class="${faNameSpace} fa-check text-green icon"></i>`);
385
+
386
+ if (this.searchApi.length) {
387
+
388
+ let searchUrl = this.searchApi;
389
+ let itemCount = this.data[this.name].length;
390
+ let currentCount = 0;
391
+
392
+ this.data[this.name].forEach(function(value) {
393
+
394
+ searchUrl += encodeURIComponent('#'+value);
395
+ currentCount++;
396
+
397
+ if (currentCount !== itemCount) {
398
+ searchUrl += '+';
399
+ }
400
+ });
401
+
402
+ $.ajax({
403
+ method: 'GET',
404
+ url: searchUrl
405
+ }).done(function(data) {
406
+
407
+ let items = data.map(function (item) {
408
+
409
+ if (item.name) {
410
+ let label = item.name;
411
+ } else if (item.label) {
412
+ let label = item.label;
413
+ } else if (item.value) {
414
+ let label = item.value;
415
+ }
416
+
417
+ return {
418
+ id: item.id.toString(),
419
+ label: label
420
+ }
421
+ });
422
+
423
+ items = items.filter(function(item) {
424
+ return self.data[self.name].indexOf(item.id) > -1;
425
+ });
426
+
427
+ let result = $(self._renderItemList(items));
428
+
429
+ $.when(self.$scrollableContent.append(result)).then(function() {
430
+
431
+ if (self.$scrollableContent[0].offsetHeight < self.$scrollableContent[0].scrollHeight) {
432
+
433
+ self.scroll.update();
434
+ self.scroll.settings.suppressScrollY = false;
435
+ self.$scrollableContent.addClass('ps-show-rail-y');
436
+
437
+ } else {
438
+
439
+ self.scroll.update();
440
+ self.scroll.settings.suppressScrollY = true;
441
+ self.$scrollableContent.removeClass('ps-show-rail-y');
442
+ }
443
+
444
+ if (self.$select.find(':input[type="checkbox"]').length) {
445
+ type = 'checkbox';
446
+ } else if (self.$select.find(':input[type="radio"]').length) {
447
+ type = 'radio';
448
+ }
449
+
450
+ if (type == 'checkbox') {
451
+
452
+ self.data[self.name].forEach(function(value) {
453
+
454
+ let $input = self.$select.find(':input').filter(function() { return this.value == value });
455
+
456
+ $input.prop('checked', true);
457
+
458
+ self.onSelect($input[0]);
459
+ });
460
+
461
+ } else if (type == 'radio') {
462
+
463
+ let $input = self.$select.find(':input').filter(function() { return this.value == self.data[self.name] });
464
+
465
+ $input.prop('checked', true);
466
+ $input.addClass('checked');
467
+
468
+ self.onSelect($input[0]);
469
+ }
470
+ });
471
+ });
472
+
473
+ } else {
474
+
475
+ if (this.$select.find(':input[type="checkbox"]').length) {
476
+ type = 'checkbox';
477
+ } else if (this.$select.find(':input[type="radio"]').length) {
478
+ type = 'radio';
479
+ }
480
+
481
+ if (type == 'checkbox') {
482
+
483
+ this.data[this.name].forEach(function(value) {
484
+
485
+ let $input = self.$select.find(':input').filter(function() { return this.value == value });
486
+
487
+ $input.prop('checked', true);
488
+
489
+ self.onSelect($input[0]);
490
+ });
491
+
492
+ } else if (type == 'radio') {
493
+
494
+ let $input = this.$select.find(':input').filter(function() { return this.value == self.data[self.name] });
495
+
496
+ $input.prop('checked', true);
497
+ $input.addClass('checked');
498
+
499
+ this.onSelect($input[0]);
500
+ }
501
+ }
502
+ }
503
+
504
+ // Search
505
+ search() {
506
+
507
+ let self = this;
508
+ let faNameSpace = this.opts.faPro ? 'fal' : 'fas';
509
+
510
+ if (this.searchString.length) {
511
+
512
+ if (this.searchApi.length) {
513
+
514
+ this.$scrollableContent.find('input:not(:checked)').parents('.select-item').not('.static-item').remove();
515
+
516
+ $.ajax({
517
+ method: 'GET',
518
+ url: this.searchApi + this.searchString
519
+ }).done(function(data) {
520
+
521
+ let items = data.map(function (item) {
522
+ return {
523
+ id: item.id.toString(),
524
+ label: item.name || item.label || item.value || null
525
+ }
526
+ });
527
+
528
+ items = items.filter(function(item) {
529
+ return !(self.data[self.name].indexOf(item.id) > -1);
530
+ });
531
+
532
+ // Remove 0 id from results
533
+ items = items.filter(function(item) {
534
+ return [0].indexOf(item.id) > -1;
535
+ });
536
+
537
+ let result = $(self._renderItemList(items));
538
+
539
+ $.when(self.$scrollableContent.append(result)).then(function() {
540
+
541
+ let faNameSpace = self.opts.faPro ? 'fal' : 'fas';
542
+
543
+ self.$searchIconContainer.html(`<i class="${faNameSpace} fa-times icon"></i>`);
544
+ self.$searchIconContainer.attr('data-clear-search', 'true');
545
+
546
+ if (self.$scrollableContent[0].offsetHeight < self.$scrollableContent[0].scrollHeight) {
547
+
548
+ self.scroll.update();
549
+ self.scroll.settings.suppressScrollY = false;
550
+ self.$scrollableContent.addClass('ps-show-rail-y');
551
+
552
+ } else {
553
+
554
+ self.scroll.update();
555
+ self.scroll.settings.suppressScrollY = true;
556
+ self.$scrollableContent.removeClass('ps-show-rail-y');
557
+ }
558
+ });
559
+ });
560
+
561
+ } else {
562
+
563
+ let results = this.searchData.filter(function(item) {
564
+ return item.val.toLocaleLowerCase().indexOf(self.searchString.toLocaleLowerCase()) > -1;
565
+ });
566
+
567
+ this.$selectItems.removeClass('d-none');
568
+ this.$selectItems.removeClass('visible');
569
+
570
+ results.forEach(function(item) {
571
+ $(self.$selectItems[item.id]).addClass('visible');
572
+ });
573
+
574
+
575
+
576
+ this.$selectItems.not('.visible').addClass('d-none');
577
+ this.$searchIconContainer.html(`<i class="${faNameSpace} fa-times icon"></i>`);
578
+ this.$searchIconContainer.attr('data-clear-search', 'true');
579
+ }
580
+
581
+ } else {
582
+
583
+ if (this.searchApi.length) {
584
+
585
+ this.$scrollableContent.find('input:not(:checked)').parents('.select-item').not('.static-item').remove();
586
+ this.$searchIconContainer.html(`<i class="${faNameSpace} fa-search icon"></i>`);
587
+ this.$searchIconContainer.attr('data-clear-search', '');
588
+
589
+ } else {
590
+
591
+ this.$selectItems.removeClass('d-none');
592
+ this.$selectItems.removeClass('visible');
593
+ this.$searchIconContainer.html(`<i class="${faNameSpace} fa-search icon"></i>`);
594
+ this.$searchIconContainer.attr('data-clear-search', '');
595
+ }
596
+ }
597
+
598
+ if (this.scroll) {
599
+ this.scroll.update();
600
+ }
601
+
602
+ this.onUpdate();
603
+ }
604
+
605
+ // Show
606
+ show() {
607
+
608
+ if (this.$el.hasClass('show')) {
609
+ return;
610
+ }
611
+
612
+ let $otherSelects = $('.select.show');
613
+ let zindex = 1;
614
+ let faNameSpace = this.opts.faPro ? 'fal' : 'fas';
615
+
616
+ if ($otherSelects.length) {
617
+ zindex = parseInt($otherSelects.first().css('z-index'), 10) + 2;
618
+ }
619
+
620
+ this.$el.css({
621
+ 'max-height': (this.scrollContentHeight + this.$selectHeader.outerHeight(true))+'px'
622
+ });
623
+
624
+ this.$el.addClass('show');
625
+
626
+ if (!$otherSelects.length) {
627
+ zindex = parseInt(this.$el.css('z-index'), 10) + 1;
628
+ }
629
+
630
+ this.$el.css({
631
+ 'z-index': zindex
632
+ });
633
+
634
+ if (this.scroll && this.$scrollableContent.length) {
635
+
636
+ if (this.$scrollableContent[0].offsetHeight < this.$scrollableContent[0].scrollHeight) {
637
+ this.$scrollableContent[0].scrollTop = 1;
638
+ this.$scrollableContent[0].scrollTop = 0;
639
+ }
640
+ }
641
+
642
+ this.$selectIconContainer.html(`<i class="${faNameSpace} fa-angle-up icon"></i>`);
643
+
644
+ this.contentOpen = true;
645
+ this.onShow();
646
+ }
647
+
648
+ // Close
649
+ close() {
650
+
651
+ let self = this;
652
+ let faNameSpace = this.opts.faPro ? 'fal' : 'fas';
653
+
654
+ this.$el.css('max-height', '');
655
+ this.$el.removeClass('show');
656
+
657
+ setTimeout(() => {
658
+ self.$el.removeAttr('style');
659
+ }, 300);
660
+
661
+ if (this.data[this.name].length > 0) {
662
+ this.$selectIconContainer.html(`<i class="${faNameSpace} fa-check text-green icon"></i>`);
663
+ } else {
664
+ this.$selectIconContainer.html(`<i class="${faNameSpace} fa-angle-down icon"></i>`);
665
+ }
666
+
667
+ this.contentOpen = false;
668
+ this.onClose();
669
+ }
670
+
671
+ onSelect(el) {
672
+
673
+ let onSelect = this.opts.onSelect;
674
+
675
+ if (typeof onSelect === 'function') {
676
+
677
+ onSelect.call(el);
678
+ }
679
+ }
680
+
681
+ _renderItemList(items) {
682
+
683
+ let html = '';
684
+
685
+ for (let i = 0; i < items.length; ++i) {
686
+
687
+ html += `
688
+
689
+ <div class="select-item">
690
+
691
+ <div class="select-item-${this.type}">
692
+
693
+ <div class="styled-${this.type}">">
694
+
695
+ <input type="${this.type}">" id="select-${this.name}-${items[i].id}" value="${items[i].id}">
696
+
697
+ <label for="select-${this.name}-${items[i].id}">
698
+
699
+ <span class="radio-inner">
700
+ <svg viewBox="0 0 18 18">
701
+ <polyline points="1.5 6 4.5 9 10.5 1"></polyline>
702
+ </svg>
703
+ </span>
704
+
705
+ <span class="${this.type}">-label" data-label>
706
+ ${items[i].label}
707
+ </span>
708
+
709
+ </label>
710
+
711
+ </div>
712
+
713
+ </div>
714
+
715
+ </div>
716
+
717
+ `;
718
+ }
719
+ }
720
+
721
+ _renderSearch() {
722
+
723
+ if (!this.showSearch) {
724
+ return '';
725
+ }
726
+
727
+ let faNameSpace = this.opts.faPro ? 'fal' : 'fas';
728
+
729
+ return `
730
+
731
+ <div class="select-search">
732
+
733
+ <div class="select-search-input">
734
+
735
+ <input type="text" name="select-search" value="" placeholder="${this.opts.searchPlaceholder}">
736
+
737
+ </div>
738
+
739
+ <div class="select-search-icon">
740
+
741
+ <i class="${faNameSpace} fa-search icon"></i>
742
+
743
+ </div>
744
+
745
+ </div>
746
+
747
+ `;
748
+ }
749
+
750
+ _renderFooter() {
751
+
752
+ if (!this.showFooter) {
753
+ return '';
754
+ }
755
+
756
+ return `
757
+
758
+ <div class="select-footer">
759
+
760
+ <button class="btn btn-primary" type="button" data-select-close>
761
+ ${this.opts.btnCloseText}
762
+ </button>
763
+
764
+ </div>
765
+
766
+ `;
767
+ }
768
+
769
+ static _jQueryInterface(config) {
770
+
771
+ return this.each(function() {
772
+
773
+ let data = $(this).data(DATA_KEY);
774
+ const _config = typeof config === 'object' && config;
775
+
776
+ if (!data) {
777
+ data = new Select(this, _config);
778
+ $(this).data(DATA_KEY, data);
779
+ }
780
+
781
+ if (typeof config === 'string') {
782
+
783
+ if (typeof data[config] === 'undefined') {
784
+ throw new TypeError(`No method named "${config}"`)
785
+ }
786
+
787
+ data[config]()
788
+ }
789
+ });
790
+ }
791
+
792
+ }
793
+
794
+ if (typeof $ !== 'undefined') {
795
+
796
+ // jQuery
797
+ const JQUERY_NO_CONFLICT = $.fn[NAME];
798
+
799
+ $.fn[NAME] = Select._jQueryInterface;
800
+ $.fn[NAME].Constructor = Select;
801
+
802
+ $.fn[NAME].noConflict = () => {
803
+
804
+ $.fn[NAME] = JQUERY_NO_CONFLICT
805
+
806
+ return Select._jQueryInterface
807
+ }
808
+
809
+ $.fn[NAME].defaults = {
810
+ name: '',
811
+ type: 'checkbox',
812
+ scrollContentHeight: 100,
813
+ faPro: false,
814
+ items: [],
815
+ showSearch: false,
816
+ showFooter: false,
817
+ searchApi: false,
818
+ onInit: null,
819
+ onUpdate: null,
820
+ onDestroy: null,
821
+ onShow: null,
822
+ onClose: null,
823
+ onSearch: null,
824
+ onSelect: null,
825
+ buildScroll: null,
826
+ searchPlaceholder: null,
827
+ btnCloseText: null,
828
+ debug: false
829
+ }
830
+ }
831
+
832
+ export default Select;