vgapp 0.2.4 → 0.2.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.
@@ -1,8 +1,7 @@
1
1
  import BaseModule from "../../base-module";
2
- import {execute, isDisabled, isVisible, mergeDeepObject, noop} from "../../../utils/js/functions";
2
+ import {execute, isDisabled, mergeDeepObject} from "../../../utils/js/functions";
3
3
  import EventHandler from "../../../utils/js/dom/event";
4
4
  import Selectors from "../../../utils/js/dom/selectors";
5
- import {Manipulator} from "../../../utils/js/dom/manipulator";
6
5
 
7
6
  /**
8
7
  * Constants
@@ -10,13 +9,11 @@ import {Manipulator} from "../../../utils/js/dom/manipulator";
10
9
  const NAME = 'rollup';
11
10
  const NAME_KEY = 'vg.rollup';
12
11
  const CLASS_NAME_SHOW = 'show';
13
- const CLASS_NAME_HIDE = 'd-none';
12
+ const CLASS_NAME_HIDE = 'vg-rollup-display--none';
14
13
  const SELECTOR_DATA_TOGGLE= '[data-vg-toggle="rollup"]'
15
14
 
16
15
  const EVENT_KEY_HIDE = `${NAME_KEY}.hide`;
17
- const EVENT_KEY_HIDDEN = `${NAME_KEY}.hidden`;
18
16
  const EVENT_KEY_SHOW = `${NAME_KEY}.show`;
19
- const EVENT_KEY_SHOWN = `${NAME_KEY}.shown`;
20
17
 
21
18
  const EVENT_KEY_CLICK_DATA_API = `click.${NAME_KEY}.data.api`;
22
19
 
@@ -25,10 +22,44 @@ class VGRollup extends BaseModule {
25
22
  super(element, params);
26
23
 
27
24
  this._params = this._getParams(element, mergeDeepObject({
28
-
25
+ content: 'text',
26
+ offset: 0,
27
+ cnt: 0,
28
+ fade: true,
29
+ transition: false,
30
+ number: false,
31
+ height: 0,
32
+ ellipsis: {
33
+ line: null
34
+ },
35
+ more: ' еще ',
36
+ button: {
37
+ enable: true,
38
+ more: "Показать",
39
+ less: "Свернуть"
40
+ }
29
41
  }, params));
30
42
 
43
+ this.classes = {
44
+ container: 'vg-rollup',
45
+ hidden: "vg-rollup-content--hidden",
46
+ fade: "vg-rollup-content--fade",
47
+ ellipsis: "vg-rollup-content--ellipsis",
48
+ button: "vg-rollup-content--button",
49
+ transition: "vg-rollup-content--transition"
50
+ };
51
+
52
+ this.total = 0;
53
+ this.count = 0;
54
+ this.offset = 0;
55
+ this.isOffset = false;
56
+
57
+ if (this._params.offset > 0) {
58
+ this.offset = (this._params.offset + this._params.cnt) || 0;
59
+ this.isOffset = true;
60
+ }
31
61
 
62
+ this.build();
32
63
  }
33
64
 
34
65
  static get NAME() {
@@ -39,19 +70,180 @@ class VGRollup extends BaseModule {
39
70
  return NAME_KEY
40
71
  }
41
72
 
42
- build() {
73
+ static toggle(target, relatedTarget) {
74
+ const instance = VGRollup.getOrCreateInstance(target);
75
+ let isShown = instance.isShow();
76
+
77
+ if (!isShown) {
78
+ instance._element.classList.add(CLASS_NAME_SHOW);
79
+ relatedTarget.innerHTML = instance._params.button.less;
80
+
81
+ if (instance.offset > 0) {
82
+ if (instance.isOffset) {
83
+ relatedTarget.innerHTML = instance._params.button.more;
84
+ } else {
85
+ relatedTarget.innerHTML = instance._params.button.less;
86
+ }
87
+ }
88
+
89
+ instance.switch(instance._element, false);
90
+ EventHandler.trigger(instance._element, EVENT_KEY_SHOW, { relatedTarget });
91
+ } else {
92
+ let textShowNum = '',
93
+ isShowNum = instance._params.number;
94
+
95
+
96
+ if (isShowNum) {
97
+ let sum = (instance.total) - (instance.count);
98
+
99
+ if (sum > 0) {
100
+ textShowNum = instance._params.more + sum;
101
+ }
102
+ }
43
103
 
104
+ relatedTarget.setAttribute("aria-expanded", false);
105
+ instance._element.classList.remove(CLASS_NAME_SHOW);
106
+ relatedTarget.innerHTML = instance._params.button.more + textShowNum;
107
+ instance.switch(instance._element, true);
108
+
109
+ EventHandler.trigger(instance._element, EVENT_KEY_HIDE, { relatedTarget });
110
+ }
44
111
  }
45
112
 
46
- toggle(relatedTarget) {
47
- return !this._isShown() ? this.show(relatedTarget) : this.hide();
113
+ build(el = null, isButtonAppend = true) {
114
+ let _this = this,
115
+ element = el || _this._element,
116
+ self_height = element.clientHeight, set_height = _this._params.height || (self_height / 2);
117
+
118
+ element.classList.add(_this.classes.container)
119
+
120
+ let isFade = _this._params.fade,
121
+ isTransition = _this._params.transition,
122
+ isEllipsis = _this._params.ellipsis.line !== null,
123
+ isButton = _this._params.button.enable,
124
+ isShowNum = _this._params.number;
125
+
126
+ if (!isButtonAppend) _this.switch(element);
127
+
128
+ if (self_height > set_height && _this._params.content === 'text') {
129
+ element.classList.add(_this.classes.hidden);
130
+ element.style.height = set_height + "px";
131
+
132
+ ellipsis();
133
+ transition();
134
+ fade();
135
+ button();
136
+ } else if (_this._params.content === 'elements') {
137
+ let elementClass = _this._params.elements || 'item',
138
+ items = element.querySelectorAll('.' + elementClass),
139
+ cnt = _this._params.cnt || 5,
140
+ i = 1;
141
+
142
+ _this.total = items.length;
143
+ _this.count = cnt;
144
+
145
+ for (const item of items) {
146
+ if (i > cnt) {
147
+ item.classList.add(CLASS_NAME_HIDE)
148
+ }
149
+
150
+ i++;
151
+ }
152
+
153
+ if (isButton === true) isButton = (i - 1) > cnt;
154
+
155
+ ellipsis();
156
+ transition();
157
+ fade();
158
+ button();
159
+ }
160
+
161
+ function ellipsis() {
162
+ if (isEllipsis) {
163
+ let line = _this._params.ellipsis.line;
164
+ isFade = false;
165
+
166
+ if (line) {
167
+ element.classList.add(_this.classes.ellipsis);
168
+ element.style.webkitLineClamp = line;
169
+ } else {
170
+ console.log("Переменная [data-line] или параметр[line] не должны быть пустыми");
171
+ }
172
+ }
173
+ }
174
+
175
+ // TODO no work
176
+ function transition() {
177
+ if (isTransition) {
178
+ element.classList.add(_this.classes.transition);
179
+ }
180
+ }
181
+
182
+ function fade() {
183
+ if (isFade) {
184
+ element.classList.add(_this.classes.fade);
185
+ }
186
+ }
187
+
188
+ function button() {
189
+ if (isButtonAppend) {
190
+ element.setAttribute("id", element.id);
191
+
192
+ if (isButton) {
193
+ let textShowNum = '';
194
+
195
+ if (isShowNum) {
196
+ let sum = (_this.total) - (_this.count);
197
+
198
+ if (sum > 0) {
199
+ textShowNum = _this._params.more + sum;
200
+ }
201
+ }
202
+
203
+ let btnTextMore = _this._params.button.more;
204
+ element.insertAdjacentHTML("afterend", "<div class=\"" + _this.classes.button + "\"><a href=\"#\" aria-expanded=\"false\" data-vg-toggle=\"rollup\" data-vg-target=\"#" + element.id + "\">" + btnTextMore + textShowNum + "</a></div>");
205
+ }
206
+ }
207
+ }
48
208
  }
49
209
 
50
- show(relatedTarget) {
210
+ switch(el, switcher = false) {
211
+ const _this = this;
212
+
213
+ if (switcher) {
214
+ this.build(el, false);
215
+ } else {
216
+ el.classList.remove(this.classes.hidden);
217
+ el.classList.remove(this.classes.ellipsis);
218
+ el.classList.remove(this.classes.fade);
219
+
220
+ el.removeAttribute("style");
51
221
 
222
+ if (_this._params.content === 'elements') {
223
+ let className = _this._params.elements;
224
+
225
+ let items = [...el.querySelectorAll('.' + className)];
226
+ if (items.length) {
227
+ if (_this.offset > 0) {
228
+ let className = _this._params.elements,
229
+ items = [...el.querySelectorAll('.' + className)];
230
+
231
+ items.slice(_this.count, _this.offset).forEach(item => item.classList.remove(CLASS_NAME_HIDE));
232
+ _this.offset = _this.offset + _this.settings.offset;
233
+
234
+ if (_this.offset > items.length) {
235
+ _this.isOffset = false;
236
+ _this.offset = 0;
237
+ }
238
+ } else {
239
+ items.forEach((item) => item.classList.remove(CLASS_NAME_HIDE))
240
+ }
241
+ }
242
+ }
243
+ }
52
244
  }
53
245
 
54
- _isShown() {
246
+ isShow() {
55
247
  return this._element.classList.contains(CLASS_NAME_SHOW);
56
248
  }
57
249
 
@@ -59,10 +251,11 @@ class VGRollup extends BaseModule {
59
251
  * Инициализация
60
252
  * @param element
61
253
  * @param params
254
+ * @param callback
62
255
  */
