vgapp 1.4.4 → 1.4.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/README.md +270 -270
- package/app/langs/en/buttons.json +17 -17
- package/app/langs/en/messages.json +36 -36
- package/app/langs/ru/buttons.json +17 -17
- package/app/langs/ru/messages.json +36 -36
- package/app/modules/vgalert/js/vgalert.js +266 -266
- package/app/modules/vgalert/scss/_variables.scss +16 -16
- package/app/modules/vgalert/scss/vgalert.scss +107 -107
- package/app/modules/vgcollapse/scss/_variables.scss +7 -7
- package/app/modules/vgcollapse/scss/vgcollapse.scss +5 -5
- package/app/modules/vgdropdown/scss/_variables.scss +14 -14
- package/app/modules/vgdropdown/scss/vgdropdown.scss +5 -5
- package/app/modules/vgdynamictable/index.js +4 -4
- package/app/modules/vgdynamictable/js/filters.js +21 -21
- package/app/modules/vgdynamictable/js/fixed.js +179 -179
- package/app/modules/vgdynamictable/js/options.js +3 -3
- package/app/modules/vgdynamictable/js/pagination.js +1 -1
- package/app/modules/vgdynamictable/js/search.js +12 -12
- package/app/modules/vgdynamictable/js/skeleton.js +27 -19
- package/app/modules/vgdynamictable/js/sortable.js +71 -71
- package/app/modules/vgdynamictable/js/summary-footer.js +28 -28
- package/app/modules/vgdynamictable/js/table-url-state.js +31 -31
- package/app/modules/vgdynamictable/js/utils/common.js +48 -48
- package/app/modules/vgdynamictable/js/vgdynamictable.js +79 -79
- package/app/modules/vgdynamictable/scss/_actions.scss +19 -19
- package/app/modules/vgdynamictable/scss/_pagination.scss +5 -5
- package/app/modules/vgdynamictable/scss/_skeleton.scss +11 -11
- package/app/modules/vgdynamictable/scss/_sortable.scss +28 -28
- package/app/modules/vgdynamictable/scss/_table.scss +7 -30
- package/app/modules/vgdynamictable/scss/_variables.scss +46 -46
- package/app/modules/vgdynamictable/scss/vgdynamictable.scss +28 -36
- package/app/modules/vgfilepreview/js/i18n.js +56 -56
- package/app/modules/vgfilepreview/js/renderers/image-modal.js +145 -145
- package/app/modules/vgfilepreview/js/renderers/image.js +92 -92
- package/app/modules/vgfilepreview/js/renderers/index.js +19 -19
- package/app/modules/vgfilepreview/js/renderers/office-modal.js +168 -168
- package/app/modules/vgfilepreview/js/renderers/office.js +79 -79
- package/app/modules/vgfilepreview/js/renderers/pdf-modal.js +260 -260
- package/app/modules/vgfilepreview/js/renderers/pdf.js +76 -76
- package/app/modules/vgfilepreview/js/renderers/playlist.js +71 -71
- package/app/modules/vgfilepreview/js/renderers/text-modal.js +343 -343
- package/app/modules/vgfilepreview/js/renderers/text.js +83 -83
- package/app/modules/vgfilepreview/js/renderers/video-modal.js +272 -272
- package/app/modules/vgfilepreview/js/renderers/video.js +80 -80
- package/app/modules/vgfilepreview/js/renderers/zip-modal.js +522 -522
- package/app/modules/vgfilepreview/js/renderers/zip.js +89 -89
- package/app/modules/vgfilepreview/js/vgfilepreview.js +7 -7
- package/app/modules/vgfilepreview/readme.md +68 -68
- package/app/modules/vgfilepreview/scss/_variables.scss +115 -115
- package/app/modules/vgfilepreview/scss/vgfilepreview.scss +463 -463
- package/app/modules/vgfiles/js/droppable.js +20 -9
- package/app/modules/vgfiles/js/render.js +153 -153
- package/app/modules/vgfiles/js/vgfiles.js +104 -104
- package/app/modules/vgfiles/readme.md +123 -123
- package/app/modules/vgfiles/scss/_mixins.scss +9 -9
- package/app/modules/vgfiles/scss/_variables.scss +41 -41
- package/app/modules/vgfiles/scss/vgfiles.scss +161 -161
- package/app/modules/vgformsender/js/hideshowpass.js +21 -16
- package/app/modules/vgformsender/js/vgformsender.js +4 -6
- package/app/modules/vgformsender/readme.md +1 -1
- package/app/modules/vgformsender/scss/_variables.scss +5 -5
- package/app/modules/vgformsender/scss/vgformsender.scss +42 -42
- package/app/modules/vglawcookie/js/vglawcookie.js +11 -8
- package/app/modules/vglawcookie/scss/_variables.scss +13 -13
- package/app/modules/vglawcookie/scss/vglawcookie.scss +5 -5
- package/app/modules/vgmodal/js/vgmodal.interaction.js +216 -216
- package/app/modules/vgmodal/js/vgmodal.js +355 -355
- package/app/modules/vgmodal/js/vgmodal.minimized.js +227 -227
- package/app/modules/vgmodal/scss/_variables.scss +17 -17
- package/app/modules/vgmodal/scss/vgmodal.scss +77 -77
- package/app/modules/vgnav/js/vgnav.js +180 -180
- package/app/modules/vgnav/scss/_breakpoints.scss +36 -36
- package/app/modules/vgnav/scss/_hamburger.scss +5 -5
- package/app/modules/vgnav/scss/_placement.scss +5 -5
- package/app/modules/vgnav/scss/_toggle.scss +5 -5
- package/app/modules/vgnav/scss/_variables.scss +26 -26
- package/app/modules/vgnav/scss/vgnav.scss +41 -41
- package/app/modules/vgnestable/README.md +39 -39
- package/app/modules/vgnestable/js/vgnestable.js +358 -358
- package/app/modules/vgnestable/scss/_variables.scss +35 -35
- package/app/modules/vgnestable/scss/vgnestable.scss +55 -55
- package/app/modules/vgrangeslider/js/skins.js +222 -222
- package/app/modules/vgrangeslider/js/vgrangeslider.js +704 -704
- package/app/modules/vgrangeslider/scss/_variables.scss +55 -55
- package/app/modules/vgrangeslider/scss/vgrangeslider.scss +239 -239
- package/app/modules/vgrollup/scss/_variables.scss +15 -15
- package/app/modules/vgrollup/scss/vgrollup.scss +6 -6
- package/app/modules/vgselect/js/vgselect.js +129 -129
- package/app/modules/vgselect/readme.md +11 -11
- package/app/modules/vgselect/scss/_variables.scss +50 -50
- package/app/modules/vgselect/scss/vgselect.scss +48 -48
- package/app/modules/vgsidebar/js/vgsidebar.js +79 -79
- package/app/modules/vgsidebar/scss/_variables.scss +10 -10
- package/app/modules/vgsidebar/scss/vgsidebar.scss +5 -5
- package/app/modules/vgtabs/scss/_variables.scss +23 -23
- package/app/modules/vgtabs/scss/vgtabs.scss +5 -5
- package/app/modules/vgtoast/scss/_variables.scss +13 -13
- package/app/modules/vgtoast/scss/vgtoast.scss +5 -5
- package/app/modules/vgtooltip/js/vgtooltip.js +107 -51
- package/app/modules/vgtooltip/scss/_variables.scss +10 -10
- package/app/modules/vgtooltip/scss/vgtooltip.scss +5 -5
- package/app/utils/js/components/audio-metadata.js +240 -240
- package/app/utils/js/components/backdrop.js +116 -116
- package/app/utils/js/components/file-icon.js +109 -109
- package/app/utils/js/components/file-preview.js +304 -304
- package/app/utils/js/components/sanitize.js +150 -150
- package/app/utils/js/components/video-metadata.js +140 -140
- package/app/utils/scss/_backdrop.scss +5 -5
- package/app/utils/scss/_theme-default.scss +12 -12
- package/app/utils/scss/_theme.scss +7 -7
- package/app/utils/scss/_tokens.scss +170 -170
- package/app/utils/scss/default.scss +9 -9
- package/app/utils/scss/functions.scss +21 -21
- package/app/utils/scss/index.scss +4 -4
- package/app/utils/scss/mixin.scss +16 -16
- package/app/utils/scss/variables.scss +105 -105
- package/app/vgapp.js +295 -295
- package/build/vgapp.css +1 -1
- package/build/vgapp.css.map +1 -1
- package/build/vgapp.js +1 -1
- package/build/vgapp.js.map +1 -1
- package/index.scss +20 -20
- package/package.json +4 -2
|
@@ -68,17 +68,17 @@ class VGSelect extends BaseModule {
|
|
|
68
68
|
constructor(element, params = {}) {
|
|
69
69
|
super(element, params);
|
|
70
70
|
|
|
71
|
-
this._params = this._getParams(element, mergeDeepObject({
|
|
72
|
-
lang: document.documentElement.lang || 'ru',
|
|
73
|
-
autosearch: true,
|
|
71
|
+
this._params = this._getParams(element, mergeDeepObject({
|
|
72
|
+
lang: document.documentElement.lang || 'ru',
|
|
73
|
+
autosearch: true,
|
|
74
74
|
// Dropdown placement behavior:
|
|
75
75
|
// - none: default CSS positioning (no JS)
|
|
76
76
|
// - auto: choose top/bottom based on available space in overflow ancestor/viewport
|
|
77
77
|
// - top: force open upwards
|
|
78
78
|
// - bottom: force open downwards
|
|
79
79
|
position: 'none',
|
|
80
|
-
search: {
|
|
81
|
-
enabled: false,
|
|
80
|
+
search: {
|
|
81
|
+
enabled: false,
|
|
82
82
|
route: '',
|
|
83
83
|
remote: false,
|
|
84
84
|
delay: 300,
|
|
@@ -103,10 +103,10 @@ class VGSelect extends BaseModule {
|
|
|
103
103
|
onLoadNext: null,
|
|
104
104
|
}, params));
|
|
105
105
|
|
|
106
|
-
this._observer = null;
|
|
107
|
-
this._observerTimeout = null;
|
|
108
|
-
this._visibilityTransitionId = 0;
|
|
109
|
-
this._drop = Selectors.find(SELECTOR_DROPDOWN, this._element);
|
|
106
|
+
this._observer = null;
|
|
107
|
+
this._observerTimeout = null;
|
|
108
|
+
this._visibilityTransitionId = 0;
|
|
109
|
+
this._drop = Selectors.find(SELECTOR_DROPDOWN, this._element);
|
|
110
110
|
this._searchTerm = '';
|
|
111
111
|
this._currentPage = 1;
|
|
112
112
|
this._totalPages = null;
|
|
@@ -122,9 +122,9 @@ class VGSelect extends BaseModule {
|
|
|
122
122
|
this._positioningScrollParent = null;
|
|
123
123
|
this._boundUpdateDropdownPlacement = () => this._updateDropdownPlacement();
|
|
124
124
|
|
|
125
|
-
this._initObserver();
|
|
126
|
-
this._syncSearch();
|
|
127
|
-
this._initLoadMoreButton();
|
|
125
|
+
this._initObserver();
|
|
126
|
+
this._syncSearch();
|
|
127
|
+
this._initLoadMoreButton();
|
|
128
128
|
|
|
129
129
|
this._triggerEvent(EVENT_KEY_INIT);
|
|
130
130
|
this._callCallback('onInit');
|
|
@@ -278,39 +278,39 @@ class VGSelect extends BaseModule {
|
|
|
278
278
|
return new Set([...DATA_ATTR_COPY_EXCLUDE_DEFAULT, ...customExcluded]);
|
|
279
279
|
}
|
|
280
280
|
|
|
281
|
-
static _normalizeDataAttrKey(value) {
|
|
281
|
+
static _normalizeDataAttrKey(value) {
|
|
282
282
|
return String(value || '')
|
|
283
283
|
.trim()
|
|
284
284
|
.replace(/^data-/, '')
|
|
285
285
|
.toLowerCase();
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
/**
|
|
289
|
-
* Определяет, нужно ли показывать поиск.
|
|
290
|
-
* search.enabled и search.remote включают его при любом количестве опций.
|
|
291
|
-
* autosearch: true использует порог 7, число задаёт собственный порог.
|
|
292
|
-
* @param {HTMLSelectElement} selector
|
|
293
|
-
* @param {Object} params
|
|
294
|
-
* @returns {boolean}
|
|
295
|
-
* @private
|
|
296
|
-
*/
|
|
297
|
-
static _isSearchEnabled(selector, params = {}) {
|
|
298
|
-
if (params.search?.enabled === true || params.search?.remote === true) return true;
|
|
299
|
-
|
|
300
|
-
const autosearch = params.autosearch;
|
|
301
|
-
if (autosearch === false) return false;
|
|
302
|
-
|
|
303
|
-
const numericThreshold = Number(autosearch);
|
|
304
|
-
const threshold = autosearch !== true && Number.isFinite(numericThreshold) && numericThreshold >= 0
|
|
305
|
-
? numericThreshold
|
|
306
|
-
: 7;
|
|
307
|
-
const optionCount = Array.from(selector?.options || []).filter(option => {
|
|
308
|
-
if (option.hidden) return false;
|
|
309
|
-
return option.value !== '' || option.textContent.trim() !== '';
|
|
310
|
-
}).length;
|
|
311
|
-
|
|
312
|
-
return optionCount > threshold;
|
|
313
|
-
}
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
/**
|
|
289
|
+
* Определяет, нужно ли показывать поиск.
|
|
290
|
+
* search.enabled и search.remote включают его при любом количестве опций.
|
|
291
|
+
* autosearch: true использует порог 7, число задаёт собственный порог.
|
|
292
|
+
* @param {HTMLSelectElement} selector
|
|
293
|
+
* @param {Object} params
|
|
294
|
+
* @returns {boolean}
|
|
295
|
+
* @private
|
|
296
|
+
*/
|
|
297
|
+
static _isSearchEnabled(selector, params = {}) {
|
|
298
|
+
if (params.search?.enabled === true || params.search?.remote === true) return true;
|
|
299
|
+
|
|
300
|
+
const autosearch = params.autosearch;
|
|
301
|
+
if (autosearch === false) return false;
|
|
302
|
+
|
|
303
|
+
const numericThreshold = Number(autosearch);
|
|
304
|
+
const threshold = autosearch !== true && Number.isFinite(numericThreshold) && numericThreshold >= 0
|
|
305
|
+
? numericThreshold
|
|
306
|
+
: 7;
|
|
307
|
+
const optionCount = Array.from(selector?.options || []).filter(option => {
|
|
308
|
+
if (option.hidden) return false;
|
|
309
|
+
return option.value !== '' || option.textContent.trim() !== '';
|
|
310
|
+
}).length;
|
|
311
|
+
|
|
312
|
+
return optionCount > threshold;
|
|
313
|
+
}
|
|
314
314
|
|
|
315
315
|
/**
|
|
316
316
|
* Проверяет, является ли значение "пустым" (соответствует placeholder)
|
|
@@ -426,57 +426,57 @@ class VGSelect extends BaseModule {
|
|
|
426
426
|
selector.insertAdjacentElement('afterend', container);
|
|
427
427
|
selector.dataset.inited = 'true';
|
|
428
428
|
|
|
429
|
-
this.getOrCreateInstance(container, params);
|
|
430
|
-
this.updateUI(selector);
|
|
431
|
-
|
|
432
|
-
return container;
|
|
433
|
-
}
|
|
434
|
-
|
|
435
|
-
/**
|
|
436
|
-
* Добавляет или убирает поле поиска согласно search.enabled/autosearch.
|
|
437
|
-
* @private
|
|
438
|
-
*/
|
|
439
|
-
_syncSearch() {
|
|
440
|
-
const selector = this._element.previousElementSibling;
|
|
441
|
-
if (!selector || selector.tagName !== 'SELECT' || !this._drop) return;
|
|
442
|
-
|
|
443
|
-
const enabled = VGSelect._isSearchEnabled(selector, this._params);
|
|
444
|
-
const currentSearch = this._drop.querySelector(`.${CLASS_NAME_SEARCH}`);
|
|
445
|
-
if (!enabled) {
|
|
446
|
-
currentSearch?.remove();
|
|
447
|
-
return;
|
|
448
|
-
}
|
|
449
|
-
if (currentSearch) return;
|
|
450
|
-
|
|
451
|
-
const search = document.createElement('div');
|
|
452
|
-
search.classList.add(CLASS_NAME_SEARCH);
|
|
453
|
-
const searchInput = document.createElement('input');
|
|
454
|
-
searchInput.name = 'vg-select-search';
|
|
455
|
-
searchInput.type = 'text';
|
|
456
|
-
searchInput.placeholder = lang_titles(this._params.lang, NAME)['search'];
|
|
457
|
-
searchInput.autocomplete = 'off';
|
|
458
|
-
searchInput.setAttribute('role', 'searchbox');
|
|
459
|
-
search.appendChild(searchInput);
|
|
460
|
-
this._drop.insertBefore(search, this._drop.firstChild);
|
|
461
|
-
|
|
462
|
-
let searchTimeout;
|
|
463
|
-
searchInput.addEventListener('input', (e) => {
|
|
464
|
-
const term = e.target.value.trim();
|
|
465
|
-
const params = this._params;
|
|
466
|
-
|
|
467
|
-
this._callCallback('onSearch', { term });
|
|
468
|
-
if (params.search.remote && params.search.route) {
|
|
469
|
-
if (term.length < (params.search.minterm || 1)) return;
|
|
470
|
-
|
|
471
|
-
clearTimeout(searchTimeout);
|
|
472
|
-
searchTimeout = setTimeout(() => {
|
|
473
|
-
this._fetchRemoteData(term);
|
|
474
|
-
}, params.search.delay || 300);
|
|
475
|
-
} else {
|
|
476
|
-
this._filterLocalOptions(term);
|
|
477
|
-
}
|
|
478
|
-
});
|
|
479
|
-
}
|
|
429
|
+
this.getOrCreateInstance(container, params);
|
|
430
|
+
this.updateUI(selector);
|
|
431
|
+
|
|
432
|
+
return container;
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
/**
|
|
436
|
+
* Добавляет или убирает поле поиска согласно search.enabled/autosearch.
|
|
437
|
+
* @private
|
|
438
|
+
*/
|
|
439
|
+
_syncSearch() {
|
|
440
|
+
const selector = this._element.previousElementSibling;
|
|
441
|
+
if (!selector || selector.tagName !== 'SELECT' || !this._drop) return;
|
|
442
|
+
|
|
443
|
+
const enabled = VGSelect._isSearchEnabled(selector, this._params);
|
|
444
|
+
const currentSearch = this._drop.querySelector(`.${CLASS_NAME_SEARCH}`);
|
|
445
|
+
if (!enabled) {
|
|
446
|
+
currentSearch?.remove();
|
|
447
|
+
return;
|
|
448
|
+
}
|
|
449
|
+
if (currentSearch) return;
|
|
450
|
+
|
|
451
|
+
const search = document.createElement('div');
|
|
452
|
+
search.classList.add(CLASS_NAME_SEARCH);
|
|
453
|
+
const searchInput = document.createElement('input');
|
|
454
|
+
searchInput.name = 'vg-select-search';
|
|
455
|
+
searchInput.type = 'text';
|
|
456
|
+
searchInput.placeholder = lang_titles(this._params.lang, NAME)['search'];
|
|
457
|
+
searchInput.autocomplete = 'off';
|
|
458
|
+
searchInput.setAttribute('role', 'searchbox');
|
|
459
|
+
search.appendChild(searchInput);
|
|
460
|
+
this._drop.insertBefore(search, this._drop.firstChild);
|
|
461
|
+
|
|
462
|
+
let searchTimeout;
|
|
463
|
+
searchInput.addEventListener('input', (e) => {
|
|
464
|
+
const term = e.target.value.trim();
|
|
465
|
+
const params = this._params;
|
|
466
|
+
|
|
467
|
+
this._callCallback('onSearch', { term });
|
|
468
|
+
if (params.search.remote && params.search.route) {
|
|
469
|
+
if (term.length < (params.search.minterm || 1)) return;
|
|
470
|
+
|
|
471
|
+
clearTimeout(searchTimeout);
|
|
472
|
+
searchTimeout = setTimeout(() => {
|
|
473
|
+
this._fetchRemoteData(term);
|
|
474
|
+
}, params.search.delay || 300);
|
|
475
|
+
} else {
|
|
476
|
+
this._filterLocalOptions(term);
|
|
477
|
+
}
|
|
478
|
+
});
|
|
479
|
+
}
|
|
480
480
|
|
|
481
481
|
/**
|
|
482
482
|
* Переключает открытие/закрытие выпадающего списка
|
|
@@ -493,16 +493,16 @@ class VGSelect extends BaseModule {
|
|
|
493
493
|
show(relatedTarget) {
|
|
494
494
|
if (isDisabled(this._element)) return;
|
|
495
495
|
|
|
496
|
-
const e = EventHandler.trigger(this._element, EVENT_KEY_SHOW, { relatedTarget });
|
|
497
|
-
if (e.defaultPrevented) return;
|
|
498
|
-
|
|
499
|
-
const transitionId = ++this._visibilityTransitionId;
|
|
500
|
-
this._element.classList.add(CLASS_NAME_SHOW);
|
|
501
|
-
// active задаёт видимое состояние dropdown (opacity/height). Оно не должно
|
|
502
|
-
// зависеть от таймера: под нагрузкой отложенный callback оставлял уже
|
|
503
|
-
// открытый dropdown прозрачным и с height: 0.
|
|
504
|
-
this._element.classList.add(CLASS_NAME_ACTIVE);
|
|
505
|
-
if (this._getPositionMode() !== 'none') {
|
|
496
|
+
const e = EventHandler.trigger(this._element, EVENT_KEY_SHOW, { relatedTarget });
|
|
497
|
+
if (e.defaultPrevented) return;
|
|
498
|
+
|
|
499
|
+
const transitionId = ++this._visibilityTransitionId;
|
|
500
|
+
this._element.classList.add(CLASS_NAME_SHOW);
|
|
501
|
+
// active задаёт видимое состояние dropdown (opacity/height). Оно не должно
|
|
502
|
+
// зависеть от таймера: под нагрузкой отложенный callback оставлял уже
|
|
503
|
+
// открытый dropdown прозрачным и с height: 0.
|
|
504
|
+
this._element.classList.add(CLASS_NAME_ACTIVE);
|
|
505
|
+
if (this._getPositionMode() !== 'none') {
|
|
506
506
|
this._setupDropdownPlacement();
|
|
507
507
|
} else {
|
|
508
508
|
// Ensure no leftovers if the instance had JS positioning before.
|
|
@@ -516,12 +516,12 @@ class VGSelect extends BaseModule {
|
|
|
516
516
|
const toggle = this._element.querySelector(SELECTOR_DATA_TOGGLE);
|
|
517
517
|
toggle.setAttribute('aria-expanded', 'true');
|
|
518
518
|
|
|
519
|
-
const searchInput = this._element.querySelector(SELECTOR_SEARCH_INPUT);
|
|
520
|
-
if (searchInput) searchInput.focus();
|
|
521
|
-
|
|
522
|
-
return this._queueCallback(() => {
|
|
523
|
-
if (transitionId !== this._visibilityTransitionId || !this._isShown()) return;
|
|
524
|
-
this._updateDropdownPlacement();
|
|
519
|
+
const searchInput = this._element.querySelector(SELECTOR_SEARCH_INPUT);
|
|
520
|
+
if (searchInput) searchInput.focus();
|
|
521
|
+
|
|
522
|
+
return this._queueCallback(() => {
|
|
523
|
+
if (transitionId !== this._visibilityTransitionId || !this._isShown()) return;
|
|
524
|
+
this._updateDropdownPlacement();
|
|
525
525
|
EventHandler.trigger(this._element, EVENT_KEY_SHOWN, { relatedTarget });
|
|
526
526
|
this._triggerEvent(EVENT_KEY_OPEN);
|
|
527
527
|
this._callCallback('onShow');
|
|
@@ -542,18 +542,18 @@ class VGSelect extends BaseModule {
|
|
|
542
542
|
* @private
|
|
543
543
|
*/
|
|
544
544
|
_completeHide(relatedTarget = {}) {
|
|
545
|
-
const e = EventHandler.trigger(this._element, EVENT_KEY_HIDE, relatedTarget);
|
|
546
|
-
if (e.defaultPrevented) return;
|
|
547
|
-
|
|
548
|
-
const transitionId = ++this._visibilityTransitionId;
|
|
549
|
-
this._teardownDropdownPlacement();
|
|
545
|
+
const e = EventHandler.trigger(this._element, EVENT_KEY_HIDE, relatedTarget);
|
|
546
|
+
if (e.defaultPrevented) return;
|
|
547
|
+
|
|
548
|
+
const transitionId = ++this._visibilityTransitionId;
|
|
549
|
+
this._teardownDropdownPlacement();
|
|
550
550
|
|
|
551
551
|
this._element.classList.remove(CLASS_NAME_ACTIVE);
|
|
552
552
|
this._element.querySelector(SELECTOR_DATA_TOGGLE).setAttribute('aria-expanded', 'false');
|
|
553
|
-
|
|
554
|
-
this._queueCallback(() => {
|
|
555
|
-
if (transitionId !== this._visibilityTransitionId) return;
|
|
556
|
-
this._element.classList.remove(CLASS_NAME_SHOW);
|
|
553
|
+
|
|
554
|
+
this._queueCallback(() => {
|
|
555
|
+
if (transitionId !== this._visibilityTransitionId) return;
|
|
556
|
+
this._element.classList.remove(CLASS_NAME_SHOW);
|
|
557
557
|
EventHandler.trigger(this._element, EVENT_KEY_HIDDEN, relatedTarget);
|
|
558
558
|
this._triggerEvent(EVENT_KEY_CLOSE);
|
|
559
559
|
this._callCallback('onHide');
|
|
@@ -637,18 +637,18 @@ class VGSelect extends BaseModule {
|
|
|
637
637
|
this._element.classList.remove('disabled');
|
|
638
638
|
}
|
|
639
639
|
|
|
640
|
-
const drop = this._element.querySelector(SELECTOR_DROPDOWN);
|
|
641
|
-
VGSelect.buildListOptions(select, drop, this._params);
|
|
642
|
-
this._syncSearch();
|
|
643
|
-
VGSelect.updateUI(select);
|
|
640
|
+
const drop = this._element.querySelector(SELECTOR_DROPDOWN);
|
|
641
|
+
VGSelect.buildListOptions(select, drop, this._params);
|
|
642
|
+
this._syncSearch();
|
|
643
|
+
VGSelect.updateUI(select);
|
|
644
644
|
}
|
|
645
645
|
|
|
646
646
|
/**
|
|
647
647
|
* Освобождает ресурсы (отключает observer, очищает таймеры)
|
|
648
648
|
*/
|
|
649
|
-
dispose() {
|
|
650
|
-
this._visibilityTransitionId++;
|
|
651
|
-
if (this._observer) {
|
|
649
|
+
dispose() {
|
|
650
|
+
this._visibilityTransitionId++;
|
|
651
|
+
if (this._observer) {
|
|
652
652
|
this._observer.disconnect();
|
|
653
653
|
this._observer = null;
|
|
654
654
|
}
|
|
@@ -1279,11 +1279,11 @@ class VGSelect extends BaseModule {
|
|
|
1279
1279
|
});
|
|
1280
1280
|
}
|
|
1281
1281
|
|
|
1282
|
-
if (isRebuild) {
|
|
1283
|
-
const drop = container.querySelector(`.${CLASS_NAME_DROPDOWN}`);
|
|
1284
|
-
VGSelect.buildListOptions(select, drop, instance?._params || {});
|
|
1285
|
-
instance?._syncSearch();
|
|
1286
|
-
instance?._triggerEvent(EVENT_KEY_REBUILD);
|
|
1282
|
+
if (isRebuild) {
|
|
1283
|
+
const drop = container.querySelector(`.${CLASS_NAME_DROPDOWN}`);
|
|
1284
|
+
VGSelect.buildListOptions(select, drop, instance?._params || {});
|
|
1285
|
+
instance?._syncSearch();
|
|
1286
|
+
instance?._triggerEvent(EVENT_KEY_REBUILD);
|
|
1287
1287
|
} else {
|
|
1288
1288
|
this.updateUI(select);
|
|
1289
1289
|
}
|
|
@@ -38,11 +38,11 @@
|
|
|
38
38
|
```js
|
|
39
39
|
js import VGSelect from './app/modules/vgselect/js/vgselect';
|
|
40
40
|
// Инициализация
|
|
41
|
-
VGSelect.init(document.getElementById('mySelect'), {
|
|
42
|
-
lang: 'ru',
|
|
43
|
-
placeholder: 'Выберите значение',
|
|
44
|
-
autosearch: true,
|
|
45
|
-
search: {
|
|
41
|
+
VGSelect.init(document.getElementById('mySelect'), {
|
|
42
|
+
lang: 'ru',
|
|
43
|
+
placeholder: 'Выберите значение',
|
|
44
|
+
autosearch: true,
|
|
45
|
+
search: {
|
|
46
46
|
enabled: true,
|
|
47
47
|
remote: true,
|
|
48
48
|
route: '/api/search',
|
|
@@ -62,11 +62,11 @@ VGSelect.init(document.getElementById('mySelect'), {
|
|
|
62
62
|
|
|
63
63
|
| Параметр | Тип | Описание |
|
|
64
64
|
|--------|-----|---------|
|
|
65
|
-
| `lang` | `string` | Язык интерфейса (поддерживается i18n). По умолчанию: `ru` |
|
|
66
|
-
| `placeholder` | `string` | Текст плейсхолдера |
|
|
67
|
-
| `autosearch` | `boolean \| number` | Автоматически включить поиск, если опций больше порога. `true` — порог 7 (по умолчанию), число — собственный порог, `false` — отключить автоматику |
|
|
68
|
-
| `search.enabled` | `boolean` | Включить поле поиска вручную при любом количестве опций |
|
|
69
|
-
| `search.remote` | `boolean` | Поиск через AJAX; при `true` поле поиска включается независимо от количества локальных опций |
|
|
65
|
+
| `lang` | `string` | Язык интерфейса (поддерживается i18n). По умолчанию: `ru` |
|
|
66
|
+
| `placeholder` | `string` | Текст плейсхолдера |
|
|
67
|
+
| `autosearch` | `boolean \| number` | Автоматически включить поиск, если опций больше порога. `true` — порог 7 (по умолчанию), число — собственный порог, `false` — отключить автоматику |
|
|
68
|
+
| `search.enabled` | `boolean` | Включить поле поиска вручную при любом количестве опций |
|
|
69
|
+
| `search.remote` | `boolean` | Поиск через AJAX; при `true` поле поиска включается независимо от количества локальных опций |
|
|
70
70
|
| `search.route` | `string` | URL для удалённого поиска |
|
|
71
71
|
| `search.delay` | `number` | Задержка перед запросом (мс) |
|
|
72
72
|
| `search.minTerm` | `number` | Минимальная длина запроса |
|
|
@@ -179,4 +179,4 @@ MIT. Свободно использовать и модифицировать.
|
|
|
179
179
|
|
|
180
180
|
📌 *Разработано в рамках фронтенд-системы VG Modules.*
|
|
181
181
|
> 🚀 Автор: VEGAS STUDIO (vegas-dev.com)
|
|
182
|
-
> 📍 Поддерживается в проектах VEGAS
|
|
182
|
+
> 📍 Поддерживается в проектах VEGAS
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
@use "../../../utils/scss" as vg;
|
|
2
|
-
|
|
3
|
-
$select-current-map: (
|
|
4
|
-
background-color: var(--vg-control-bg, #ffffff),
|
|
5
|
-
color: var(--vg-text-color, #{vg.$color}),
|
|
6
|
-
border-width: vg.$border-width,
|
|
7
|
-
border-style: vg.$border-style,
|
|
8
|
-
border-color: var(--vg-control-border-color, #dddddd),
|
|
1
|
+
@use "../../../utils/scss" as vg;
|
|
2
|
+
|
|
3
|
+
$select-current-map: (
|
|
4
|
+
background-color: var(--vg-control-bg, #ffffff),
|
|
5
|
+
color: var(--vg-text-color, #{vg.$color}),
|
|
6
|
+
border-width: vg.$border-width,
|
|
7
|
+
border-style: vg.$border-style,
|
|
8
|
+
border-color: var(--vg-control-border-color, #dddddd),
|
|
9
9
|
border-radius: 5px,
|
|
10
10
|
padding-left: 16px,
|
|
11
11
|
padding-right: 40px,
|
|
@@ -16,69 +16,69 @@ $select-current-map: (
|
|
|
16
16
|
z-index: 10,
|
|
17
17
|
) !default;
|
|
18
18
|
|
|
19
|
-
$select-placeholder-map: (
|
|
20
|
-
placehoder-color: var(--vg-text-placeholder-color, rgba(0, 0, 0, .32)),
|
|
21
|
-
placehoder-font-size: 16px,
|
|
22
|
-
) !default;
|
|
19
|
+
$select-placeholder-map: (
|
|
20
|
+
placehoder-color: var(--vg-text-placeholder-color, rgba(0, 0, 0, .32)),
|
|
21
|
+
placehoder-font-size: 16px,
|
|
22
|
+
) !default;
|
|
23
23
|
|
|
24
24
|
$select-current-svg: '<svg aria-hidden="true" focusable="false" data-prefix="fa-light" data-icon="chevron-down" class="svg-inline--fa fa-chevron-down fa-w-14" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path d="M4 181C7 178 12 176 16 176C20 176 24 177 27 180L224 362L421 180C428 174 438 175 444 181C450 188 449 198 443 204L235 396C229 401 219 401 213 396L5 204C-1 198 -2 188 4 181Z" fill="gray"/></svg>' !default;
|
|
25
25
|
|
|
26
|
-
$select-dropdown-map: (
|
|
27
|
-
background-color: var(--vg-control-bg, #ffffff),
|
|
28
|
-
color: var(--vg-text-color, #{vg.$color}),
|
|
29
|
-
border-width: vg.$border-width,
|
|
30
|
-
border-style: vg.$border-style,
|
|
31
|
-
border-color: var(--vg-control-border-color, #dddddd),
|
|
32
|
-
border-radius: vg.$border-radius,
|
|
33
|
-
box-shadow: 0 7px 12px 1px var(--vg-shadow-soft-color, rgba(68, 68, 68, .11)),
|
|
26
|
+
$select-dropdown-map: (
|
|
27
|
+
background-color: var(--vg-control-bg, #ffffff),
|
|
28
|
+
color: var(--vg-text-color, #{vg.$color}),
|
|
29
|
+
border-width: vg.$border-width,
|
|
30
|
+
border-style: vg.$border-style,
|
|
31
|
+
border-color: var(--vg-control-border-color, #dddddd),
|
|
32
|
+
border-radius: vg.$border-radius,
|
|
33
|
+
box-shadow: 0 7px 12px 1px var(--vg-shadow-soft-color, rgba(68, 68, 68, .11)),
|
|
34
34
|
z-index: 15,
|
|
35
35
|
) !default;
|
|
36
36
|
|
|
37
|
-
$select-list-map: (
|
|
38
|
-
background-color: transparent,
|
|
39
|
-
color: var(--vg-text-color, #{vg.$color}),
|
|
37
|
+
$select-list-map: (
|
|
38
|
+
background-color: transparent,
|
|
39
|
+
color: var(--vg-text-color, #{vg.$color}),
|
|
40
40
|
padding-left: 8px,
|
|
41
41
|
padding-right: 8px,
|
|
42
42
|
padding-top: 8px,
|
|
43
43
|
padding-bottom: 8px,
|
|
44
|
-
border-bottom-width: vg.$border-width,
|
|
45
|
-
border-bottom-style: vg.$border-style,
|
|
46
|
-
border-bottom-color: var(--vg-border-disabled-color, #f5f5f5),
|
|
44
|
+
border-bottom-width: vg.$border-width,
|
|
45
|
+
border-bottom-style: vg.$border-style,
|
|
46
|
+
border-bottom-color: var(--vg-border-disabled-color, #f5f5f5),
|
|
47
47
|
) !default;
|
|
48
48
|
|
|
49
|
-
$select-optgroup-map: (
|
|
50
|
-
background-color: transparent,
|
|
51
|
-
color: var(--vg-text-color, #{vg.$color}),
|
|
49
|
+
$select-optgroup-map: (
|
|
50
|
+
background-color: transparent,
|
|
51
|
+
color: var(--vg-text-color, #{vg.$color}),
|
|
52
52
|
padding-left: 8px,
|
|
53
53
|
padding-right: 8px,
|
|
54
54
|
padding-top: 8px,
|
|
55
55
|
padding-bottom: 8px,
|
|
56
|
-
border-bottom-width: vg.$border-width,
|
|
57
|
-
border-bottom-style: vg.$border-style,
|
|
58
|
-
border-bottom-color: var(--vg-border-strong-color, #838383),
|
|
56
|
+
border-bottom-width: vg.$border-width,
|
|
57
|
+
border-bottom-style: vg.$border-style,
|
|
58
|
+
border-bottom-color: var(--vg-border-strong-color, #838383),
|
|
59
59
|
font-weight: 500,
|
|
60
60
|
) !default;
|
|
61
61
|
|
|
62
62
|
$select-list-max-height: 286px !default;
|
|
63
63
|
$select-list-scrollbar-width: 6px !default;
|
|
64
|
-
$select-list-scrollbar-bg: var(--vg-surface-muted-bg, #f5f5f5) !default;
|
|
65
|
-
$select-list-scrollbar-thumb: var(--vg-text-muted-color, #999999) !default;
|
|
64
|
+
$select-list-scrollbar-bg: var(--vg-surface-muted-bg, #f5f5f5) !default;
|
|
65
|
+
$select-list-scrollbar-thumb: var(--vg-text-muted-color, #999999) !default;
|
|
66
66
|
|
|
67
|
-
$select-list-hover-map: (
|
|
68
|
-
background-color: var(--vg-surface-hover-bg, #f7f7f7),
|
|
69
|
-
color: var(--vg-text-color, #{vg.$color}),
|
|
70
|
-
border-bottom-color: var(--vg-border-disabled-color, #f5f5f5),
|
|
67
|
+
$select-list-hover-map: (
|
|
68
|
+
background-color: var(--vg-surface-hover-bg, #f7f7f7),
|
|
69
|
+
color: var(--vg-text-color, #{vg.$color}),
|
|
70
|
+
border-bottom-color: var(--vg-border-disabled-color, #f5f5f5),
|
|
71
71
|
) !default;
|
|
72
72
|
|
|
73
|
-
$select-optgroup-hover-map: (
|
|
74
|
-
background-color: var(--vg-surface-hover-bg, #f7f7f7),
|
|
75
|
-
color: var(--vg-text-color, #{vg.$color}),
|
|
76
|
-
border-bottom-color: var(--vg-border-disabled-color, #f5f5f5),
|
|
73
|
+
$select-optgroup-hover-map: (
|
|
74
|
+
background-color: var(--vg-surface-hover-bg, #f7f7f7),
|
|
75
|
+
color: var(--vg-text-color, #{vg.$color}),
|
|
76
|
+
border-bottom-color: var(--vg-border-disabled-color, #f5f5f5),
|
|
77
77
|
) !default;
|
|
78
78
|
|
|
79
|
-
$select-search-map: (
|
|
80
|
-
background-color: var(--vg-control-muted-bg, #f2f2f2),
|
|
81
|
-
color: var(--vg-text-color, #{vg.$color})
|
|
79
|
+
$select-search-map: (
|
|
80
|
+
background-color: var(--vg-control-muted-bg, #f2f2f2),
|
|
81
|
+
color: var(--vg-text-color, #{vg.$color})
|
|
82
82
|
) !default;
|
|
83
83
|
|
|
84
84
|
$select-tags-map: (
|
|
@@ -88,15 +88,15 @@ $select-tags-map: (
|
|
|
88
88
|
padding: 2px 0
|
|
89
89
|
) !default;
|
|
90
90
|
|
|
91
|
-
$select-tag-map: (
|
|
92
|
-
gap: 4px,
|
|
93
|
-
background: var(--vg-primary-color, #0d6efd),
|
|
94
|
-
color: var(--vg-primary-contrast-color, #ffffff),
|
|
91
|
+
$select-tag-map: (
|
|
92
|
+
gap: 4px,
|
|
93
|
+
background: var(--vg-primary-color, #0d6efd),
|
|
94
|
+
color: var(--vg-primary-contrast-color, #ffffff),
|
|
95
95
|
padding: 2px 6px,
|
|
96
96
|
border-radius: 4px,
|
|
97
97
|
font-size: 14px,
|
|
98
98
|
remove-width: 12px,
|
|
99
99
|
remove-height: 12px,
|
|
100
|
-
remove-stroke: var(--vg-primary-contrast-color, #ffffff),
|
|
100
|
+
remove-stroke: var(--vg-primary-contrast-color, #ffffff),
|
|
101
101
|
remove-stroke-width: 2
|
|
102
102
|
) !default;
|