vgapp 0.1.5 → 0.1.7

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.
@@ -1,5 +1,13 @@
1
1
  import BaseModule from "../../base-module";
2
- import {isDisabled, isEmptyObj, mergeDeepObject, noop, transliterate} from "../../../utils/js/functions";
2
+ import {
3
+ execute,
4
+ isDisabled,
5
+ isEmptyObj,
6
+ mergeDeepObject,
7
+ noop,
8
+ normalizeData,
9
+ transliterate
10
+ } from "../../../utils/js/functions";
3
11
  import {Manipulator} from "../../../utils/js/dom/manipulator";
4
12
  import EventHandler from "../../../utils/js/dom/event";
5
13
  import Selectors from "../../../utils/js/dom/selectors";
@@ -23,13 +31,16 @@ const CLASS_NAME_PLACEHOLDER = 'vg-select-current--placeholder';
23
31
  const CLASS_NAME_SEARCH = 'vg-select-search';
24
32
 
25
33
  const EVENT_KEY_CLICK_DATA_API = `click.${NAME_KEY}.data.api`;
34
+ const EVENT_KEY_UP_DATA_API = `keyup.${NAME_KEY}.data.api`;
26
35
  const EVENT_KEY_CHANGE = `${NAME_KEY}.change`;
27
36
  const EVENT_KEY_HIDE = `${NAME_KEY}.hide`;
28
37
  const EVENT_KEY_HIDDEN = `${NAME_KEY}.hidden`;
29
38
  const EVENT_KEY_SHOW = `${NAME_KEY}.show`;
30
39
  const EVENT_KEY_SHOWN = `${NAME_KEY}.shown`;
31
40
 
32
- const SELECTOR_DATA_TOGGLE = '[data-vg-toggle="select"]';
41
+ const SELECTOR_DATA_TOGGLE = '[data-vg-toggle="select"]';
42
+ const SELECTOR_OPTION_TOGGLE = '[data-vg-toggle="select-option"]';
43
+ const SELECTOR_SEARCH_TOGGLE = '[name=vg-select-search]';
33
44
 
34
45
 
35
46
  let observerTimout;
@@ -46,10 +57,15 @@ class VGSelect extends BaseModule {
46
57
  target: '',
47
58
  method: 'get',
48
59
  loader: false,
60
+ },
61
+ render: {
62
+ option: noop,
63
+ item: noop
49
64
  }
50
65
  }, params));
51
66
 
52
67
  this._drop = Selectors.find('.' + CLASS_NAME_DROPDOWN, this._element);
68
+ this.refresh();
53
69
  }
54
70
 
