vgapp 1.3.3 → 1.3.5
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 +5 -12
- 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/base-module.js +111 -111
- package/app/modules/vgalert/js/vgalert.js +52 -52
- package/app/modules/vgalert/readme.md +105 -105
- package/app/modules/vgdynamictable/index.js +5 -5
- package/app/modules/vgdynamictable/js/editable.js +19 -19
- package/app/modules/vgdynamictable/js/filters.js +21 -21
- package/app/modules/vgdynamictable/js/fixed.js +179 -179
- package/app/modules/vgdynamictable/js/pagination.js +1 -1
- package/app/modules/vgdynamictable/js/search.js +12 -12
- 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-remote.js +79 -79
- 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 +268 -268
- package/app/modules/vgdynamictable/readme.md +250 -250
- package/app/modules/vgdynamictable/scss/_skeleton.scss +6 -6
- package/app/modules/vgdynamictable/scss/_sortable.scss +24 -24
- package/app/modules/vgdynamictable/scss/_table.scss +4 -4
- package/app/modules/vgdynamictable/scss/_variables.scss +79 -79
- package/app/modules/vgdynamictable/scss/vgdynamictable.scss +27 -27
- 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 +113 -113
- package/app/modules/vgfilepreview/scss/vgfilepreview.scss +464 -464
- package/app/modules/vgfiles/js/base.js +26 -26
- package/app/modules/vgfiles/js/droppable.js +260 -260
- 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/_variables.scss +18 -18
- package/app/modules/vgfiles/scss/vgfiles.scss +148 -148
- package/app/modules/vgformsender/js/hideshowpass.js +16 -16
- package/app/modules/vgformsender/scss/vgformsender.scss +34 -34
- package/app/modules/vgmodal/js/vgmodal.drag.js +332 -332
- package/app/modules/vgmodal/js/vgmodal.js +188 -188
- package/app/modules/vgmodal/js/vgmodal.resize.js +27 -27
- package/app/modules/vgmodal/scss/vgmodal.scss +14 -14
- package/app/modules/vgnav/js/vgnav.js +135 -135
- package/app/modules/vgnav/readme.md +67 -67
- package/app/modules/vgnestable/README.md +307 -307
- package/app/modules/vgnestable/scss/_variables.scss +60 -60
- package/app/modules/vgnestable/scss/vgnestable.scss +163 -163
- package/app/modules/vgrangeslider/js/skins.js +222 -222
- package/app/modules/vgrangeslider/js/vgrangeslider.js +704 -704
- package/app/modules/vgrangeslider/readme.md +523 -523
- package/app/modules/vgrangeslider/scss/_variables.scss +53 -53
- package/app/modules/vgrangeslider/scss/vgrangeslider.scss +240 -240
- package/app/modules/vgselect/js/vgselect.js +39 -39
- package/app/modules/vgselect/scss/vgselect.scss +22 -22
- package/app/modules/vgspy/readme.md +28 -28
- package/app/modules/vgtoast/readme.md +18 -18
- package/app/modules/vgtoast/scss/vgtoast.scss +48 -48
- package/app/modules/vgtooltip/js/vgtooltip.js +89 -89
- package/app/modules/vgtooltip/readme.md +181 -181
- package/app/utils/js/components/ajax.js +117 -117
- package/app/utils/js/components/audio-metadata.js +240 -240
- package/app/utils/js/components/backdrop.js +17 -17
- 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/vgapp.js +21 -21
- 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.js +14 -14
- package/package.json +3 -2
|
@@ -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,23 +90,23 @@ class VGAlert {
|
|
|
90
90
|
info: getSVG("info"),
|
|
91
91
|
},
|
|
92
92
|
};
|
|
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') {
|
|
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') {
|
|
110
110
|
const context = new VGAlert(options, lang);
|
|
111
111
|
|
|
112
112
|
if (isAlertOpen) return Promise.reject({ accepted: false, reason: lang_messages(context.lang, NAME_KEY).reason });
|
|
@@ -218,7 +218,7 @@ class VGAlert {
|
|
|
218
218
|
});
|
|
219
219
|
}
|
|
220
220
|
|
|
221
|
-
static confirm(elem, options = {}) {
|
|
221
|
+
static confirm(elem, options = {}) {
|
|
222
222
|
let lang = 'ru';
|
|
223
223
|
|
|
224
224
|
if ('lang' in options) {
|
|
@@ -228,35 +228,35 @@ class VGAlert {
|
|
|
228
228
|
const context = new VGAlert(options, lang);
|
|
229
229
|
if (context._params.mode !== "confirm") return;
|
|
230
230
|
|
|
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
|
-
}
|
|
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
|
+
}
|
|
260
260
|
|
|
261
261
|
_setParams(params) {
|
|
262
262
|
const merged = mergeDeepObject(this._defaultParams, params);
|
|
@@ -434,6 +434,6 @@ class VGAlertConfirm extends BaseModule {
|
|
|
434
434
|
}
|
|
435
435
|
|
|
436
436
|
// Делегирование кликов по data-атрибутам
|
|
437
|
-
VGAlert._isDataApiBound = false;
|
|
438
|
-
|
|
439
|
-
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;
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import EventHandler from "../../../utils/js/dom/event";
|
|
2
|
-
import Data from "../../../utils/js/dom/data";
|
|
3
|
-
|
|
4
|
-
const TABLE_SELECTOR = '[data-vg-table]';
|
|
5
|
-
const ROW_SELECTOR = 'tbody tr:not([data-group-header="1"])';
|
|
6
|
-
const ROW_CHECK_SELECTOR = '[data-row-select]';
|
|
7
|
-
const CHECK_ALL_SELECTOR = '[data-select-all]';
|
|
8
|
-
const DEFAULT_ROW_REORDER_HANDLE_SELECTOR = '[data-row-reorder-handle]';
|
|
9
|
-
const ROW_REORDER_IGNORE_SELECTOR = 'input, button, a, select, textarea, [contenteditable="true"]';
|
|
10
|
-
const TABLE_DATA_KEY = 'vg.dynamicTable';
|
|
1
|
+
import EventHandler from "../../../utils/js/dom/event";
|
|
2
|
+
import Data from "../../../utils/js/dom/data";
|
|
3
|
+
|
|
4
|
+
const TABLE_SELECTOR = '[data-vg-table]';
|
|
5
|
+
const ROW_SELECTOR = 'tbody tr:not([data-group-header="1"])';
|
|
6
|
+
const ROW_CHECK_SELECTOR = '[data-row-select]';
|
|
7
|
+
const CHECK_ALL_SELECTOR = '[data-select-all]';
|
|
8
|
+
const DEFAULT_ROW_REORDER_HANDLE_SELECTOR = '[data-row-reorder-handle]';
|
|
9
|
+
const ROW_REORDER_IGNORE_SELECTOR = 'input, button, a, select, textarea, [contenteditable="true"]';
|
|
10
|
+
const TABLE_DATA_KEY = 'vg.dynamicTable';
|
|
11
11
|
const ACTION_CALLBACK_MAP = {
|
|
12
12
|
rowcheck: 'onRowCheck',
|
|
13
13
|
checkall: 'onCheckAll',
|
|
@@ -403,12 +403,12 @@ class Editable {
|
|
|
403
403
|
: {};
|
|
404
404
|
}
|
|
405
405
|
|
|
406
|
-
static _getTableInstance(table) {
|
|
407
|
-
if (!table) {
|
|
408
|
-
return null;
|
|
409
|
-
}
|
|
410
|
-
return Data.get(table, TABLE_DATA_KEY);
|
|
411
|
-
}
|
|
406
|
+
static _getTableInstance(table) {
|
|
407
|
+
if (!table) {
|
|
408
|
+
return null;
|
|
409
|
+
}
|
|
410
|
+
return Data.get(table, TABLE_DATA_KEY);
|
|
411
|
+
}
|
|
412
412
|
|
|
413
413
|
static _getEventPrefix(table) {
|
|
414
414
|
const instance = this._getTableInstance(table);
|
|
@@ -431,8 +431,8 @@ class Editable {
|
|
|
431
431
|
}
|
|
432
432
|
}
|
|
433
433
|
|
|
434
|
-
EventHandler.on(document, 'DOMContentLoaded', () => {
|
|
435
|
-
Editable.initAll();
|
|
436
|
-
});
|
|
434
|
+
EventHandler.on(document, 'DOMContentLoaded', () => {
|
|
435
|
+
Editable.initAll();
|
|
436
|
+
});
|
|
437
437
|
|
|
438
438
|
export default Editable;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {normalizeNonNegativeInt, safeQuerySelector} from "./utils/common";
|
|
2
|
-
|
|
3
|
-
class Filters {
|
|
1
|
+
import {normalizeNonNegativeInt, safeQuerySelector} from "./utils/common";
|
|
2
|
+
|
|
3
|
+
class Filters {
|
|
4
4
|
constructor(options = {}) {
|
|
5
5
|
this._options = Object.assign({
|
|
6
6
|
enabled: true,
|
|
@@ -19,12 +19,12 @@ class Filters {
|
|
|
19
19
|
operatorAttr: 'data-filter-operator',
|
|
20
20
|
defaultOperator: 'eq',
|
|
21
21
|
skipEmpty: true,
|
|
22
|
-
trimValues: true,
|
|
23
|
-
emitOnInit: false,
|
|
24
|
-
initialValues: {},
|
|
25
|
-
onChange: null,
|
|
26
|
-
onReset: null,
|
|
27
|
-
}, options);
|
|
22
|
+
trimValues: true,
|
|
23
|
+
emitOnInit: false,
|
|
24
|
+
initialValues: {},
|
|
25
|
+
onChange: null,
|
|
26
|
+
onReset: null,
|
|
27
|
+
}, options);
|
|
28
28
|
|
|
29
29
|
this._form = null;
|
|
30
30
|
this._timer = null;
|
|
@@ -119,7 +119,7 @@ class Filters {
|
|
|
119
119
|
if (!selector) {
|
|
120
120
|
return null;
|
|
121
121
|
}
|
|
122
|
-
return safeQuerySelector(selector);
|
|
122
|
+
return safeQuerySelector(selector);
|
|
123
123
|
}
|
|
124
124
|
|
|
125
125
|
_handleInput(event) {
|
|
@@ -134,8 +134,8 @@ class Filters {
|
|
|
134
134
|
this._emit();
|
|
135
135
|
return;
|
|
136
136
|
}
|
|
137
|
-
clearTimeout(this._timer);
|
|
138
|
-
this._timer = setTimeout(() => this._emit(), normalizeNonNegativeInt(this._options.debounceMs, 300));
|
|
137
|
+
clearTimeout(this._timer);
|
|
138
|
+
this._timer = setTimeout(() => this._emit(), normalizeNonNegativeInt(this._options.debounceMs, 300));
|
|
139
139
|
}
|
|
140
140
|
|
|
141
141
|
_handleChange(event) {
|
|
@@ -169,14 +169,14 @@ class Filters {
|
|
|
169
169
|
if (!resetButton) {
|
|
170
170
|
return;
|
|
171
171
|
}
|
|
172
|
-
event.preventDefault();
|
|
173
|
-
this._reset();
|
|
174
|
-
if (typeof this._options.onReset === 'function') {
|
|
175
|
-
this._options.onReset();
|
|
176
|
-
}
|
|
177
|
-
clearTimeout(this._timer);
|
|
178
|
-
this._emit();
|
|
179
|
-
}
|
|
172
|
+
event.preventDefault();
|
|
173
|
+
this._reset();
|
|
174
|
+
if (typeof this._options.onReset === 'function') {
|
|
175
|
+
this._options.onReset();
|
|
176
|
+
}
|
|
177
|
+
clearTimeout(this._timer);
|
|
178
|
+
this._emit();
|
|
179
|
+
}
|
|
180
180
|
|
|
181
181
|
_handleSubmit(event) {
|
|
182
182
|
if (!this._isManualMode()) {
|
|
@@ -441,7 +441,7 @@ class Filters {
|
|
|
441
441
|
const tag = String(node.tagName || '').toUpperCase();
|
|
442
442
|
return tag === 'INPUT' || tag === 'SELECT' || tag === 'TEXTAREA';
|
|
443
443
|
}
|
|
444
|
-
_isManualMode() {
|
|
444
|
+
_isManualMode() {
|
|
445
445
|
const mode = String(this._options.applyMode || 'auto').toLowerCase().trim();
|
|
446
446
|
return mode === 'manual';
|
|
447
447
|
}
|