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.
- package/CHANGELOG.md +8 -3
- package/app/modules/vgdropdown/scss/vgdropdown.css +47 -47
- package/app/modules/vgformsender/scss/vgformsender.css +13 -13
- package/app/modules/vglawcookie/scss/vglawcookie.css +87 -87
- package/app/modules/vgmodal/scss/vgmodal.css +3824 -3824
- package/app/modules/vgnav/scss/vgnav.css +309 -309
- package/app/modules/vgnotify/scss/vgnotify.css +3 -3
- package/app/modules/vgrollup/scss/vgrollup.css +41 -41
- package/app/modules/vgselect/js/vgselect.js +274 -238
- package/app/modules/vgselect/scss/vgselect.css +256 -256
- package/app/modules/vgsidebar/scss/vgsidebar.css +86 -86
- package/app/utils/scss/default.css +275 -275
- package/build/vgapp.css +4942 -10
- package/build/vgapp.js +4275 -3
- package/build/vgapp.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
import BaseModule from "../../base-module";
|
|
2
|
-
import {
|
|
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
|
|
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
|
-
|
|
64
|
-
|
|
65
|
-
|
|
79
|
+
static buildListOptions(selector, drop) {
|
|
80
|
+
let options = selector.options,
|
|
81
|
+
list = document.createElement('ul');
|
|
66
82
|
|
|
67
|
-
|
|
68
|
-
if (isDisabled(this._element)) return;
|
|
83
|
+
list.classList.add(CLASS_NAME_LIST);
|
|
69
84
|
|
|
70
|
-
|
|
71
|
-
if (showEvent.defaultPrevented) return;
|
|
85
|
+
let optGroup = selector.querySelectorAll('optgroup');
|
|
72
86
|
|
|
73
|
-
if (
|
|
74
|
-
|
|
75
|
-
|
|
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
|
-
|
|
93
|
+
let liLabel = document.createElement('li');
|
|
94
|
+
liLabel.innerHTML = el.label.trim();
|
|
95
|
+
liLabel.classList.add(CLASS_NAME_OPTGROUP_TITLE)
|
|
80
96
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
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
|
-
|
|
87
|
-
}
|
|
111
|
+
drop.append(list);
|
|
88
112
|
|
|
89
|
-
|
|
90
|
-
if (isDisabled(this._element) || !this._isShown()) return;
|
|
113
|
+
return list;
|
|
91
114
|
|
|
92
|
-
|
|
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
|
-
|
|
96
|
-
|
|
97
|
-
|
|
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
|
-
|
|
100
|
-
//this._element.setAttribute('aria-expanded', 'false');
|
|
124
|
+
Manipulator.set(li, 'data-vg-toggle', 'select-option');
|
|
101
125
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
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
|
-
|
|
109
|
-
|
|
110
|
-
|
|
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
|
-
|
|
116
|
-
|
|
117
|
-
}
|
|
137
|
+
if (Manipulator.has(option, 'disabled')) li.classList.add('disabled');
|
|
138
|
+
if (Manipulator.has(option, 'hidden')) li.classList.add('hidden');
|
|
118
139
|
|
|
119
|
-
|
|
120
|
-
const _this = this;
|
|
121
|
-
let element = this._element;
|
|
140
|
+
list.append(li);
|
|
122
141
|
|
|
123
|
-
|
|
142
|
+
i++;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
124
146
|
|
|
125
|
-
|
|
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 (
|
|
128
|
-
|
|
154
|
+
} else if (reBuild) {
|
|
155
|
+
VGSelect.destroy(selector);
|
|
129
156
|
}
|
|
130
157
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
let option_selected,
|
|
134
|
-
options = element.options;
|
|
158
|
+
selector.parentElement.style.position = 'relative';
|
|
135
159
|
|
|
136
|
-
if (
|
|
137
|
-
option_selected = '<span class="'+ CLASS_NAME_PLACEHOLDER +'">' +
|
|
160
|
+
if (placeholder && selector.selectedIndex === 0) {
|
|
161
|
+
option_selected = '<span class="'+ CLASS_NAME_PLACEHOLDER +'">' + placeholder + '<span>';
|
|
138
162
|
} else {
|
|
139
|
-
option_selected =
|
|
163
|
+
option_selected = selector.options[selector.selectedIndex].innerText;
|
|
140
164
|
}
|
|
141
165
|
|
|
142
166
|
// Создаем основной элемент с классами селекта
|
|
143
|
-
let classes = Manipulator.get(
|
|
144
|
-
|
|
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
|
-
|
|
173
|
+
element.classList.add(_class)
|
|
150
174
|
}
|
|
151
175
|
|
|
152
|
-
if (Manipulator.has(
|
|
176
|
+
if (Manipulator.has(selector, 'disabled')) element.classList.add('disabled');
|
|
153
177
|
|
|
154
|
-
let elData = Manipulator.get(
|
|
178
|
+
let elData = Manipulator.get(selector);
|
|
155
179
|
if (!isEmptyObj(elData)) {
|
|
156
180
|
for (const key of Object.keys(elData)) {
|
|
157
|
-
Manipulator.set(
|
|
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
|
-
|
|
191
|
+
element.append(current);
|
|
168
192
|
|
|
169
193
|
// Создаем элемент выпадающего списка
|
|
170
194
|
let dropdown = document.createElement('div');
|
|
171
195
|
dropdown.classList.add(CLASS_NAME_DROPDOWN);
|
|
172
|
-
|
|
196
|
+
element.append(dropdown);
|
|
173
197
|
|
|
174
198
|
// Создаем список и варианты селекта
|
|
175
|
-
|
|
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
|
-
|
|
187
|
-
|
|
188
|
-
liLabel.classList.add(CLASS_NAME_OPTGROUP_TITLE)
|
|
201
|
+
// Добавляем все созданный контейнер после селекта
|
|
202
|
+
selector.insertAdjacentElement('afterend', element);
|
|
189
203
|
|
|
190
|
-
|
|
204
|
+
// помечаем элемент инициализированным
|
|
205
|
+
selector.dataset.inited = 'true';
|
|
191
206
|
|
|
192
|
-
|
|
207
|
+
if (isSearch) {
|
|
208
|
+
let search_container = document.createElement('div');
|
|
209
|
+
search_container.classList.add(CLASS_NAME_SEARCH);
|
|
193
210
|
|
|
194
|
-
|
|
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
|
-
|
|
197
|
-
|
|
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
|
-
|
|
205
|
-
|
|
206
|
-
for (const option of options) {
|
|
207
|
-
let li = document.createElement('li');
|
|
220
|
+
return element;
|
|
221
|
+
}
|
|
208
222
|
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
223
|
+
render(selector, callback) {
|
|
224
|
+
let list = Selectors.find('.' + CLASS_NAME_LIST, this._drop);
|
|
225
|
+
if (list) list.remove();
|
|
212
226
|
|
|
213
|
-
|
|
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
|
-
|
|
221
|
-
|
|
222
|
-
}
|
|
229
|
+
execute(callback, [this, selector]);
|
|
230
|
+
}
|
|
223
231
|
|
|
224
|
-
|
|
225
|
-
|
|
232
|
+
toggle(relatedTarget) {
|
|
233
|
+
return !this._isShown() ? this.show(relatedTarget) : this.hide();
|
|
234
|
+
}
|
|
226
235
|
|
|
227
|
-
|
|
236
|
+
show(relatedTarget) {
|
|
237
|
+
if (isDisabled(this._element)) return;
|
|
228
238
|
|
|
229
|
-
|
|
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
|
-
|
|
248
|
+
// TODO доделать
|
|
249
|
+
/*this._route((status, data) => {
|
|
250
|
+
let response = normalizeData(data.response),
|
|
251
|
+
select = this._element.previousSibling;
|
|
234
252
|
|
|
235
|
-
|
|
236
|
-
|
|
253
|
+
if (response.length) {
|
|
254
|
+
Selectors.findAll('option', select).forEach(option => {
|
|
255
|
+
option.remove();
|
|
256
|
+
});
|
|
237
257
|
|
|
238
|
-
|
|
239
|
-
|
|
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 (
|
|
242
|
-
this.
|
|
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
|
-
|
|
247
|
-
|
|
285
|
+
hide() {
|
|
286
|
+
if (isDisabled(this._element) || !this._isShown()) return;
|
|
248
287
|
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
element.remove();
|
|
288
|
+
this._completeHide();
|
|
289
|
+
}
|
|
252
290
|
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
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(
|
|
264
|
-
const
|
|
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
|
-
|
|
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
|
-
|
|
332
|
-
|
|
342
|
+
static destroy(select) {
|
|
343
|
+
let element = select.nextElementSibling;
|
|
333
344
|
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
345
|
+
if (element) {
|
|
346
|
+
if (element.classList.contains(CLASS_NAME_CONTAINER)) {
|
|
347
|
+
element.remove();
|
|
337
348
|
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
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
|
-
|
|
362
|
-
|
|
363
|
-
e.preventDefault();
|
|
359
|
+
static hideOpenToggles(event) {
|
|
360
|
+
const openToggles = Selectors.findAll('.vg-select:not(.disabled):not(:disabled).show');
|
|
364
361
|
|
|
365
|
-
|
|
362
|
+
for (const toggle of openToggles) {
|
|
363
|
+
const context = VGSelect.getInstance(toggle);
|
|
364
|
+
if (!context) continue;
|
|
366
365
|
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
366
|
+
if (event.target.closest('.' + CLASS_NAME_CONTAINER) === context._element) {
|
|
367
|
+
return;
|
|
368
|
+
}
|
|
370
369
|
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
}
|
|
370
|
+
const composedPath = event.composedPath();
|
|
371
|
+
if (composedPath.includes(context._element)) {
|
|
372
|
+
continue
|
|
373
|
+
}
|
|
376
374
|
|
|
377
|
-
|
|
375
|
+
const relatedTarget = { relatedTarget: context._element }
|
|
378
376
|
|
|
379
|
-
|
|
380
|
-
|
|
377
|
+
if (event.type === 'click') {
|
|
378
|
+
relatedTarget.clickEvent = event
|
|
379
|
+
}
|
|
381
380
|
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
}
|
|
386
|
-
});
|
|
387
|
-
});
|
|
381
|
+
context._completeHide(relatedTarget)
|
|
382
|
+
}
|
|
383
|
+
}
|
|
388
384
|
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
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
|
-
|
|
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
|
-
|
|
417
|
-
|
|
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;
|