vgapp 0.0.5 → 0.0.7

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.
@@ -60,7 +60,7 @@ class BaseModule {
60
60
  }
61
61
 
62
62
  Ajax[_this._params.ajax.method](_this._params.ajax.route, _this._params.ajax.data || {}, function (status, data) {
63
- setData(data);
63
+ setData(data.response);
64
64
  execute(callback, [status, data]);
65
65
  });
66
66
  }
@@ -83,14 +83,15 @@ const Ajax = {
83
83
  }
84
84
  let x = Ajax.x();
85
85
  x.open(method, url, async);
86
+ x.setRequestHeader("X-Requested-With", "XMLHttpRequest");
86
87
  x.onreadystatechange = function () {
87
88
  if (x.readyState === 4) {
88
89
  switch (x.status) {
89
90
  case 200:
90
- callback('success', x.responseText)
91
+ callback('success', {text: x.statusText, response: x.responseText, code: x.status})
91
92
  break;
92
93
  default:
93
- callback('error', x.statusText)
94
+ callback('error', {text: x.statusText, response: x.responseText, code: x.status})
94
95
  break;
95
96
  }
96
97
  }
@@ -27,7 +27,7 @@ class VGDropdown extends BaseModule {
27
27
  constructor(element, params) {
28
28
  super(element, params);
29
29
 
30
- this._params = this._getParams(element, mergeDeepObject({
30
+ let defaultParams = {
31
31
  offset: [0, 2],
32
32
  over: false,
33
33
  backdrop: true,
@@ -35,14 +35,20 @@ class VGDropdown extends BaseModule {
35
35
  keyboard: true,
36
36
  placement: 'bottom',
37
37
  animation: true,
38
- timeoutAnimation: 300,
38
+ timeoutAnimation: 350,
39
39
  hover: false,
40
40
  ajax: {
41
41
  route: '',
42
42
  target: '',
43
43
  method: 'get'
44
44
  }
45
- }, params));
45
+ }
46
+
47
+ if ('offset' in params && Array.isArray(params.offset)) {
48
+ defaultParams.offset = params.offset;
49
+ }
50
+
51
+ this._params = this._getParams(element, mergeDeepObject(defaultParams, params));
46
52
 
47
53
  this._parent = this._element.parentNode;
48
54
  this._drop = Selectors.find('.' + TARGET_CONTAINER, this._parent);
@@ -2,7 +2,7 @@ import BaseModule from "../../base-module";
2
2
  import {Manipulator} from "../../../utils/js/dom/manipulator";
3
3
  import EventHandler from "../../../utils/js/dom/event";
4
4
  import VGModal from "../../vgmodal/js/vgmodal";
5
- import {makeRandomString, mergeDeepObject, normalizeData} from "../../../utils/js/functions";
5
+ import {isObject, makeRandomString, mergeDeepObject, normalizeData} from "../../../utils/js/functions";
6
6
  import Selectors from "../../../utils/js/dom/selectors";
7
7
  import VGCollapse from "../../vgcollapse/js/vgcollapse";
8
8
  import {getSVG} from "../../module-fn";
@@ -212,9 +212,27 @@ class VGFormSender extends BaseModule {
212
212
  alert(data, status) {
213
213
  const _this = this;
214
214
 
215
- if (typeof data === "object") {
216
- if ('errors' in data) {
217
- status = normalizeData(data.errors) ? 'error' : 'success';
215
+ if (isObject(data)) {
216
+ if (('code' in data) && data.code && data.code === 200) {
217
+ if ('response' in data && data.response) {
218
+ let response = normalizeData(data.response);
219
+ if (typeof response === 'string') {
220
+ if (response.indexOf("Parse error") !== -1 || response.indexOf("syntax error") !== -1) {
221
+ status = 'error';
222
+ data = {
223
+ response: {
224
+ title: 'Error',
225
+ message: 'Something went wrong, please repeat later'
226
+ },
227
+ text: 'Something went wrong, please repeat later'
228
+ }
229
+ }
230
+ } else {
231
+ if ('errors' in response && normalizeData(response.errors)) {
232
+ status = normalizeData(response.errors) ? 'error' : 'success';
233
+ }
234
+ }
235
+ }
218
236
  }
219
237
  }
220
238
 
@@ -288,21 +306,79 @@ class VGFormSender extends BaseModule {
288
306
  setDataRelationStatus($element, status, data, type) {
289
307
  let $alert = Selectors.find('.vg-alert-' + status, $element);
290
308
 
291
- if (typeof data === 'object') {
292
- if ('view' in data && typeof data.view === 'object') {
293
- let txt = '';
294
-
295
- if ('title' in data.view) {
296
- txt += '<h4 class="vg-alert-content--title">' + data.view.title + '</h4>'
309
+ if (isObject(data)) {
310
+ if (status === 'error') {
311
+ if ('code' in data && data.code !== 200) {
312
+ if ('text' in data && !data.text) {
313
+ data.text = 'Something went wrong, please repeat later';
314
+
315
+ switch (data.code) {
316
+ case 400:
317
+ data.text = 'Bad Request'
318
+ break;
319
+ case 401:
320
+ data.text = 'Unauthorized'
321
+ break;
322
+ case 403:
323
+ data.text = 'Unauthorized'
324
+ break;
325
+ case 413:
326
+ data.text = 'Forbidden'
327
+ break;
328
+ case 404:
329
+ data.text = 'Not Found'
330
+ break;
331
+ case 422:
332
+ data.text = 'Unprocessable Entity'
333
+ break;
334
+ case 500:
335
+ data.text = 'Internal Server Error'
336
+ break;
337
+ case 504:
338
+ data.text = 'Gateway Timeout'
339
+ break;
340
+ }
341
+ }
297
342
  }
343
+ }
298
344
 
299
- if ('message' in data.view) {
300
- txt += '<div class="vg-alert-content--message">' + data.view.message + '</div>'
345
+ if ('response' in data) {
346
+ let response = normalizeData(data.response), title = '', txt = '', code = '';
347
+ if (typeof response !== 'string') {
348
+ if (!('view' in response)) {
349
+ if ('title' in response) title = response.title;
350
+ if (status === 'error' && data.code !== 200) {
351
+ code = ' ' + data.text + ' (' + data.code + ')';
352
+ }
353
+
354
+ txt += '<h4 class="vg-alert-content--title">' + title + code + '</h4>';
355
+
356
+ if ('message' in response) {
357
+ txt += '<div class="vg-alert-content--message">' + response.message + '</div>'
358
+ }
359
+
360
+ if ('errors' in response) {
361
+ let errors = normalizeData(response.errors) || null;
362
+ if (isObject(errors)) {
363
+ for (const error in errors) {
364
+ if (Array.isArray(errors[error])) {
365
+ errors[error].forEach(function (t) {
366
+ txt += '<div>'+ t +'</div>';
367
+ })
368
+ } else {
369
+ txt = '<div>'+ errors[error] +'</div>';
370
+ }
371
+ }
372
+ }
373
+ }
374
+
375
+ data = {
376
+ view: txt
377
+ }
378
+ }
379
+ } else {
380
+ data.view = response;
301
381
  }
302
-
303
- data = txt;
304
- } else if ('view' in data && typeof data.view === "string") {
305
- data = data.view;
306
382
  }
307
383
  }
308
384
 
@@ -324,13 +400,13 @@ class VGFormSender extends BaseModule {
324
400
 
325
401
  let text = document.createElement('div');
326
402
  text.classList.add('vg-alert-content--text');
327
- text.innerHTML = data;
403
+ text.innerHTML = data.view;
328
404
 
329
405
  content.append(text);
330
406
  $alert.append(content);
331
407
  } else {
332
408
  let text = Selectors.find('.vg-alert-content--text', $alert);
333
- text.innerHTML = data;
409
+ text.innerHTML = data.view;
334
410
  }
335
411
 
336
412
  return $alert;
@@ -0,0 +1,91 @@
1
+ import BaseModule from "../../base-module";
2
+ import {execute, isDisabled, isVisible, mergeDeepObject, noop} from "../../../utils/js/functions";
3
+ import EventHandler from "../../../utils/js/dom/event";
4
+ import Selectors from "../../../utils/js/dom/selectors";
5
+ import {Manipulator} from "../../../utils/js/dom/manipulator";
6
+
7
+ /**
8
+ * Constants
9
+ */
10
+ const NAME = 'rollup';
11
+ const NAME_KEY = 'vg.rollup';
12
+ const CLASS_NAME_SHOW = 'show';
13
+ const CLASS_NAME_HIDE = 'd-none';
14
+ const SELECTOR_DATA_TOGGLE= '[data-vg-toggle="rollup"]'
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
+
21
+ const EVENT_KEY_CLICK_DATA_API = `click.${NAME_KEY}.data.api`;
22
+
23
+ class VGRollup extends BaseModule {
24
+ constructor(element, params = {}) {
25
+ super(element, params);
26
+
27
+ this._params = this._getParams(element, mergeDeepObject({
28
+
29
+ }, params));
30
+
31
+
32
+ }
33
+
34
+ static get NAME() {
35
+ return NAME;
36
+ }
37
+
38
+ static get NAME_KEY() {
39
+ return NAME_KEY
40
+ }
41
+
42
+ /**
43
+ * Инициализация
44
+ * @param element
45
+ * @param params
46
+ */
47
+ static init(element, params = {}) {
48
+ const instance = VGRollup.getOrCreateInstance(element, params);
49
+ instance.build();
50
+ }
51
+
52
+ build() {
53
+
54
+ }
55
+
56
+ toggle(relatedTarget) {
57
+ return !this._isShown() ? this.show(relatedTarget) : this.hide();
58
+ }
59
+
60
+ show(relatedTarget) {
61
+
62
+ }
63
+
64
+ _isShown() {
65
+ return this._element.classList.contains(CLASS_NAME_SHOW);
66
+ }
67
+ }
68
+
69
+ /**
70
+ * Data API implementation
71
+ */
72
+ EventHandler.on(document, EVENT_KEY_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
73
+ const target = Selectors.getElementFromSelector(this);
74
+ if (!target) return;
75
+
76
+ if (['A', 'AREA'].includes(this.tagName)) {
77
+ event.preventDefault()
78
+ }
79
+
80
+ if (isDisabled(this)) {
81
+ return
82
+ }
83
+
84
+ this.setAttribute('aria-expanded', true);
85
+
86
+ const data = VGRollup.getOrCreateInstance(target)
87
+ data.toggle(this);
88
+ });
89
+
90
+
91
+ export default VGRollup;
@@ -0,0 +1,8 @@
1
+ $rollup-map: (
2
+ transition: $transition-base,
3
+ fade-height: 100px,
4
+ fade-background: linear-gradient(180deg, rgba(255,255,255,0) 0%, rgba(255,255,255,1) 100%)
5
+ );
6
+ $rollup-button-map: (
7
+ align: center
8
+ );
@@ -0,0 +1,49 @@
1
+ /**
2
+ *--------------------------------------------------------------------------
3
+ * Модуль: VGRollup
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-rollup {
15
+ @include mix-vars('rollup', $rollup-map);
16
+ transform: var(--vg-rollup-transition);
17
+
18
+ &-button {
19
+ @include mix-vars('rollup-button', $rollup-button-map);
20
+ text-align: var(--vg-rollup-button-align);
21
+ }
22
+
23
+ &-content {
24
+ &--hidden {
25
+ overflow: hidden;
26
+ }
27
+
28
+ &--fade {
29
+ position: relative;
30
+
31
+ &:after {
32
+ content: '';
33
+ position: absolute;
34
+ left: 0;
35
+ bottom: 0;
36
+ width: 100%;
37
+ height: var(--vg-rollup-fade-height);
38
+ background: var(--vg-rollup-fade-background);
39
+ }
40
+ }
41
+
42
+ &--ellipsis {
43
+ overflow: hidden;
44
+ text-overflow: ellipsis;
45
+ display: -webkit-box;
46
+ -webkit-box-orient: vertical;
47
+ }
48
+ }
49
+ }
@@ -0,0 +1,143 @@
1
+ build(isFirstInit = true) {
2
+ let self_height = this._element.clientHeight,
3
+ set_height = parseInt(this._params.height) || (self_height / 2);
4
+
5
+ if (isFirstInit) this._element.classList.add('vg-rollup');
6
+
7
+ if (self_height > set_height && this._params.content === 'text') {
8
+ this._element.classList.add(this._params.classes.hidden);
9
+ this._element.style.height = set_height + "px";
10
+
11
+ this.ellipsis();
12
+ this.fade();
13
+ if (isFirstInit) this.button();
14
+ } else if (this._params.content === 'elements') {
15
+ let elementClass = this._params.elements,
16
+ items = this._element.querySelectorAll('.' + elementClass),
17
+ cnt = this._params.cnt,
18
+ i = 1;
19
+
20
+ this.total = items.length;
21
+ this.count = cnt;
22
+
23
+ for (const item of items) {
24
+ if (i > cnt) {
25
+ item.classList.add(CLASS_NAME_HIDE)
26
+ }
27
+
28
+ i++;
29
+ }
30
+
31
+ if (this._params.button === true) this._params.button = (i - 1) > cnt;
32
+
33
+ this.ellipsis();
34
+ this.fade();
35
+ if (isFirstInit) this.button();
36
+ }
37
+
38
+ if (isFirstInit) {
39
+ this._button = document.querySelector('[data-vg-target="'+ this._element.id +'"]');
40
+ execute(this._params.callback.afterInit, [this]);
41
+ }
42
+ }
43
+
44
+ ellipsis() {
45
+ if (this._params.ellipsis.line) {
46
+ this._element.classList.add(this._params.classes.ellipsis);
47
+ this._element.style.webkitLineClamp = this._params.ellipsis.line;
48
+ }
49
+ }
50
+
51
+ fade() {
52
+ if (this._params.fade) {
53
+ if (this._element.classList.contains(this._params.classes.ellipsis)) {
54
+ this._element.classList.remove(this._params.classes.fade)
55
+ } else {
56
+ this._element.classList.add(this._params.classes.fade);
57
+ }
58
+ }
59
+ }
60
+
61
+ button() {
62
+ if (this._params.button) {
63
+ let target = this._element.id,
64
+ button = document.querySelector('[data-vg-target="'+ target +'"]');
65
+
66
+ console.log(button)
67
+
68
+ if (!button) {
69
+ let textShowNum = '', btnTextShow = this._params.text.show;
70
+
71
+ if (this._params.number) {
72
+ let sum = (this.total) - (this.count);
73
+
74
+ if (sum > 0) {
75
+ textShowNum = this._params.text.more + sum;
76
+ }
77
+ }
78
+
79
+ this._element.insertAdjacentHTML("afterend", '<div class="' + this._params.classes.button + '"><a href="#" aria-expanded="false" data-vg-target="#' + target + '" data-vg-toggle="rollup">' + btnTextShow + textShowNum + '</a></div>');
80
+ }
81
+ }
82
+ }
83
+
84
+ toggle(relatedTarget) {
85
+ return !this._isShown() ? this.show(relatedTarget) : this.hide();
86
+ }
87
+
88
+ show(relatedTarget) {
89
+ if (isDisabled(this._element)) return;
90
+
91
+ const showEvent = EventHandler.trigger(this._element, EVENT_KEY_SHOW, { relatedTarget })
92
+ if (showEvent.defaultPrevented) return;
93
+
94
+ this._element.classList.add(CLASS_NAME_SHOW);
95
+
96
+ const completeCallBack = () => {
97
+ if (this._params.content === 'elements') {
98
+ [... Selectors.findAll('.' + this._params.elements, this._element)].forEach(el => {
99
+ if (el.classList.contains(CLASS_NAME_HIDE)) {
100
+ el.classList.remove(CLASS_NAME_HIDE)
101
+ }
102
+ });
103
+ } else {
104
+ this._element.style.height = this.self_height + "px";
105
+ this._element.classList.remove(this._params.classes.fade);
106
+
107
+ if (this._element.classList.contains(this._params.classes.ellipsis)) {
108
+ this._element.classList.remove(this._params.classes.ellipsis)
109
+ }
110
+ }
111
+
112
+ relatedTarget.innerHTML = this._params.text.hide;
113
+
114
+ EventHandler.trigger(this._element, EVENT_KEY_SHOWN, { relatedTarget });
115
+ }
116
+
117
+ this._button = relatedTarget;
118
+ execute(this._params.callback.show, [this]);
119
+ this._queueCallback(completeCallBack, this._element, true, 50)
120
+ }
121
+
122
+ hide() {
123
+ if (isDisabled(this._element)) return;
124
+
125
+ const hideEvent = EventHandler.trigger(this._element, EVENT_KEY_HIDE);
126
+ if (hideEvent.defaultPrevented) return;
127
+
128
+ this._element.setAttribute('aria-expanded', 'false');
129
+
130
+ this.build(false)
131
+
132
+ const completeCallback = () => {
133
+ this._element.classList.remove(CLASS_NAME_SHOW);
134
+ EventHandler.trigger(this._element, EVENT_KEY_HIDDEN)
135
+ };
136
+
137
+ execute(this._params.callback.hide, [this]);
138
+ this._queueCallback(completeCallback, this._element, true);
139
+ }
140
+
141
+ _isShown() {
142
+ return this._element.classList.contains(CLASS_NAME_SHOW);
143
+ }
@@ -149,7 +149,7 @@ EventHandler.on(document, EVENT_KEY_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, functi
149
149
 
150
150
  this.setAttribute('aria-expanded', true);
151
151
  EventHandler.one(target, EVENT_KEY_HIDDEN, () => {
152
- if (isVisible(this)) this.focus();
152
+ //if (isVisible(this)) this.focus();
153
153
  this.setAttribute('aria-expanded', false);
154
154
  })
155
155
 
@@ -51,6 +51,11 @@ const isDisabled = element => {
51
51
  return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false'
52
52
  }
53
53
 
54
+ /**
55
+ * isVisible
56
+ * @param element
57
+ * @returns {boolean}
58
+ */
54
59
  function isVisible (element) {
55
60
  if (!isElement(element) || element.getClientRects().length === 0) {
56
61
  return false