vgapp 1.3.0 → 1.3.2

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.
Files changed (89) hide show
  1. package/README.md +133 -133
  2. package/app/langs/en/buttons.json +17 -17
  3. package/app/langs/en/messages.json +36 -36
  4. package/app/langs/ru/buttons.json +17 -17
  5. package/app/langs/ru/messages.json +36 -36
  6. package/app/modules/base-module.js +111 -111
  7. package/app/modules/vgalert/js/vgalert.js +52 -29
  8. package/app/modules/vgalert/readme.md +105 -105
  9. package/app/modules/vgdynamictable/index.js +5 -5
  10. package/app/modules/vgdynamictable/js/editable.js +19 -19
  11. package/app/modules/vgdynamictable/js/filters.js +21 -21
  12. package/app/modules/vgdynamictable/js/fixed.js +179 -179
  13. package/app/modules/vgdynamictable/js/pagination.js +1 -1
  14. package/app/modules/vgdynamictable/js/search.js +12 -12
  15. package/app/modules/vgdynamictable/js/sortable.js +71 -71
  16. package/app/modules/vgdynamictable/js/summary-footer.js +28 -28
  17. package/app/modules/vgdynamictable/js/table-remote.js +79 -79
  18. package/app/modules/vgdynamictable/js/table-url-state.js +31 -31
  19. package/app/modules/vgdynamictable/js/utils/common.js +48 -48
  20. package/app/modules/vgdynamictable/js/vgdynamictable.js +268 -268
  21. package/app/modules/vgdynamictable/readme.md +250 -250
  22. package/app/modules/vgdynamictable/scss/_skeleton.scss +6 -6
  23. package/app/modules/vgdynamictable/scss/_sortable.scss +24 -24
  24. package/app/modules/vgdynamictable/scss/_table.scss +4 -4
  25. package/app/modules/vgdynamictable/scss/_variables.scss +79 -79
  26. package/app/modules/vgdynamictable/scss/vgdynamictable.scss +27 -27
  27. package/app/modules/vgfilepreview/js/i18n.js +56 -56
  28. package/app/modules/vgfilepreview/js/renderers/image-modal.js +145 -145
  29. package/app/modules/vgfilepreview/js/renderers/image.js +92 -92
  30. package/app/modules/vgfilepreview/js/renderers/index.js +19 -19
  31. package/app/modules/vgfilepreview/js/renderers/office-modal.js +168 -168
  32. package/app/modules/vgfilepreview/js/renderers/office.js +79 -79
  33. package/app/modules/vgfilepreview/js/renderers/pdf-modal.js +260 -260
  34. package/app/modules/vgfilepreview/js/renderers/pdf.js +76 -76
  35. package/app/modules/vgfilepreview/js/renderers/playlist.js +71 -71
  36. package/app/modules/vgfilepreview/js/renderers/text-modal.js +343 -343
  37. package/app/modules/vgfilepreview/js/renderers/text.js +83 -83
  38. package/app/modules/vgfilepreview/js/renderers/video-modal.js +272 -272
  39. package/app/modules/vgfilepreview/js/renderers/video.js +80 -80
  40. package/app/modules/vgfilepreview/js/renderers/zip-modal.js +522 -522
  41. package/app/modules/vgfilepreview/js/renderers/zip.js +89 -89
  42. package/app/modules/vgfilepreview/js/vgfilepreview.js +7 -7
  43. package/app/modules/vgfilepreview/readme.md +68 -68
  44. package/app/modules/vgfilepreview/scss/_variables.scss +113 -113
  45. package/app/modules/vgfilepreview/scss/vgfilepreview.scss +464 -464
  46. package/app/modules/vgfiles/js/base.js +26 -26
  47. package/app/modules/vgfiles/js/droppable.js +260 -260
  48. package/app/modules/vgfiles/js/render.js +153 -153
  49. package/app/modules/vgfiles/js/vgfiles.js +104 -104
  50. package/app/modules/vgfiles/readme.md +123 -123
  51. package/app/modules/vgfiles/scss/_variables.scss +18 -18
  52. package/app/modules/vgfiles/scss/vgfiles.scss +148 -148
  53. package/app/modules/vgformsender/js/hideshowpass.js +16 -16
  54. package/app/modules/vgformsender/scss/vgformsender.scss +34 -34
  55. package/app/modules/vgmodal/js/vgmodal.drag.js +332 -332
  56. package/app/modules/vgmodal/js/vgmodal.js +188 -188
  57. package/app/modules/vgmodal/js/vgmodal.resize.js +27 -27
  58. package/app/modules/vgmodal/scss/vgmodal.scss +14 -14
  59. package/app/modules/vgnav/js/vgnav.js +135 -135
  60. package/app/modules/vgnav/readme.md +67 -67
  61. package/app/modules/vgnestable/README.md +307 -307
  62. package/app/modules/vgnestable/scss/_variables.scss +60 -60
  63. package/app/modules/vgnestable/scss/vgnestable.scss +163 -163
  64. package/app/modules/vgrangeslider/js/skins.js +222 -222
  65. package/app/modules/vgrangeslider/js/vgrangeslider.js +704 -704
  66. package/app/modules/vgrangeslider/readme.md +523 -523
  67. package/app/modules/vgrangeslider/scss/_variables.scss +53 -53
  68. package/app/modules/vgrangeslider/scss/vgrangeslider.scss +240 -240
  69. package/app/modules/vgselect/js/vgselect.js +39 -39
  70. package/app/modules/vgselect/scss/vgselect.scss +22 -22
  71. package/app/modules/vgspy/readme.md +28 -28
  72. package/app/modules/vgtoast/readme.md +18 -18
  73. package/app/modules/vgtoast/scss/vgtoast.scss +48 -48
  74. package/app/modules/vgtooltip/js/vgtooltip.js +89 -89
  75. package/app/modules/vgtooltip/readme.md +181 -181
  76. package/app/utils/js/components/ajax.js +117 -117
  77. package/app/utils/js/components/audio-metadata.js +240 -240
  78. package/app/utils/js/components/backdrop.js +17 -17
  79. package/app/utils/js/components/file-icon.js +109 -109
  80. package/app/utils/js/components/file-preview.js +304 -304
  81. package/app/utils/js/components/sanitize.js +150 -150
  82. package/app/utils/js/components/video-metadata.js +140 -140
  83. package/app/vgapp.js +130 -107
  84. package/build/vgapp.css +1 -1
  85. package/build/vgapp.css.map +1 -1
  86. package/build/vgapp.js +1 -1
  87. package/build/vgapp.js.map +1 -1
  88. package/index.js +14 -14
  89. package/package.json +1 -1
