@finqu/cool 1.2.28 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (207) hide show
  1. package/README.md +680 -1
  2. package/dist/css/cool.css +23510 -16076
  3. package/dist/css/cool.css.map +1 -154
  4. package/dist/css/cool.min.css +89 -3
  5. package/dist/css/cool.min.css.map +1 -1
  6. package/dist/js/cool.bundle.js +15397 -3775
  7. package/dist/js/cool.bundle.js.map +1 -1
  8. package/dist/js/cool.bundle.min.js +20 -8
  9. package/dist/js/cool.bundle.min.js.map +1 -1
  10. package/dist/js/cool.esm.js +4281 -3352
  11. package/dist/js/cool.esm.js.map +1 -1
  12. package/dist/js/cool.esm.min.js +9 -8
  13. package/dist/js/cool.esm.min.js.map +1 -1
  14. package/dist/js/cool.js +4283 -3354
  15. package/dist/js/cool.js.map +1 -1
  16. package/dist/js/cool.min.js +9 -8
  17. package/dist/js/cool.min.js.map +1 -1
  18. package/package.json +94 -61
  19. package/.babelrc.js +0 -20
  20. package/.browserslistrc +0 -13
  21. package/build/.eslintrc.json +0 -10
  22. package/build/banner.js +0 -14
  23. package/build/build-plugins.js +0 -92
  24. package/build/rollup.config.js +0 -46
  25. package/dist/css/cool-grid.css +0 -3704
  26. package/dist/css/cool-grid.css.map +0 -30
  27. package/dist/css/cool-grid.min.css +0 -7
  28. package/dist/css/cool-grid.min.css.map +0 -1
  29. package/dist/css/cool-reboot.css +0 -285
  30. package/dist/css/cool-reboot.css.map +0 -62
  31. package/dist/css/cool-reboot.min.css +0 -7
  32. package/dist/css/cool-reboot.min.css.map +0 -1
  33. package/html/dropdown-test.html +0 -200
  34. package/html/index.html +0 -2704
  35. package/js/dist/collapse.js +0 -5290
  36. package/js/dist/collapse.js.map +0 -1
  37. package/js/dist/common.js +0 -22152
  38. package/js/dist/common.js.map +0 -1
  39. package/js/dist/cooldropdown.js +0 -467
  40. package/js/dist/cooldropdown.js.map +0 -1
  41. package/js/dist/coolpopover.js +0 -391
  42. package/js/dist/coolpopover.js.map +0 -1
  43. package/js/dist/coolsectiontabs.js +0 -256
  44. package/js/dist/coolsectiontabs.js.map +0 -1
  45. package/js/dist/coolselect.js +0 -796
  46. package/js/dist/coolselect.js.map +0 -1
  47. package/js/dist/cooltooltip.js +0 -360
  48. package/js/dist/cooltooltip.js.map +0 -1
  49. package/js/dist/coolui.js +0 -73
  50. package/js/dist/coolui.js.map +0 -1
  51. package/js/dist/dropdown.js +0 -27421
  52. package/js/dist/dropdown.js.map +0 -1
  53. package/js/dist/popover.js +0 -9298
  54. package/js/dist/popover.js.map +0 -1
  55. package/js/dist/sectiontabs.js +0 -4483
  56. package/js/dist/sectiontabs.js.map +0 -1
  57. package/js/dist/select.js +0 -37052
  58. package/js/dist/select.js.map +0 -1
  59. package/js/dist/tooltip.js +0 -8786
  60. package/js/dist/tooltip.js.map +0 -1
  61. package/js/index.esm.js +0 -21
  62. package/js/index.umd.js +0 -21
  63. package/js/src/abstract-ui-component.js +0 -81
  64. package/js/src/collapse.js +0 -272
  65. package/js/src/common.js +0 -313
  66. package/js/src/dialog.js +0 -578
  67. package/js/src/dropdown.js +0 -525
  68. package/js/src/popover.js +0 -621
  69. package/js/src/section-tabs.js +0 -215
  70. package/js/src/select.js +0 -1341
  71. package/js/src/toast.js +0 -581
  72. package/js/src/tooltip.js +0 -591
  73. package/js/src/util/animate-css.js +0 -22
  74. package/js/src/util/index.js +0 -122
  75. package/js/src/util/perfect-scrollbar.js +0 -1316
  76. package/less/alert.less +0 -345
  77. package/less/badge.less +0 -38
  78. package/less/bootstrap-noconflict.less +0 -23
  79. package/less/bootstrap.less +0 -23
  80. package/less/button-group.less +0 -153
  81. package/less/buttons.less +0 -287
  82. package/less/dialog-noconflict.less +0 -174
  83. package/less/dialog.less +0 -203
  84. package/less/dropdown.less +0 -209
  85. package/less/forms.less +0 -770
  86. package/less/images.less +0 -242
  87. package/less/input-group.less +0 -163
  88. package/less/list-group.less +0 -73
  89. package/less/mixins/aspect-ratio.less +0 -23
  90. package/less/mixins/border-radius.less +0 -24
  91. package/less/mixins/box-shadow.less +0 -4
  92. package/less/mixins/buttons.less +0 -17
  93. package/less/mixins/caret.less +0 -51
  94. package/less/mixins/clearfix.less +0 -10
  95. package/less/mixins/gradients.less +0 -34
  96. package/less/mixins/nav-divider.less +0 -7
  97. package/less/mixins/object-fit.less +0 -13
  98. package/less/mixins/reset-text.less +0 -16
  99. package/less/mixins.less +0 -11
  100. package/less/package.json +0 -11
  101. package/less/pagination.less +0 -69
  102. package/less/popover.less +0 -143
  103. package/less/project.sublime-workspace +0 -774
  104. package/less/reboot.less +0 -235
  105. package/less/section.less +0 -793
  106. package/less/select.less +0 -150
  107. package/less/tables.less +0 -737
  108. package/less/tabs.less +0 -162
  109. package/less/tooltip.less +0 -87
  110. package/less/type.less +0 -71
  111. package/less/utilities/align.less +0 -27
  112. package/less/utilities/animate.less +0 -3512
  113. package/less/utilities/background.less +0 -70
  114. package/less/utilities/borders.less +0 -16
  115. package/less/utilities/color.less +0 -70
  116. package/less/utilities/cursor.less +0 -8
  117. package/less/utilities/display.less +0 -38
  118. package/less/utilities/embed.less +0 -61
  119. package/less/utilities/flex.less +0 -76
  120. package/less/utilities/jquery-ui.less +0 -116
  121. package/less/utilities/lazyload.less +0 -29
  122. package/less/utilities/overflow.less +0 -11
  123. package/less/utilities/pace.less +0 -25
  124. package/less/utilities/placeholder.less +0 -60
  125. package/less/utilities/position.less +0 -42
  126. package/less/utilities/scrollbar.less +0 -152
  127. package/less/utilities/spacing.less +0 -197
  128. package/less/utilities/text.less +0 -68
  129. package/less/utilities/transform.less +0 -7
  130. package/less/utilities.less +0 -21
  131. package/less/variables.less +0 -343
  132. package/scss/LISENCE +0 -15
  133. package/scss/_alert.scss +0 -106
  134. package/scss/_badge.scss +0 -71
  135. package/scss/_button-group.scss +0 -129
  136. package/scss/_buttons.scss +0 -207
  137. package/scss/_custom-forms.scss +0 -429
  138. package/scss/_dialog.scss +0 -161
  139. package/scss/_dropdown.scss +0 -231
  140. package/scss/_forms.scss +0 -257
  141. package/scss/_frame.scss +0 -548
  142. package/scss/_functions.scss +0 -124
  143. package/scss/_grid.scss +0 -35
  144. package/scss/_images.scss +0 -362
  145. package/scss/_input-group.scss +0 -271
  146. package/scss/_list-group.scss +0 -82
  147. package/scss/_mixins.scss +0 -34
  148. package/scss/_navbar.scss +0 -264
  149. package/scss/_notification.scss +0 -13
  150. package/scss/_pagination.scss +0 -79
  151. package/scss/_popover.scss +0 -165
  152. package/scss/_reboot.scss +0 -283
  153. package/scss/_root.scss +0 -15
  154. package/scss/_section.scss +0 -912
  155. package/scss/_select.scss +0 -175
  156. package/scss/_tables.scss +0 -716
  157. package/scss/_tabs.scss +0 -175
  158. package/scss/_toast.scss +0 -182
  159. package/scss/_tooltip.scss +0 -101
  160. package/scss/_type.scss +0 -121
  161. package/scss/_utilities.scss +0 -23
  162. package/scss/_variables.scss +0 -699
  163. package/scss/cool-grid.scss +0 -29
  164. package/scss/cool-reboot.scss +0 -11
  165. package/scss/cool.scss +0 -37
  166. package/scss/mixins/_alert-variant.scss +0 -25
  167. package/scss/mixins/_aspect-ratio.scss +0 -29
  168. package/scss/mixins/_background-variant.scss +0 -25
  169. package/scss/mixins/_badge-variant.scss +0 -36
  170. package/scss/mixins/_breakpoints.scss +0 -102
  171. package/scss/mixins/_buttons.scss +0 -104
  172. package/scss/mixins/_caret.scss +0 -80
  173. package/scss/mixins/_clearfix.scss +0 -10
  174. package/scss/mixins/_float.scss +0 -14
  175. package/scss/mixins/_forms.scss +0 -67
  176. package/scss/mixins/_gradients.scss +0 -40
  177. package/scss/mixins/_grid-framework.scss +0 -72
  178. package/scss/mixins/_grid.scss +0 -60
  179. package/scss/mixins/_nav-divider.scss +0 -9
  180. package/scss/mixins/_notification-variant.scss +0 -7
  181. package/scss/mixins/_object-fit.scss +0 -16
  182. package/scss/mixins/_reset-text.scss +0 -19
  183. package/scss/mixins/_text-emphasis.scss +0 -21
  184. package/scss/mixins/_text-hide.scss +0 -10
  185. package/scss/mixins/_text-truncate.scss +0 -81
  186. package/scss/mixins/_visibility.scss +0 -7
  187. package/scss/project.sublime-workspace +0 -491
  188. package/scss/utilities/_align.scss +0 -41
  189. package/scss/utilities/_animate.scss +0 -3512
  190. package/scss/utilities/_background.scss +0 -14
  191. package/scss/utilities/_borders.scss +0 -146
  192. package/scss/utilities/_clearfix.scss +0 -6
  193. package/scss/utilities/_collapse.scss +0 -33
  194. package/scss/utilities/_cursor.scss +0 -22
  195. package/scss/utilities/_display.scss +0 -16
  196. package/scss/utilities/_embed.scss +0 -78
  197. package/scss/utilities/_flex.scss +0 -52
  198. package/scss/utilities/_lazyload.scss +0 -31
  199. package/scss/utilities/_overflow.scss +0 -6
  200. package/scss/utilities/_perfect-scrollbar.scss +0 -141
  201. package/scss/utilities/_placeholder.scss +0 -76
  202. package/scss/utilities/_position.scss +0 -30
  203. package/scss/utilities/_sizing.scss +0 -32
  204. package/scss/utilities/_spacing.scss +0 -92
  205. package/scss/utilities/_text.scss +0 -99
  206. package/scss/utilities/_user-select.scss +0 -14
  207. package/scss/utilities/_visibility.scss +0 -10
