vgapp 0.7.6 → 0.7.8

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 CHANGED
@@ -1,3 +1,15 @@
1
+ # VEGAS-APP 0.7.7 - 0.7.8 (Декабрь, 18, 2025)
2
+ * Дополнен модуль VGFormSender. В директории модуля появился файл readme.md. Добавлен JSDoc
3
+ * Удалена набор функций Ajax в module-fn и добавлен самостоятельный класс Ajax с более продвинутой логикой работы с XHR
4
+ * Добавлен в компоненты класс LaravelHtmlBuilder, на лету создающий шаблоны и элементы
5
+ ```js
6
+ const tmpl = Html('dom'); // или 'string'
7
+ let elm = tmpl.div({...attrbuttes}, 'text');
8
+ ```
9
+ * Начата работа над компонентом Lang доступные функции `lang_titles(lang, module)` и `lang_messages(lang, module)` (в разработке)
10
+ * Исправлены ошибки в разных модулях
11
+
12
+ ---
1
13
  # VEGAS-APP 0.7.6 (Декабрь, 13, 2025)
2
14
  * Исправлена анимация в модуле VGToast
3
15
  * Добавлены темы `theme:` `['success', 'info', 'warning', 'danger', 'dark']` для модуля VGToast
@@ -6,11 +18,10 @@
6
18
  ---
7
19
 
8
20
  # VEGAS-APP 0.7.5 (Декабрь, 08, 2025)
9
- * В модуль VGFORSENDER добавлен параметр `fields` для программного добавление новых полей в FormData,
21
+ * В модуль VGFORMSENDER добавлен параметр `fields` для программного добавление новых полей в FormData,
10
22
  если в значении объекта окажется массив или объект, то сформируется json строка
