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.
Files changed (86) hide show
  1. package/README.md +24 -2
  2. package/app/modules/base-module.js +14 -2
  3. package/app/modules/module-fn.js +5 -4
  4. package/app/modules/vgalert/js/vgalert.js +21 -1
  5. package/app/modules/vgalert/scss/vgalert.scss +48 -0
  6. package/app/modules/vgdropdown/js/vgdropdown.js +58 -27
  7. package/app/modules/vgfilepreview/js/renderers/video-modal.js +5 -1
  8. package/app/modules/vgfilepreview/js/renderers/video.js +6 -1
  9. package/app/modules/vgfilepreview/js/vgfilepreview.js +5 -1
  10. package/app/modules/vgfiles/js/base.js +29 -15
  11. package/app/modules/vgfiles/js/droppable.js +37 -31
  12. package/app/modules/vgfiles/js/vgfiles.js +10 -4
  13. package/app/modules/vgfiles/scss/_mixins.scss +12 -2
  14. package/app/modules/vgfiles/scss/_variables.scss +3 -1
  15. package/app/modules/vgfiles/scss/vgfiles.scss +55 -10
  16. package/app/modules/vgformsender/js/vgformsender.js +5 -2
  17. package/app/modules/vgloadmore/js/vgloadmore.js +35 -7
  18. package/app/modules/vgnestable/js/vgnestable.js +140 -0
  19. package/app/modules/vgnestable/scss/_variables.scss +16 -9
  20. package/app/modules/vgnestable/scss/vgnestable.scss +35 -2
  21. package/app/modules/vgtable/index.js +3 -0
  22. package/app/modules/vgtable/js/_columns.js +567 -0
  23. package/app/modules/vgtable/js/_expandable.js +242 -0
  24. package/app/modules/vgtable/js/_filters.js +264 -0
  25. package/app/modules/vgtable/js/_fixed-columns.js +249 -0
  26. package/app/modules/vgtable/js/_i18n.js +75 -0
  27. package/app/modules/vgtable/js/_options.js +428 -0
  28. package/app/modules/vgtable/js/_pagination.js +491 -0
  29. package/app/modules/vgtable/js/_panning.js +124 -0
  30. package/app/modules/vgtable/js/_params-groups.js +21 -0
  31. package/app/modules/vgtable/js/_remote.js +395 -0
  32. package/app/modules/vgtable/js/_row-reorder.js +268 -0
  33. package/app/modules/vgtable/js/_search.js +134 -0
  34. package/app/modules/vgtable/js/_selection.js +113 -0
  35. package/app/modules/vgtable/js/_skeleton.js +123 -0
  36. package/app/modules/vgtable/js/_sorting.js +340 -0
  37. package/app/modules/vgtable/js/_states.js +143 -0
  38. package/app/modules/vgtable/js/_sticky-header.js +218 -0
  39. package/app/modules/vgtable/js/_url-state.js +178 -0
  40. package/app/modules/vgtable/js/vgtable.js +1444 -0
  41. package/app/modules/vgtable/readme.md +922 -0
  42. package/app/modules/vgtable/scss/_columns.scss +52 -0
  43. package/app/modules/vgtable/scss/_expandable.scss +54 -0
  44. package/app/modules/vgtable/scss/_fixed-columns.scss +117 -0
  45. package/app/modules/vgtable/scss/_pagination.scss +191 -0
  46. package/app/modules/vgtable/scss/_row-reorder.scss +45 -0
  47. package/app/modules/vgtable/scss/_skeleton.scss +65 -0
  48. package/app/modules/vgtable/scss/_sorting.scss +89 -0
  49. package/app/modules/vgtable/scss/_states.scss +70 -0
  50. package/app/modules/vgtable/scss/_sticky-header.scss +127 -0
  51. package/app/modules/vgtable/scss/_variables.scss +296 -0
  52. package/app/modules/vgtable/scss/vgtable.scss +206 -0
  53. package/app/utils/js/components/placement.js +64 -10
  54. package/app/vgapp.js +3 -3
  55. package/build/vgapp.css +1 -1
  56. package/build/vgapp.css.map +1 -1
  57. package/build/vgapp.js +1 -1
  58. package/build/vgapp.js.map +1 -1
  59. package/index.js +1 -1
  60. package/index.scss +3 -3
  61. package/package.json +4 -4
  62. package/app/modules/vgdynamictable/index.js +0 -4
  63. package/app/modules/vgdynamictable/js/editable.js +0 -438
  64. package/app/modules/vgdynamictable/js/expandable.js +0 -248
  65. package/app/modules/vgdynamictable/js/filters.js +0 -450
  66. package/app/modules/vgdynamictable/js/fixed.js +0 -566
  67. package/app/modules/vgdynamictable/js/options.js +0 -650
  68. package/app/modules/vgdynamictable/js/pagination.js +0 -623
  69. package/app/modules/vgdynamictable/js/search.js +0 -82
  70. package/app/modules/vgdynamictable/js/skeleton.js +0 -144
  71. package/app/modules/vgdynamictable/js/sortable.js +0 -442
  72. package/app/modules/vgdynamictable/js/summary-footer.js +0 -284
  73. package/app/modules/vgdynamictable/js/table-remote.js +0 -821
  74. package/app/modules/vgdynamictable/js/table-state.js +0 -243
  75. package/app/modules/vgdynamictable/js/table-url-state.js +0 -444
  76. package/app/modules/vgdynamictable/js/utils/common.js +0 -48
  77. package/app/modules/vgdynamictable/js/vgdynamictable.js +0 -3870
  78. package/app/modules/vgdynamictable/js/viewport.js +0 -322
  79. package/app/modules/vgdynamictable/readme.md +0 -251
  80. package/app/modules/vgdynamictable/scss/_actions.scss +0 -196
  81. package/app/modules/vgdynamictable/scss/_pagination.scss +0 -186
  82. package/app/modules/vgdynamictable/scss/_skeleton.scss +0 -63
  83. package/app/modules/vgdynamictable/scss/_sortable.scss +0 -66
  84. package/app/modules/vgdynamictable/scss/_table.scss +0 -137
  85. package/app/modules/vgdynamictable/scss/_variables.scss +0 -138
  86. 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
- const isSortableDrag = (e) => {
66
- // 1) если sortable реально активен — на элементе есть класс dragging
67
- if (document.querySelector('.dragging')) return true;
68
-
69
- // 2) маркер, который ставит sortable
70
- let plain = '';
71
- try { plain = e.dataTransfer?.getData?.('text/plain') || ''; } catch (_) {}
72
- return plain === 'vgsortable';
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 (isSortableDrag(e)) {
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 (isSortableDrag(e)) {
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 (isSortableDrag(e)) {
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 (isSortableDrag(e)) {
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
- uploads: {
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('trash'), action = 'data-vg-dismiss';
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
- &.pending {
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: 36px,
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-secondary-bg);
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
- gap: 8px;
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
- $collapse.append(_this.setDataRelationStatus($collapse, status, data, 'collapse'));
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 = Selectors.find(this._params.target) || this._element.parentNode;
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 = { limit: this._params.limit, offset: this._params.offset };
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 && this._params.detach && noMoreData) {
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 = Selectors.find(this._params.target) || this._element.parentNode;
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 && this._params.detach && remaining.length === 0) {
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;