vgapp 0.7.3 → 0.7.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/CHANGELOG.md +45 -0
- package/app/modules/module-fn.js +7 -7
- package/app/modules/vgalert/index.js +3 -0
- package/app/modules/vgalert/js/!old/!vgalert.js +153 -0
- package/app/modules/vgalert/js/vgalert.js +337 -0
- package/app/modules/vgalert/scss/_variables.scss +1 -0
- package/app/modules/vgalert/scss/vgalert.scss +66 -0
- package/app/modules/vgformsender/js/vgformsender.js +73 -43
- package/app/modules/vgformsender/scss/_variables.scss +1 -1
- package/app/modules/vgformsender/scss/vgformsender.scss +53 -4
- package/app/modules/vgloadmore/js/vgloadmore.js +2 -2
- package/app/modules/vgrollup/js/vgrollup.js +1 -1
- package/app/modules/vgselect/js/vgselect.js +0 -1
- package/app/modules/vgspy/js/vgspy.js +0 -1
- package/app/utils/scss/animation.scss +11 -0
- package/app/utils/scss/default.scss +3 -141
- package/app/utils/scss/functions.scss +18 -0
- package/app/utils/scss/mixin.scss +12 -0
- package/app/utils/scss/variables.scss +19 -15
- package/build/vgapp.css +3 -1743
- package/build/vgapp.css.map +1 -1
- package/build/vgapp.js +2 -30
- package/index.js +1 -1
- package/package.json +1 -1
- package/app/utils/scss/animate.scss +0 -4081
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,51 @@
|
|
|
1
|
+
# VEGAS-APP 0.7.5 (Декабрь, 08, 2025)
|
|
2
|
+
* В модуль VGFORSENDER добавлен параметр `fields` для программного добавление новых полей в FormData,
|
|
3
|
+
если в значении объекта окажется массив или объект, то сформируется json строка
|
|
4
|
+
```
|
|
5
|
+
{
|
|
6
|
+
...
|
|
7
|
+
fields: [
|
|
8
|
+
{
|
|
9
|
+
name: Andranik,
|
|
10
|
+
surname: Gasparyan
|
|
11
|
+
},
|
|
12
|
+
...
|
|
13
|
+
{
|
|
14
|
+
json: [{key: value}]
|
|
15
|
+
}
|
|
16
|
+
]
|
|
17
|
+
}
|
|
18
|
+
```
|
|
19
|
+
* Хак на кнопку отправки `onclick` можно повесить колбек на событие
|
|
20
|
+
```
|
|
21
|
+
<button type="submit" class="btn btn-primary"
|
|
22
|
+
onclick='vg.VGFormSender.buttonClick("#form-simple", function (form, self) {
|
|
23
|
+
self._button.innerHTML = `<span class="spinner-border spinner-border-sm"></span>`;
|
|
24
|
+
}, "before")'
|
|
25
|
+
>
|
|
26
|
+
<span>Сохранить</span>
|
|
27
|
+
</button>
|
|
28
|
+
```
|
|
29
|
+
у модуля три события `before`, `error` и `success`
|
|
30
|
+
|
|
31
|
+
* Исправлены ошибки в разных модулях
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
# VEGAS-APP 0.7.2 - 0.7.4 (Декабрь, 04, 2025)
|
|
37
|
+
* Новые стили и иконки для success, info, danger, warning
|
|
38
|
+
* Исправлены ошибки в разных модулях
|
|
39
|
+
|
|
40
|
+
## Новый модуль VGAlert
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
1
44
|
# VEGAS-APP 0.7.1 (Ноябрь, 26, 2025)
|
|
2
45
|
* в vgformsender добавлен interceptor beforeSend, позволяющий проделать необходимые пользовательские действия перед тем, как отправить форму
|
|
3
46
|
|
|
47
|
+
---
|
|
48
|
+
|
|
4
49
|
# VEGAS-APP 0.6.9 - 0.7.0 (Ноябрь, 21, 2025)
|
|
5
50
|
* Изменения коснулись модуля vgformsender в частности кнопку submit, дата атрибуты можно вешать на нее или на саму форму
|
|
6
51
|
1. Опциональное состояние кнопки(submit) data-button-enabled="false" - никаких действий с текстом кнопки не будет
|
package/app/modules/module-fn.js
CHANGED
|
@@ -13,13 +13,13 @@ import Selectors from "../utils/js/dom/selectors";
|
|
|
13
13
|
*/
|
|
14
14
|
const getSVG = (name) => {
|
|
15
15
|
const svg = {
|
|
16
|
-
|
|
17
|
-
success: '<svg viewBox="0 0
|
|
18
|
-
waiting: '<svg viewBox="0 0
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
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
23
|
};
|
|
24
24
|
|
|
25
25
|
return svg[name] ?? '';
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import BaseModule from "../../base-module";
|
|
2
|
+
import EventHandler from "../../../utils/js/dom/event";
|
|
3
|
+
import {isDisabled, makeRandomString, mergeDeepObject} from "../../../utils/js/functions";
|
|
4
|
+
import Selectors from "../../../utils/js/dom/selectors";
|
|
5
|
+
import VGModal from "../../vgmodal/js/vgmodal";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Constants
|
|
9
|
+
*/
|
|
10
|
+
const NAME = 'alert';
|
|
11
|
+
const NAME_KEY = 'vg.alert';
|
|
12
|
+
const SELECTOR_DATA_TOGGLE= '[data-vg-toggle="alert"]';
|
|
13
|
+
const EVENT_KEY_CLICK_DATA_API = `click.${NAME_KEY}.data.api`;
|
|
14
|
+
|
|
15
|
+
let IS_PROMISE = false;
|
|
16
|
+
|
|
17
|
+
class VGAlert extends BaseModule {
|
|
18
|
+
constructor(element, params = {}) {
|
|
19
|
+
super(element, params);
|
|
20
|
+
|
|
21
|
+
this._params = this._getParams(element, mergeDeepObject({
|
|
22
|
+
modal: {
|
|
23
|
+
centered: false,
|
|
24
|
+
backdrop: true,
|
|
25
|
+
overflow: true,
|
|
26
|
+
keyboard: true,
|
|
27
|
+
animation: {
|
|
28
|
+
enable: false,
|
|
29
|
+
in: 'animate__rollIn',
|
|
30
|
+
out: 'animate__rollOut',
|
|
31
|
+
delay: 0,
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
toast: {
|
|
35
|
+
|
|
36
|
+
},
|
|
37
|
+
elements: {
|
|
38
|
+
button: ''
|
|
39
|
+
},
|
|
40
|
+
dialog: 'modal',
|
|
41
|
+
mode: 'alert',
|
|
42
|
+
}, params));
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
static get NAME() {
|
|
46
|
+
return NAME;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
static get NAME_KEY() {
|
|
50
|
+
return NAME_KEY
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
static run(message, element = null, params = {}, event = null) {
|
|
54
|
+
if (!element) {
|
|
55
|
+
let a = document.createElement('a');
|
|
56
|
+
a.classList.add('btn-alert-fake');
|
|
57
|
+
document.body.append(a);
|
|
58
|
+
element = a;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const instance = VGAlert.getOrCreateInstance(element, mergeDeepObject({
|
|
62
|
+
message: message
|
|
63
|
+
}, params));
|
|
64
|
+
|
|
65
|
+
return instance.promise(event);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
toggle(event) {
|
|
69
|
+
const promise = this.promise(event);
|
|
70
|
+
promise.then(resolve => {
|
|
71
|
+
IS_PROMISE = true;
|
|
72
|
+
this._element.click();
|
|
73
|
+
}).catch(reject => {
|
|
74
|
+
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
promise(event) {
|
|
79
|
+
let dialog = this._build();
|
|
80
|
+
dialog.toggle();
|
|
81
|
+
|
|
82
|
+
return new Promise((resolve) => {
|
|
83
|
+
if (this._params.mode === 'alert') {
|
|
84
|
+
dialog._element.addEventListener('vg.'+ this._params.dialog +'.hidden', () => {
|
|
85
|
+
setTimeout(() => {
|
|
86
|
+
IS_PROMISE = false;
|
|
87
|
+
let fakeBtn = document.querySelector('.btn-alert-fake');
|
|
88
|
+
if (fakeBtn) fakeBtn.remove();
|
|
89
|
+
}, 100)
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
_build() {
|
|
96
|
+
if (this._params.dialog === 'modal') {
|
|
97
|
+
return this._buildModal();
|
|
98
|
+
}
|
|
99
|
+
if (this._params.dialog === 'toast') {
|
|
100
|
+
return this._buildToast();
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
_buildModal() {
|
|
105
|
+
let id = 'vg-alert-' + makeRandomString(),
|
|
106
|
+
$modal = Selectors.find('.vg-alert-modal');
|
|
107
|
+
|
|
108
|
+
if ($modal) $modal.remove();
|
|
109
|
+
|
|
110
|
+
return VGModal.build(id, this._params.modal, (self) => {
|
|
111
|
+
let element = self._element;
|
|
112
|
+
element.classList.add('vg-alert-modal');
|
|
113
|
+
|
|
114
|
+
let $body = Selectors.find('.vg-modal-body', element);
|
|
115
|
+
if ($body) {
|
|
116
|
+
let html = '<div class="message">' + this._params.message + '</div>';
|
|
117
|
+
|
|
118
|
+
html += '<div class="buttons">';
|
|
119
|
+
if (this._params.elements.button) {
|
|
120
|
+
html += '<a href="#" data-vg-dismiss="modal" class="btn btn-primary">'+ this._params.elements.button +'</a>';
|
|
121
|
+
}
|
|
122
|
+
html += '</div>';
|
|
123
|
+
|
|
124
|
+
$body.innerHTML = html;
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
_buildToast() {
|
|
130
|
+
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Data API implementation
|
|
136
|
+
*/
|
|
137
|
+
EventHandler.on(document, EVENT_KEY_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
|
|
138
|
+
if (!IS_PROMISE) {
|
|
139
|
+
let target = this;
|
|
140
|
+
event.preventDefault();
|
|
141
|
+
|
|
142
|
+
if (isDisabled(target)) return;
|
|
143
|
+
|
|
144
|
+
const data = VGAlert.getOrCreateInstance(target)
|
|
145
|
+
data.toggle(event);
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
window.alert = (message) => {
|
|
150
|
+
VGAlert.run(message);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
export default VGAlert;
|
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
import BaseModule from "../../base-module";
|
|
2
|
+
import VGModal from "../../vgmodal";
|
|
3
|
+
|
|
4
|
+
import {isElement, isVisible, makeRandomString, mergeDeepObject} from "../../../utils/js/functions";
|
|
5
|
+
import {getSVG} from "../../module-fn";
|
|
6
|
+
import {Classes, Manipulator} from "../../../utils/js/dom/manipulator";
|
|
7
|
+
import Selectors from "../../../utils/js/dom/selectors";
|
|
8
|
+
import EventHandler from "../../../utils/js/dom/event";
|
|
9
|
+
|
|
10
|
+
const CLASS_NAME_ALERT = "vg-alert";
|
|
11
|
+
|
|
12
|
+
class VGAlert {
|
|
13
|
+
constructor(params = {}) {
|
|
14
|
+
this._elementsDefault = {
|
|
15
|
+
buttons: {
|
|
16
|
+
agree: {
|
|
17
|
+
element: '',
|
|
18
|
+
tag: 'button',
|
|
19
|
+
attr: {
|
|
20
|
+
type: 'button',
|
|
21
|
+
},
|
|
22
|
+
toggle: 'data-vg-alert-agree',
|
|
23
|
+
class: ['btn'],
|
|
24
|
+
text: 'Да, согласен'
|
|
25
|
+
},
|
|
26
|
+
cancel: {
|
|
27
|
+
element: '',
|
|
28
|
+
tag: 'button',
|
|
29
|
+
attr: {
|
|
30
|
+
type: 'button',
|
|
31
|
+
},
|
|
32
|
+
toggle: 'data-vg-alert-cancel',
|
|
33
|
+
class: ['btn'],
|
|
34
|
+
text: 'Отмена'
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
message: {
|
|
38
|
+
title: 'Заголовок по умолчанию',
|
|
39
|
+
description: 'Описание текущего действия',
|
|
40
|
+
},
|
|
41
|
+
icons: {
|
|
42
|
+
danger: getSVG('danger'),
|
|
43
|
+
warning: getSVG('warning'),
|
|
44
|
+
success: getSVG('success'),
|
|
45
|
+
info: getSVG('info'),
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
this._defaultParams = {
|
|
50
|
+
ajax: {
|
|
51
|
+
route: '',
|
|
52
|
+
target: '',
|
|
53
|
+
method: 'get',
|
|
54
|
+
loader: false,
|
|
55
|
+
once: false,
|
|
56
|
+
output: true,
|
|
57
|
+
},
|
|
58
|
+
modal: {
|
|
59
|
+
centered: false,
|
|
60
|
+
backdrop: true,
|
|
61
|
+
overflow: true,
|
|
62
|
+
keyboard: true,
|
|
63
|
+
dismiss: true,
|
|
64
|
+
animation: {
|
|
65
|
+
enable: false,
|
|
66
|
+
in: 'animate__rollIn',
|
|
67
|
+
out: 'animate__rollOut',
|
|
68
|
+
delay: 300,
|
|
69
|
+
duration: 700
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
mode: 'confirm',
|
|
73
|
+
theme: 'danger',
|
|
74
|
+
buttons: {},
|
|
75
|
+
message: {},
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
this._params = this._setParams(params);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
static call(options = {}) {
|
|
82
|
+
const context = new VGAlert(options);
|
|
83
|
+
let modal = context._buildModal();
|
|
84
|
+
modal.show();
|
|
85
|
+
|
|
86
|
+
let container = modal._element,
|
|
87
|
+
agreeBtn = Selectors.find('[data-vg-alert-agree]', container),
|
|
88
|
+
cancelBtn = Selectors.find('[data-vg-alert-cancel]', container);
|
|
89
|
+
|
|
90
|
+
return new Promise((resolve, reject) => {
|
|
91
|
+
const handleAgree = () => {
|
|
92
|
+
cleanup();
|
|
93
|
+
resolve({
|
|
94
|
+
accepted: true,
|
|
95
|
+
timestamp: new Date(),
|
|
96
|
+
});
|
|
97
|
+
modal.hide();
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
const handleCancel = () => {
|
|
101
|
+
modal.hide();
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
const cleanup = () => {
|
|
105
|
+
if (agreeBtn) agreeBtn.removeEventListener('click', handleAgree);
|
|
106
|
+
if (cancelBtn) cancelBtn.removeEventListener('click', handleCancel);
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
if (context._params.mode === 'confirm') {
|
|
110
|
+
if (agreeBtn) agreeBtn.addEventListener('click', handleAgree);
|
|
111
|
+
if (cancelBtn) cancelBtn.addEventListener('click', handleCancel);
|
|
112
|
+
|
|
113
|
+
container.addEventListener('vg.modal.hide', () => {
|
|
114
|
+
cleanup();
|
|
115
|
+
|
|
116
|
+
reject({
|
|
117
|
+
accepted: false,
|
|
118
|
+
timestamp: new Date(),
|
|
119
|
+
});
|
|
120
|
+
})
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
if (context._params.mode === 'info') {
|
|
124
|
+
if (cancelBtn) cancelBtn.addEventListener('click', handleCancel);
|
|
125
|
+
|
|
126
|
+
container.addEventListener('vg.modal.hide', () => {
|
|
127
|
+
cleanup();
|
|
128
|
+
|
|
129
|
+
reject({
|
|
130
|
+
accepted: false,
|
|
131
|
+
timestamp: new Date(),
|
|
132
|
+
});
|
|
133
|
+
})
|
|
134
|
+
}
|
|
135
|
+
})
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
static confirm(elem, options = {}) {
|
|
139
|
+
let context = new VGAlert(options);
|
|
140
|
+
if (context._params.mode !== 'confirm') return;
|
|
141
|
+
|
|
142
|
+
const instance = VGAlertConfirm.getOrCreateInstance(elem, context._params);
|
|
143
|
+
instance.run(VGAlert);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
_setParams(params) {
|
|
147
|
+
params = mergeDeepObject(this._defaultParams, params);
|
|
148
|
+
params.buttons = mergeDeepObject(this._elementsDefault.buttons, params.buttons);
|
|
149
|
+
params.message = mergeDeepObject(this._elementsDefault.message, params.message);
|
|
150
|
+
params.icon = this._elementsDefault.icons[params.theme];
|
|
151
|
+
|
|
152
|
+
return params;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
_buildModal() {
|
|
156
|
+
let id = CLASS_NAME_ALERT + '-' + makeRandomString(),
|
|
157
|
+
$modal = Selectors.find('.'+ CLASS_NAME_ALERT +'-modal');
|
|
158
|
+
|
|
159
|
+
if ($modal) $modal.remove();
|
|
160
|
+
|
|
161
|
+
return VGModal.build(id, this._params.modal, (self) => {
|
|
162
|
+
let element = self._element;
|
|
163
|
+
element.classList.add(CLASS_NAME_ALERT + '-modal');
|
|
164
|
+
|
|
165
|
+
let $body = Selectors.find('.vg-modal-body', element);
|
|
166
|
+
if ($body) {
|
|
167
|
+
let wrapper = document.createElement('div');
|
|
168
|
+
Classes.add(wrapper, CLASS_NAME_ALERT + '-wrapper');
|
|
169
|
+
Classes.add(wrapper, CLASS_NAME_ALERT + '-' + this._params.theme);
|
|
170
|
+
|
|
171
|
+
let content = document.createElement('div');
|
|
172
|
+
Classes.add(content, CLASS_NAME_ALERT + '-content');
|
|
173
|
+
|
|
174
|
+
let icon = document.createElement('div');
|
|
175
|
+
Classes.add(icon, CLASS_NAME_ALERT + '-content--icon');
|
|
176
|
+
this._create(icon, 'icons', this._params.theme);
|
|
177
|
+
|
|
178
|
+
let message = document.createElement('div');
|
|
179
|
+
Classes.add(message, CLASS_NAME_ALERT + '-content--message');
|
|
180
|
+
|
|
181
|
+
let title = document.createElement('div');
|
|
182
|
+
Classes.add(title, CLASS_NAME_ALERT + '-content--title');
|
|
183
|
+
this._create(title, 'messages', 'title');
|
|
184
|
+
|
|
185
|
+
let description = document.createElement('div');
|
|
186
|
+
Classes.add(description, CLASS_NAME_ALERT + '-content--description');
|
|
187
|
+
this._create(description, 'messages', 'description');
|
|
188
|
+
|
|
189
|
+
message.append(title);
|
|
190
|
+
message.append(description);
|
|
191
|
+
|
|
192
|
+
if (this._params.icon) content.append(icon);
|
|
193
|
+
content.append(message);
|
|
194
|
+
|
|
195
|
+
let buttons = document.createElement('div');
|
|
196
|
+
Classes.add(buttons, 'vg-alert-buttons');
|
|
197
|
+
|
|
198
|
+
if (this._params.mode === 'confirm') {
|
|
199
|
+
this._create(buttons, 'button', 'cancel');
|
|
200
|
+
this._create(buttons, 'button', 'agree');
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
if (this._params.mode === 'info') {
|
|
204
|
+
this._create(buttons, 'button', 'cancel');
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
wrapper.append(content);
|
|
208
|
+
wrapper.append(buttons);
|
|
209
|
+
$body.append(wrapper);
|
|
210
|
+
}
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
_create(container, element, mode) {
|
|
215
|
+
if (element === 'button') {
|
|
216
|
+
let button = this._params.buttons[mode];
|
|
217
|
+
if (button.element) {
|
|
218
|
+
return container.innerHTML += button.element;
|
|
219
|
+
} else {
|
|
220
|
+
if (!button.tag) return;
|
|
221
|
+
|
|
222
|
+
let btn = document.createElement(button.tag);
|
|
223
|
+
Classes.add(btn, button.class.join(' '));
|
|
224
|
+
|
|
225
|
+
if (button.attr) {
|
|
226
|
+
let attr = button.attr;
|
|
227
|
+
for (const key in attr) {
|
|
228
|
+
Manipulator.set(btn, key, attr[key]);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
Manipulator.set(btn, button.toggle, true);
|
|
233
|
+
btn.innerHTML = button.text;
|
|
234
|
+
|
|
235
|
+
container.append(btn);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
if (element === 'icons') {
|
|
240
|
+
if (this._params.icon) {
|
|
241
|
+
container.innerHTML = this._params.icon;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
if (element === 'messages') {
|
|
246
|
+
if (this._params.message) {
|
|
247
|
+
container.innerHTML = this._params.message[mode];
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* Constants
|
|
256
|
+
*/
|
|
257
|
+
const NAME = 'alert';
|
|
258
|
+
const NAME_KEY = 'vg.alert';
|
|
259
|
+
|
|
260
|
+
const SELECTOR_DATA_TOGGLE = '[data-vg-toggle="alert"]';
|
|
261
|
+
const EVENT_KEY_CLICK_DATA_API = `click.${NAME_KEY}.data.api`;
|
|
262
|
+
|
|
263
|
+
const EVENT_KEY_LOADED = 'vg.alert.loaded';
|
|
264
|
+
const EVENT_KEY_ACCEPT = 'vg.alert.accept';
|
|
265
|
+
const EVENT_KEY_REJECT = 'vg.alert.reject';
|
|
266
|
+
|
|
267
|
+
class VGAlertConfirm extends BaseModule {
|
|
268
|
+
constructor(element, options = {}) {
|
|
269
|
+
super(element);
|
|
270
|
+
|
|
271
|
+
this._params = this._getParams(this._element, mergeDeepObject({
|
|
272
|
+
|
|
273
|
+
}, options));
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
static get NAME() {
|
|
277
|
+
return NAME;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
static get NAME_KEY() {
|
|
281
|
+
return NAME_KEY
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
run(self) {
|
|
285
|
+
if (this._params.mode !== 'confirm') return;
|
|
286
|
+
|
|
287
|
+
self.call(this._params).then((resolve) => {
|
|
288
|
+
if (resolve.accepted) {
|
|
289
|
+
if (this._params.ajax.route) {
|
|
290
|
+
return this._ajax()
|
|
291
|
+
} else {
|
|
292
|
+
return resolve;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
}).then((response) => {
|
|
296
|
+
EventHandler.trigger(this._element, EVENT_KEY_ACCEPT, {vgalert: response});
|
|
297
|
+
}).catch((error) => {
|
|
298
|
+
EventHandler.trigger(this._element, EVENT_KEY_REJECT, {vgalert: error});
|
|
299
|
+
})
|
|
300
|
+
}
|
|
301
|
+
_ajax() {
|
|
302
|
+
return new Promise((resolve) => {
|
|
303
|
+
this._route((status, data) => {
|
|
304
|
+
EventHandler.trigger(this._element, EVENT_KEY_LOADED, {stats: status, data: data});
|
|
305
|
+
|
|
306
|
+
resolve({
|
|
307
|
+
status: status,
|
|
308
|
+
data: data
|
|
309
|
+
});
|
|
310
|
+
})
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
EventHandler.on(document, EVENT_KEY_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, (event) => {
|
|
316
|
+
event.preventDefault();
|
|
317
|
+
|
|
318
|
+
let target = event.target;
|
|
319
|
+
if (!isVisible(target) || !isElement(target)) return;
|
|
320
|
+
|
|
321
|
+
VGAlert.confirm(target, {
|
|
322
|
+
message: {
|
|
323
|
+
title: 'Удалить этот товар',
|
|
324
|
+
description: 'Внимание этот товар будет удален'
|
|
325
|
+
},
|
|
326
|
+
buttons: {
|
|
327
|
+
agree: {
|
|
328
|
+
class: ['btn', 'btn-primary'],
|
|
329
|
+
},
|
|
330
|
+
cancel: {
|
|
331
|
+
class: ['btn', 'btn-outline-primary'],
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
});
|
|
335
|
+
})
|
|
336
|
+
|
|
337
|
+
export default VGAlert;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
$alert-map: ();
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
*--------------------------------------------------------------------------
|
|
3
|
+
* Модуль: VGAlert
|
|
4
|
+
* Автор: Vegas DEV
|
|
5
|
+
* Лицензия: смотри LICENSE
|
|
6
|
+
*--------------------------------------------------------------------------
|
|
7
|
+
**/
|
|
8
|
+
|
|
9
|
+
@import "../../../utils/scss/functions";
|
|
10
|
+
@import "../../../utils/scss/mixin";
|
|
11
|
+
@import "../../../utils/scss/variables";
|
|
12
|
+
@import "variables";
|
|
13
|
+
|
|
14
|
+
.vg-alert {
|
|
15
|
+
&-modal {
|
|
16
|
+
--vg-modal-padding: 0 !important;
|
|
17
|
+
--vg-modal-width: 520px !important;
|
|
18
|
+
--vg-modal-margin: 65px !important;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
&-wrapper {
|
|
22
|
+
@include mix-vars('alert', $alert-map);
|
|
23
|
+
@include mix-alert-color-mode($class: vg-alert);
|
|
24
|
+
border-radius: var(--vg-border-radius);
|
|
25
|
+
overflow: hidden;
|
|
26
|
+
|
|
27
|
+
.vg-alert-content {
|
|
28
|
+
--vg-alert-color: $color;
|
|
29
|
+
padding: 1.5rem;
|
|
30
|
+
display: flex;
|
|
31
|
+
align-items: center;
|
|
32
|
+
gap: 1.5rem;
|
|
33
|
+
color: var(--vg-alert-color);
|
|
34
|
+
|
|
35
|
+
.vg-alert-content--title {
|
|
36
|
+
font-weight: bold;
|
|
37
|
+
font-size: 1.5rem;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
.vg-alert-content--description {
|
|
41
|
+
font-weight: 300;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.vg-alert-content--icon {
|
|
45
|
+
svg {
|
|
46
|
+
width: 48px;
|
|
47
|
+
height: 48px;
|
|
48
|
+
|
|
49
|
+
path {
|
|
50
|
+
fill: var(--vg-alert-icon);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
.vg-alert-buttons {
|
|
57
|
+
background-color: #F5F5F5;
|
|
58
|
+
padding: 1rem 1.5rem;
|
|
59
|
+
display: flex;
|
|
60
|
+
align-items: center;
|
|
61
|
+
justify-content: flex-end;
|
|
62
|
+
gap: .5rem;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|