11
- ```
23
+ ```js
12
24
  {
13
- ...
14
25
  fields: [
15
26
  {
16
27
  name: Andranik,
@@ -24,7 +35,7 @@
24
35
  }
25
36
  ```
26
37
  * Хак на кнопку отправки `onclick` можно повесить колбек на событие
27
- ```
38
+ ```html
28
39
  <button type="submit" class="btn btn-primary"
29
40
  onclick='vg.VGFormSender.buttonClick("#form-simple", function (form, self) {
30
41
  self._button.innerHTML = `<span class="spinner-border spinner-border-sm"></span>`;
@@ -3,8 +3,10 @@ import Selectors from "../utils/js/dom/selectors";
3
3
  import Data from "../utils/js/dom/data";
4
4
  import Params from "../utils/js/components/params";
5
5
  import EventHandler from "../utils/js/dom/event";
6
- import {Ajax, getSVG} from "./module-fn";
6
+ import {getSVG} from "./module-fn";
7
7
  import Animation from "../utils/js/components/animation";
8
+ import Ajax from "../utils/js/components/ajax";
9
+ import Html from "../utils/js/components/templater";
8
10
 
9
11
  class BaseModule {
10
12
  constructor(element) {
@@ -33,14 +35,28 @@ class BaseModule {
33
35
  }
34
36
  }
35
37
 
38
+ /**
39
+ * Метод для отправки данных на сервер
40
+ * данные для работы должны быть в this._params.ajax
41
+ * - route = ссылка для отправки данных, обязательное поле
42
+ * - method = по умолчанию get
43
+ * - target = элемент (#container-request), куда будут выгружен ответ сервер, тип строка
44
+ * - loader = спиннер загрузки использует класс vg-loader (в дефолтных стилях), по умолчанию false
45
+ * - once = сделает всего один запрос (например: при открытии модалки несколько раз), по умолчанию false
46
+ * - output = Разрешает или запрещает добавление контента с сервера в целевой блок, по умолчанию false
47
+ * - timeout = задержка перед отправкой, по умолчанию 0
48
+ * @param callback
49
+ */
36
50
  _route(callback) {
37
51
  let $content = null,
38
52
  timeout = this._params.ajax.timeout || 0;
39
53
 
40
54
  if (this._isLoaded) return;
41
55
 
42
- const setData = (data) => {
43
- if ($content) $content.innerHTML = data;
56
+ const setData = (response) => {
57
+ if (typeof response === "string") {
58
+ if ($content) $content.innerHTML = response;
59
+ }
44
60
  };
45
61
 
46
62
  if (!this._params.hasOwnProperty('ajax')) {
@@ -59,25 +75,44 @@ class BaseModule {
59
75
  $content = Selectors.find(this._params.ajax.target);
60
76
  }
61
77
 
62
- if ('loader' in this._params.ajax && this._params.ajax.loader) {
78
+ if (('loader' in this._params.ajax && this._params.ajax.loader) && ('output' in this._params.ajax && this._params.ajax.output)) {
79
+ setData(Html('string').div({class: 'vg-loader'}));
80
+ }
81
+
82
+ let completeAjaxRequest = (data, status) => {
83
+ if ('loader' in this._params.ajax && this._params.ajax.loader) setData('');
84
+
85
+ if ('once' in this._params.ajax && this._params.ajax.once) {
86
+ this._isLoaded = true;
87
+ }
88
+
63
89
  if ('output' in this._params.ajax && this._params.ajax.output) {
64
- setData('<div class="vg-loader"></div>');
90
+ setData(data.response);
91
+ }
92
+
93
+ execute(callback, [status, data, $content]);
94
+ }
95
+
96
+ const ajax = new Ajax();
97
+
98
+ let ajaxData = {
99
+ onSuccess: (data) => {
100
+ completeAjaxRequest(data, 'success')
101
+ },
102
+ onError: (err) => {
103
+ completeAjaxRequest(err, 'error')
65
104
  }
66
105
  }
67
106
 
68
107
  setTimeout(() => {
69
- Ajax[this._params.ajax.method](this._params.ajax.route, this._params.ajax.data || {}, (status, data) => {
70
- if ('once' in this._params.ajax && this._params.ajax.once) {
71
- this._isLoaded = true;
72
- }
73
-
74
- if ('output' in this._params.ajax && this._params.ajax.output) {
75
- setData(data.response);
76
- }
77
-
78
- execute(callback, [status, data, $content]);
79
- });
80
- }, timeout)
108
+ if (this._params.ajax.method.toLowerCase() === 'get') {
109
+ ajax.get(this._params.ajax.route, ajaxData);
110
+ }
111
+
112
+ if (this._params.ajax.method.toLowerCase() === 'post') {
113
+ ajax.post(this._params.ajax.route, this._params.ajax.data, ajaxData);
114
+ }
115
+ }, timeout);
81
116
  }
82
117
 
83
118
  _dismissElement() {
@@ -13,13 +13,15 @@ import Selectors from "../utils/js/dom/selectors";
13
13
  */
14
14
  const getSVG = (name) => {
15
15
  const svg = {
16
- danger: '<svg width="72" height="72" viewBox="0 0 72 72" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M36 4.5C53.3953 4.5 67.5 18.6047 67.5 36C67.5 53.3953 53.3953 67.5 36 67.5C18.6047 67.5 4.5 53.3953 4.5 36C4.5 18.6047 18.6047 4.5 36 4.5ZM44.9961 23.8237C44.9944 23.8242 44.9931 23.825 44.9902 23.8279L36 32.818L27.0098 23.8279C27.0069 23.825 27.0056 23.8242 27.0039 23.8237C27.0023 23.8232 27.0006 23.8232 26.999 23.8237C26.9975 23.8242 26.9961 23.825 26.9932 23.8279L23.8278 26.9932C23.825 26.9961 23.8243 26.9975 23.8237 26.9991C23.8232 27.0007 23.8232 27.0024 23.8237 27.004L23.8244 27.0056C23.8253 27.0071 23.8265 27.0085 23.8279 27.0098L32.818 36L23.8279 44.9903C23.825 44.9931 23.8242 44.9945 23.8237 44.9961C23.8232 44.9977 23.8232 44.9995 23.8237 45.0011C23.8242 45.0026 23.825 45.0039 23.8279 45.0068L26.9932 48.1723C26.9961 48.1751 26.9975 48.1758 26.9991 48.1764C27.0007 48.1769 27.0024 48.1769 27.004 48.1764C27.0056 48.1759 27.0069 48.1751 27.0098 48.1722L36 39.1819L44.9903 48.1721C44.9931 48.175 44.9945 48.1758 44.9961 48.1763C44.9977 48.1768 44.9995 48.1768 45.0011 48.1763C45.0026 48.1758 45.0039 48.175 45.0068 48.1721L48.1723 45.0068C48.1751 45.0039 48.1758 45.0025 48.1764 45.0009C48.1769 44.9993 48.1769 44.9976 48.1764 44.996L48.1757 44.9944C48.1747 44.9929 48.1736 44.9915 48.1722 44.9902L39.1819 36L48.1721 27.0098C48.175 27.0069 48.1758 27.0056 48.1763 27.0039C48.1768 27.0023 48.1768 27.0006 48.1763 26.999C48.1758 26.9975 48.175 26.9961 48.1721 26.9932L45.0068 23.8278C45.0039 23.825 45.0025 23.8243 45.0009 23.8237C44.9993 23.8232 44.9977 23.8232 44.9961 23.8237Z" fill="#000000"/></svg>',
17
- success: '<svg width="72" height="72" viewBox="0 0 72 72" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M36 4.5C18.6047 4.5 4.5 18.6047 4.5 36C4.5 53.3953 18.6047 67.5 36 67.5C53.3953 67.5 67.5 53.3953 67.5 36C67.5 18.6047 53.3953 4.5 36 4.5ZM49.6055 25.7133L34.7977 46.2445C34.5907 46.5334 34.3179 46.7688 34.0018 46.9312C33.6857 47.0935 33.3354 47.1782 32.9801 47.1782C32.6247 47.1782 32.2745 47.0935 31.9584 46.9312C31.6423 46.7688 31.3695 46.5334 31.1625 46.2445L22.3945 34.0945C22.1273 33.7219 22.3945 33.2016 22.8516 33.2016H26.1492C26.8664 33.2016 27.5484 33.5461 27.9703 34.1367L32.9766 41.0836L44.0297 25.7555C44.4516 25.1719 45.1266 24.8203 45.8508 24.8203H49.1484C49.6055 24.8203 49.8727 25.3406 49.6055 25.7133Z" fill="#000000"/></svg>',
18
- waiting: '<svg width="72" height="72" viewBox="0 0 72 72" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M51 10.02C55.5248 12.6326 59.2888 16.3816 61.9194 20.8959C64.5501 25.4103 65.9561 30.5334 65.9983 35.7581C66.0405 40.9828 64.7174 46.1279 62.1601 50.6841C59.6027 55.2404 55.8997 59.0497 51.4177 61.735C46.9357 64.4203 41.8301 65.8885 36.6063 65.9942C31.3825 66.1 26.2216 64.8395 21.6347 62.3378C17.0477 59.836 13.1936 56.1796 10.454 51.7306C7.71439 47.2816 6.18423 42.1942 6.015 36.972L6 36L6.015 35.028C6.18301 29.847 7.69064 24.7979 10.3909 20.373C13.0912 15.9481 16.892 12.2984 21.4227 9.77969C25.9534 7.26098 31.0594 5.95923 36.243 6.00136C41.4266 6.04348 46.5108 7.42804 51 10.02ZM36 18C35.2652 18.0001 34.556 18.2699 34.0069 18.7582C33.4578 19.2465 33.107 19.9193 33.021 20.649L33 21V36L33.027 36.393C33.0954 36.9135 33.2992 37.407 33.618 37.824L33.879 38.124L42.879 47.124L43.161 47.37C43.6871 47.7782 44.3341 47.9998 45 47.9998C45.6659 47.9998 46.3129 47.7782 46.839 47.37L47.121 47.121L47.37 46.839C47.7782 46.3129 47.9998 45.6659 47.9998 45C47.9998 44.3341 47.7782 43.6872 47.37 43.161L47.121 42.879L39 34.755V21L38.979 20.649C38.893 19.9193 38.5422 19.2465 37.9931 18.7582C37.444 18.2699 36.7348 18.0001 36 18Z" fill="black"/></svg>',
19
- warning: '<svg width="72" height="72" viewBox="0 0 72 72" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M36.5 5C44.8543 5 52.8665 8.31874 58.7739 14.2261C64.6813 20.1335 68 28.1457 68 36.5C68 44.8543 64.6813 52.8665 58.7739 58.7739C52.8665 64.6813 44.8543 68 36.5 68C28.1457 68 20.1335 64.6813 14.2261 58.7739C8.31874 52.8665 5 44.8543 5 36.5C5 28.1457 8.31874 20.1335 14.2261 14.2261C20.1335 8.31874 28.1457 5 36.5 5ZM36.5 18.5C35.9287 18.4995 35.3635 18.6181 34.8406 18.8484C34.3178 19.0786 33.8487 19.4154 33.4633 19.8372C33.0779 20.259 32.7848 20.7565 32.6025 21.298C32.4203 21.8395 32.353 22.413 32.405 22.982L34.0475 41.009C34.1112 41.6151 34.397 42.1761 34.8499 42.5839C35.3028 42.9917 35.8906 43.2173 36.5 43.2173C37.1094 43.2173 37.6972 42.9917 38.1501 42.5839C38.603 42.1761 38.8888 41.6151 38.9525 41.009L40.5905 22.982C40.6424 22.4134 40.5753 21.8403 40.3933 21.2991C40.2114 20.7579 39.9186 20.2606 39.5337 19.8389C39.1488 19.4171 38.6803 19.0803 38.1579 18.8498C37.6356 18.6192 37.0709 18.5001 36.5 18.5ZM36.5 54.5C37.4548 54.5 38.3705 54.1207 39.0456 53.4456C39.7207 52.7705 40.1 51.8548 40.1 50.9C40.1 49.9452 39.7207 49.0295 39.0456 48.3544C38.3705 47.6793 37.4548 47.3 36.5 47.3C35.5452 47.3 34.6295 47.6793 33.9544 48.3544C33.2793 49.0295 32.9 49.9452 32.9 50.9C32.9 51.8548 33.2793 52.7705 33.9544 53.4456C34.6295 54.1207 35.5452 54.5 36.5 54.5Z" fill="#000000"/></svg>',
20
- info: '<svg width="72" height="72" viewBox="0 0 72 72" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M36 4.5C18.6047 4.5 4.5 18.6047 4.5 36C4.5 53.3953 18.6047 67.5 36 67.5C53.3953 67.5 67.5 53.3953 67.5 36C67.5 18.6047 53.3953 4.5 36 4.5ZM33.75 20.8125C33.75 20.5031 34.0031 20.25 34.3125 20.25H37.6875C37.9969 20.25 38.25 20.5031 38.25 20.8125V39.9375C38.25 40.2469 37.9969 40.5 37.6875 40.5H34.3125C34.0031 40.5 33.75 40.2469 33.75 39.9375V20.8125ZM36 51.75C35.1168 51.732 34.2759 51.3685 33.6577 50.7375C33.0395 50.1065 32.6932 49.2584 32.6932 48.375C32.6932 47.4916 33.0395 46.6435 33.6577 46.0125C34.2759 45.3815 35.1168 45.018 36 45C36.8832 45.018 37.7241 45.3815 38.3423 46.0125C38.9605 46.6435 39.3068 47.4916 39.3068 48.375C39.3068 49.2584 38.9605 50.1065 38.3423 50.7375C37.7241 51.3685 36.8832 51.732 36 51.75Z" fill="#000000"/></svg>',
21
- dots: '<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M10 17C11.1046 17 12 16.1046 12 15C12 13.8954 11.1046 13 10 13C8.89543 13 8 13.8954 8 15C8 16.1046 8.89543 17 10 17Z" fill="black"/><path d="M10 12C11.1046 12 12 11.1046 12 10C12 8.89543 11.1046 8 10 8C8.89543 8 8 8.89543 8 10C8 11.1046 8.89543 12 10 12Z" fill="black"/><path d="M10 7C11.1046 7 12 6.10457 12 5C12 3.89543 11.1046 3 10 3C8.89543 3 8 3.89543 8 5C8 6.10457 8.89543 7 10 7Z" fill="black"/></svg>',
22
- cross: '<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M15.3149 0.340332C15.4478 0.20752 15.6027 0.118978 15.7798 0.074707C15.9569 0.0249023 16.134 0.0249023 16.311 0.074707C16.4881 0.118978 16.6431 0.20752 16.7759 0.340332C16.9142 0.473145 17.0055 0.630859 17.0498 0.813477C17.0941 0.99056 17.0941 1.16764 17.0498 1.34473C17.0055 1.52181 16.917 1.67676 16.7842 1.80957L1.80127 16.8008C1.67399 16.9281 1.52181 17.0111 1.34473 17.0498C1.16764 17.0941 0.987793 17.0941 0.805176 17.0498C0.628092 17.0111 0.470378 16.9253 0.332031 16.7925C0.199219 16.6597 0.110677 16.502 0.0664062 16.3193C0.0221354 16.1423 0.0221354 15.9652 0.0664062 15.7881C0.110677 15.611 0.196452 15.4588 0.32373 15.3315L15.3149 0.340332ZM16.7842 15.3232C16.917 15.4561 17.0028 15.6082 17.0415 15.7798C17.0858 15.9569 17.0858 16.134 17.0415 16.311C17.0028 16.4937 16.9142 16.6541 16.7759 16.7925C16.6431 16.9253 16.4881 17.0138 16.311 17.0581C16.134 17.1024 15.9569 17.1024 15.7798 17.0581C15.6027 17.0138 15.4478 16.9253 15.3149 16.7925L0.32373 1.80127C0.201986 1.67952 0.116211 1.53011 0.0664062 1.35303C0.0221354 1.17594 0.0221354 0.996094 0.0664062 0.813477C0.116211 0.630859 0.204753 0.473145 0.332031 0.340332C0.464844 0.20752 0.622559 0.118978 0.805176 0.074707C0.987793 0.0304362 1.16488 0.0304362 1.33643 0.074707C1.51351 0.118978 1.66846 0.204753 1.80127 0.332031L16.7842 15.3232Z" fill="#000"/></svg>',
16
+ danger: '<svg width="72" height="72" viewBox="0 0 72 72" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M36 4.5C53.3953 4.5 67.5 18.6047 67.5 36C67.5 53.3953 53.3953 67.5 36 67.5C18.6047 67.5 4.5 53.3953 4.5 36C4.5 18.6047 18.6047 4.5 36 4.5ZM44.9961 23.8237C44.9944 23.8242 44.9931 23.825 44.9902 23.8279L36 32.818L27.0098 23.8279C27.0069 23.825 27.0056 23.8242 27.0039 23.8237C27.0023 23.8232 27.0006 23.8232 26.999 23.8237C26.9975 23.8242 26.9961 23.825 26.9932 23.8279L23.8278 26.9932C23.825 26.9961 23.8243 26.9975 23.8237 26.9991C23.8232 27.0007 23.8232 27.0024 23.8237 27.004L23.8244 27.0056C23.8253 27.0071 23.8265 27.0085 23.8279 27.0098L32.818 36L23.8279 44.9903C23.825 44.9931 23.8242 44.9945 23.8237 44.9961C23.8232 44.9977 23.8232 44.9995 23.8237 45.0011C23.8242 45.0026 23.825 45.0039 23.8279 45.0068L26.9932 48.1723C26.9961 48.1751 26.9975 48.1758 26.9991 48.1764C27.0007 48.1769 27.0024 48.1769 27.004 48.1764C27.0056 48.1759 27.0069 48.1751 27.0098 48.1722L36 39.1819L44.9903 48.1721C44.9931 48.175 44.9945 48.1758 44.9961 48.1763C44.9977 48.1768 44.9995 48.1768 45.0011 48.1763C45.0026 48.1758 45.0039 48.175 45.0068 48.1721L48.1723 45.0068C48.1751 45.0039 48.1758 45.0025 48.1764 45.0009C48.1769 44.9993 48.1769 44.9976 48.1764 44.996L48.1757 44.9944C48.1747 44.9929 48.1736 44.9915 48.1722 44.9902L39.1819 36L48.1721 27.0098C48.175 27.0069 48.1758 27.0056 48.1763 27.0039C48.1768 27.0023 48.1768 27.0006 48.1763 26.999C48.1758 26.9975 48.175 26.9961 48.1721 26.9932L45.0068 23.8278C45.0039 23.825 45.0025 23.8243 45.0009 23.8237C44.9993 23.8232 44.9977 23.8232 44.9961 23.8237Z" fill="#000000"/></svg>',
17
+ success: '<svg width="72" height="72" viewBox="0 0 72 72" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M36 4.5C18.6047 4.5 4.5 18.6047 4.5 36C4.5 53.3953 18.6047 67.5 36 67.5C53.3953 67.5 67.5 53.3953 67.5 36C67.5 18.6047 53.3953 4.5 36 4.5ZM49.6055 25.7133L34.7977 46.2445C34.5907 46.5334 34.3179 46.7688 34.0018 46.9312C33.6857 47.0935 33.3354 47.1782 32.9801 47.1782C32.6247 47.1782 32.2745 47.0935 31.9584 46.9312C31.6423 46.7688 31.3695 46.5334 31.1625 46.2445L22.3945 34.0945C22.1273 33.7219 22.3945 33.2016 22.8516 33.2016H26.1492C26.8664 33.2016 27.5484 33.5461 27.9703 34.1367L32.9766 41.0836L44.0297 25.7555C44.4516 25.1719 45.1266 24.8203 45.8508 24.8203H49.1484C49.6055 24.8203 49.8727 25.3406 49.6055 25.7133Z" fill="#000000"/></svg>',
18
+ waiting: '<svg width="72" height="72" viewBox="0 0 72 72" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M51 10.02C55.5248 12.6326 59.2888 16.3816 61.9194 20.8959C64.5501 25.4103 65.9561 30.5334 65.9983 35.7581C66.0405 40.9828 64.7174 46.1279 62.1601 50.6841C59.6027 55.2404 55.8997 59.0497 51.4177 61.735C46.9357 64.4203 41.8301 65.8885 36.6063 65.9942C31.3825 66.1 26.2216 64.8395 21.6347 62.3378C17.0477 59.836 13.1936 56.1796 10.454 51.7306C7.71439 47.2816 6.18423 42.1942 6.015 36.972L6 36L6.015 35.028C6.18301 29.847 7.69064 24.7979 10.3909 20.373C13.0912 15.9481 16.892 12.2984 21.4227 9.77969C25.9534 7.26098 31.0594 5.95923 36.243 6.00136C41.4266 6.04348 46.5108 7.42804 51 10.02ZM36 18C35.2652 18.0001 34.556 18.2699 34.0069 18.7582C33.4578 19.2465 33.107 19.9193 33.021 20.649L33 21V36L33.027 36.393C33.0954 36.9135 33.2992 37.407 33.618 37.824L33.879 38.124L42.879 47.124L43.161 47.37C43.6871 47.7782 44.3341 47.9998 45 47.9998C45.6659 47.9998 46.3129 47.7782 46.839 47.37L47.121 47.121L47.37 46.839C47.7782 46.3129 47.9998 45.6659 47.9998 45C47.9998 44.3341 47.7782 43.6872 47.37 43.161L47.121 42.879L39 34.755V21L38.979 20.649C38.893 19.9193 38.5422 19.2465 37.9931 18.7582C37.444 18.2699 36.7348 18.0001 36 18Z" fill="black"/></svg>',
19
+ warning: '<svg width="72" height="72" viewBox="0 0 72 72" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M36.5 5C44.8543 5 52.8665 8.31874 58.7739 14.2261C64.6813 20.1335 68 28.1457 68 36.5C68 44.8543 64.6813 52.8665 58.7739 58.7739C52.8665 64.6813 44.8543 68 36.5 68C28.1457 68 20.1335 64.6813 14.2261 58.7739C8.31874 52.8665 5 44.8543 5 36.5C5 28.1457 8.31874 20.1335 14.2261 14.2261C20.1335 8.31874 28.1457 5 36.5 5ZM36.5 18.5C35.9287 18.4995 35.3635 18.6181 34.8406 18.8484C34.3178 19.0786 33.8487 19.4154 33.4633 19.8372C33.0779 20.259 32.7848 20.7565 32.6025 21.298C32.4203 21.8395 32.353 22.413 32.405 22.982L34.0475 41.009C34.1112 41.6151 34.397 42.1761 34.8499 42.5839C35.3028 42.9917 35.8906 43.2173 36.5 43.2173C37.1094 43.2173 37.6972 42.9917 38.1501 42.5839C38.603 42.1761 38.8888 41.6151 38.9525 41.009L40.5905 22.982C40.6424 22.4134 40.5753 21.8403 40.3933 21.2991C40.2114 20.7579 39.9186 20.2606 39.5337 19.8389C39.1488 19.4171 38.6803 19.0803 38.1579 18.8498C37.6356 18.6192 37.0709 18.5001 36.5 18.5ZM36.5 54.5C37.4548 54.5 38.3705 54.1207 39.0456 53.4456C39.7207 52.7705 40.1 51.8548 40.1 50.9C40.1 49.9452 39.7207 49.0295 39.0456 48.3544C38.3705 47.6793 37.4548 47.3 36.5 47.3C35.5452 47.3 34.6295 47.6793 33.9544 48.3544C33.2793 49.0295 32.9 49.9452 32.9 50.9C32.9 51.8548 33.2793 52.7705 33.9544 53.4456C34.6295 54.1207 35.5452 54.5 36.5 54.5Z" fill="#000000"/></svg>',
20
+ info: '<svg width="72" height="72" viewBox="0 0 72 72" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M36 4.5C18.6047 4.5 4.5 18.6047 4.5 36C4.5 53.3953 18.6047 67.5 36 67.5C53.3953 67.5 67.5 53.3953 67.5 36C67.5 18.6047 53.3953 4.5 36 4.5ZM33.75 20.8125C33.75 20.5031 34.0031 20.25 34.3125 20.25H37.6875C37.9969 20.25 38.25 20.5031 38.25 20.8125V39.9375C38.25 40.2469 37.9969 40.5 37.6875 40.5H34.3125C34.0031 40.5 33.75 40.2469 33.75 39.9375V20.8125ZM36 51.75C35.1168 51.732 34.2759 51.3685 33.6577 50.7375C33.0395 50.1065 32.6932 49.2584 32.6932 48.375C32.6932 47.4916 33.0395 46.6435 33.6577 46.0125C34.2759 45.3815 35.1168 45.018 36 45C36.8832 45.018 37.7241 45.3815 38.3423 46.0125C38.9605 46.6435 39.3068 47.4916 39.3068 48.375C39.3068 49.2584 38.9605 50.1065 38.3423 50.7375C37.7241 51.3685 36.8832 51.732 36 51.75Z" fill="#000000"/></svg>',
21
+ dots: '<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M10 17C11.1046 17 12 16.1046 12 15C12 13.8954 11.1046 13 10 13C8.89543 13 8 13.8954 8 15C8 16.1046 8.89543 17 10 17Z" fill="black"/><path d="M10 12C11.1046 12 12 11.1046 12 10C12 8.89543 11.1046 8 10 8C8.89543 8 8 8.89543 8 10C8 11.1046 8.89543 12 10 12Z" fill="black"/><path d="M10 7C11.1046 7 12 6.10457 12 5C12 3.89543 11.1046 3 10 3C8.89543 3 8 3.89543 8 5C8 6.10457 8.89543 7 10 7Z" fill="black"/></svg>',
22
+ cross: '<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M15.3149 0.340332C15.4478 0.20752 15.6027 0.118978 15.7798 0.074707C15.9569 0.0249023 16.134 0.0249023 16.311 0.074707C16.4881 0.118978 16.6431 0.20752 16.7759 0.340332C16.9142 0.473145 17.0055 0.630859 17.0498 0.813477C17.0941 0.99056 17.0941 1.16764 17.0498 1.34473C17.0055 1.52181 16.917 1.67676 16.7842 1.80957L1.80127 16.8008C1.67399 16.9281 1.52181 17.0111 1.34473 17.0498C1.16764 17.0941 0.987793 17.0941 0.805176 17.0498C0.628092 17.0111 0.470378 16.9253 0.332031 16.7925C0.199219 16.6597 0.110677 16.502 0.0664062 16.3193C0.0221354 16.1423 0.0221354 15.9652 0.0664062 15.7881C0.110677 15.611 0.196452 15.4588 0.32373 15.3315L15.3149 0.340332ZM16.7842 15.3232C16.917 15.4561 17.0028 15.6082 17.0415 15.7798C17.0858 15.9569 17.0858 16.134 17.0415 16.311C17.0028 16.4937 16.9142 16.6541 16.7759 16.7925C16.6431 16.9253 16.4881 17.0138 16.311 17.0581C16.134 17.1024 15.9569 17.1024 15.7798 17.0581C15.6027 17.0138 15.4478 16.9253 15.3149 16.7925L0.32373 1.80127C0.201986 1.67952 0.116211 1.53011 0.0664062 1.35303C0.0221354 1.17594 0.0221354 0.996094 0.0664062 0.813477C0.116211 0.630859 0.204753 0.473145 0.332031 0.340332C0.464844 0.20752 0.622559 0.118978 0.805176 0.074707C0.987793 0.0304362 1.16488 0.0304362 1.33643 0.074707C1.51351 0.118978 1.66846 0.204753 1.80127 0.332031L16.7842 15.3232Z" fill="#000"/></svg>',
23
+ 'eye-open': '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><path d="M288 80c-65.2 0-118.8 29.6-159.9 67.7C89.6 183.5 63 226 49.4 256c13.6 30 40.2 72.5 78.6 108.3C169.2 402.4 222.8 432 288 432s118.8-29.6 159.9-67.7C486.4 328.5 513 286 526.6 256c-13.6-30-40.2-72.5-78.6-108.3C406.8 109.6 353.2 80 288 80zM95.4 112.6C142.5 68.8 207.2 32 288 32s145.5 36.8 192.6 80.6c46.8 43.5 78.1 95.4 93 131.1c3.3 7.9 3.3 16.7 0 24.6c-14.9 35.7-46.2 87.7-93 131.1C433.5 443.2 368.8 480 288 480s-145.5-36.8-192.6-80.6C48.6 356 17.3 304 2.5 268.3c-3.3-7.9-3.3-16.7 0-24.6C17.3 208 48.6 156 95.4 112.6zM288 336c44.2 0 80-35.8 80-80s-35.8-80-80-80c-.7 0-1.3 0-2 0c1.3 5.1 2 10.5 2 16c0 35.3-28.7 64-64 64c-5.5 0-10.9-.7-16-2c0 .7 0 1.3 0 2c0 44.2 35.8 80 80 80zm0-208a128 128 0 1 1 0 256 128 128 0 1 1 0-256z"/></svg>',
24
+ 'eye-hide': '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><path d="M38.8 5.1C28.4-3.1 13.3-1.2 5.1 9.2S-1.2 34.7 9.2 42.9l592 464c10.4 8.2 25.5 6.3 33.7-4.1s6.3-25.5-4.1-33.7L525.6 386.7c39.6-40.6 66.4-86.1 79.9-118.4c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C465.5 68.8 400.8 32 320 32c-68.2 0-125 26.3-169.3 60.8L38.8 5.1zm151 118.3C226 97.7 269.5 80 320 80c65.2 0 118.8 29.6 159.9 67.7C518.4 183.5 545 226 558.6 256c-12.6 28-36.6 66.8-70.9 100.9l-53.8-42.2c9.1-17.6 14.2-37.5 14.2-58.7c0-70.7-57.3-128-128-128c-32.2 0-61.7 11.9-84.2 31.5l-46.1-36.1zM394.9 284.2l-81.5-63.9c4.2-8.5 6.6-18.2 6.6-28.3c0-5.5-.7-10.9-2-16c.7 0 1.3 0 2 0c44.2 0 80 35.8 80 80c0 9.9-1.8 19.4-5.1 28.2zm9.4 130.3C378.8 425.4 350.7 432 320 432c-65.2 0-118.8-29.6-159.9-67.7C121.6 328.5 95 286 81.4 256c8.3-18.4 21.5-41.5 39.4-64.8L83.1 161.5C60.3 191.2 44 220.8 34.5 243.7c-3.3 7.9-3.3 16.7 0 24.6c14.9 35.7 46.2 87.7 93 131.1C174.5 443.2 239.2 480 320 480c47.8 0 89.9-12.9 126.2-32.5l-41.9-33zM192 256c0 70.7 57.3 128 128 128c13.3 0 26.1-2 38.2-5.8L302 334c-23.5-5.4-43.1-21.2-53.7-42.3l-56.1-44.2c-.2 2.8-.3 5.6-.3 8.5z"/></svg>',
23
25
  };
24
26
 
25
27
  return svg[name] ?? '';
@@ -48,80 +50,6 @@ const dismissTrigger = (module, method = 'hide') => {
48
50
  })
49
51
  }
50
52
 
51
- /**
52
- * AJAX REQUEST
53
- * @type {{post: ajax.post, get: ajax.get, x: ((function(): (XMLHttpRequest))|*), send: ajax.send}}
54
- */
55
- const Ajax = {
56
- x: function () {
57
- if (typeof XMLHttpRequest !== 'undefined') {
58
- return new XMLHttpRequest();
59
- }
60
- let versions = [
61
- "MSXML2.XmlHttp.6.0",
62
- "MSXML2.XmlHttp.5.0",
63
- "MSXML2.XmlHttp.4.0",
64
- "MSXML2.XmlHttp.3.0",
65
- "MSXML2.XmlHttp.2.0",
66
- "Microsoft.XmlHttp"
67
- ];
68
-
69
- let xhr;
70
- for (let i = 0; i < versions.length; i++) {
71
- try {
72
- xhr = new ActiveXObject(versions[i]);
73
- break;
74
- } catch (e) {}
75
- }
76
-
77
- return xhr;
78
- },
79
-
80
- send: function (url, callback, method, data, async) {
81
- if (async === undefined) {
82
- async = true;
83
- }
84
- let x = Ajax.x();
85
- x.open(method, url, async);
86
- x.setRequestHeader("X-Requested-With", "XMLHttpRequest");
87
- x.onreadystatechange = function () {
88
- if (x.readyState === 4) {
89
- switch (x.status) {
90
- case 200:
91
- callback('success', {text: x.statusText, response: x.responseText, code: x.status})
92
- break;
93
- default:
94
- callback('error', {text: x.statusText, response: x.responseText, code: x.status})
95
- break;
96
- }
97
- }
98
- };
99
- x.send(data)
100
- },
101
-
102
- get: function (url, data, callback, async) {
103
- let query = [];
104
-
105
- if (!isEmptyObj(data)) {
106
- for (let key in data) {
107
- query.push(encodeURIComponent(key) + '=' + encodeURIComponent(data[key]));
108
- }
109
- }
110
-
111
- let uri = '';
112
- if (query.length) {
113
- uri += url.includes('?') ? '&' : '?';
114
- uri += query.join('&');
115
- }
116
-
117
- Ajax.send(url + uri, callback, 'GET', null, async)
118
- },
119
-
120
- post: function (url, data, callback, async) {
121
- Ajax.send(url, callback, 'POST', data, async)
122
- }
123
- };
124
-
125
53
  export {
126
- dismissTrigger, Ajax, getSVG
54
+ dismissTrigger, getSVG
127
55
  }
@@ -6,7 +6,6 @@ import Placement from "../../../utils/js/components/placement";
6
6
  import Overflow from "../../../utils/js/components/overflow";
7
7
  import Backdrop from "../../../utils/js/components/backdrop";
8
8
  import {dismissTrigger} from "../../module-fn";
9
- import VGSidebar from "../../vgsidebar";
10
9
 
11
10
  const NAME = 'dropdown';
12
11
  const NAME_KEY = 'vg.dropdown';
@@ -33,12 +32,11 @@ class VGDropdown extends BaseModule {
33
32
  super(element, params);
34
33
 
35
34
  let defaultParams = {
36
- offset: [0, 2],
37
35
  backdrop: false,
38
36
  overflow: false,
39
37
  keyboard: false,
40
- placement: 'bottom',
41
38
  timeoutAnimation: 10,
39
+ placement: 'auto',
42
40
  hover: false,
43
41
  ajax: {
44
42
  route: '',
@@ -49,30 +47,27 @@ class VGDropdown extends BaseModule {
49
47
  output: true,
50
48
  },
51
49
  animation: {
52
- fade: false,
50
+ fade: true,
53
51
  enable: false,
54
52
  in: 'animate__flipInY',
55
53
  out: 'animate__flipOutY',
56
- delay: 800,
54
+ delay: 300,
57
55
  },
58
- }
59
-
60
- if ('offset' in params && Array.isArray(params.offset)) {
61
- defaultParams.offset = params.offset;
62
- }
56
+ };
63
57
 
64
58
  this._params = this._getParams(element, mergeDeepObject(defaultParams, params));
65
59
 
66
60
  const target = Selectors.getElementFromSelector(this._element);
67
-
68
61
  this._parent = this._element.parentNode;
69
- this._drop = target || Selectors.find('.' + TARGET_CONTAINER, this._parent);
70
- this._isPlacement = false;
62
+ this._drop = target || Selectors.find(`.${TARGET_CONTAINER}`, this._parent);
63
+
64
+ if (!this._drop) return;
71
65
 
72
- this.isFade = this._params.animation.fade;
66
+ this._isPlacement = false;
67
+ this.isFade = this._params.animation.fade;
73
68
  this.isAnimation = this._params.animation.enable;
74
69
 
75
- this._params.animation.delay = !this.isAnimation ? 0 : this._params.animation.delay;
70
+ this._params.animation.delay = this.isAnimation ? this._params.animation.delay : 0;
76
71
  this._animation(this._drop, VGDropdown.NAME_KEY, this._params.animation);
77
72
  }
78
73
 
@@ -91,25 +86,22 @@ class VGDropdown extends BaseModule {
91
86
  show() {
92
87
  if (isDisabled(this._element) || this._isShown()) return;
93
88
 
94
- const relatedTarget = {
95
- relatedTarget: this._element
96
- }
89
+ const relatedTarget = { relatedTarget: this._element };
97
90
 
98
- const showEvent = EventHandler.trigger(this._drop, EVENT_KEY_SHOW, relatedTarget)
91
+ const showEvent = EventHandler.trigger(this._drop, EVENT_KEY_SHOW, relatedTarget);
99
92
  if (showEvent.defaultPrevented) return;
100
93
 
101
94
  if ('ontouchstart' in document.documentElement) {
102
- for (const element of [].concat(...document.body.children)) {
103
- EventHandler.on(element, 'mouseover', noop);
104
- }
95
+ [].concat(...document.body.children).forEach(el => {
96
+ EventHandler.on(el, 'mouseover', noop);
97
+ });
105
98
  }
106
99
 
107
- this._route();
108
-
109
- this._element.setAttribute('aria-expanded', true);
100
+ this._element.setAttribute('aria-expanded', 'true');
110
101
  this._element.classList.add(CLASS_NAME_SHOW);
111
102
  this._drop.classList.add(CLASS_NAME_SHOW);
112
103
  this._setPlacement();
104
+ this._route();
113
105
 
114
106
  if (this._params.backdrop && !this._params.hover) {
115
107
  Backdrop.show();
@@ -117,36 +109,28 @@ class VGDropdown extends BaseModule {
117
109
 
118
110
  if (this._params.overflow) {
119
111
  Overflow.append();
120
- document.body.classList.add('dropdown-open')
112
+ document.body.classList.add('dropdown-open');
121
113
  }
122
114
 
123
- const completeCallBack = () => {
115
+ const completeCallback = () => {
124
116
  if (this.isFade) {
125
117
  this._drop.classList.add(CLASS_NAME_FADE);
126
- } else if(!this.isAnimation) {
118
+ } else if (!this.isAnimation) {
127
119
  this._drop.classList.add(CLASS_NAME_OPEN);
128
120
  }
121
+ EventHandler.trigger(this._drop, EVENT_KEY_SHOWN, relatedTarget);
122
+ };
129
123
 
130
- EventHandler.trigger(this._drop, EVENT_KEY_SHOWN, relatedTarget)
131
- }
132
-
133
- this._queueCallback(completeCallBack, this._drop, this.isAnimation || this.isFade, 50);
124
+ this._queueCallback(completeCallback, this._drop, this.isAnimation || this.isFade, 50);
134
125
  }
135
126
 
136
127
  hide() {
137
- if (isDisabled(this._element) || !this._isShown()) {
138
- return;
139
- }
140
-
141
- const relatedTarget = {
142
- relatedTarget: this._element
143
- }
144
-
145
- this._completeHide(relatedTarget);
128
+ if (isDisabled(this._element) || !this._isShown()) return;
129
+ this._completeHide({ relatedTarget: this._element });
146
130
  }
147
131
 
148
132
  dispose() {
149
- return super.dispose();
133
+ super.dispose();
150
134
  }
151
135
 
152
136
  _isShown() {
@@ -154,30 +138,27 @@ class VGDropdown extends BaseModule {
154
138
  }
155
139
 
156
140
  _completeHide(relatedTarget) {
157
- const hideEvent = EventHandler.trigger(this._drop, EVENT_KEY_HIDE, relatedTarget)
158
- if (hideEvent.defaultPrevented) {
159
- return;
160
- }
141
+ const hideEvent = EventHandler.trigger(this._drop, EVENT_KEY_HIDE, relatedTarget);
142
+ if (hideEvent.defaultPrevented) return;
161
143
 
162
144
  if ('ontouchstart' in document.documentElement) {
163
- for (const element of [].concat(...document.body.children)) {
164
- EventHandler.off(element, 'mouseover', noop);
165
- }
145
+ [].concat(...document.body.children).forEach(el => {
146
+ EventHandler.off(el, 'mouseover', noop);
147
+ });
166
148
  }
167
149
 
150
+ this._element.classList.remove(CLASS_NAME_SHOW);
151
+ this._element.setAttribute('aria-expanded', 'false');
152
+
168
153
  if (this.isFade) {
169
154
  this._drop.classList.remove(CLASS_NAME_FADE);
170
- } else if(!this.isAnimation) {
155
+ } else if (!this.isAnimation) {
171
156
  this._drop.classList.remove(CLASS_NAME_OPEN);
172
157
  }
173
158
 
174
- this._element.classList.remove(CLASS_NAME_SHOW);
175
- this._element.setAttribute('aria-expanded', 'false');
176
-
177
159
  if (this._params.backdrop && !this._params.hover) {
178
- const _this = this;
179
- Backdrop.hide(function () {
180
- if (_this._params.overflow) {
160
+ Backdrop.hide(() => {
161
+ if (this._params.overflow) {
181
162
  Overflow.destroy();
182
163
  }
183
164
  });
@@ -192,29 +173,40 @@ class VGDropdown extends BaseModule {
192
173
  const completeCallback = () => {
193
174
  this._drop.classList.remove(CLASS_NAME_SHOW);
194
175
  EventHandler.trigger(this._drop, EVENT_KEY_HIDDEN, relatedTarget);
195
- }
176
+ };
196
177
  this._queueCallback(completeCallback, this._drop, this.isAnimation || this.isFade);
197
178
  }, this._params.animation.delay);
198
179
  }
199
180
 
200
- // TODO class Placement isn't done
201
181
  _setPlacement() {
202
- const _this = this;
203
-
204
- if (!_this._isPlacement) {
205
- const $placement = new Placement({
206
- drop: _this._drop
207
- })
182
+ if (!this._drop) return;
183
+
184
+ if (!this._isPlacement) {
185
+ let placementDefault = 'bottom-start',
186
+ autoFlip = false,
187
+ overflowProtection = false;
188
+
189
+ if (this._params.placement === 'auto') {
190
+ autoFlip = true;
191
+ overflowProtection = true;
192
+ } else {
193
+ placementDefault = this._params.placement
194
+ }
208
195
 
209
- $placement._setPlacement();
210
- }
196
+ const placement = new Placement({
197
+ reference: this._element,
198
+ drop: this._drop,
199
+ placement: placementDefault,
200
+ boundary: 'clippingParents',
201
+ autoFlip: autoFlip,
202
+ overflowProtection: overflowProtection,
203
+ fallbackPlacements: ['top-start', 'bottom-end', 'top-end'],
204
+ });
211
205
 
212
- if (_this._params.offset) {
213
- _this._drop.style.paddingTop = _this._params.offset[1] + 'px';
214
- _this._drop.style.paddingRight = _this._params.offset[0] + 'px';
206
+ placement._setPlacement(); // позиционируем
215
207
  }
216
208
 
217
- _this._isPlacement = true;
209
+ this._isPlacement = true;
218
210
  }
219
211
 
220
212
  static init(element, params = {}) {
@@ -223,109 +215,103 @@ class VGDropdown extends BaseModule {
223
215
  if (instance._params.hover && !instance.isMobileDevice()) {
224
216
  let currentElem = null;
225
217
 
226
- EventHandler.on(instance._parent, EVENT_MOUSEOVER_DATA_API, function (event) {
218
+ EventHandler.on(instance._parent, EVENT_MOUSEOVER_DATA_API, (event) => {
227
219
  if (currentElem) return;
220
+
228
221
  VGDropdown.hideOpenToggles(event);
229
222
 
230
- let target = event.target.closest('.' + PARENT_CONTAINER);
231
- if (!target) return;
223
+ const target = event.target.closest(`.${PARENT_CONTAINER}`);
224
+ if (!target || !instance._parent.contains(target)) return;
232
225
 
233
- if (!instance._parent.contains(target)) return;
234
226
  currentElem = target;
235
227
  instance.show();
236
228
  });
237
229
 
238
- EventHandler.on(instance._parent, EVENT_MOUSEOUT_DATA_API, function (event) {
230
+ EventHandler.on(instance._parent, EVENT_MOUSEOUT_DATA_API, (event) => {
239
231
  if (!currentElem) return;
240
232
 
241
233
  let relatedTarget = event.relatedTarget;
242
-
243
- while (relatedTarget) {
244
- if (relatedTarget === currentElem) return;
234
+ while (relatedTarget && relatedTarget !== currentElem) {
245
235
  relatedTarget = relatedTarget.parentNode;
246
236
  }
247
237
 
238
+ if (relatedTarget === currentElem) return;
239
+
248
240
  currentElem = null;
249
- instance._completeHide({relatedTarget: instance._element});
250
- })
241
+ instance._completeHide({ relatedTarget: instance._element });
242
+ });
251
243
  }
252
244
 
245
+ // Клавиатурные события
253
246
  EventHandler.on(document, EVENT_KEYUP_DATA_API, SELECTOR_DATA_TOGGLE, VGDropdown.keydownHandler);
254
- EventHandler.on(document, EVENT_KEYDOWN_DATA_API, '.' + TARGET_CONTAINER, VGDropdown.keydownHandler);
247
+ EventHandler.on(document, EVENT_KEYDOWN_DATA_API, `.${TARGET_CONTAINER}`, VGDropdown.keydownHandler);
255
248
  EventHandler.on(document, EVENT_KEYUP_DATA_API, VGDropdown.clearDrops);
256
249
  EventHandler.on(document, EVENT_CLICK_DATA_API, VGDropdown.clearDrops);
257
- EventHandler.on(element, EVENT_CLICK_DATA_API, function (event) {
250
+
251
+ // Клик по тоглу
252
+ EventHandler.on(element, EVENT_CLICK_DATA_API, (event) => {
258
253
  event.preventDefault();
259
254
  instance.toggle();
260
255
  });
261
256
  }
262
257
 
263
258
  static hideOpenToggles(event) {
264
- const openToggles = Selectors.findAll('[data-vg-toggle="dropdown"]:not(.disabled):not(:disabled).show');
259
+ const openToggles = Selectors.findAll(`${SELECTOR_DATA_TOGGLE}:not(.disabled):not(:disabled).${CLASS_NAME_SHOW}`);
265
260
  for (const toggle of openToggles) {
266
261
  const context = VGDropdown.getInstance(toggle);
267
- if (!context) {
268
- continue;
269
- }
262
+ if (!context) continue;
270
263
 
271
- if (event.target.closest('.' + TARGET_CONTAINER) === context._drop) {
264
+ if (event.target.closest(`.${TARGET_CONTAINER}`) === context._drop) {
272
265
  return;
273
266
  }
274
267
 
275
- const composedPath = event.composedPath();
268
+ const composedPath = event.composedPath?.() || [];
276
269
  if (composedPath.includes(context._element)) {
277
- continue
270
+ continue;
278
271
  }
279
272
 
280
- const relatedTarget = { relatedTarget: context._element }
281
-
273
+ const relatedTarget = { relatedTarget: context._element };
282
274
  if (event.type === 'click') {
283
- relatedTarget.clickEvent = event
275
+ relatedTarget.clickEvent = event;
284
276
  }
285
277
 
286
- context._completeHide(relatedTarget)
278
+ context._completeHide(relatedTarget);
287
279
  }
288
280
  }
289
281
 
290
282
  static keydownHandler(event) {
291
- const isInput = /input|textarea/i.test(event.target.tagName)
292
- const isEscapeEvent = event.key === 'Escape'
293
- const isUpOrDownEvent = ['ArrowUp', 'ArrowDown'].includes(event.key)
283
+ const isInput = /input|textarea/i.test(event.target.tagName);
284
+ const isEscapeEvent = event.key === 'Escape';
285
+ const isUpOrDownEvent = ['ArrowUp', 'ArrowDown'].includes(event.key);
294
286
 
295
- if (!isUpOrDownEvent && !isEscapeEvent) {
296
- return
297
- }
287
+ if (!isUpOrDownEvent && !isEscapeEvent) return;
288
+ if (isInput && !isEscapeEvent) return;
298
289
 
299
- if (isInput && !isEscapeEvent) {
300
- return
301
- }
290
+ event.preventDefault();
302
291
 
303
- event.preventDefault()
292
+ const toggle = this.matches(SELECTOR_DATA_TOGGLE)
293
+ ? this
294
+ : Selectors.find(SELECTOR_DATA_TOGGLE, event.delegateTarget?.parentNode);
304
295
 
305
- const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE) ?
306
- this : (Selectors.find(SELECTOR_DATA_TOGGLE, event.delegateTarget.parentNode))
296
+ if (!toggle) return;
307
297
 
308
- const instance = VGDropdown.getOrCreateInstance(getToggleButton)
298
+ const instance = VGDropdown.getOrCreateInstance(toggle);
309
299
 
310
300
  if (isUpOrDownEvent) {
311
- event.stopPropagation()
312
- instance.show()
313
- return
314
- }
315
-
316
- if (instance._isShown()) {
317
- event.stopPropagation()
318
- instance.hide()
319
- getToggleButton.focus()
301
+ event.stopPropagation();
302
+ instance.show();
303
+ } else if (instance._isShown()) {
304
+ event.stopPropagation();
305
+ instance.hide();
306
+ toggle.focus();
320
307
  }
321
308
  }
322
309
 
323
310
  static clearDrops(event) {
324
311
  if (event.button === 2 || (event.type === 'keyup' && event.key !== 'Tab')) {
325
- return
312
+ return;
326
313
  }
327
-
328
- VGDropdown.hideOpenToggles(event)
314
+ VGDropdown.hideOpenToggles(event);
329
315
  }
330
316
  }
331
317