63
- static init(element, params = {}) {
256
+ static init(element, params = {}, callback) {
64
257
  const instance = VGRollup.getOrCreateInstance(element, params);
65
- instance.toggle();
258
+ execute(callback, [instance]);
66
259
  }
67
260
  }
68
261
 
@@ -82,9 +275,7 @@ EventHandler.on(document, EVENT_KEY_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, functi
82
275
  }
83
276
 
84
277
  this.setAttribute('aria-expanded', true);
85
-
86
- const data = VGRollup.getOrCreateInstance(target)
87
- data.toggle(this);
278
+ VGRollup.toggle(target, this);
88
279
  });
89
280
 
90
281
 
@@ -1,41 +1,44 @@
1
- @charset "UTF-8";
2
- /**
3
- *--------------------------------------------------------------------------
4
- * Модуль: VGRollup
5
- * Автор: Vegas DEV
6
- * Лицензия: смотри LICENSE
7
- *--------------------------------------------------------------------------
8
- **/
9
- .vg-rollup {
10
- --vg-rollup-transition: all 0.5s ease-in-out ;
11
- --vg-rollup-fade-height: 100px ;
12
- --vg-rollup-fade-background: linear-gradient(180deg, rgba(255, 255, 255, 0) 0%, rgb(255, 255, 255) 100%) ;
13
- transform: var(--vg-rollup-transition);
14
- }
15
- .vg-rollup-button {
16
- --vg-rollup-button-align: center ;
17
- text-align: var(--vg-rollup-button-align);
18
- }
19
- .vg-rollup-content--hidden {
20
- overflow: hidden;
21
- }
22
- .vg-rollup-content--fade {
23
- position: relative;
24
- }
25
- .vg-rollup-content--fade:after {
26
- content: "";
27
- position: absolute;
28
- left: 0;
29
- bottom: 0;
30
- width: 100%;
31
- height: var(--vg-rollup-fade-height);
32
- background: var(--vg-rollup-fade-background);
33
- }
34
- .vg-rollup-content--ellipsis {
35
- overflow: hidden;
36
- text-overflow: ellipsis;
37
- display: -webkit-box;
38
- -webkit-box-orient: vertical;
39
- }
40
-
41
- /*# sourceMappingURL=vgrollup.css.map */
1
+ @charset "UTF-8";
2
+ /**
3
+ *--------------------------------------------------------------------------
4
+ * Модуль: VGRollup
5
+ * Автор: Vegas DEV
6
+ * Лицензия: смотри LICENSE
7
+ *--------------------------------------------------------------------------
8
+ **/
9
+ .vg-rollup {
10
+ --vg-rollup-transition: all 0.5s ease-in-out ;
11
+ --vg-rollup-fade-height: 100px ;
12
+ --vg-rollup-fade-background: linear-gradient(180deg, rgba(255, 255, 255, 0) 0%, rgb(255, 255, 255) 100%) ;
13
+ transform: var(--vg-rollup-transition);
14
+ }
15
+ .vg-rollup-button {
16
+ --vg-rollup-button-align: center ;
17
+ text-align: var(--vg-rollup-button-align);
18
+ }
19
+ .vg-rollup-content--hidden {
20
+ overflow: hidden;
21
+ }
22
+ .vg-rollup-content--fade {
23
+ position: relative;
24
+ }
25
+ .vg-rollup-content--fade:after {
26
+ content: "";
27
+ position: absolute;
28
+ left: 0;
29
+ bottom: 0;
30
+ width: 100%;
31
+ height: var(--vg-rollup-fade-height);
32
+ background: var(--vg-rollup-fade-background);
33
+ }
34
+ .vg-rollup-content--ellipsis {
35
+ overflow: hidden;
36
+ text-overflow: ellipsis;
37
+ display: -webkit-box;
38
+ -webkit-box-orient: vertical;
39
+ }
40
+ .vg-rollup-display--none {
41
+ display: none !important;
42
+ }
43
+
44
+ /*# sourceMappingURL=vgrollup.css.map */
@@ -1 +1 @@
1
- {"version":3,"sourceRoot":"","sources":["vgrollup.scss","../../../utils/scss/mixin.scss"],"names":[],"mappings":";AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAaA;ECNG;EAAA;EAAA;EDQF;;AAEA;ECVE;EDYD;;AAIA;EACC;;AAGD;EACC;;AAEA;EACC;EACA;EACA;EACA;EACA;EACA;EACA;;AAIF;EACC;EACA;EACA;EACA","file":"vgrollup.css"}
1
+ {"version":3,"sourceRoot":"","sources":["vgrollup.scss","../../../utils/scss/mixin.scss"],"names":[],"mappings":";AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAaA;ECNG;EAAA;EAAA;EDQF;;AAEA;ECVE;EDYD;;AAIA;EACC;;AAGD;EACC;;AAEA;EACC;EACA;EACA;EACA;EACA;EACA;EACA;;AAIF;EACC;EACA;EACA;EACA;;AAKD;EACC","file":"vgrollup.css"}
@@ -46,4 +46,10 @@
46
46
  -webkit-box-orient: vertical;
47
47
  }
48
48
  }
49
+
50
+ &-display {
51
+ &--none {
52
+ display: none !important;
53
+ }
54
+ }
49
55
  }