@@ -15,8 +15,8 @@ import Animation from "../utils/js/components/animation";
15
15
  import Ajax from "../utils/js/components/ajax";
16
16
  import Html from "../utils/js/components/templater";
17
17
 
18
- class BaseModule {
19
- constructor(element) {
18
+ class BaseModule {
19
+ constructor(element) {
20
20
  if (!element) return
21
21
 
22
22
  this._element = Selectors.find(element);
@@ -54,13 +54,13 @@ class BaseModule {
54
54
  * - timeout = задержка перед отправкой, по умолчанию 0
55
55
  * @param callback
56
56
  */
57
- _route(callback) {
58
- if (typeof callback !== 'function') {
59
- return this._requestRoute(callback);
60
- }
61
-
62
- let $content = null,
63
- timeout = this._params.ajax.timeout || 0;
57
+ _route(callback) {
58
+ if (typeof callback !== 'function') {
59
+ return this._requestRoute(callback);
60
+ }
61
+
62
+ let $content = null,
63
+ timeout = this._params.ajax.timeout || 0;
64
64
 
65
65
  if (this._isLoaded) return;
66
66
 
@@ -137,83 +137,83 @@ class BaseModule {
137
137
  if (this._params.ajax.method.toLowerCase() === 'delete') {
138
138
  ajax.delete(this._params.ajax.route, ajaxData);
139
139
  }
140
- }, timeout);
141
- }
142
-
143
- _requestRoute(options = {}) {
144
- const config = this._normalizeRouteRequestOptions(options);
145
- return Ajax.requestRoute(config);
146
- }
147
-
148
- _buildRouteUrl(params = {}, endpoint = '', options = {}) {
149
- const config = this._normalizeRouteRequestOptions(Object.assign({}, options, {
150
- params,
151
- route: endpoint || options.route || '',
152
- }));
153
- return Ajax.buildRouteUrl(config.route, {
154
- params: config.params,
155
- baseParams: config.baseParams,
156
- });
157
- }
158
-
159
- _normalizeRouteRequestOptions(options = {}) {
160
- const requestOptions = this._params && isObject(this._params.request)
161
- ? this._params.request
162
- : {};
163
- const ajaxOptions = this._params && isObject(this._params.ajax)
164
- ? this._params.ajax
165
- : {};
166
- const source = isObject(options) ? options : {};
167
- const route = String(
168
- source.route
169
- || source.endpoint
170
- || requestOptions.route
171
- || ajaxOptions.route
172
- || ''
173
- ).trim();
174
- const method = String(
175
- source.method
176
- || requestOptions.method
177
- || ajaxOptions.method
178
- || 'GET'
179
- ).toUpperCase().trim() || 'GET';
180
- const credentials = String(
181
- source.credentials
182
- || requestOptions.credentials
183
- || 'same-origin'
184
- ).trim() || 'same-origin';
185
- const headers = mergeDeepObject(
186
- {
187
- 'Accept': 'application/json',
188
- 'X-Requested-With': 'XMLHttpRequest',
189
- },
190
- isObject(requestOptions.headers) ? requestOptions.headers : {},
191
- isObject(source.headers) ? source.headers : {}
192
- );
193
- const baseParams = mergeDeepObject(
194
- {},
195
- isObject(requestOptions.params) ? requestOptions.params : {},
196
- isObject(source.baseParams) ? source.baseParams : {},
197
- isObject(source.paramsBase) ? source.paramsBase : {}
198
- );
199
- const params = isObject(source.params) ? source.params : {};
200
- const body = source.body !== undefined
201
- ? source.body
202
- : (source.data !== undefined ? source.data : null);
203
- return {
204
- route,
205
- method,
206
- credentials,
207
- headers,
208
- baseParams,
209
- params,
210
- body,
211
- signal: source.signal || null,
212
- responseType: String(source.responseType || source.parse || 'auto').toLowerCase().trim() || 'auto',
213
- };
214
- }
215
-
216
- _dismissElement() {
140
+ }, timeout);
141
+ }
142
+
143
+ _requestRoute(options = {}) {
144
+ const config = this._normalizeRouteRequestOptions(options);
145
+ return Ajax.requestRoute(config);
146
+ }
147
+
148
+ _buildRouteUrl(params = {}, endpoint = '', options = {}) {
149
+ const config = this._normalizeRouteRequestOptions(Object.assign({}, options, {
150
+ params,
151
+ route: endpoint || options.route || '',
152
+ }));
153
+ return Ajax.buildRouteUrl(config.route, {
154
+ params: config.params,
155
+ baseParams: config.baseParams,
156
+ });
157
+ }
158
+
159
+ _normalizeRouteRequestOptions(options = {}) {
160
+ const requestOptions = this._params && isObject(this._params.request)
161
+ ? this._params.request
162
+ : {};
163
+ const ajaxOptions = this._params && isObject(this._params.ajax)
164
+ ? this._params.ajax
165
+ : {};
166
+ const source = isObject(options) ? options : {};
167
+ const route = String(
168
+ source.route
169
+ || source.endpoint
170
+ || requestOptions.route
171
+ || ajaxOptions.route
172
+ || ''
173
+ ).trim();
174
+ const method = String(
175
+ source.method
176
+ || requestOptions.method
177
+ || ajaxOptions.method
178
+ || 'GET'
179
+ ).toUpperCase().trim() || 'GET';
180
+ const credentials = String(
181
+ source.credentials
182
+ || requestOptions.credentials
183
+ || 'same-origin'
184
+ ).trim() || 'same-origin';
185
+ const headers = mergeDeepObject(
186
+ {
187
+ 'Accept': 'application/json',
188
+ 'X-Requested-With': 'XMLHttpRequest',
189
+ },
190
+ isObject(requestOptions.headers) ? requestOptions.headers : {},
191
+ isObject(source.headers) ? source.headers : {}
192
+ );
193
+ const baseParams = mergeDeepObject(
194
+ {},
195
+ isObject(requestOptions.params) ? requestOptions.params : {},
196
+ isObject(source.baseParams) ? source.baseParams : {},
197
+ isObject(source.paramsBase) ? source.paramsBase : {}
198
+ );
199
+ const params = isObject(source.params) ? source.params : {};
200
+ const body = source.body !== undefined
201
+ ? source.body
202
+ : (source.data !== undefined ? source.data : null);
203
+ return {
204
+ route,
205
+ method,
206
+ credentials,
207
+ headers,
208
+ baseParams,
209
+ params,
210
+ body,
211
+ signal: source.signal || null,
212
+ responseType: String(source.responseType || source.parse || 'auto').toLowerCase().trim() || 'auto',
213
+ };
214
+ }
215
+
216
+ _dismissElement() {
217
217
  let cross = getSVG('cross'),
218
218
  button = this._element.querySelector('.vg-btn-close');
219
219
 
@@ -235,34 +235,34 @@ class BaseModule {
235
235
  return Data.get(Selectors.find(element), this.NAME_KEY)
236
236
  }
237
237
 
238
- static getOrCreateInstance(element, params = {}) {
239
- return this.getInstance(element) || new this(element, !isEmptyObj(params) ? params : {})
240
- }
241
-
242
- static boot(params = {}) {
243
- if (typeof this.initAll === 'function') {
244
- return this.initAll(params);
245
- }
246
-
247
- if (typeof this.init !== 'function') {
248
- return null;
249
- }
250
-
251
- if (params && Object.prototype.hasOwnProperty.call(params, 'element')) {
252
- const { element, ...options } = params;
253
- return this.init(element, options);
254
- }
255
-
256
- return null;
257
- }
258
-
259
- static get DATA_KEY() {
260
- return `vg.${this.NAME}`
261
- }
238
+ static getOrCreateInstance(element, params = {}) {
239
+ return this.getInstance(element) || new this(element, !isEmptyObj(params) ? params : {})
240
+ }
241
+
242
+ static boot(params = {}) {
243
+ if (typeof this.initAll === 'function') {
244
+ return this.initAll(params);
245
+ }
246
+
247
+ if (typeof this.init !== 'function') {
248
+ return null;
249
+ }
250
+
251
+ if (params && Object.prototype.hasOwnProperty.call(params, 'element')) {
252
+ const { element, ...options } = params;
253
+ return this.init(element, options);
254
+ }
255
+
256
+ return null;
257
+ }
258
+
259
+ static get DATA_KEY() {
260
+ return `vg.${this.NAME}`
261
+ }
262
262
 
263
263
  static get EVENT_KEY() {
264
264
  return `.${this.DATA_KEY}`
265
265
  }
266
266
  }
267
267
 
268
- export default BaseModule;
268
+ export default BaseModule;
@@ -23,8 +23,8 @@ const NAME_KEY = "vg.alert";
23
23
  // Глобальная блокировка: предотвращаем открытие нескольких алертов
24
24
  let isAlertOpen = false;
25
25
 
26
- class VGAlert {
27
- constructor(params = {}, lang = 'ru') {
26
+ class VGAlert {
27
+ constructor(params = {}, lang = 'ru') {
28
28
  this.lang = lang;
29
29
  this._defaultParams = {
30
30
  render: {
@@ -90,10 +90,23 @@ class VGAlert {
90
90
  info: getSVG("info"),
91
91
  },
92
92
  };
93
- this._params = this._setParams(params);
94
- }
95
-
96
- static call(options = {}, lang = 'ru') {
93
+ this._params = this._setParams(params);
94
+ }
95
+
96
+ static get NAME() {
97
+ return NAME;
98
+ }
99
+
100
+ static get NAME_KEY() {
101
+ return NAME_KEY;
102
+ }
103
+
104
+ static boot() {
105
+ this._bindDataApi();
106
+ return null;
107
+ }
108
+
109
+ static call(options = {}, lang = 'ru') {
97
110
  const context = new VGAlert(options, lang);
98
111
 
99
112
  if (isAlertOpen) return Promise.reject({ accepted: false, reason: lang_messages(context.lang, NAME_KEY).reason });
@@ -205,7 +218,7 @@ class VGAlert {
205
218
  });
206
219
  }
207
220
 
208
- static confirm(elem, options = {}) {
221
+ static confirm(elem, options = {}) {
209
222
  let lang = 'ru';
210
223
 
211
224
  if ('lang' in options) {
@@ -215,9 +228,35 @@ class VGAlert {
215
228
  const context = new VGAlert(options, lang);
216
229
  if (context._params.mode !== "confirm") return;
217
230
 
218
- const instance = VGAlertConfirm.getOrCreateInstance(elem, context._params);
219
- instance.run(VGAlert);
220
- }
231
+ const instance = VGAlertConfirm.getOrCreateInstance(elem, context._params);
232
+ instance.run(VGAlert);
233
+ }
234
+
235
+ static _bindDataApi() {
236
+ if (this._isDataApiBound) {
237
+ return;
238
+ }
239
+
240
+ this._isDataApiBound = true;
241
+
242
+ EventHandler.on(document, EVENT_KEY_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
243
+ event.preventDefault();
244
+ const target = event.target;
245
+
246
+ if (!isVisible(target) || !isElement(target)) return;
247
+
248
+ VGAlert.confirm(target, {
249
+ buttons: {
250
+ agree: {
251
+ class: ["btn-primary"],
252
+ },
253
+ cancel: {
254
+ class: ["btn-outline-primary"],
255
+ },
256
+ },
257
+ });
258
+ });
259
+ }
221
260
 
222
261
  _setParams(params) {
223
262
  const merged = mergeDeepObject(this._defaultParams, params);
@@ -395,22 +434,6 @@ class VGAlertConfirm extends BaseModule {
395
434
  }
396
435
 
397
436
  // Делегирование кликов по data-атрибутам
398
- EventHandler.on(document, EVENT_KEY_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
399
- event.preventDefault();
400
- const target = event.target;
401
-
402
- if (!isVisible(target) || !isElement(target)) return;
403
-
404
- VGAlert.confirm(target, {
405
- buttons: {
406
- agree: {
407
- class: ["btn-primary"],
408
- },
409
- cancel: {
410
- class: ["btn-outline-primary"],
411
- },
412
- },
413
- });
414
- });
415
-
416
- export default VGAlert;
437
+ VGAlert._isDataApiBound = false;
438
+
439
+ export default VGAlert;
@@ -11,12 +11,12 @@
11
11
  - Полная **локализация** (настройка языка)
12
12
  - Гибкая **настройка кнопок** и сообщений
13
13
  - Поддержка **SVG-иконок** и тем стилей (`danger`, `warning`, `success`, `info`)
14
- - Работа как через **API**, так и через **`data`-атрибуты**
15
- - Интеграция с промисами (`Promise`)
16
- - Защита от **множественных одновременных вызовов**
17
- - Поддержка **клавиатурных сокращений** (Enter, Escape)
18
- - Два режима рендера: обычный **`modal`** и вложенный **`overlay`**
19
- - Возможность закрывать родительскую модалку/сайдбар через `render.dismiss`
14
+ - Работа как через **API**, так и через **`data`-атрибуты**
15
+ - Интеграция с промисами (`Promise`)
16
+ - Защита от **множественных одновременных вызовов**
17
+ - Поддержка **клавиатурных сокращений** (Enter, Escape)
18
+ - Два режима рендера: обычный **`modal`** и вложенный **`overlay`**
19
+ - Возможность закрывать родительскую модалку/сайдбар через `render.dismiss`
20
20
 
21
21
  ---
22
22
 
@@ -29,45 +29,45 @@ import VGAlert from "./app/modules/vgalert/js/vgalert.js";
29
29
 
30
30
  ---
31
31
 
32
- ## 🧩 Режимы работы
32
+ ## 🧩 Режимы работы
33
33
 
34
34
  ### 1. `confirm` — Подтверждение действия
35
35
  Показывает два действия: **Подтвердить** и **Отмена**.
36
36
 
37
- ### 2. `info` — Информационное сообщение
38
- Показывает только кнопку **ОК** (или "Продолжить").
39
-
40
- ---
41
-
42
- ## 🖼 Рендер (`render`)
43
-
44
- `VGAlert` поддерживает два варианта отображения:
45
-
46
- | Параметр | Значение | Описание |
47
- |--------|--------|----------|
48
- | `render.type` | `modal` | Обычный alert в отдельной модалке |
49
- | `render.type` | `overlay` | Alert-оверлей внутри текущей `.vg-modal` или `.vg-sidebar` |
50
- | `render.dismiss` | `true` / `false` | Для `overlay`: после закрытия alert дополнительно закрывает родительский контейнер |
51
-
52
- ### Пример: alert поверх открытой модалки
53
-
54
- ```js
55
- VGAlert.call({
56
- render: {
57
- type: "overlay",
58
- dismiss: true
59
- },
60
- relatedTarget: button,
61
- message: {
62
- title: "Удалить запись",
63
- description: "Действие будет выполнено в текущем окне."
64
- }
65
- });
66
- ```
67
-
68
- `relatedTarget` нужен для `overlay`, чтобы модуль нашёл ближайшую `.vg-modal` или `.vg-sidebar`, куда надо встроить alert.
69
-
70
- ---
37
+ ### 2. `info` — Информационное сообщение
38
+ Показывает только кнопку **ОК** (или "Продолжить").
39
+
40
+ ---
41
+
42
+ ## 🖼 Рендер (`render`)
43
+
44
+ `VGAlert` поддерживает два варианта отображения:
45
+
46
+ | Параметр | Значение | Описание |
47
+ |--------|--------|----------|
48
+ | `render.type` | `modal` | Обычный alert в отдельной модалке |
49
+ | `render.type` | `overlay` | Alert-оверлей внутри текущей `.vg-modal` или `.vg-sidebar` |
50
+ | `render.dismiss` | `true` / `false` | Для `overlay`: после закрытия alert дополнительно закрывает родительский контейнер |
51
+
52
+ ### Пример: alert поверх открытой модалки
53
+
54
+ ```js
55
+ VGAlert.call({
56
+ render: {
57
+ type: "overlay",
58
+ dismiss: true
59
+ },
60
+ relatedTarget: button,
61
+ message: {
62
+ title: "Удалить запись",
63
+ description: "Действие будет выполнено в текущем окне."
64
+ }
65
+ });
66
+ ```
67
+
68
+ `relatedTarget` нужен для `overlay`, чтобы модуль нашёл ближайшую `.vg-modal` или `.vg-sidebar`, куда надо встроить alert.
69
+
70
+ ---
71
71
 
72
72
  ## 🎨 Темы (`theme`)
73
73
  | Значение | Иконка | Назначение |
@@ -108,9 +108,9 @@ VGAlert.call({
108
108
  });
109
109
  ```
110
110
 
111
- ### Пример 2: Информационное сообщение
112
- ```js
113
- VGAlert.call({
111
+ ### Пример 2: Информационное сообщение
112
+ ```js
113
+ VGAlert.call({
114
114
  mode: "info",
115
115
  theme: "success",
116
116
  message: {
@@ -123,26 +123,26 @@ VGAlert.call({
123
123
  class: ["btn-success"]
124
124
  }
125
125
  }
126
- });
127
- ```
128
-
129
- ### Пример 3: Обработка результата через `Promise`
130
- ```js
131
- VGAlert.call({
132
- message: {
133
- title: "Подтвердите действие",
134
- description: "Продолжить?"
135
- }
136
- }).then((result) => {
137
- console.log(result.accepted); // true
138
- console.log(result.timestamp);
139
- }).catch((error) => {
140
- console.log(error.accepted); // false
141
- console.log(error.timestamp);
142
- });
143
- ```
144
-
145
- ---
126
+ });
127
+ ```
128
+
129
+ ### Пример 3: Обработка результата через `Promise`
130
+ ```js
131
+ VGAlert.call({
132
+ message: {
133
+ title: "Подтвердите действие",
134
+ description: "Продолжить?"
135
+ }
136
+ }).then((result) => {
137
+ console.log(result.accepted); // true
138
+ console.log(result.timestamp);
139
+ }).catch((error) => {
140
+ console.log(error.accepted); // false
141
+ console.log(error.timestamp);
142
+ });
143
+ ```
144
+
145
+ ---
146
146
 
147
147
  ## 🔌 Работа с AJAX
148
148
 
@@ -169,30 +169,30 @@ VGAlert.confirm(element, {
169
169
 
170
170
  ---
171
171
 
172
- ## 🔔 События
173
-
174
- Модуль генерирует события на элементе-триггере, у которого есть `[data-vg-toggle="alert"]`:
175
-
176
- | Событие | Описание |
177
- |--------|--------|
178
- | `vg.alert.accept` | Пользователь подтвердил действие |
172
+ ## 🔔 События
173
+
174
+ Модуль генерирует события на элементе-триггере, у которого есть `[data-vg-toggle="alert"]`:
175
+
176
+ | Событие | Описание |
177
+ |--------|--------|
178
+ | `vg.alert.accept` | Пользователь подтвердил действие |
179
179
  | `vg.alert.reject` | Пользователь отменил действие |
180
- | `vg.alert.finally` | Действие завершено (в любом случае) |
181
- | `vg.alert.loaded` | Получен ответ от сервера (если был AJAX) |
182
-
183
- ```js
184
- const buttons = document.querySelectorAll('[data-vg-toggle="alert"]');
185
-
186
- buttons.forEach((button) => {
187
- button.addEventListener('vg.alert.accept', function (e) {
188
- console.log('Подтверждено:', e.vgalert);
189
- });
190
- });
191
- ```
192
-
193
- Если нужен общий глобальный обработчик, событие можно слушать и на `document`, так как оно всплывает.
194
-
195
- ---
180
+ | `vg.alert.finally` | Действие завершено (в любом случае) |
181
+ | `vg.alert.loaded` | Получен ответ от сервера (если был AJAX) |
182
+
183
+ ```js
184
+ const buttons = document.querySelectorAll('[data-vg-toggle="alert"]');
185
+
186
+ buttons.forEach((button) => {
187
+ button.addEventListener('vg.alert.accept', function (e) {
188
+ console.log('Подтверждено:', e.vgalert);
189
+ });
190
+ });
191
+ ```
192
+
193
+ Если нужен общий глобальный обработчик, событие можно слушать и на `document`, так как оно всплывает.
194
+
195
+ ---
196
196
 
197
197
  ## ⌨️ Клавиатурные комбинации
198
198
 
@@ -203,16 +203,16 @@ buttons.forEach((button) => {
203
203
 
204
204
  ## 🛠️ Конфигурация по умолчанию
205
205
  ```js
206
- {
207
- mode: "confirm",
208
- theme: "danger",
209
- render: {
210
- type: "modal",
211
- dismiss: false
212
- },
213
- modal: {
214
- centered: false,
215
- backdrop: true,
206
+ {
207
+ mode: "confirm",
208
+ theme: "danger",
209
+ render: {
210
+ type: "modal",
211
+ dismiss: false
212
+ },
213
+ modal: {
214
+ centered: false,
215
+ backdrop: true,
216
216
  keyboard: true,
217
217
  dismiss: true
218
218
  },
@@ -249,13 +249,13 @@ VGAlert.call(params, 'en');
249
249
 
250
250
  ## 🧩 Кастомизация кнопок
251
251
 
252
- Поддерживает:
253
- - `tag: 'button' | 'a'`
254
- - `type` (для `<button>`)
255
- - `class` — массив CSS-классов
256
- - `attr` — любые дополнительные атрибуты
257
- - `element` — готовый HTML-код кнопки
258
- - `toggle` — служебный атрибут кнопки (`data-vg-alert-agree` / `data-vg-alert-cancel`), обычно задаётся модулем автоматически
252
+ Поддерживает:
253
+ - `tag: 'button' | 'a'`
254
+ - `type` (для `<button>`)
255
+ - `class` — массив CSS-классов
256
+ - `attr` — любые дополнительные атрибуты
257
+ - `element` — готовый HTML-код кнопки
258
+ - `toggle` — служебный атрибут кнопки (`data-vg-alert-agree` / `data-vg-alert-cancel`), обычно задаётся модулем автоматически
259
259
 
260
260
  ### Пример: кнопка-ссылка
261
261
  ```js
@@ -298,4 +298,4 @@ MIT — свободно используйте и модифицируйте.
298
298
  ---
299
299
 
300
300
  > 🚀 Автор: VEGAS STUDIO (vegas-dev.com)
301
- > 📍 Поддерживается в проектах VEGAS
301
+ > 📍 Поддерживается в проектах VEGAS
@@ -1,5 +1,5 @@
1
- import VGDynamicTable from "./js/vgdynamictable";
2
- import Editable from "./js/editable";
3
-
4
- export {Editable, VGDynamicTable};
5
- export default VGDynamicTable;
1
+ import VGDynamicTable from "./js/vgdynamictable";
2
+ import Editable from "./js/editable";
3
+
4
+ export {Editable, VGDynamicTable};
5
+ export default VGDynamicTable;