vgapp 0.3.2 → 0.3.4

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,6 @@
1
+ # VEGAS-APP 0.3.4 (Май, 20, 2025)
2
+ ## Новый модуль VGSpy
3
+
1
4
  # VEGAS-APP 0.3.0 (Май, 09, 2025)
2
5
  * Исправлены ошибки
3
6
  ## Модуль VGFORMSENDER
@@ -13,7 +16,7 @@
13
16
 
14
17
  ## Новый модуль VGToast
15
18
 
16
- # VEGAS-APP 0.2.2 - 0.2.3 (Апрель, 4, 2025)
19
+ # VEGAS-APP 0.2.3 (Апрель, 4, 2025)
17
20
  ## Модуль VGDROPDOWN
18
21
  * Добавлен параметр overflow и backdrop
19
22
 
@@ -31,7 +34,7 @@
31
34
  * Релиз
32
35
 
33
36
 
34
- # VEGAS-APP 0.1.6 - 0.1.7 (Март, 12, 2025)
37
+ # VEGAS-APP 0.1.7 (Март, 12, 2025)
35
38
  ## Модуль VGSelect
36
39
  * Исправлены ошибки
37
40
 
@@ -49,7 +52,7 @@
49
52
  * Событие после аякс запроса NAME_KEY.loaded
50
53
 
51
54
 
52
- # VEGAS-APP 0.1.3 - 0.1.4 (Март, 10, 2025)
55
+ # VEGAS-APP 0.1.4 (Март, 10, 2025)
53
56
  * Перенесен плагин (<a href="https://github.com/vegas-dev/vegas-select">VGSelect</a>) в модуль VGSelect
54
57
  * для модулей VGSidebar и VGModal добавлена возможность собирать параметры с кнопки вызова элемента
55
58
  * в модуль VGSidebar добавлен класс vg-sidebar-open в тело документа
@@ -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;
@@ -1,7 +1,8 @@
1
1
  import BaseModule from "../../base-module";
2
2
  import EventHandler from "../../../utils/js/dom/event";
3
- import {dismissTrigger} from "../../module-fn";
4
- import {execute, mergeDeepObject} from "../../../utils/js/functions";
3
+ import {isDisabled, makeRandomString, mergeDeepObject} from "../../../utils/js/functions";
4
+ import Selectors from "../../../utils/js/dom/selectors";
5
+ import VGModal from "../../vgmodal/js/vgmodal";
5
6
 
