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