vgapp 0.7.4 → 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 CHANGED
@@ -1,3 +1,38 @@
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
+
1
36
  # VEGAS-APP 0.7.2 - 0.7.4 (Декабрь, 04, 2025)
2
37
  * Новые стили и иконки для success, info, danger, warning
3
38
  * Исправлены ошибки в разных модулях
@@ -16,12 +16,6 @@ import VGCollapse from "../../vgcollapse/js/vgcollapse";
16
16
  import {getSVG} from "../../module-fn";
17
17
  import VGHideShowPass from "./hideshowpass";
18
18
 
19
- /**
20
- * TODO
21
- * доделай динамическое добавление полей в форму,
22
- * но не меняй место их получения (их нужно получить прямо перед отправкой, после того как выполнился промис beforeSend)
23
- */
24
-
25
19
  /**
26
20
  * Constants
27
21
  */
@@ -102,13 +96,15 @@ class VGFormSender extends BaseModule {
102
96
  spinner: {
103
97
  enabled: false,
104
98
  element: '<span class="spinner-border spinner-border-sm me-2"></span>'
105
- }
99
+ },
100
+ click: noop,
106
101
  },
107
102
  }, params));
108
103
 
104
+ this._button = Selectors.find('[type="submit"]', this._element) || Selectors.find('[form="' + this._element.id + '"]') || null;
105
+
109
106
  this._params.ajax.route = Manipulator.get(this._element, 'action').toLowerCase();
110
107
  this._params.ajax.method = Manipulator.get(this._element, 'method').toLowerCase();
111
- this._button = Selectors.find('[type="submit"]', this._element) || Selectors.find('[form="' + this._element.id + '"]') || null;
112
108
 
113
109
  this._params.isBtnText = Manipulator.get(this._element, 'data-btn-text') !== 'false';
114
110
  this._params.isJsonParse = Manipulator.get(this._element, 'data-json-parse') !== 'false';
@@ -151,13 +147,23 @@ class VGFormSender extends BaseModule {
151
147
  return this
152
148
  }
153
149
 
154
- request(data, event) {
150
+ request(event, data = null) {
155
151
  const _this = this;
152
+ const mergeFormData = (target, source) => {
153
+ source.forEach((value, key) => {
154
+ target.set(key, value);
155
+ });
156
+ return target;
157
+ }
156
158
 
157
159
  _this._alertBefore();
158
160
 
159
161
  const submit = () => {
160
- _this._params.ajax.data = new FormData(_this._element);
162
+ let formData = new FormData(_this._element);
163
+
164
+ if (data) _this._params.ajax.data = mergeFormData(data, formData);
165
+ else _this._params.ajax.data = formData;
166
+
161
167
  _this._route(function (status, data) {
162
168
  _this._element.classList.remove('was-validated');
163
169
 
@@ -229,11 +235,23 @@ class VGFormSender extends BaseModule {
229
235
  EventHandler.trigger(_this._element, EVENT_KEY_SUCCESS, [event, _this, data]);
230
236
  }
231
237
 
238
+ static buttonClick(formID, callback, status = 'before') {
239
+ const form = Selectors.find(formID);
240
+ if (form) {
241
+ const instance = VGFormSender.getOrCreateInstance(formID);
242
+ form.addEventListener('vg.fs.' + status, e => {
243
+ execute(callback, [form, instance])
244
+ })
245
+ }
246
+ }
247
+
232
248
  _statusButton(status) {
233
249
  if (!this._button) return;
234
250
 
235
251
  if (status === 'before') {
236
- const button = getDeepestLastChild(this._button) || this._button;
252
+ const button = this._button;
253
+
254
+ this._params.button.initial = this._button.innerHTML.trim();
237
255
 
238
256
  if (this._params.button.spinner.enabled) {
239
257
  this._button.insertAdjacentHTML('afterbegin', this._params.button.spinner.element);
@@ -246,19 +264,25 @@ class VGFormSender extends BaseModule {
246
264
  if (this._params.button.disabled) {
247
265
  Manipulator.set(this._button,'disabled', 'disabled');
248
266
  }
267
+
268
+ execute(this._params.button.click, [this, this._button, 'before'])
249
269
  }
250
270
 
251
271
  if (status === 'after') {
252
272
  if (this._params.button.enabled) {
253
273
  this._button.innerHTML = this._params.button.initial;
254
274
  }
275
+
255
276
  if (this._params.button.disabled) {
256
277
  Manipulator.remove(this._button,'disabled');
257
278
  }
279
+
258
280
  if (this._params.button.spinner.enabled) {
259
281
  let spinner = this._button.querySelector('.spinner-border');
260
282
  if (spinner) spinner.remove();
261
283
  }
284
+
285
+ execute(this._params.button.click, [this, this._button, 'after'])
262
286
  }
263
287
  }
264
288
 
@@ -533,34 +557,36 @@ EventHandler.on(document, EVENT_SUBMIT_DATA_API, function (event) {
533
557
  }
534
558
  }
535
559
 
536
- /*const collectData = function(data, fields) {
537
- for (let name in fields) {
538
- if (typeof fields[name] === 'object') {
539
- for (let key in fields[name]) {
540
- let arr = Object.keys(fields[name][key]).map(function (i) {
541
- return fields[name][key][i];
560
+ if (!instance._params.submit) {
561
+ event.preventDefault();
562
+
563
+ const collectData = function(data, fields) {
564
+ fields.forEach(function(field) {
565
+ if (isObject(field)) {
566
+ let keys = Object.keys(field);
567
+ keys.forEach(function(key) {
568
+ let value = normalizeData(field[key]);
569
+
570
+ if (Array.isArray(value) || isObject(value)) {
571
+ data.append(key, JSON.stringify(value));
572
+ } else {
573
+ data.append(key, value);
574
+ }
542
575
  });
543
- data.append(name, arr);
544
576
  }
545
- } else {
546
- data.append(name, fields[name]);
547
- }
548
- }
549
-
550
- return data;
551
- }*/
577
+ });
552
578
 
553
- if (!instance._params.submit) {
554
- event.preventDefault();
579
+ return data;
580
+ }
555
581
 
556
- //let data = new FormData(instance._element);
582
+ let data = new FormData(instance._element),
583
+ fields = instance._params.fields;
557
584
 
558
- // TODO доделать
559
- /*if (Array.isArray(instance._params.ajax.fields) && instance._params.ajax.fields.length) {
560
- data = collectData(data, instance._params.ajax.fields);
561
- }*/
585
+ if (Array.isArray(fields) && fields.length) {
586
+ data = collectData(data, fields);
587
+ }
562
588
 
563
- return instance.request(event);
589
+ return instance.request(event, data);
564
590
  }
565
591
  })
566
592
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vgapp",
3
- "version": "0.7.4",
3
+ "version": "0.7.5",
4
4
  "description": "",
5
5
  "author": {
6
6
  "name": "Vegas Studio",