@finqu/cool 1.2.29 → 2.0.2

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