package/js/src/select.js DELETED
@@ -1,1341 +0,0 @@
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
- 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
- // Reset plugin data
64
- reset() {
65
-
66
- this.data = {};
67
- this.data[this.name] = [];
68
- this.items = [];
69
- this.$select.find('.select-item').remove();
70
- this.$selectItems = [];
71
- this.$selectIconContainer.html(this.selectIconDefault);
72
-
73
- if (this.data[this.name].length == 0 &&
74
- this.dynamicTitle &&
75
- this.dynamicTitleDefault &&
76
- this.dynamicTitleDefault !== 0 &&
77
- this.$selectTitle.text().trim() == 0 &&
78
- (this.$selectItems.length > 0 || this.searchApi)) {
79
-
80
- this.$selectTitle.html(this.dynamicTitleDefault);
81
- }
82
-
83
- if (this.$selectItems.length == 0 && !this.searchApi && this.dynamicTitle && this.dynamicTitleEmptyDefault && this.dynamicTitleEmptyDefault !== 0) {
84
-
85
- this.$selectHeader.css('cursor', 'default');
86
- this.$selectIconContainer.addClass('d-none');
87
- this.$selectTitle.html(this.dynamicTitleEmptyDefault);
88
- }
89
-
90
- if (this.showSearch) {
91
-
92
- this.searchData = [];
93
- this.$searchInput.val('');
94
- this.searchString = '';
95
- this.search.call(this);
96
- }
97
- }
98
-
99
- // Cache DOM nodes for performance
100
- buildCache() {
101
-
102
- return new Promise((primaryResolve, primaryReject) => {
103
-
104
- let self = this;
105
-
106
- this.$el = $(this.el);
107
- this.$container = this.$el.parent();
108
- this.$selectHeader = this.$el.find('.select-header');
109
- this.$selectTitle = this.$el.find('.select-title');
110
- this.$selectIconContainer = this.$selectHeader.find('.select-icon');
111
- this.selectIconDefault = this.$selectHeader.find('.select-icon') ? this.$selectHeader.find('.select-icon').html() : '<i class="'+(this.opts.faPro ? 'fal' : 'fas')+'fa-angle-down icon"></i>';
112
- this.name = this.$el.data('name') ? this.$el.data('name') : this.opts.name;
113
- this.scrollContentHeight = this.$el.data('scrollContentHeight') ? this.$el.data('scrollContentHeight') : this.opts.scrollContentHeight;
114
- this.items = this.$el.data('items') ? this.$el.data('items') : this.opts.items;
115
- this.data = {};
116
- this.data[this.name] = [];
117
- this.searchData = [];
118
- this.searchApi = this.$el.data('searchApi') ? this.$el.data('searchApi') : this.opts.searchApi;
119
- this.searchRequest = null;
120
- this.type = this.$el.data('type') ? this.$el.data('type') : this.opts.type;
121
- this.contentOpen = false;
122
- this.searchPlaceholder = this.$el.data('search-placeholder') ? this.$el.data('search-placeholder') : this.opts.searchPlaceholder;
123
- this.btnCloseText = this.$el.data('btn-close-text') ? this.$el.data('btn-close-text') : this.opts.btnCloseText;
124
- this.labelTemplate = this.opts.labelTemplate;
125
- this.confirmCheck = this.opts.confirmCheck;
126
- this.confirmUncheck = this.opts.confirmUncheck;
127
- this.preventUncheck = this.opts.preventUncheck;
128
- this.dynamicTitle = this.$el.data('dynamicTitle') ? this.$el.data('dynamicTitle') : this.opts.dynamicTitle;
129
- this.dynamicTitleDefault = this.$el.data('dynamicTitleDefault') ? this.$el.data('dynamicTitleDefault') : this.opts.dynamicTitleDefault;
130
- this.dynamicTitleEmptyDefault = this.$el.data('dynamicTitleEmptyDefault') ? this.$el.data('dynamicTitleEmptyDefault') : this.opts.dynamicTitleEmptyDefault;
131
- this.allowNoneOnRadioSelect = this.$el.data('allowNoneOnRadioSelect') ? this.$el.data('allowNoneOnRadioSelect') : this.opts.allowNoneOnRadioSelect;
132
- this.showValidStateIcon = this.$el.data('showValidStateIcon') ? this.$el.data('showValidStateIcon') : this.opts.showValidStateIcon;
133
- this.itemsToExclude = this.$el.data('itemsToExclude') ? this.$el.data('itemsToExclude').replace(/\s/g, '').split(',') : this.opts.itemsToExclude;
134
- this.primaryKeyword = this.$el.data('primaryKeyword') ? this.$el.data('primaryKeyword') : this.opts.primaryKeyword;
135
- this.preventClose = false;
136
-
137
- if (this.itemsToExclude.length > 0) {
138
- this.itemsToExclude = this.itemsToExclude.map(String);
139
- }
140
-
141
- if (this.opts.setData) {
142
- this.data = this.opts.setData;
143
- }
144
-
145
- if (this.$el.data('setData') && this.$el.data('setData') != '') {
146
- this.data = this.$el.data('setData');
147
- }
148
-
149
- // Convert data to be array so filters doesn't fail
150
- if (!Array.isArray(this.data[this.name]) && this.data[this.name] !== '' && this.data[this.name].length > 0) {
151
-
152
- const arr = this.data[this.name].toString().trim().split(',');
153
-
154
- this.data[this.name] = arr;
155
- }
156
-
157
- // Convert all values to string format to make filtering more simple
158
- if (this.data[this.name].length > 0) {
159
- this.data[this.name] = this.data[this.name].map(String);
160
- }
161
-
162
- if (this.data[this.name].length > 0 && this.itemsToExclude.length > 0) {
163
-
164
- this.data[this.name] = this.data[this.name].filter(function(item) {
165
-
166
- if (item[self.primaryKeyword]) {
167
-
168
- return self.itemsToExclude.indexOf(item[self.primaryKeyword].toString()) === -1;
169
-
170
- } else {
171
-
172
- return self.itemsToExclude.indexOf(item.toString()) === -1;
173
- }
174
- });
175
- }
176
-
177
- if (this.items.length > 0 && this.itemsToExclude.length > 0) {
178
-
179
- this.items = this.items.filter(function(item) {
180
-
181
- if (item[self.primaryKeyword]) {
182
-
183
- return self.itemsToExclude.indexOf(item[self.primaryKeyword].toString()) === -1;
184
-
185
- } else {
186
-
187
- return self.itemsToExclude.indexOf(item.toString()) === -1;
188
- }
189
- });
190
- }
191
-
192
- if (this.$el.find('.select-search').length) {
193
- this.showSearch = true;
194
- } else {
195
- this.showSearch = this.$el.data('showSearch') ? this.$el.data('showSearch') : this.opts.showSearch;
196
- }
197
-
198
- if (this.$el.find('.select-footer').length) {
199
- this.showFooter = true;
200
- } else {
201
- this.showFooter = this.$el.data('showFooter') ? this.$el.data('showFooter') : this.opts.showFooter;
202
- }
203
-
204
- this.$select = this.$el.find('.select-content');
205
-
206
- new Promise((secondaryResolve, secondaryReject) => {
207
-
208
- if (!this.$select.length) {
209
-
210
- let items = this._renderItemList(this.items);
211
-
212
- this.$select = $(`
213
- <div class="select-content">
214
-
215
- ${this._renderSearch()}
216
-
217
- <div class="select-scrollable-content"></div>
218
-
219
- ${this._renderFooter()}
220
-
221
- </div>
222
- `);
223
-
224
- this.$el.append(this.$select);
225
- this.$select.find('.select-scrollable-content').append(items);
226
-
227
- secondaryResolve();
228
-
229
- } else {
230
-
231
- const selectItems = this.$select.find('.select-item');
232
-
233
- if (selectItems.length > 0 && this.itemsToExclude.length > 0) {
234
-
235
- $.each(selectItems, (i, el) => {
236
-
237
- const val = $(el).find(':input').val();
238
-
239
- if (self.itemsToExclude.indexOf(val) > -1) {
240
- $(el).remove();
241
- }
242
- });
243
- }
244
-
245
- secondaryResolve();
246
- }
247
-
248
- }).then(() => {
249
-
250
- this.$scrollableContent = this.$select.find('.select-scrollable-content') ? this.$select.find('.select-scrollable-content') : false;
251
- this.$selectItems = this.$select.find('.select-item');
252
-
253
- if (this.data[this.name].length == 0 &&
254
- this.dynamicTitle &&
255
- this.dynamicTitleDefault &&
256
- this.dynamicTitleDefault !== 0 &&
257
- this.$selectTitle.text().trim() == 0 &&
258
- (this.$selectItems.length > 0 || this.searchApi)) {
259
-
260
- this.$selectTitle.html(this.dynamicTitleDefault);
261
- }
262
-
263
- if (this.$selectItems.length == 0 && !this.searchApi && this.dynamicTitle && this.dynamicTitleEmptyDefault && this.dynamicTitleEmptyDefault !== 0) {
264
-
265
- this.$selectHeader.css('cursor', 'default');
266
- this.$selectIconContainer.addClass('d-none');
267
- this.$selectTitle.html(this.dynamicTitleEmptyDefault);
268
- }
269
-
270
- if (this.showSearch) {
271
-
272
- this.$searchContainer = this.$select.find('.select-search');
273
- this.$searchInput = this.$select.find('[name="select-search"]');
274
- this.$searchIconContainer = this.$select.find('.select-search-icon');
275
- this.$clearSearchButton = this.$select.find('[data-clear-search]');
276
-
277
- // Prevent tabfocus from breaking select functionality
278
- this.$searchInput[0].tabIndex = -1;
279
- }
280
-
281
- if (this.showFooter) {
282
-
283
- this.$footerContainer = this.$select.find('.select-footer');
284
- this.$closeButton = this.$select.find('[data-select-close]');
285
-
286
- // Prevent tabfocus from breaking select functionality
287
- this.$closeButton[0].tabIndex = -1;
288
- }
289
-
290
- this.buildSearchData();
291
-
292
- this.log(this.$el);
293
- this.log(this.$select);
294
- this.log(this.$scrollableContent);
295
- this.log('Name: '+this.name);
296
- this.log('Show search: '+this.showSearch);
297
- this.log('Show footer: '+this.showFooter);
298
- this.log('Scroll content height: '+this.scrollContentHeight+'px');
299
- this.log(this.items);
300
- this.log(this.searchData);
301
-
302
- primaryResolve();
303
- })
304
- });
305
- }
306
-
307
- // Build scroll
308
- buildScroll() {
309
-
310
- if (this.$scrollableContent.length > 0) {
311
-
312
- let scrollContentHeight = this.scrollContentHeight;
313
-
314
- if (this.showSearch) {
315
- scrollContentHeight = scrollContentHeight - (this.$searchContainer.outerHeight(true) || 0);
316
- }
317
-
318
- if (this.showFooter) {
319
- scrollContentHeight = scrollContentHeight - (this.$footerContainer.outerHeight(true) || 0);
320
- }
321
-
322
- this.$scrollableContent.css({
323
- 'max-height': (scrollContentHeight - parseInt(this.$scrollableContent.css('marginTop'), 10) - parseInt(this.$scrollableContent.css('marginBottom'), 10)) +'px'
324
- });
325
-
326
- if (touchEvents()) {
327
-
328
- this.$scrollableContent.css({
329
- 'overflow-y': 'auto'
330
- });
331
-
332
- } else {
333
-
334
- this.$scrollableContent.addClass('ps-dark');
335
- this.scroll = new PerfectScrollbar(this.$scrollableContent[0], {
336
- wheelSpeed: 1,
337
- wheelPropagation: false,
338
- minScrollbarLength: 20,
339
- scrollYMarginOffset : -1,
340
- suppressScrollY: true,
341
- suppressScrollX: true,
342
- });
343
-
344
- // Prevent tabfocus from breaking select functionality
345
- this.$scrollableContent.find('[tabindex="0"]').attr('tabindex', -1);
346
-
347
- if (this.$scrollableContent[0].offsetHeight < this.$scrollableContent[0].scrollHeight) {
348
-
349
- this.$scrollableContent.addClass('ps-show-rail-y');
350
- this.scroll.settings.suppressScrollY = false;
351
- }
352
- }
353
- }
354
- }
355
-
356
- // Build search data
357
- buildSearchData() {
358
-
359
- return new Promise((resolve, reject) => {
360
-
361
- this.searchData = [];
362
-
363
- let selectLabels = this.$select.find('[data-label]');
364
-
365
- $.each(selectLabels, (i, el) => {
366
-
367
- this.searchData.push({
368
- id: i,
369
- val: $(el).text().trim()
370
- });
371
- });
372
-
373
- resolve();
374
- });
375
- }
376
-
377
- // Bind events that trigger methods
378
- bindEvents() {
379
-
380
- let self = this;
381
-
382
- this.$selectHeader.on('click'+'.'+NAME, () => {
383
-
384
- if (this.contentOpen) {
385
- this.close();
386
- } else if (this.$selectItems.length > 0 || this.searchApi) {
387
- this.show();
388
- }
389
- });
390
-
391
- this.$el.on('change'+'.'+NAME, 'input[type="checkbox"]', function() {
392
-
393
- let el = this;
394
- let val = $(this).val();
395
- let closeTimeout = 600; // ms
396
-
397
- self.preventClose = true;
398
-
399
- if (typeof self.confirmCheck === 'function' && el.checked) {
400
-
401
- el.checked = false;
402
-
403
- self.confirmCheck((cb) => {
404
-
405
- if (cb == 'confirmed') {
406
-
407
- self.data[self.name].indexOf(val) === -1 ? self.data[self.name].push(val) : false;
408
- el.checked = true;
409
- self.onSelect(el);
410
- }
411
-
412
- setTimeout(function() {
413
- self.preventClose = false;
414
- }, closeTimeout);
415
- }, el);
416
-
417
- } else if (el.checked) {
418
-
419
- self.data[self.name].indexOf(val) === -1 ? self.data[self.name].push(val) : false;
420
- self.onSelect(el);
421
-
422
- setTimeout(function() {
423
- self.preventClose = false;
424
- }, closeTimeout);
425
-
426
- } else if (typeof self.confirmUncheck === 'function' && !el.checked) {
427
-
428
- el.checked = true;
429
-
430
- self.confirmUncheck((cb) => {
431
-
432
- if (cb == 'confirmed') {
433
-
434
- self.data[self.name] = self.data[self.name].filter(n => n != val);
435
- el.checked = false;
436
- self.onSelect(el);
437
- }
438
-
439
- setTimeout(function() {
440
- self.preventClose = false;
441
- }, closeTimeout);
442
- }, el);
443
-
444
- } else if (!el.checked && !self.preventUncheck) {
445
-
446
- self.data[self.name] = self.data[self.name].filter(n => n != val);
447
- self.onSelect(el);
448
-
449
- setTimeout(function() {
450
- self.preventClose = false;
451
- }, closeTimeout);
452
-
453
- } else if (!el.checked && self.preventUncheck) {
454
-
455
- el.checked = true;
456
-
457
- setTimeout(function() {
458
- self.preventClose = false;
459
- }, closeTimeout);
460
- }
461
- });
462
-
463
- this.$el.on('change'+'.'+NAME, 'input[type="radio"]', function() {
464
-
465
- let val = $(this).val();
466
-
467
- if (this.checked) {
468
-
469
- self.data[self.name] = [val];
470
- self.$select.find('input[type="radio"]').not($(this)).prop('checked', false);
471
- self.$select.find('input[type="radio"]').not($(this)).removeClass('checked');
472
-
473
- } else {
474
-
475
- self.data[self.name] = [];
476
- }
477
- });
478
-
479
- this.$el.on('click'+'.'+NAME, 'input[type="radio"]', function() {
480
-
481
- if ($(this).hasClass('checked') && self.allowNoneOnRadioSelect) {
482
-
483
- self.data[self.name] = [];
484
- $(this).prop('checked', false);
485
- $(this).removeClass('checked');
486
-
487
- if (self.dynamicTitle) {
488
- self.$selectTitle.html(self.dynamicTitleDefault);
489
- }
490
-
491
- } else {
492
-
493
- $(this).addClass('checked');
494
-
495
- if (self.dynamicTitle) {
496
- self.$selectTitle.html($(this).parent().find('[data-label]').text());
497
- }
498
- }
499
-
500
- self.onSelect(this);
501
- });
502
-
503
- if (this.scroll) {
504
-
505
- this.$scrollableContent.find('.ps__thumb-y').mousedown(function() {
506
- self.$scrollableContent.addClass('ps-mousedown-scroll');
507
- });
508
-
509
- $(document).mouseup(function() {
510
-
511
- if (self.$scrollableContent.hasClass('ps-mousedown-scroll')) {
512
- self.$scrollableContent.removeClass('ps-mousedown-scroll');
513
- }
514
- });
515
- }
516
-
517
- if (this.showSearch) {
518
-
519
- this.$searchInput.on('keydown'+'.'+NAME, debounce(function () {
520
-
521
- self.searchString = $(this).val().trim();
522
- self.search.call(self);
523
-
524
- }, 250));
525
-
526
- this.$searchInput.on('focusin'+'.'+NAME, function () {
527
-
528
- self.$searchContainer.addClass('focused');
529
- });
530
-
531
- this.$searchInput.on('focusout'+'.'+NAME, function () {
532
-
533
- self.$searchContainer.removeClass('focused');
534
- });
535
-
536
- this.$searchContainer.on('click'+'.'+NAME, '[data-clear-search]', function () {
537
-
538
- if (self.searchString.length) {
539
-
540
- self.$searchInput.val('');
541
- self.searchString = '';
542
- self.search.call(self);
543
-
544
- } else {
545
-
546
- return;
547
- }
548
- });
549
- }
550
-
551
- if (this.showFooter) {
552
-
553
- this.$closeButton.on('click'+'.'+NAME, () => {
554
-
555
- this.close();
556
- });
557
- }
558
-
559
- $(document).on('touchstart click', function(e) {
560
-
561
- if (!self.$el.is(e.target) && !self.$el.has(e.target).length && self.contentOpen && !self.preventClose) {
562
-
563
- self.close.call(self);
564
- }
565
- });
566
- }
567
-
568
- // Unbind events that trigger methods
569
- unbindEvents() {
570
-
571
- this.$el.off('.'+NAME);
572
- }
573
-
574
- // Get data
575
- getData(data) {
576
-
577
- if (data) {
578
- return this.data[data];
579
- } else {
580
- return this.data;
581
- }
582
- }
583
-
584
- // Set data
585
- setData() {
586
-
587
- let self = this;
588
- let faNameSpace = this.opts.faPro ? 'fal' : 'fas';
589
-
590
- if (this.showValidStateIcon) {
591
- this.$selectIconContainer.html(`<i class="${faNameSpace} fa-check text-green icon"></i>`);
592
- } else {
593
- this.$selectIconContainer.html(this.selectIconDefault);
594
- }
595
-
596
- if (this.searchApi.length) {
597
-
598
- let searchUrl = this.searchApi;
599
- let itemCount = this.data[this.name].length;
600
- let currentCount = 0;
601
-
602
- this.data[this.name].forEach(function(value) {
603
-
604
- searchUrl += encodeURIComponent('#'+value);
605
- currentCount++;
606
-
607
- if (currentCount !== itemCount) {
608
- searchUrl += '+';
609
- }
610
- });
611
-
612
- $.ajax({
613
- method: 'GET',
614
- url: searchUrl
615
- }).done(function(data) {
616
-
617
- let items = data.map(item => {
618
-
619
- item.id = item[self.primaryKeyword].toString();
620
-
621
- return item;
622
- });
623
-
624
- let itemIds = items.map(item => {
625
- return item.id.toString()
626
- });
627
-
628
- // Remove value from data if it doesn't exist anymore
629
- self.data[self.name] = self.data[self.name].filter(function(value) {
630
- return itemIds.indexOf(value.toString()) > -1;
631
- });
632
-
633
- if (self.data[self.name].length == 0) {
634
- self.$selectIconContainer.html(self.selectIconDefault);
635
- }
636
-
637
- items = items.filter(function(item) {
638
- return self.data[self.name].indexOf(item.id) > -1 && self.itemsToExclude.indexOf(item.id) === -1 && item.id != 0;
639
- });
640
-
641
- let result = self._renderItemList(items);
642
-
643
- $.when(self.$scrollableContent.append(result)).then(function() {
644
-
645
- let $inputs = self.$scrollableContent.find(':input');
646
-
647
- if (self.$scrollableContent[0].offsetHeight < self.$scrollableContent[0].scrollHeight) {
648
-
649
- self.scroll.update();
650
- self.scroll.settings.suppressScrollY = false;
651
- self.$scrollableContent.addClass('ps-show-rail-y');
652
-
653
- } else {
654
-
655
- self.scroll.update();
656
- self.scroll.settings.suppressScrollY = true;
657
- self.$scrollableContent.removeClass('ps-show-rail-y');
658
- }
659
-
660
- if (self.$scrollableContent.find(':input[type="checkbox"]').length) {
661
- self.type = 'checkbox';
662
- } else if (self.$scrollableContent.find(':input[type="radio"]').length) {
663
- self.type = 'radio';
664
- }
665
-
666
- if (self.type == 'checkbox') {
667
-
668
- self.data[self.name].forEach(function(value) {
669
-
670
- let $input = $inputs.filter(function() {
671
- return this.value == value;
672
- });
673
-
674
- $input.prop('checked', true);
675
-
676
- self.onSelect($input[0]);
677
- });
678
-
679
- } else if (self.type == 'radio') {
680
-
681
- let $input = $inputs.filter(function() {
682
- return this.value == self.data[self.name][0];
683
- });
684
-
685
- $input.prop('checked', true);
686
- $input.addClass('checked');
687
-
688
- if (self.dynamicTitle) {
689
- self.$selectTitle.html($input.parent().find('[data-label]').text());
690
- }
691
-
692
- self.onSelect($input[0]);
693
- }
694
- });
695
- });
696
-
697
- } else {
698
-
699
- // Remove value from data if it doesn't exist anymore
700
- let $inputs = this.$scrollableContent.find(':input');
701
- let inputValues = $inputs.length > 0 ? $inputs.map(function() {
702
- return this.value.toString();
703
- }).get() : [];
704
-
705
- this.data[this.name] = this.data[this.name].filter(function(value) {
706
- return inputValues.indexOf(value.toString()) > -1;
707
- });
708
-
709
- if (this.data[this.name].length == 0) {
710
- this.$selectIconContainer.html(this.selectIconDefault);
711
- }
712
-
713
- if (this.$scrollableContent.find(':input[type="checkbox"]').length) {
714
- this.type = 'checkbox';
715
- } else if (this.$scrollableContent.find(':input[type="radio"]').length) {
716
- this.type = 'radio';
717
- }
718
-
719
- if (this.type == 'checkbox') {
720
-
721
- this.data[this.name].forEach(function(value) {
722
-
723
- let $input = $inputs.filter(function() {
724
- return this.value == value
725
- });
726
-
727
- $input.prop('checked', true);
728
-
729
- self.onSelect($input[0]);
730
- });
731
-
732
- } else if (this.type == 'radio') {
733
-
734
- let $input = $inputs.filter(function() {
735
- return this.value == self.data[self.name][0];
736
- });
737
-
738
- $input.prop('checked', true);
739
- $input.addClass('checked');
740
-
741
- if (this.dynamicTitle) {
742
- this.$selectTitle.html($input.parent().find('[data-label]').text());
743
- }
744
-
745
- this.onSelect($input[0]);
746
- }
747
- }
748
- }
749
-
750
- // Search
751
- search() {
752
-
753
- let self = this;
754
- let faNameSpace = this.opts.faPro ? 'fal' : 'fas';
755
-
756
- if (this.searchString.length) {
757
-
758
- if (this.searchApi.length) {
759
-
760
- this.$scrollableContent.find('input:not(:checked)').parents('.select-item').not('.static-item').remove();
761
-
762
- if (this.searchRequest !== null) {
763
- this.searchRequest.abort();
764
- }
765
-
766
- this.searchRequest = $.ajax({
767
- method: 'GET',
768
- url: this.searchApi + this.searchString
769
- }).done(function(data) {
770
-
771
- self.searchRequest = null;
772
-
773
- let items = data.map(item => {
774
-
775
- item.id = item[self.primaryKeyword].toString();
776
-
777
- return item;
778
- });
779
-
780
- items = items.filter(function(item) {
781
- return self.data[self.name].indexOf(item.id) === -1 && self.itemsToExclude.indexOf(item.id) === -1 && item.id != 0;
782
- });
783
-
784
- let result = self._renderItemList(items);
785
-
786
- $.when(self.$scrollableContent.append(result)).then(function() {
787
-
788
- let faNameSpace = self.opts.faPro ? 'fal' : 'fas';
789
-
790
- self.$searchIconContainer.html(`<i class="${faNameSpace} fa-times icon"></i>`);
791
- self.$searchIconContainer.attr('data-clear-search', 'true');
792
-
793
- if (self.$scrollableContent[0].offsetHeight < self.$scrollableContent[0].scrollHeight) {
794
-
795
- self.scroll.update();
796
- self.scroll.settings.suppressScrollY = false;
797
- self.$scrollableContent.addClass('ps-show-rail-y');
798
-
799
- } else {
800
-
801
- self.scroll.update();
802
- self.scroll.settings.suppressScrollY = true;
803
- self.$scrollableContent.removeClass('ps-show-rail-y');
804
- }
805
- });
806
- });
807
-
808
- } else {
809
-
810
- let results = this.searchData.filter(function(item) {
811
- return item.val.toLocaleLowerCase().indexOf(self.searchString.toLocaleLowerCase()) > -1;
812
- });
813
-
814
- this.$selectItems.removeClass('d-none');
815
- this.$selectItems.removeClass('visible');
816
-
817
- results.forEach(function(item) {
818
- $(self.$selectItems[item.id]).addClass('visible');
819
- });
820
-
821
- this.$selectItems.not('.visible').addClass('d-none');
822
- this.$searchIconContainer.html(`<i class="${faNameSpace} fa-times icon"></i>`);
823
- this.$searchIconContainer.attr('data-clear-search', 'true');
824
- }
825
-
826
- } else {
827
-
828
- if (this.searchApi.length) {
829
-
830
- this.$scrollableContent.find('input:not(:checked)').parents('.select-item').not('.static-item').remove();
831
- this.$searchIconContainer.html(`<i class="${faNameSpace} fa-search icon"></i>`);
832
- this.$searchIconContainer.attr('data-clear-search', '');
833
-
834
- } else {
835
-
836
- this.$selectItems.removeClass('d-none');
837
- this.$selectItems.removeClass('visible');
838
- this.$searchIconContainer.html(`<i class="${faNameSpace} fa-search icon"></i>`);
839
- this.$searchIconContainer.attr('data-clear-search', '');
840
- }
841
- }
842
-
843
- if (this.scroll) {
844
- this.scroll.update();
845
- }
846
-
847
- this.onUpdate();
848
- }
849
-
850
- // Show
851
- show() {
852
-
853
- if (this.$el.hasClass('show')) {
854
- return;
855
- }
856
-
857
- let $otherSelects = $('.select.show');
858
- let zindex = 1;
859
- let faNameSpace = this.opts.faPro ? 'fal' : 'fas';
860
-
861
- if ($otherSelects.length) {
862
- zindex = parseInt($otherSelects.first().css('z-index'), 10) + 2;
863
- }
864
-
865
- this.$el.css({
866
- 'max-height': (this.scrollContentHeight + this.$selectHeader.outerHeight(true))+'px'
867
- });
868
-
869
- this.$el.addClass('show');
870
-
871
- if (!$otherSelects.length) {
872
- zindex = parseInt(this.$el.css('z-index'), 10) + 1;
873
- }
874
-
875
- this.$el.css({
876
- 'z-index': zindex
877
- });
878
-
879
- if (this.scroll && this.$scrollableContent.length) {
880
-
881
- if (this.$scrollableContent[0].offsetHeight < this.$scrollableContent[0].scrollHeight) {
882
- this.$scrollableContent[0].scrollTop = 1;
883
- this.$scrollableContent[0].scrollTop = 0;
884
- }
885
- }
886
-
887
- this.$selectIconContainer.html(`<i class="${faNameSpace} fa-angle-up icon"></i>`);
888
-
889
- setTimeout(() => {
890
- this.$el[0].scrollIntoView({behavior: 'smooth', block: 'nearest', inline: 'nearest'});
891
- }, 300);
892
-
893
- this.contentOpen = true;
894
- this.onShow();
895
- }
896
-
897
- // Close
898
- close() {
899
-
900
- if (!this.preventClose) {
901
-
902
- let self = this;
903
- let faNameSpace = this.opts.faPro ? 'fal' : 'fas';
904
-
905
- this.$el.css('max-height', '');
906
- this.$el.removeClass('show');
907
-
908
- setTimeout(() => {
909
- self.$el.removeAttr('style');
910
- }, 300);
911
-
912
- if (this.data[this.name].length > 0 && this.showValidStateIcon) {
913
- this.$selectIconContainer.html(`<i class="${faNameSpace} fa-check text-green icon"></i>`);
914
- } else {
915
- this.$selectIconContainer.html(this.selectIconDefault);
916
- }
917
-
918
- this.contentOpen = false;
919
- this.onClose();
920
- }
921
- }
922
-
923
- // On select
924
- onSelect(el) {
925
-
926
- let self = this;
927
- let onSelect = this.opts.onSelect;
928
- let data = $(el).parents('.select-item').data();
929
-
930
- if (this.searchApi.length && !$.isEmptyObject(data)) {
931
-
932
- if ($(el).length && el.checked) {
933
-
934
- this.items.push(data);
935
-
936
- } else {
937
-
938
- this.items = $.grep(this.items, function(item) { return item[self.primaryKeyword] != data.id });
939
- }
940
- }
941
-
942
- if (typeof onSelect === 'function') {
943
-
944
- onSelect.call(el, data, this);
945
- }
946
- }
947
-
948
- // Add more items after plugin is already initialized
949
- appendItems(items, selectItems) {
950
-
951
- return new Promise((resolve, reject) => {
952
-
953
- let self = this;
954
-
955
- if (!$.isArray(items)) {
956
-
957
- let itemsArr = [];
958
-
959
- itemsArr.push(items);
960
- items = itemsArr;
961
- }
962
-
963
- items = items.filter(function(item) {
964
- return self.itemsToExclude.indexOf(item[self.primaryKeyword].toString()) === -1;
965
- });
966
-
967
- items.forEach(item => {
968
-
969
- this.items.push(item);
970
- });
971
-
972
- let domItems = this._renderItemList(items);
973
-
974
- this.$scrollableContent.prepend(domItems);
975
- this.$selectItems = this.$select.find('.select-item');
976
-
977
- this.buildSearchData().then(() => {
978
-
979
- if (this.$selectItems.length > 0) {
980
-
981
- if (this.$select.find(':input[type="checkbox"]').length) {
982
- this.type = 'checkbox';
983
- } else if (this.$select.find(':input[type="radio"]').length) {
984
- this.type = 'radio';
985
- }
986
-
987
- if (this.type == 'checkbox') {
988
-
989
- items.forEach(item => {
990
-
991
- let $input = this.$select.find(':input').filter(function() { return this.value == item.id });
992
- let val = $input.val().toString();
993
-
994
- $input.prop('checked', true);
995
-
996
- this.data[this.name].indexOf(val) === -1 ? this.data[this.name].push(val) : false;
997
- this.onSelect($input[0]);
998
- });
999
-
1000
- } else if (this.type == 'radio') {
1001
-
1002
- let item = items[0];
1003
- let $input = this.$select.find(':input').filter(function() { return this.value == item.id });
1004
- let val = $input.val().toString();
1005
-
1006
- $input.prop('checked', true);
1007
- $input.addClass('checked');
1008
-
1009
- this.data[this.name].indexOf(val) === -1 ? this.data[this.name] = [val] : false;
1010
-
1011
- if (this.dynamicTitle) {
1012
- this.$selectTitle.html($input.parent().find('[data-label]').text());
1013
- }
1014
-
1015
- this.$select.find('input[type="radio"]').not($input).prop('checked', false);
1016
- this.$select.find('input[type="radio"]').not($input).removeClass('checked');
1017
- this.onSelect($input[0]);
1018
- }
1019
- }
1020
-
1021
- if (this.data[this.name].length == 0 &&
1022
- this.dynamicTitle &&
1023
- this.dynamicTitleDefault &&
1024
- this.dynamicTitleDefault !== 0 &&
1025
- this.$selectTitle.text().trim() == 0 &&
1026
- (this.$selectItems.length > 0 || this.searchApi)) {
1027
-
1028
- this.$selectTitle.html(this.dynamicTitleDefault);
1029
- }
1030
-
1031
- if (this.$selectHeader.attr('style')) {
1032
- this.$selectHeader.removeAttr('style');
1033
- }
1034
-
1035
- if (this.$selectIconContainer.hasClass('d-none')) {
1036
- this.$selectIconContainer.removeClass('d-none');
1037
- }
1038
-
1039
- resolve();
1040
- });
1041
- });
1042
- }
1043
-
1044
- // Deselect items
1045
- deselectItems(array) {
1046
-
1047
- return new Promise((resolve, reject) => {
1048
-
1049
- array.forEach(id => {
1050
-
1051
- let $input = this.$select.find(':input').filter(function() { return this.value == id });
1052
-
1053
- if ($input[0].checked) {
1054
-
1055
- $input.trigger('click');
1056
- }
1057
- });
1058
-
1059
- if (this.data[this.name].length == 0) {
1060
- this.$selectIconContainer.html(this.selectIconDefault);
1061
- }
1062
- });
1063
- }
1064
-
1065
- // Get item
1066
- getItem(key, val) {
1067
-
1068
- let result = $.grep(this.items, function(item) { return item[key] == val })[0];
1069
-
1070
- return result ? result : null;
1071
- }
1072
-
1073
- // Get selected items
1074
- getSelectedItems(segment) {
1075
-
1076
- let ids = [];
1077
- let result = [];
1078
- let data = this.data[this.name];
1079
-
1080
- if (!$.isArray(data)) {
1081
-
1082
- ids.push(data);
1083
-
1084
- } else {
1085
-
1086
- ids = data;
1087
- }
1088
-
1089
- ids = ids.map(String);
1090
-
1091
- if (this.items.length > 0) {
1092
-
1093
- result = $.grep(this.items, function(item) { return ids.indexOf(item.id.toString()) > -1 });
1094
-
1095
- if (segment) {
1096
-
1097
- result = result.map(obj => {
1098
- return obj[segment];
1099
- }).filter(obj => {
1100
- return obj != null;
1101
- });
1102
- }
1103
-
1104
- } else {
1105
-
1106
- result = ids;
1107
- }
1108
-
1109
- return result;
1110
- }
1111
-
1112
- // Get selected item
1113
- getSelectedItem(segment) {
1114
-
1115
- let ids = [];
1116
- let result = [];
1117
- let data = this.data[this.name];
1118
-
1119
- if (!$.isArray(data)) {
1120
-
1121
- ids.push(data);
1122
-
1123
- } else {
1124
-
1125
- ids = data;
1126
- }
1127
-
1128
- ids = ids.map(String);
1129
-
1130
- if (this.items.length > 0) {
1131
-
1132
- result = $.grep(this.items, function(item) { return ids.indexOf(item.id.toString()) > -1 });
1133
-
1134
- if (segment) {
1135
-
1136
- result = result.map(obj => {
1137
- return obj[segment];
1138
- }).filter(obj => {
1139
- return obj != null;
1140
- });
1141
- }
1142
-
1143
- } else {
1144
-
1145
- result = ids;
1146
- }
1147
-
1148
- return result[0] == null ? null : result[0];
1149
- }
1150
-
1151
- _renderItemList(items) {
1152
-
1153
- let result = [];
1154
-
1155
- for (let i = 0; i < items.length; ++i) {
1156
-
1157
- let item = items[i];
1158
- let label = '';
1159
-
1160
- if (typeof this.labelTemplate === 'function') {
1161
-
1162
- label = this.labelTemplate(item);
1163
-
1164
- } else {
1165
-
1166
- if (item.name) {
1167
- label = item.name;
1168
- } else if (item.label) {
1169
- label = item.label;
1170
- } else if (item.value) {
1171
- label = item.value;
1172
- }
1173
- }
1174
-
1175
- result.push($(`
1176
-
1177
- <div class="select-item">
1178
-
1179
- <div class="select-item-${this.type}">
1180
-
1181
- <div class="styled-${this.type}">
1182
-
1183
- <input type="${this.type}" id="select-${this.name}-${items[i].id}" value="${items[i].id}" tabindex="-1">
1184
-
1185
- <label for="select-${this.name}-${items[i].id}">
1186
-
1187
- <span class="radio-inner">
1188
- <svg viewBox="0 0 18 18">
1189
- <polyline points="1.5 6 4.5 9 10.5 1"></polyline>
1190
- </svg>
1191
- </span>
1192
-
1193
- <span class="${this.type}-label"${typeof this.labelTemplate !== 'function' ? ' data-label' : ''}>
1194
- ${label}
1195
- </span>
1196
-
1197
- </label>
1198
-
1199
- </div>
1200
-
1201
- </div>
1202
-
1203
- </div>
1204
-
1205
- `).data(item));
1206
- }
1207
-
1208
- return result;
1209
- }
1210
-
1211
- _renderSearch() {
1212
-
1213
- if (!this.showSearch) {
1214
-
1215
- return '';
1216
-
1217
- } else {
1218
-
1219
- let faNameSpace = this.opts.faPro ? 'fal' : 'fas';
1220
-
1221
- return `
1222
-
1223
- <div class="select-search">
1224
-
1225
- <div class="select-search-input">
1226
-
1227
- <input type="text" name="select-search" value="" placeholder="${this.searchPlaceholder}" tabindex="-1">
1228
-
1229
- </div>
1230
-
1231
- <div class="select-search-icon">
1232
-
1233
- <i class="${faNameSpace} fa-search icon"></i>
1234
-
1235
- </div>
1236
-
1237
- </div>
1238
-
1239
- `;
1240
- }
1241
- }
1242
-
1243
- _renderFooter() {
1244
-
1245
- if (!this.showFooter) {
1246
-
1247
- return '';
1248
-
1249
- } else {
1250
-
1251
- return `
1252
-
1253
- <div class="select-footer">
1254
-
1255
- <button class="btn btn-block btn-secondary" type="button" tabindex="-1" data-select-close >
1256
- ${this.btnCloseText}
1257
- </button>
1258
-
1259
- </div>
1260
-
1261
- `;
1262
- }
1263
- }
1264
-
1265
- static _jQueryInterface(config) {
1266
-
1267
- return this.each(function() {
1268
-
1269
- let data = $(this).data(DATA_KEY);
1270
- const _config = typeof config === 'object' && config;
1271
-
1272
- if (!data) {
1273
- data = new Select(this, _config);
1274
- $(this).data(DATA_KEY, data);
1275
- }
1276
-
1277
- if (typeof config === 'string') {
1278
-
1279
- if (typeof data[config] === 'undefined') {
1280
- throw new TypeError(`No method named "${config}"`)
1281
- }
1282
-
1283
- data[config]()
1284
- }
1285
- });
1286
- }
1287
-
1288
- }
1289
-
1290
- if (typeof $ !== 'undefined') {
1291
-
1292
- // jQuery
1293
- const JQUERY_NO_CONFLICT = $.fn[NAME];
1294
-
1295
- $.fn[NAME] = Select._jQueryInterface;
1296
- $.fn[NAME].Constructor = Select;
1297
-
1298
- $.fn[NAME].noConflict = () => {
1299
-
1300
- $.fn[NAME] = JQUERY_NO_CONFLICT;
1301
-
1302
- return Select._jQueryInterface;
1303
- }
1304
-
1305
- $.fn[NAME].defaults = {
1306
- name: '',
1307
- type: 'checkbox',
1308
- labelTemplate: null,
1309
- confirmCheck: null,
1310
- confirmUncheck: null,
1311
- setData: null,
1312
- scrollContentHeight: 100,
1313
- faPro: false,
1314
- items: [],
1315
- showSearch: false,
1316
- showFooter: false,
1317
- searchApi: false,
1318
- onInit: null,
1319
- onUpdate: null,
1320
- onDestroy: null,
1321
- onShow: null,
1322
- onClose: null,
1323
- onReset: null,
1324
- onSearch: null,
1325
- onSelect: null,
1326
- buildScroll: null,
1327
- searchPlaceholder: null,
1328
- btnCloseText: null,
1329
- debug: false,
1330
- dynamicTitle: false,
1331
- dynamicTitleDefault: '',
1332
- dynamicTitleEmptyDefault: '',
1333
- allowNoneOnRadioSelect: true,
1334
- preventUncheck: false,
1335
- showValidStateIcon: true,
1336
- itemsToExclude: [],
1337
- primaryKeyword: 'id'
1338
- }
1339
- }
1340
-
1341
- export default Select;