6
7
  /**
7
8
  * Constants
@@ -9,60 +10,36 @@ import {execute, mergeDeepObject} from "../../../utils/js/functions";
9
10
  const NAME = 'alert';
10
11
  const NAME_KEY = 'vg.alert';
11
12
  const SELECTOR_DATA_TOGGLE= '[data-vg-toggle="alert"]';
12
-
13
- const CLASS_NAME_SHOW = 'show';
14
- const CLASS_NAME_OPEN = 'vg-alert-open';
15
-
16
- const EVENT_KEY_HIDE = `${NAME_KEY}.hide`;
17
- const EVENT_KEY_HIDDEN = `${NAME_KEY}.hidden`;
18
- const EVENT_KEY_SHOW = `${NAME_KEY}.show`;
19
- const EVENT_KEY_SHOWN = `${NAME_KEY}.shown`;
20
- const EVENT_KEY_LOADED = `${NAME_KEY}.loaded`;
21
- const EVENT_KEY_CONFIRM = `${NAME_KEY}.confirm`;
22
- const EVENT_KEY_CANCEL = `${NAME_KEY}.cancel`;
23
-
24
- const EVENT_KEY_KEYDOWN_DISMISS = `keydown.dismiss.${NAME_KEY}`;
25
- const EVENT_KEY_HIDE_PREVENTED = `hidePrevented.${NAME_KEY}`;
26
13
  const EVENT_KEY_CLICK_DATA_API = `click.${NAME_KEY}.data.api`;
27
14
 
15
+ let IS_PROMISE = false;
16
+
28
17
  class VGAlert extends BaseModule {
29
18
  constructor(element, params = {}) {
30
19
  super(element, params);
31
20
 
32
21
  this._params = this._getParams(element, mergeDeepObject({
33
- backdrop: true,
34
- overflow: true,
35
- keyboard: true,
36
- confirm: true,
37
- showInside: true,
38
- theme: 'default',
39
- elements: [
40
- {
41
- 'title': 'Вы уверены?',
42
- 'element': 'button',
43
- 'type': 'confirm',
44
- 'classes': ['btn', 'btn-primary']
45
- }
46
- ],
47
- animation: {
48
- enable: false,
49
- in: 'animate__rollIn',
50
- out: 'animate__rollOut',
51
- delay: 800,
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
+ },
52
33
  },
53
- ajax: {
54
- route: '',
55
- target: '',
56
- method: 'get',
57
- loader: false,
58
- }
59
- }, params));
34
+ toast: {
60
35
 
61
- this._addEventListeners();
62
- this._dismissElement();
63
-
64
- this._params.animation.delay = !this._params.animation.enable ? 0 : this._params.animation.delay;
65
- this._animation(this._element, VGAlert.NAME_KEY, this._params.animation);
36
+ },
37
+ elements: {
38
+ button: ''
39
+ },
40
+ dialog: 'modal',
41
+ mode: 'alert',
42
+ }, params));
66
43
  }
67
44
 
68
45
  static get NAME() {
@@ -73,57 +50,56 @@ class VGAlert extends BaseModule {
73
50
  return NAME_KEY
74
51
  }
75
52
 
76
- static run(text, params = {}, callback) {
77
- return VGAlert.build(text, params, callback);
78
- }
53
+ static run(... args) {
79
54
 
80
- static build(text, params, callback) {
81
- params = mergeDeepObject({
82
- theme: 'default',
83
- }, params);
55
+ }
84
56
 
85
- let target;
57
+ toggle(event) {
86
58
 
87
- let instance = VGAlert.getOrCreateInstance(target, params);
88
- execute(callback, [instance]);
89
- instance.show();
90
59
  }
91
60
 
92
- toggle(relatedTarget) {
93
- return !this._isShown() ? this.show(relatedTarget) : this.hide();
94
- }
61
+ promise(event) {
95
62
 
96
- show(relatedTarget) {
63
+ }
97
64
 
65
+ _build() {
66
+ if (this._params.dialog === 'modal') {
67
+ return this._buildModal();
68
+ }
69
+ if (this._params.dialog === 'toast') {
70
+ return this._buildToast();
71
+ }
98
72
  }
99
73
 
100
- hide() {
74
+ _buildModal() {
75
+ let id = 'vg-alert-' + makeRandomString(),
76
+ $modal = Selectors.find('.vg-alert-modal');
101
77
 
102
- }
78
+ if ($modal) $modal.remove();
103
79
 
104
- dispose() {
105
- super.dispose();
106
- }
80
+ return VGModal.build(id, this._params.modal, (self) => {
81
+ let element = self._element;
82
+ element.classList.add('vg-alert-modal');
107
83
 
108
- _isShown() {
109
- return this._element.classList.contains(CLASS_NAME_SHOW);
110
- }
84
+ let $body = Selectors.find('.vg-modal-body', element);
85
+ if ($body) {
86
+ let html = '<div class="message">' + this._params.message + '</div>';
111
87
 
112
- _addEventListeners() {
113
- EventHandler.on(document, EVENT_KEY_KEYDOWN_DISMISS, event => {
114
- if (event.key !== 'Escape') return;
88
+ html += '<div class="buttons">';
89
+ if (this._params.elements.button) {
90
+ html += '<a href="#" data-vg-dismiss="modal" class="btn btn-primary">'+ this._params.elements.button +'</a>';
91
+ }
92
+ html += '</div>';
115
93
 
116
- if (this._params.keyboard) {
117
- this.hide();
118
- return;
94
+ $body.innerHTML = html;
119
95
  }
120
-
121
- EventHandler.trigger(this._element, EVENT_KEY_HIDE_PREVENTED)
122
96
  });
123
97
  }
124
- }
125
98
 
126
- dismissTrigger(VGAlert);
99
+ _buildToast() {
100
+
101
+ }
102
+ }
127
103
 
128
104
  /**
129
105
  * Data API implementation
@@ -132,4 +108,8 @@ EventHandler.on(document, EVENT_KEY_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, functi
132
108
 
133
109
  });
134
110
 
135
- export default VGAlert;
111
+ window.alert = (message) => {
112
+ VGAlert.run(message);
113
+ }
114
+
115
+ export default VGAlert;
@@ -0,0 +1,108 @@
1
+ import BaseModule from "../../base-module";
2
+ import {isObject, mergeDeepObject, normalizeData} from "../../../utils/js/functions";
3
+ import EventHandler from "../../../utils/js/dom/event";
4
+ import Selectors from "../../../utils/js/dom/selectors";
5
+
6
+ const NAME = 'datatable';
7
+ const NAME_KEY = 'vg.datatable';
8
+
9
+ const CLASS_NAME_LOADER = 'vg-datatable-loader';
10
+ const CLASS_NAME_LOADER_AFTER = 'vg-datatable-loader--after';
11
+
12
+ const EVENT_KEY_LOADED = `${NAME_KEY}.loaded`;
13
+
14
+ class VGDataTable extends BaseModule {
15
+ constructor(element, params) {
16
+ super(element, params);
17
+
18
+ this._params = this._getParams(element, mergeDeepObject({
19
+ mode: 'table', // варианты: table, list, card
20
+ paginate: {
21
+ enabled: true,
22
+ stack: true,
23
+ items: 10
24
+ },
25
+ loader: true,
26
+
27
+ ajax: {
28
+ enabled: true,
29
+ route: '',
30
+ target: '',
31
+ method: 'get',
32
+ loader: false,
33
+ }
34
+ }, params));
35
+
36
+ this.paginateCount = this._params.paginate.items;
37
+ }
38
+
39
+ static get NAME() {
40
+ return NAME;
41
+ }
42
+
43
+ static get NAME_KEY() {
44
+ return NAME_KEY;
45
+ }
46
+
47
+ static init(el, params = {}) {
48
+ let instance = VGDataTable.getOrCreateInstance(el, params);
49
+ instance.build();
50
+ }
51
+
52
+ build() {
53
+ if (this._params.loader) {
54
+ this._element.classList.add(CLASS_NAME_LOADER_AFTER);
55
+ this._element.parentElement.style.position = 'relative';
56
+ this._element.insertAdjacentHTML('beforebegin', '<div class="'+ CLASS_NAME_LOADER +'"><div class="vg-loader"></div></div>')
57
+ }
58
+
59
+ if (this._params.ajax.enabled) {
60
+ this._route((status, data) => {
61
+ setTimeout(() => {
62
+ EventHandler.trigger(this._element, EVENT_KEY_LOADED, {stats: status, data: data});
63
+
64
+ if (this._params.loader) {
65
+ this._element.classList.remove(CLASS_NAME_LOADER_AFTER);
66
+ Selectors.find('.' + CLASS_NAME_LOADER).remove();
67
+ }
68
+
69
+ this._setBuildMode(normalizeData(data.response));
70
+ }, 1000);
71
+ });
72
+ } else {
73
+ // TODO берем данные которые уже есть странице и загружены
74
+ }
75
+ }
76
+
77
+ _setBuildMode(data) {
78
+ if (!data) return;
79
+
80
+ switch (this._params.mode) {
81
+ case 'table': this._modeBuildTable(data); break;
82
+ case 'list': this._modeBuildList(data); break;
83
+ case 'card': this._modeBuildCard(data); break;
84
+ }
85
+ }
86
+
87
+ _modeBuildTable(data) {
88
+ let target = Selectors.find('tbody', this._element);
89
+
90
+ if (isObject(data)) {
91
+ for (const datum of data) {
92
+ console.log(datum)
93
+ }
94
+ } else {
95
+ target.innerHTML = data;
96
+ }
97
+ }
98
+
99
+ _modeBuildList(data) {
100
+
101
+ }
102
+
103
+ _modeBuildCard(data) {
104
+
105
+ }
106
+ }
107
+
108
+ export default VGDataTable;
@@ -0,0 +1,3 @@
1
+ $datatable-map: (
2
+ loader-bg: rgba(white, .15)
3
+ );
@@ -0,0 +1,47 @@
1
+ /**
2
+ *--------------------------------------------------------------------------
3
+ * Модуль: VGDataTable
4
+ * Автор: Vegas DEV
5
+ * Лицензия: смотри LICENSE.md
6
+ *--------------------------------------------------------------------------
7
+ **/
8
+
9
+ @import "../../../utils/scss/functions";
10
+ @import "../../../utils/scss/mixin";
11
+ @import "../../../utils/scss/variables";
12
+ @import "variables";
13
+
14
+ .vg-datatable {
15
+ @include mix-vars('datatable', $datatable-map);
16
+
17
+ &-loader {
18
+ position: absolute;
19
+ width: 100%;
20
+ height: 100%;
21
+ min-height: 300px;
22
+ left: 0;
23
+ top: 0;
24
+ display: flex;
25
+ align-items: center;
26
+ justify-content: center;
27
+ z-index: 100;
28
+
29
+ &--after {
30
+ position: relative;
31
+
32
+ &:after {
33
+ content: '';
34
+ width: 100%;
35
+ height: 100%;
36
+ min-height: 300px;
37
+ display: flex;
38
+ align-items: center;
39
+ justify-content: center;
40
+ background-color: var(--vg-datatable-loader-bg);
41
+ position: absolute;
42
+ left: 0;
43
+ top: 0;
44
+ }
45
+ }
46
+ }
47
+ }
@@ -20,9 +20,7 @@ class VGHideShowPass extends BaseModule{
20
20
  constructor(el, params = {}) {
21
21
  super(el, params);
22
22
 
23
- this._params = this._getParams(el, mergeDeepObject({
24
-
25
- }, params))
23
+ this._params = this._getParams(el, mergeDeepObject({}, params));
26
24
  }
27
25
 
28
26
  static get NAME() {
@@ -36,6 +36,12 @@ class VGFormSender extends BaseModule {
36
36
  super(element, params);
37
37
 
38
38
  this._params = this._getParams(element, mergeDeepObject({
39
+ response: {
40
+ enabled: false,
41
+ errors: false,
42
+ title: '',
43
+ message: '',
44
+ },
39
45
  redirect: {
40
46
  error: '',
41
47
  success: ''
@@ -125,6 +131,10 @@ class VGFormSender extends BaseModule {
125
131
  _this._route(function (status, data) {
126
132
  _this._element.classList.remove('was-validated');
127
133
 
134
+ if (_this._params.response.enabled) {
135
+ data.response = _this._params.response;
136
+ }
137
+
128
138
  if (_this._params.alert.enabled) {
129
139
  if (typeof status === 'string' && status === 'error') {
130
140
  if (_this._params.redirect.error) {
@@ -50,6 +50,7 @@ class VGModal extends BaseModule {
50
50
  keyboard: true,
51
51
  fields: [],
52
52
  hash: false,
53
+ centered: false,
53
54
  ajax: {
54
55
  route: '',
55
56
  target: '',
@@ -60,7 +61,8 @@ class VGModal extends BaseModule {
60
61
  enable: false,
61
62
  in: 'animate__rollIn',
62
63
  out: 'animate__rollOut',
63
- delay: 800,
64
+ delay: 100,
65
+ duration: 800,
64
66
  },
65
67
  classes: {
66
68
  general: 'vg-modal',
@@ -106,6 +108,10 @@ class VGModal extends BaseModule {
106
108
  _element.id = id;let dialog = document.createElement('div');
107
109
  dialog.classList.add('vg-modal-dialog');
108
110
 
111
+ if ('centered' in params && params.centered) {
112
+ dialog.classList.add('vg-modal-dialog-centered');
113
+ }
114
+
109
115
  let content = document.createElement('div');
110
116
  content.classList.add('vg-modal-content');
111
117
 
@@ -130,6 +136,8 @@ class VGModal extends BaseModule {
130
136
  const modal = VGModal.getOrCreateInstance(_element, params);
131
137
 
132
138
  execute(callback, [modal]);
139
+
140
+ return modal;
133
141
  }
134
142
 
135
143
  toggle(relatedTarget) {