vgapp 1.4.8 → 1.5.0
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/README.md +24 -2
- package/app/modules/base-module.js +14 -2
- package/app/modules/module-fn.js +5 -4
- package/app/modules/vgalert/js/vgalert.js +21 -1
- package/app/modules/vgalert/scss/vgalert.scss +48 -0
- package/app/modules/vgdropdown/js/vgdropdown.js +58 -27
- package/app/modules/vgfilepreview/js/renderers/video-modal.js +5 -1
- package/app/modules/vgfilepreview/js/renderers/video.js +6 -1
- package/app/modules/vgfilepreview/js/vgfilepreview.js +5 -1
- package/app/modules/vgfiles/js/base.js +29 -15
- package/app/modules/vgfiles/js/droppable.js +37 -31
- package/app/modules/vgfiles/js/vgfiles.js +10 -4
- package/app/modules/vgfiles/scss/_mixins.scss +12 -2
- package/app/modules/vgfiles/scss/_variables.scss +3 -1
- package/app/modules/vgfiles/scss/vgfiles.scss +55 -10
- package/app/modules/vgformsender/js/vgformsender.js +5 -2
- package/app/modules/vgloadmore/js/vgloadmore.js +35 -7
- package/app/modules/vgnestable/js/vgnestable.js +140 -0
- package/app/modules/vgnestable/scss/_variables.scss +16 -9
- package/app/modules/vgnestable/scss/vgnestable.scss +35 -2
- package/app/modules/vgtable/index.js +3 -0
- package/app/modules/vgtable/js/_columns.js +567 -0
- package/app/modules/vgtable/js/_expandable.js +242 -0
- package/app/modules/vgtable/js/_filters.js +264 -0
- package/app/modules/vgtable/js/_fixed-columns.js +249 -0
- package/app/modules/vgtable/js/_i18n.js +75 -0
- package/app/modules/vgtable/js/_options.js +428 -0
- package/app/modules/vgtable/js/_pagination.js +491 -0
- package/app/modules/vgtable/js/_panning.js +124 -0
- package/app/modules/vgtable/js/_params-groups.js +21 -0
- package/app/modules/vgtable/js/_remote.js +395 -0
- package/app/modules/vgtable/js/_row-reorder.js +268 -0
- package/app/modules/vgtable/js/_search.js +134 -0
- package/app/modules/vgtable/js/_selection.js +113 -0
- package/app/modules/vgtable/js/_skeleton.js +123 -0
- package/app/modules/vgtable/js/_sorting.js +340 -0
- package/app/modules/vgtable/js/_states.js +143 -0
- package/app/modules/vgtable/js/_sticky-header.js +218 -0
- package/app/modules/vgtable/js/_url-state.js +178 -0
- package/app/modules/vgtable/js/vgtable.js +1444 -0
- package/app/modules/vgtable/readme.md +922 -0
- package/app/modules/vgtable/scss/_columns.scss +52 -0
- package/app/modules/vgtable/scss/_expandable.scss +54 -0
- package/app/modules/vgtable/scss/_fixed-columns.scss +117 -0
- package/app/modules/vgtable/scss/_pagination.scss +191 -0
- package/app/modules/vgtable/scss/_row-reorder.scss +45 -0
- package/app/modules/vgtable/scss/_skeleton.scss +65 -0
- package/app/modules/vgtable/scss/_sorting.scss +89 -0
- package/app/modules/vgtable/scss/_states.scss +70 -0
- package/app/modules/vgtable/scss/_sticky-header.scss +127 -0
- package/app/modules/vgtable/scss/_variables.scss +296 -0
- package/app/modules/vgtable/scss/vgtable.scss +206 -0
- package/app/utils/js/components/placement.js +64 -10
- package/app/vgapp.js +3 -3
- package/build/vgapp.css +1 -1
- package/build/vgapp.css.map +1 -1
- package/build/vgapp.js +1 -1
- package/build/vgapp.js.map +1 -1
- package/index.js +1 -1
- package/index.scss +3 -3
- package/package.json +4 -4
- package/app/modules/vgdynamictable/index.js +0 -4
- package/app/modules/vgdynamictable/js/editable.js +0 -438
- package/app/modules/vgdynamictable/js/expandable.js +0 -248
- package/app/modules/vgdynamictable/js/filters.js +0 -450
- package/app/modules/vgdynamictable/js/fixed.js +0 -566
- package/app/modules/vgdynamictable/js/options.js +0 -650
- package/app/modules/vgdynamictable/js/pagination.js +0 -623
- package/app/modules/vgdynamictable/js/search.js +0 -82
- package/app/modules/vgdynamictable/js/skeleton.js +0 -144
- package/app/modules/vgdynamictable/js/sortable.js +0 -442
- package/app/modules/vgdynamictable/js/summary-footer.js +0 -284
- package/app/modules/vgdynamictable/js/table-remote.js +0 -821
- package/app/modules/vgdynamictable/js/table-state.js +0 -243
- package/app/modules/vgdynamictable/js/table-url-state.js +0 -444
- package/app/modules/vgdynamictable/js/utils/common.js +0 -48
- package/app/modules/vgdynamictable/js/vgdynamictable.js +0 -3870
- package/app/modules/vgdynamictable/js/viewport.js +0 -322
- package/app/modules/vgdynamictable/readme.md +0 -251
- package/app/modules/vgdynamictable/scss/_actions.scss +0 -196
- package/app/modules/vgdynamictable/scss/_pagination.scss +0 -186
- package/app/modules/vgdynamictable/scss/_skeleton.scss +0 -63
- package/app/modules/vgdynamictable/scss/_sortable.scss +0 -66
- package/app/modules/vgdynamictable/scss/_table.scss +0 -137
- package/app/modules/vgdynamictable/scss/_variables.scss +0 -138
- package/app/modules/vgdynamictable/scss/vgdynamictable.scss +0 -264
|
@@ -1,12 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Описание: Управляет локальными и smartdrop-событиями файловых dropzone VGFiles.
|
|
3
|
+
* Возможности: Отличает внешнее добавление файлов от внутренней сортировки, подсвечивает активную зону и передаёт файлы input-элементу.
|
|
4
|
+
*/
|
|
1
5
|
import { isElement } from "../../../utils/js/functions";
|
|
2
6
|
import EventHandler from "../../../utils/js/dom/event";
|
|
3
7
|
import Selectors from "../../../utils/js/dom/selectors";
|
|
4
8
|
import { Classes } from "../../../utils/js/dom/manipulator";
|
|
5
9
|
import BaseModule from "../../base-module";
|
|
6
10
|
|
|
7
|
-
const CLASS_NAME_CONTAINER = 'vg-files';
|
|
8
|
-
const CLASS_NAME_DROP = `${CLASS_NAME_CONTAINER}-drop`;
|
|
9
|
-
const CLASS_NAME_DROP_LIST = `${CLASS_NAME_DROP}--list`;
|
|
11
|
+
const CLASS_NAME_CONTAINER = 'vg-files';
|
|
12
|
+
const CLASS_NAME_DROP = `${CLASS_NAME_CONTAINER}-drop`;
|
|
13
|
+
const CLASS_NAME_DROP_LIST = `${CLASS_NAME_DROP}--list`;
|
|
10
14
|
|
|
11
15
|
const CLASS_NAME_DROP_ACTIVE = 'drop-active';
|
|
12
16
|
const CLASS_NAME_DROP_HOVER = 'drop-hover';
|
|
@@ -59,34 +63,24 @@ class VGFilesDroppable extends BaseModule {
|
|
|
59
63
|
/**
|
|
60
64
|
* Настройка событий перетаскивания
|
|
61
65
|
*/
|
|
62
|
-
_setupEvents() {
|
|
63
|
-
if (!isElement(this._element)) return;
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
};
|
|
74
|
-
|
|
75
|
-
EventHandler.on(this._element, `click.${NAME_KEY}`, (e) => {
|
|
76
|
-
if (this._element.tagName !== 'LABEL') return;
|
|
77
|
-
|
|
78
|
-
const fileList = e.target?.closest?.(`.${CLASS_NAME_DROP_LIST}`);
|
|
79
|
-
if (fileList && this._element.contains(fileList)) {
|
|
80
|
-
e.preventDefault();
|
|
81
|
-
}
|
|
82
|
-
});
|
|
66
|
+
_setupEvents() {
|
|
67
|
+
if (!isElement(this._element)) return;
|
|
68
|
+
|
|
69
|
+
EventHandler.on(this._element, `click.${NAME_KEY}`, (e) => {
|
|
70
|
+
if (this._element.tagName !== 'LABEL') return;
|
|
71
|
+
|
|
72
|
+
const fileList = e.target?.closest?.(`.${CLASS_NAME_DROP_LIST}`);
|
|
73
|
+
if (fileList && this._element.contains(fileList)) {
|
|
74
|
+
e.preventDefault();
|
|
75
|
+
}
|
|
76
|
+
});
|
|
83
77
|
|
|
84
78
|
EventHandler.on(this._element, 'dragover', (e) => {
|
|
85
79
|
e.preventDefault();
|
|
86
80
|
e.stopPropagation();
|
|
87
81
|
|
|
88
82
|
// ✅ Сортировка: НЕ подсвечиваем dropzone
|
|
89
|
-
if (
|
|
83
|
+
if (this._isSortableDrag(e)) {
|
|
90
84
|
Classes.remove(this._element, [CLASS_NAME_DROP_ACTIVE, CLASS_NAME_DROP_HOVER]);
|
|
91
85
|
VGFilesDroppable._setDropMessageTitleState(this._element, false);
|
|
92
86
|
e.dataTransfer.dropEffect = 'none';
|
|
@@ -103,7 +97,7 @@ class VGFilesDroppable extends BaseModule {
|
|
|
103
97
|
e.stopPropagation();
|
|
104
98
|
|
|
105
99
|
// ✅ Сортировка: НЕ подсвечиваем dropzone
|
|
106
|
-
if (
|
|
100
|
+
if (this._isSortableDrag(e)) {
|
|
107
101
|
Classes.remove(this._element, [CLASS_NAME_DROP_ACTIVE, CLASS_NAME_DROP_HOVER]);
|
|
108
102
|
VGFilesDroppable._setDropMessageTitleState(this._element, false);
|
|
109
103
|
return;
|
|
@@ -118,7 +112,7 @@ class VGFilesDroppable extends BaseModule {
|
|
|
118
112
|
e.stopPropagation();
|
|
119
113
|
|
|
120
114
|
// ✅ Сортировка: гарантированно без подсветки
|
|
121
|
-
if (
|
|
115
|
+
if (this._isSortableDrag(e)) {
|
|
122
116
|
Classes.remove(this._element, [CLASS_NAME_DROP_ACTIVE, CLASS_NAME_DROP_HOVER]);
|
|
123
117
|
VGFilesDroppable._setDropMessageTitleState(this._element, false);
|
|
124
118
|
return;
|
|
@@ -143,7 +137,7 @@ class VGFilesDroppable extends BaseModule {
|
|
|
143
137
|
VGFilesDroppable._setDropMessageTitleState(this._element, false);
|
|
144
138
|
|
|
145
139
|
// ✅ сортировка: не трогаем input
|
|
146
|
-
if (
|
|
140
|
+
if (this._isSortableDrag(e)) {
|
|
147
141
|
return;
|
|
148
142
|
}
|
|
149
143
|
|
|
@@ -238,6 +232,8 @@ class VGFilesDroppable extends BaseModule {
|
|
|
238
232
|
|
|
239
233
|
_isFileDrag(e) {
|
|
240
234
|
try {
|
|
235
|
+
if (this._isSortableDrag(e)) return false;
|
|
236
|
+
|
|
241
237
|
const dt = e?.dataTransfer;
|
|
242
238
|
if (!dt) return false;
|
|
243
239
|
|
|
@@ -257,6 +253,16 @@ class VGFilesDroppable extends BaseModule {
|
|
|
257
253
|
}
|
|
258
254
|
}
|
|
259
255
|
|
|
256
|
+
_isSortableDrag(e) {
|
|
257
|
+
if (document.querySelector('.dragging')) return true;
|
|
258
|
+
|
|
259
|
+
try {
|
|
260
|
+
return (e?.dataTransfer?.getData?.('text/plain') || '') === 'vgsortable';
|
|
261
|
+
} catch (_) {
|
|
262
|
+
return false;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
|
|
260
266
|
_getVisibleDropZonesInViewport() {
|
|
261
267
|
const dropZones = Array.from(Selectors.findAll(`.${CLASS_NAME_DROP}`) || []);
|
|
262
268
|
return dropZones.filter((el) => this._isVisibleInViewport(el));
|
|
@@ -334,9 +340,9 @@ class VGFilesDroppable extends BaseModule {
|
|
|
334
340
|
return this._files;
|
|
335
341
|
}
|
|
336
342
|
|
|
337
|
-
dispose() {
|
|
338
|
-
EventHandler.off(this._element, `click.${NAME_KEY}`);
|
|
339
|
-
EventHandler.off(this._element, 'dragover');
|
|
343
|
+
dispose() {
|
|
344
|
+
EventHandler.off(this._element, `click.${NAME_KEY}`);
|
|
345
|
+
EventHandler.off(this._element, 'dragover');
|
|
340
346
|
EventHandler.off(this._element, 'dragenter');
|
|
341
347
|
EventHandler.off(this._element, 'dragleave');
|
|
342
348
|
EventHandler.off(this._element, 'drop');
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Описание: основной класс выбора, отображения и AJAX-загрузки файлов VGFiles.
|
|
3
|
+
* Возможности: управляет списками и dropzone, прогрессом, кастомными действиями, удалением, повторной загрузкой и сортировкой.
|
|
4
|
+
*/
|
|
1
5
|
import VGFilesBase from "./base";
|
|
2
6
|
import FileUploader from "./loader";
|
|
3
7
|
import VGFilesDroppable from "./droppable";
|
|
@@ -43,8 +47,11 @@ class VGFiles extends VGFilesBase {
|
|
|
43
47
|
prepend: true,
|
|
44
48
|
replace: true,
|
|
45
49
|
rename: false,
|
|
46
|
-
smartdrop: false,
|
|
47
|
-
|
|
50
|
+
smartdrop: false,
|
|
51
|
+
customButtons: {
|
|
52
|
+
hideOnUploadState: true
|
|
53
|
+
},
|
|
54
|
+
uploads: {
|
|
48
55
|
mode: 'sequential',
|
|
49
56
|
route: '',
|
|
50
57
|
maxParallel: 3,
|
|
@@ -810,8 +817,7 @@ class VGFiles extends VGFilesBase {
|
|
|
810
817
|
}
|
|
811
818
|
|
|
812
819
|
_setButtonElement(file, isAjax = false, status = '') {
|
|
813
|
-
let icon = getSVG('
|
|
814
|
-
if (!this._params.info) icon = getSVG('cross');
|
|
820
|
+
let icon = getSVG('remove'), action = 'data-vg-dismiss';
|
|
815
821
|
if (isAjax) {
|
|
816
822
|
icon = getSVG('spinner');
|
|
817
823
|
if (status === 'completed') icon = getSVG('check');
|
|
@@ -23,8 +23,18 @@
|
|
|
23
23
|
}
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
-
@mixin vgfiles-state() {
|
|
27
|
-
&.
|
|
26
|
+
@mixin vgfiles-state() {
|
|
27
|
+
&.hide-custom-buttons-on-upload-state {
|
|
28
|
+
&.pending,
|
|
29
|
+
&.loading,
|
|
30
|
+
&.failing {
|
|
31
|
+
.file-actions {
|
|
32
|
+
display: none;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
&.pending {
|
|
28
38
|
> * {
|
|
29
39
|
opacity: .32;
|
|
30
40
|
pointer-events: none;
|
|
@@ -52,9 +52,11 @@ $files-map: (
|
|
|
52
52
|
drop-file-flex: calc(25% - 6px),
|
|
53
53
|
|
|
54
54
|
drop-remove-offset: 10px,
|
|
55
|
-
drop-remove-size:
|
|
55
|
+
drop-remove-size: 28px,
|
|
56
56
|
drop-remove-radius: 3px,
|
|
57
57
|
drop-remove-hover-bg: rgb(var(--vg-body-bg-rgb, 255 255 255) / .4),
|
|
58
|
+
drop-actions-gap: 4px,
|
|
59
|
+
drop-control-icon-size: 16px,
|
|
58
60
|
|
|
59
61
|
// stat
|
|
60
62
|
stat-padding: 12px 8px,
|
|
@@ -48,6 +48,7 @@
|
|
|
48
48
|
|
|
49
49
|
svg {
|
|
50
50
|
width: 24px;
|
|
51
|
+
height: 24px;
|
|
51
52
|
|
|
52
53
|
path {
|
|
53
54
|
fill: var(--vg-files-label-color);
|
|
@@ -195,7 +196,7 @@
|
|
|
195
196
|
.stat-label {
|
|
196
197
|
svg {
|
|
197
198
|
path {
|
|
198
|
-
fill: var(--vg-
|
|
199
|
+
fill: var(--vg-text-color);
|
|
199
200
|
}
|
|
200
201
|
}
|
|
201
202
|
}
|
|
@@ -261,7 +262,7 @@
|
|
|
261
262
|
}
|
|
262
263
|
|
|
263
264
|
.file {
|
|
264
|
-
--vg-button-color: var(--vg-secondary);
|
|
265
|
+
--vg-button-color: var(--vg-secondary-color, var(--vg-secondary, var(--vg-text-muted-color, #6b7280)));
|
|
265
266
|
display: flex;
|
|
266
267
|
align-items: center;
|
|
267
268
|
gap: var(--vg-files-info-gap);
|
|
@@ -434,7 +435,7 @@
|
|
|
434
435
|
position: relative;
|
|
435
436
|
|
|
436
437
|
&:hover {
|
|
437
|
-
--vg-button-color: var(--vg-danger);
|
|
438
|
+
--vg-button-color: var(--vg-danger-color, var(--vg-danger, #ff2a2c));
|
|
438
439
|
}
|
|
439
440
|
|
|
440
441
|
i {
|
|
@@ -531,6 +532,7 @@
|
|
|
531
532
|
}
|
|
532
533
|
|
|
533
534
|
&-drop {
|
|
535
|
+
display: block;
|
|
534
536
|
background-color: var(--vg-files-drop-bg);
|
|
535
537
|
border: var(--vg-files-drop-border-width) var(--vg-files-drop-border-style) var(--vg-files-drop-border-color);
|
|
536
538
|
cursor: pointer;
|
|
@@ -548,6 +550,14 @@
|
|
|
548
550
|
height: auto;
|
|
549
551
|
min-height: var(--vg-files-drop-height);
|
|
550
552
|
|
|
553
|
+
&:has(.vg-files-drop-message.has-files) {
|
|
554
|
+
cursor: default;
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
.vg-files-drop-message.has-files {
|
|
558
|
+
cursor: pointer;
|
|
559
|
+
}
|
|
560
|
+
|
|
551
561
|
&:hover {
|
|
552
562
|
animation: none;
|
|
553
563
|
background-image: none;
|
|
@@ -637,7 +647,7 @@
|
|
|
637
647
|
overflow: hidden;
|
|
638
648
|
|
|
639
649
|
.file {
|
|
640
|
-
--vg-button-color: var(--vg-body-color);
|
|
650
|
+
--vg-button-color: var(--vg-text-color, var(--vg-body-color, #000000));
|
|
641
651
|
border-radius: var(--vg-files-drop-file-radius);
|
|
642
652
|
position: relative;
|
|
643
653
|
overflow: hidden;
|
|
@@ -708,7 +718,33 @@
|
|
|
708
718
|
top: var(--vg-files-drop-remove-offset);
|
|
709
719
|
display: flex;
|
|
710
720
|
flex-direction: column;
|
|
711
|
-
|
|
721
|
+
align-items: flex-end;
|
|
722
|
+
gap: var(--vg-files-drop-actions-gap);
|
|
723
|
+
opacity: .2;
|
|
724
|
+
transform: var(--vg-transition-base);
|
|
725
|
+
|
|
726
|
+
.file-actions {
|
|
727
|
+
display: flex;
|
|
728
|
+
flex-direction: column;
|
|
729
|
+
align-items: center;
|
|
730
|
+
gap: var(--vg-files-drop-actions-gap);
|
|
731
|
+
|
|
732
|
+
button {
|
|
733
|
+
width: var(--vg-files-drop-remove-size);
|
|
734
|
+
height: var(--vg-files-drop-remove-size);
|
|
735
|
+
min-width: var(--vg-files-drop-remove-size);
|
|
736
|
+
min-height: var(--vg-files-drop-remove-size);
|
|
737
|
+
max-width: var(--vg-files-drop-remove-size);
|
|
738
|
+
max-height: var(--vg-files-drop-remove-size);
|
|
739
|
+
padding: 0;
|
|
740
|
+
justify-content: center;
|
|
741
|
+
|
|
742
|
+
svg {
|
|
743
|
+
width: var(--vg-files-drop-control-icon-size);
|
|
744
|
+
height: var(--vg-files-drop-control-icon-size);
|
|
745
|
+
}
|
|
746
|
+
}
|
|
747
|
+
}
|
|
712
748
|
|
|
713
749
|
.file-remove {
|
|
714
750
|
.file-failing-actions {
|
|
@@ -717,7 +753,7 @@
|
|
|
717
753
|
|
|
718
754
|
button {
|
|
719
755
|
background: var(--vg-body-bg);
|
|
720
|
-
color: var(--vg-body-color);
|
|
756
|
+
color: var(--vg-text-color, var(--vg-body-color, #000000));
|
|
721
757
|
border: none;
|
|
722
758
|
cursor: pointer;
|
|
723
759
|
outline: none;
|
|
@@ -729,12 +765,12 @@
|
|
|
729
765
|
position: relative;
|
|
730
766
|
width: var(--vg-files-drop-remove-size);
|
|
731
767
|
height: var(--vg-files-drop-remove-size);
|
|
768
|
+
min-width: var(--vg-files-drop-remove-size);
|
|
769
|
+
min-height: var(--vg-files-drop-remove-size);
|
|
770
|
+
max-width: var(--vg-files-drop-remove-size);
|
|
771
|
+
max-height: var(--vg-files-drop-remove-size);
|
|
732
772
|
border-radius: var(--vg-files-drop-remove-radius);
|
|
733
773
|
|
|
734
|
-
&:hover {
|
|
735
|
-
background-color: var(--vg-files-drop-remove-hover-bg);
|
|
736
|
-
}
|
|
737
|
-
|
|
738
774
|
i {
|
|
739
775
|
position: absolute;
|
|
740
776
|
left: 0;
|
|
@@ -746,6 +782,9 @@
|
|
|
746
782
|
justify-content: center;
|
|
747
783
|
|
|
748
784
|
svg {
|
|
785
|
+
width: var(--vg-files-drop-control-icon-size);
|
|
786
|
+
height: var(--vg-files-drop-control-icon-size);
|
|
787
|
+
|
|
749
788
|
path {
|
|
750
789
|
fill: var(--vg-button-color);
|
|
751
790
|
}
|
|
@@ -754,6 +793,12 @@
|
|
|
754
793
|
}
|
|
755
794
|
}
|
|
756
795
|
}
|
|
796
|
+
|
|
797
|
+
&:hover {
|
|
798
|
+
.file-custom {
|
|
799
|
+
opacity: 1;
|
|
800
|
+
}
|
|
801
|
+
}
|
|
757
802
|
}
|
|
758
803
|
}
|
|
759
804
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
2
|
* VGFormSender Module
|
|
3
3
|
*
|
|
4
4
|
* Этот модуль отвечает за отправку форм с поддержкой AJAX, валидации, отображения уведомлений
|
|
@@ -702,7 +702,10 @@ class VGFormSender extends BaseModule {
|
|
|
702
702
|
$collapse.classList.add(_this._params.classes.alertCollapse);
|
|
703
703
|
$collapse.classList.add('vg-collapse');
|
|
704
704
|
$collapse.id = _this._params.classes.general + '-' + makeRandomString();
|
|
705
|
-
|
|
705
|
+
|
|
706
|
+
const $alert = _this.setDataRelationStatus($collapse, status, data, 'collapse');
|
|
707
|
+
$alert.classList.add(CLASS_NAME_ALERT, CLASS_NAME_ALERT + '-' + status);
|
|
708
|
+
$collapse.append($alert);
|
|
706
709
|
|
|
707
710
|
_this._element.prepend($collapse);
|
|
708
711
|
}
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Описание: подгрузка статического и удалённого контента по кнопке или при прокрутке.
|
|
3
|
+
* Возможности: Data API, AJAX-пагинация, infinite scroll, события, анимация и автоcкрытие триггера.
|
|
4
|
+
*/
|
|
1
5
|
import BaseModule from "../../base-module";
|
|
2
6
|
import EventHandler from "../../../utils/js/dom/event";
|
|
3
7
|
import { execute, isObject, mergeDeepObject, normalizeData } from "../../../utils/js/functions";
|
|
@@ -213,7 +217,7 @@ class VGLoadMore extends BaseModule {
|
|
|
213
217
|
|
|
214
218
|
const buttonData = {
|
|
215
219
|
limit: this._params.limit,
|
|
216
|
-
offset: this._params.offset,
|
|
220
|
+
offset: this._params.offset || this._params.limit,
|
|
217
221
|
output: this._params.output,
|
|
218
222
|
autohide: this._params.autohide,
|
|
219
223
|
animate: this._params.animate,
|
|
@@ -278,7 +282,7 @@ class VGLoadMore extends BaseModule {
|
|
|
278
282
|
|
|
279
283
|
this._observer.disconnect();
|
|
280
284
|
|
|
281
|
-
const container =
|
|
285
|
+
const container = this._getTargetContainer();
|
|
282
286
|
const items = Selectors.findAll(`.${this._params.elements}`, container);
|
|
283
287
|
const visibleItems = items.filter(item => item.classList.contains(CLASS_NAME_SHOW));
|
|
284
288
|
const lastVisible = visibleItems[visibleItems.length - 1];
|
|
@@ -331,7 +335,10 @@ class VGLoadMore extends BaseModule {
|
|
|
331
335
|
|
|
332
336
|
const originalText = this._params.button.text;
|
|
333
337
|
|
|
334
|
-
this._params.ajax.data =
|
|
338
|
+
this._params.ajax.data = mergeDeepObject(this._params.ajax.data, {
|
|
339
|
+
limit: this._params.limit,
|
|
340
|
+
offset: this._params.offset
|
|
341
|
+
});
|
|
335
342
|
|
|
336
343
|
this._route((status, data, responseTarget) => {
|
|
337
344
|
if (status === 'error' || typeof data?.response !== 'string') return;
|
|
@@ -348,7 +355,7 @@ class VGLoadMore extends BaseModule {
|
|
|
348
355
|
this._observeLastVisibleItem();
|
|
349
356
|
|
|
350
357
|
const noMoreData = !data.response.trim();
|
|
351
|
-
if (this._params.autohide &&
|
|
358
|
+
if (this._params.autohide && noMoreData) {
|
|
352
359
|
this._autohideTrigger();
|
|
353
360
|
}
|
|
354
361
|
|
|
@@ -366,7 +373,7 @@ class VGLoadMore extends BaseModule {
|
|
|
366
373
|
* @private
|
|
367
374
|
*/
|
|
368
375
|
staticLoad(callback) {
|
|
369
|
-
const container =
|
|
376
|
+
const container = this._getTargetContainer();
|
|
370
377
|
const items = Selectors.findAll(`.${this._params.elements}`, container);
|
|
371
378
|
const start = this._params.offset;
|
|
372
379
|
const end = start + this._params.limit;
|
|
@@ -394,14 +401,32 @@ class VGLoadMore extends BaseModule {
|
|
|
394
401
|
this._observeLastVisibleItem();
|
|
395
402
|
|
|
396
403
|
const remaining = items.slice(end);
|
|
397
|
-
if (this._params.autohide &&
|
|
404
|
+
if (this._params.autohide && remaining.length === 0) {
|
|
398
405
|
this._autohideTrigger();
|
|
399
406
|
}
|
|
400
407
|
|
|
401
408
|
this._restoreElementState(this._params.button.text);
|
|
409
|
+
EventHandler.trigger(this._element, EVENT_KEY_LOADED, {
|
|
410
|
+
stats: 'success',
|
|
411
|
+
data: {
|
|
412
|
+
items: newItems,
|
|
413
|
+
offset: this._params.offset,
|
|
414
|
+
remaining: remaining.length
|
|
415
|
+
}
|
|
416
|
+
});
|
|
402
417
|
execute(callback, [this, this._element]);
|
|
403
418
|
}
|
|
404
419
|
|
|
420
|
+
/**
|
|
421
|
+
* Возвращает контейнер элементов для container- и trigger-режимов.
|
|
422
|
+
* @returns {Element|null}
|
|
423
|
+
* @private
|
|
424
|
+
*/
|
|
425
|
+
_getTargetContainer() {
|
|
426
|
+
return Selectors.find(this._params.target)
|
|
427
|
+
|| (this._isToggleElement ? this._element.parentNode : this._element);
|
|
428
|
+
}
|
|
429
|
+
|
|
405
430
|
/**
|
|
406
431
|
* Восстанавливает состояние кнопки (включает, устанавливает текст)
|
|
407
432
|
* @param {string} text - Текст кнопки
|
|
@@ -425,6 +450,9 @@ class VGLoadMore extends BaseModule {
|
|
|
425
450
|
this._observer = null;
|
|
426
451
|
} else if (this._params.detach && this._element.parentNode) {
|
|
427
452
|
this._element.remove();
|
|
453
|
+
} else {
|
|
454
|
+
this._element.classList.add(CLASS_NAME_HIDE);
|
|
455
|
+
this._element.setAttribute('aria-hidden', 'true');
|
|
428
456
|
}
|
|
429
457
|
}
|
|
430
458
|
|
|
@@ -456,4 +484,4 @@ EventHandler.on(document, EVENT_KEY_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, functi
|
|
|
456
484
|
VGLoadMore.getOrCreateInstance(this).toggle();
|
|
457
485
|
});
|
|
458
486
|
|
|
459
|
-
export default VGLoadMore;
|
|
487
|
+
export default VGLoadMore;
|