55
71
  static get NAME() {
@@ -60,101 +76,109 @@ class VGSelect extends BaseModule {
60
76
  return NAME_KEY;
61
77
  }
62
78
 
63
- toggle(relatedTarget) {
64
- return !this._isShown() ? this.show(relatedTarget) : this.hide();
65
- }
79
+ static buildListOptions(selector, drop) {
80
+ let options = selector.options,
81
+ list = document.createElement('ul');
66
82
 
67
- show(relatedTarget) {
68
- if (isDisabled(this._element)) return;
83
+ list.classList.add(CLASS_NAME_LIST);
69
84
 
70
- const showEvent = EventHandler.trigger(this._element, EVENT_KEY_SHOW, { relatedTarget })
71
- if (showEvent.defaultPrevented) return;
85
+ let optGroup = selector.querySelectorAll('optgroup');
72
86
 
73
- if ('ontouchstart' in document.documentElement) {
74
- for (const element of [].concat(...document.body.children)) {
75
- EventHandler.on(element, 'mouseover', noop);
76
- }
77
- }
87
+ if (optGroup.length) {
88
+ let isSelected = false;
89
+ [...optGroup].forEach(function (el) {
90
+ let olOptGroup = document.createElement('ol');
91
+ olOptGroup.classList.add(CLASS_NAME_OPTGROUP);
78
92
 
79
- this._element.classList.add(CLASS_NAME_SHOW);
93
+ let liLabel = document.createElement('li');
94
+ liLabel.innerHTML = el.label.trim();
95
+ liLabel.classList.add(CLASS_NAME_OPTGROUP_TITLE)
80
96
 
81
- const completeCallBack = () => {
82
- this._element.classList.add(CLASS_NAME_ACTIVE);
83
- EventHandler.trigger(this._element, EVENT_KEY_SHOWN, { relatedTarget });
97
+ olOptGroup.prepend(liLabel)
98
+
99
+ let optGroupOptions = Selectors.findAll('option', el);
100
+
101
+ createLi(optGroupOptions, olOptGroup, isSelected);
102
+
103
+ list.append(olOptGroup);
104
+ isSelected = true;
105
+ });
106
+ } else {
107
+ let isSelected = false;
108
+ createLi(options, list, isSelected);
84
109
  }
85
110
 
86
- this._queueCallback(completeCallBack, this._drop, true, 50)
87
- }
111
+ drop.append(list);
88
112
 
89
- hide() {
90
- if (isDisabled(this._element) || !this._isShown()) return;
113
+ return list;
91
114
 
92
- this._completeHide();
93
- }
115
+ function createLi(options, list, isSelected) {
116
+ let i = 0;
117
+ for (const option of options) {
118
+ let li = document.createElement('li');
94
119
 
95
- _completeHide() {
96
- const hideEvent = EventHandler.trigger(this._element, EVENT_KEY_HIDE, {})
97
- if (hideEvent.defaultPrevented) return;
120
+ li.innerHTML = option.innerHTML.trim().replace(/<\/[^>]+(>|$)/g, "")
121
+ li.dataset.value = Manipulator.get(option, 'value');
122
+ li.classList.add(CLASS_NAME_OPTION);
98
123
 
99
- this._element.classList.remove(CLASS_NAME_ACTIVE);
100
- //this._element.setAttribute('aria-expanded', 'false');
124
+ Manipulator.set(li, 'data-vg-toggle', 'select-option');
101
125
 
102
- if ('ontouchstart' in document.documentElement) {
103
- for (const element of [].concat(...document.body.children)) {
104
- EventHandler.off(element, 'mouseover', noop);
105
- }
106
- }
126
+ let liData = Manipulator.get(option);
127
+ if (!isEmptyObj(liData)) {
128
+ for (const key of Object.keys(liData)) {
129
+ Manipulator.set(li, 'data-' + key, liData[key]);
130
+ }
131
+ }
107
132
 
108
- const completeCallback = () => {
109
- this._element.classList.remove(CLASS_NAME_SHOW);
110
- EventHandler.trigger(this._element, EVENT_KEY_HIDDEN, {});
111
- }
112
- this._queueCallback(completeCallback, this._element, true, 10);
113
- }
133
+ if (i === selector.selectedIndex && !isSelected) {
134
+ li.classList.add('selected');
135
+ }
114
136
 
115
- _isShown() {
116
- return this._element.classList.contains(CLASS_NAME_SHOW);
117
- }
137
+ if (Manipulator.has(option, 'disabled')) li.classList.add('disabled');
138
+ if (Manipulator.has(option, 'hidden')) li.classList.add('hidden');
118
139
 
119
- build(isRebuild, elm = null) {
120
- const _this = this;
121
- let element = this._element;
140
+ list.append(li);
122
141
 
123
- if (elm) element = elm;
142
+ i++;
143
+ }
144
+ }
145
+ }
124
146
 
125
- if (element.dataset?.inited === 'true' && !isRebuild) {
147
+ static build(selector, reBuild) {
148
+ let option_selected,
149
+ placeholder = selector.dataset.placeholder || '',
150
+ isSearch = selector.dataset.search || false;
151
+
152
+ if (selector.dataset?.inited === 'true' && !reBuild) {
126
153
  return;
127
- } else if (isRebuild) {
128
- _this.destroy(element);
154
+ } else if (reBuild) {
155
+ VGSelect.destroy(selector);
129
156
  }
130
157
 
131
- element.parentElement.style.position = 'relative';
132
-
133
- let option_selected,
134
- options = element.options;
158
+ selector.parentElement.style.position = 'relative';
135
159
 
136
- if (_this._params.placeholder && element.selectedIndex === 0) {
137
- option_selected = '<span class="'+ CLASS_NAME_PLACEHOLDER +'">' + _this._params.placeholder + '<span>';
160
+ if (placeholder && selector.selectedIndex === 0) {
161
+ option_selected = '<span class="'+ CLASS_NAME_PLACEHOLDER +'">' + placeholder + '<span>';
138
162
  } else {
139
- option_selected = element.options[element.selectedIndex].innerText;
163
+ option_selected = selector.options[selector.selectedIndex].innerText;
140
164
  }
141
165
 
142
166
  // Создаем основной элемент с классами селекта
143
- let classes = Manipulator.get(element,'class'),
144
- select = document.createElement('div');
167
+ let classes = Manipulator.get(selector,'class'),
168
+ element = document.createElement('div');
145
169
 
146
170
  classes = classes.split(' ');
147
171
 
148
172
  for (const _class of classes) {
149
- select.classList.add(_class)
173
+ element.classList.add(_class)
150
174
  }
151
175
 
152
- if (Manipulator.has(element, 'disabled')) select.classList.add('disabled')
176
+ if (Manipulator.has(selector, 'disabled')) element.classList.add('disabled');
153
177
 
154
- let elData = Manipulator.get(element);
178
+ let elData = Manipulator.get(selector);
155
179
  if (!isEmptyObj(elData)) {
156
180
  for (const key of Object.keys(elData)) {
157
- Manipulator.set(select,'data-' + key, elData[key]);
181
+ Manipulator.set(element,'data-' + key, elData[key]);
158
182
  }
159
183
  }
160
184
 
@@ -164,109 +188,138 @@ class VGSelect extends BaseModule {
164
188
  Manipulator.set(current, 'data-vg-toggle', 'select');
165
189
  Manipulator.set(current, 'aria-expanded', 'false');
166
190
  current.innerHTML = option_selected.trim();
167
- select.append(current);
191
+ element.append(current);
168
192
 
169
193
  // Создаем элемент выпадающего списка
170
194
  let dropdown = document.createElement('div');
171
195
  dropdown.classList.add(CLASS_NAME_DROPDOWN);
172
- select.append(dropdown);
196
+ element.append(dropdown);
173
197
 
174
198
  // Создаем список и варианты селекта
175
- let list = document.createElement('ul');
176
- list.classList.add(CLASS_NAME_LIST);
177
-
178
- let optGroup = element.querySelectorAll('optgroup');
179
-
180
- if (optGroup.length) {
181
- let isSelected = false;
182
- [...optGroup].forEach(function (el) {
183
- let olOptGroup = document.createElement('ol');
184
- olOptGroup.classList.add(CLASS_NAME_OPTGROUP);
199
+ VGSelect.buildListOptions(selector, dropdown);
185
200
 
186
- let liLabel = document.createElement('li');
187
- liLabel.innerHTML = el.label.trim();
188
- liLabel.classList.add(CLASS_NAME_OPTGROUP_TITLE)
201
+ // Добавляем все созданный контейнер после селекта
202
+ selector.insertAdjacentElement('afterend', element);
189
203
 
190
- olOptGroup.prepend(liLabel)
204
+ // помечаем элемент инициализированным
205
+ selector.dataset.inited = 'true';
191
206
 
192
- let optGroupOptions = el.querySelectorAll('option');
207
+ if (isSearch) {
208
+ let search_container = document.createElement('div');
209
+ search_container.classList.add(CLASS_NAME_SEARCH);
193
210
 
194
- createLi(optGroupOptions, olOptGroup, isSelected);
211
+ let input = document.createElement('input');
212
+ Manipulator.set(input, 'name', 'vg-select-search');
213
+ Manipulator.set(input, 'type', 'text');
214
+ Manipulator.set(input, 'placeholder', 'Поиск...');
195
215
 
196
- list.append(olOptGroup);
197
- isSelected = true;
198
- });
199
- } else {
200
- let isSelected = false;
201
- createLi(options, list, isSelected);
216
+ search_container.append(input);
217
+ dropdown.prepend(search_container);
202
218
  }
203
219
 
204
- function createLi(options, list, isSelected) {
205
- let i = 0;
206
- for (const option of options) {
207
- let li = document.createElement('li');
220
+ return element;
221
+ }
208
222
 
209
- li.innerHTML = option.innerHTML.trim().replace(/<\/[^>]+(>|$)/g, "")
210
- li.dataset.value = Manipulator.get(option, 'value');
211
- li.classList.add(CLASS_NAME_OPTION);
223
+ render(selector, callback) {
224
+ let list = Selectors.find('.' + CLASS_NAME_LIST, this._drop);
225
+ if (list) list.remove();
212
226
 
213
- let liData = Manipulator.get(option);
214
- if (!isEmptyObj(liData)) {
215
- for (const key of Object.keys(liData)) {
216
- Manipulator.set(li, 'data-' + key, liData[key]);
217
- }
218
- }
227
+ VGSelect.buildListOptions(selector, this._drop);
219
228
 
220
- if (i === element.selectedIndex && !isSelected) {
221
- li.classList.add('selected');
222
- }
229
+ execute(callback, [this, selector]);
230
+ }
223
231
 
224
- if (Manipulator.has(option, 'disabled')) li.classList.add('disabled');
225
- if (Manipulator.has(option, 'hidden')) li.classList.add('hidden');
232
+ toggle(relatedTarget) {
233
+ return !this._isShown() ? this.show(relatedTarget) : this.hide();
234
+ }
226
235
 
227
- list.append(li);
236
+ show(relatedTarget) {
237
+ if (isDisabled(this._element)) return;
228
238
 
229
- i++;
239
+ const showEvent = EventHandler.trigger(this._element, EVENT_KEY_SHOW, { relatedTarget })
240
+ if (showEvent.defaultPrevented) return;
241
+
242
+ if ('ontouchstart' in document.documentElement) {
243
+ for (const element of [].concat(...document.body.children)) {
244
+ EventHandler.on(element, 'mouseover', noop);
230
245
  }
231
246
  }
232
247
 
233
- dropdown.append(list);
248
+ // TODO доделать
249
+ /*this._route((status, data) => {
250
+ let response = normalizeData(data.response),
251
+ select = this._element.previousSibling;
234
252
 
235
- // Добавляем все созданный контейнер после селекта
236
- element.insertAdjacentElement('afterend', select);
253
+ if (response.length) {
254
+ Selectors.findAll('option', select).forEach(option => {
255
+ option.remove();
256
+ });
237
257
 
238
- // помечаем элемент инициализированным
239
- element.dataset.inited = 'true';
258
+ response.forEach(el => {
259
+ let option = document.createElement('option');
260
+ option.innerText = el.title;
261
+ Manipulator.set(option, 'value', el.id);
262
+
263
+ select.append(option);
264
+ });
265
+
266
+ this.render(select);
267
+ }
268
+ });*/
269
+
270
+ this._element.classList.add(CLASS_NAME_SHOW);
240
271
 
241
- if (_this._params.search) {
242
- this.search(select);
272
+ if (this._params.search) {
273
+ let input = Selectors.find('input', this._element);
274
+ if (input) input.focus();
243
275
  }
276
+
277
+ const completeCallBack = () => {
278
+ this._element.classList.add(CLASS_NAME_ACTIVE);
279
+ EventHandler.trigger(this._element, EVENT_KEY_SHOWN, { relatedTarget });
280
+ }
281
+
282
+ this._queueCallback(completeCallBack, this._drop, true, 50)
244
283
  }
245
284
 
246
- destroy(select) {
247
- let element = select.nextElementSibling;
285
+ hide() {
286
+ if (isDisabled(this._element) || !this._isShown()) return;
248
287
 
249
- if (element) {
250
- if (element.classList.contains(CLASS_NAME_CONTAINER)) {
251
- element.remove();
288
+ this._completeHide();
289
+ }
252
290
 
253
- select.selectedIndex = 0;
254
- [...select.querySelectorAll('option')].forEach(function (el, index) {
255
- if (el.hasAttribute('selected')) {
256
- select.selectedIndex = index;
257
- }
258
- });
291
+ _completeHide() {
292
+ const hideEvent = EventHandler.trigger(this._element, EVENT_KEY_HIDE, {})
293
+ if (hideEvent.defaultPrevented) return;
294
+
295
+ this._element.classList.remove(CLASS_NAME_ACTIVE);
296
+ let toggle = Selectors.find(SELECTOR_DATA_TOGGLE, this._element);
297
+ Manipulator.set(toggle, 'aria-expanded', 'false');
298
+
299
+ if ('ontouchstart' in document.documentElement) {
300
+ for (const element of [].concat(...document.body.children)) {
301
+ EventHandler.off(element, 'mouseover', noop);
259
302
  }
260
303
  }
304
+
305
+ const completeCallback = () => {
306
+ this._element.classList.remove(CLASS_NAME_SHOW);
307
+ EventHandler.trigger(this._element, EVENT_KEY_HIDDEN, {});
308
+ }
309
+ this._queueCallback(completeCallback, this._element, true, 10);
310
+ }
311
+
312
+ _isShown() {
313
+ return this._element.classList.contains(CLASS_NAME_SHOW);
261
314
  }
262
315
 
263
- refresh(select) {
264
- const _this = this;
316
+ refresh() {
317
+ const select = this._element.previousSibling;
265
318
 
266
319
  let observer = new MutationObserver(() => {
267
320
  clearTimeout(observerTimout);
268
321
  observerTimout = setTimeout(() => {
269
- _this.build(true, select);
322
+ VGSelect.build(select, true);
270
323
  }, 100);
271
324
  });
272
325
 
@@ -279,131 +332,62 @@ class VGSelect extends BaseModule {
279
332
  }
280
333
 
281
334
  search(select) {
282
- let dropdown = select.querySelector('.' + CLASS_NAME_DROPDOWN);
283
-
284
- let search_container = document.createElement('div');
285
- search_container.classList.add(CLASS_NAME_SEARCH);
286
-
287
- let input = document.createElement('input');
288
- input.setAttribute('name', 'vg-select-search');
289
- input.setAttribute('type', 'text');
290
- input.setAttribute('placeholder', 'Поиск...');
291
-
292
- search_container.append(input);
293
- dropdown.prepend(search_container);
294
-
295
- search_container.querySelector('[name=vg-select-search]').addEventListener('keyup', (e) => {
296
- e.preventDefault();
297
-
298
- let el = e.target;
299
-
300
- let selectList = el?.closest('.' + CLASS_NAME_DROPDOWN).querySelector('.' + CLASS_NAME_LIST);
301
- if (selectList) {
302
- let options = [...selectList.querySelectorAll('.' + CLASS_NAME_OPTION)],
303
- optionsGroup = [...selectList.querySelectorAll('.' + CLASS_NAME_OPTGROUP)],
304
- value = el?.value;
305
-
306
- options = options.concat(optionsGroup);
307
-
308
- for (const option of options) {
309
- Manipulator.show(option);
310
- }
311
-
312
- if (value.length) {
313
- value = value.trim();
314
- value = value.toLowerCase();
315
- value = transliterate(value, true);
316
-
317
- for (const option of options) {
318
- let text = option.innerText.toLowerCase();
319
335
 
320
- if (text.indexOf(value) === -1) Manipulator.hide(option);
321
- }
322
- }
323
- }
324
- });
325
336
  }
326
337
 
327
338
  dispose() {
328
339
  super.dispose();
329
340
  }
330
341
 
331
- _addEventListeners(select) {
332
- const _this = this;
342
+ static destroy(select) {
343
+ let element = select.nextElementSibling;
333
344
 
334
- select.querySelector('.' + CLASS_NAME_CURRENT).onclick = function (e) {
335
- let el = e.target,
336
- container = el.closest('.' + CLASS_NAME_CONTAINER);
345
+ if (element) {
346
+ if (element.classList.contains(CLASS_NAME_CONTAINER)) {
347
+ element.remove();
337
348
 
338
- let selects = document.querySelectorAll('.' + CLASS_NAME_CONTAINER);
339
- if (selects.length) {
340
- for (const els of selects) {
341
- if (els !== container) {
342
- els?.classList.remove('show');
349
+ select.selectedIndex = 0;
350
+ [...select.querySelectorAll('option')].forEach(function (el, index) {
351
+ if (el.hasAttribute('selected')) {
352
+ select.selectedIndex = index;
343
353
  }
344
- }
345
- }
346
-
347
- if (container.classList.contains('show')) {
348
- container.classList.remove('show');
349
- } else {
350
- container.classList.add('show');
351
-
352
- if (_this._params.search) {
353
- let input = container.querySelector('input');
354
- if (input) input.focus();
355
- }
354
+ });
356
355
  }
357
-
358
- return false;
359
356
  }
357
+ }
360
358
 
361
- select.querySelectorAll('.' + CLASS_NAME_OPTION).forEach((option) => {
362
- option.addEventListener('click', (e) => {
363
- e.preventDefault();
359
+ static hideOpenToggles(event) {
360
+ const openToggles = Selectors.findAll('.vg-select:not(.disabled):not(:disabled).show');
364
361
 
365
- let el = e.target;
362
+ for (const toggle of openToggles) {
363
+ const context = VGSelect.getInstance(toggle);
364
+ if (!context) continue;
366
365
 
367
- if (!el.classList.contains('disabled')) {
368
- let container = el.closest('.' + CLASS_NAME_CONTAINER),
369
- options = container.querySelectorAll('.' + CLASS_NAME_OPTION);
366
+ if (event.target.closest('.' + CLASS_NAME_CONTAINER) === context._element) {
367
+ return;
368
+ }
370
369
 
371
- if (options.length) {
372
- for (const option of options) {
373
- option.classList.remove('selected');
374
- }
375
- }
370
+ const composedPath = event.composedPath();
371
+ if (composedPath.includes(context._element)) {
372
+ continue
373
+ }
376
374
 
377
- el.classList.add('selected');
375
+ const relatedTarget = { relatedTarget: context._element }
378
376
 
379
- container.querySelector('.' + CLASS_NAME_CURRENT).innerText = el.innerText;
380
- container.classList.remove('show');
377
+ if (event.type === 'click') {
378
+ relatedTarget.clickEvent = event
379
+ }
381
380
 
382
- let select = container.previousSibling;
383
- select.value = el.dataset.value;
384
- EventHandler.trigger(select, EVENT_KEY_CHANGE)
385
- }
386
- });
387
- });
381
+ context._completeHide(relatedTarget)
382
+ }
383
+ }
388
384
 
389
- window.addEventListener('click', function (e) {
390
- if (!e?.target.closest('.' + CLASS_NAME_CONTAINER)) {
391
- let selects = document.querySelectorAll('.' + CLASS_NAME_CONTAINER);
392
- if (selects.length) {
393
- for (const el of selects) {
394
- el?.classList.remove('show');
395
- }
396
- }
397
- }
398
- });
385
+ static clearDrops(event) {
386
+ if (event.button === 2 || (event.type === 'keyup' && event.key !== 'Tab')) {
387
+ return
388
+ }
399
389
 
400
- [...document.querySelectorAll('form')].forEach(function (form) {
401
- form.addEventListener("reset", function () {
402
- form.querySelectorAll('select.vg-select').forEach(function (select) {
403
- VGSelect.init(select, {}, true)
404
- })
405
- });
406
- });
390
+ VGSelect.hideOpenToggles(event)
407
391
  }
408
392
 
409
393
  /**
@@ -413,20 +397,18 @@ class VGSelect extends BaseModule {
413
397
  * @param isRebuild
414
398
  */
415
399
  static init(element, params = {}, isRebuild = false) {
416
- const instance = VGSelect.getOrCreateInstance(element, params);
417
- instance.build(isRebuild);
400
+ let elm = VGSelect.build(element);
401
+ VGSelect.getOrCreateInstance(elm, params);
418
402
  }
419
403
  }
420
404
 
405
+ EventHandler.on(document, EVENT_KEY_CLICK_DATA_API, VGSelect.clearDrops);
406
+
421
407
  EventHandler.on(document, EVENT_KEY_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function () {
422
408
  const target = this.closest('.' + CLASS_NAME_CONTAINER);
423
409
 
424
410
  Manipulator.set(this, 'aria-expanded', true);
425
411
 
426
- EventHandler.one(target, EVENT_KEY_HIDDEN, () => {
427
- Manipulator.set(this, 'aria-expanded', false);
428
- })
429
-
430
412
  const alreadyOpen = Selectors.find('.vg-select.show')
431
413
  if (alreadyOpen && alreadyOpen !== target) {
432
414
  VGSelect.getInstance(alreadyOpen).hide();
@@ -436,5 +418,59 @@ EventHandler.on(document, EVENT_KEY_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, functi
436
418
  instance.toggle(this);
437
419
  });
438
420
 
421
+ EventHandler.on(document, EVENT_KEY_CLICK_DATA_API, SELECTOR_OPTION_TOGGLE, function (e) {
422
+ let el = e.target;
423
+
424
+ if (!el.classList.contains('disabled')) {
425
+ let container = el.closest('.' + CLASS_NAME_CONTAINER),
426
+ options = container.querySelectorAll('.' + CLASS_NAME_OPTION);
427
+
428
+ if (options.length) {
429
+ for (const option of options) {
430
+ option.classList.remove('selected');
431
+ }
432
+ }
433
+
434
+ el.classList.add('selected');
435
+
436
+ container.querySelector('.' + CLASS_NAME_CURRENT).innerText = el.innerText;
437
+ container.classList.remove('show');
438
+
439
+ let select = container.previousSibling;
440
+ select.value = el.dataset.value;
441
+ EventHandler.trigger(select, EVENT_KEY_CHANGE, {value: normalizeData(el.dataset.value)});
442
+ EventHandler.trigger(select, 'change', {value: normalizeData(el.dataset.value)});
443
+ }
444
+ });
445
+
446
+ EventHandler.on(document, EVENT_KEY_UP_DATA_API, SELECTOR_SEARCH_TOGGLE, function (e) {
447
+ let el = this;
448
+
449
+ let selectList = el?.closest('.' + CLASS_NAME_DROPDOWN).querySelector('.' + CLASS_NAME_LIST);
450
+ if (selectList) {
451
+ let options = [...selectList.querySelectorAll('.' + CLASS_NAME_OPTION)],
452
+ optionsGroup = [...selectList.querySelectorAll('.' + CLASS_NAME_OPTGROUP)],
453
+ value = el?.value;
454
+
455
+ options = options.concat(optionsGroup);
456
+
457
+ for (const option of options) {
458
+ Manipulator.show(option);
459
+ }
460
+
461
+ if (value.length) {
462
+ value = value.trim();
463
+ value = value.toLowerCase();
464
+ value = transliterate(value, true);
465
+
466
+ for (const option of options) {
467
+ let text = option.innerText.toLowerCase();
468
+
469
+ if (text.indexOf(value) === -1) Manipulator.hide(option);
470
+ }
471
+ }
472
+ }
473
+ });
474
+
439
475
 
440
476
  export default VGSelect;