vgapp 1.1.1 → 1.1.3

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 (53) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/README.md +19 -16
  3. package/app/langs/en/buttons.json +17 -2
  4. package/app/langs/en/messages.json +36 -1
  5. package/app/langs/ru/buttons.json +17 -2
  6. package/app/langs/ru/messages.json +69 -34
  7. package/app/modules/module-fn.js +15 -9
  8. package/app/modules/vgfilepreview/index.js +3 -0
  9. package/app/modules/vgfilepreview/js/i18n.js +56 -0
  10. package/app/modules/vgfilepreview/js/renderers/image-modal.js +145 -0
  11. package/app/modules/vgfilepreview/js/renderers/image.js +92 -0
  12. package/app/modules/vgfilepreview/js/renderers/index.js +19 -0
  13. package/app/modules/vgfilepreview/js/renderers/office-modal.js +168 -0
  14. package/app/modules/vgfilepreview/js/renderers/office.js +79 -0
  15. package/app/modules/vgfilepreview/js/renderers/pdf-modal.js +260 -0
  16. package/app/modules/vgfilepreview/js/renderers/pdf.js +76 -0
  17. package/app/modules/vgfilepreview/js/renderers/playlist.js +71 -0
  18. package/app/modules/vgfilepreview/js/renderers/text-modal.js +343 -0
  19. package/app/modules/vgfilepreview/js/renderers/text.js +83 -0
  20. package/app/modules/vgfilepreview/js/renderers/video-modal.js +272 -0
  21. package/app/modules/vgfilepreview/js/renderers/video.js +80 -0
  22. package/app/modules/vgfilepreview/js/renderers/zip-modal.js +522 -0
  23. package/app/modules/vgfilepreview/js/renderers/zip.js +89 -0
  24. package/app/modules/vgfilepreview/js/vgfilepreview.js +532 -0
  25. package/app/modules/vgfilepreview/readme.md +68 -0
  26. package/app/modules/vgfilepreview/scss/_variables.scss +113 -0
  27. package/app/modules/vgfilepreview/scss/vgfilepreview.scss +460 -0
  28. package/app/modules/vgfiles/js/base.js +463 -175
  29. package/app/modules/vgfiles/js/droppable.js +260 -260
  30. package/app/modules/vgfiles/js/render.js +153 -153
  31. package/app/modules/vgfiles/js/vgfiles.js +41 -29
  32. package/app/modules/vgfiles/readme.md +116 -217
  33. package/app/modules/vgfiles/scss/_variables.scss +18 -10
  34. package/app/modules/vgfiles/scss/vgfiles.scss +153 -59
  35. package/app/modules/vgformsender/js/vgformsender.js +7 -2
  36. package/app/modules/vgmodal/js/vgmodal.js +12 -0
  37. package/app/modules/vgnav/js/vgnav.js +135 -135
  38. package/app/modules/vgnav/readme.md +67 -67
  39. package/app/modules/vgnestable/README.md +307 -307
  40. package/app/modules/vgnestable/scss/_variables.scss +60 -60
  41. package/app/modules/vgnestable/scss/vgnestable.scss +163 -163
  42. package/app/modules/vgselect/js/vgselect.js +62 -59
  43. package/app/modules/vgselect/scss/vgselect.scss +22 -22
  44. package/app/modules/vgspy/readme.md +28 -28
  45. package/app/utils/js/components/audio-metadata.js +240 -0
  46. package/app/utils/js/components/file-icon.js +109 -0
  47. package/app/utils/js/components/file-preview.js +304 -0
  48. package/app/utils/js/components/sanitize.js +150 -150
  49. package/build/vgapp.css +1 -1
  50. package/build/vgapp.css.map +1 -1
  51. package/index.js +1 -0
  52. package/index.scss +9 -6
  53. package/package.json +1 -1
@@ -1,60 +1,60 @@
1
- $nestable-map: (
2
- list-transition: "background-color .15s ease, outline-color .15s ease",
3
- list-drop-target-bg: rgba(13, 110, 253, .06),
4
- list-drop-target-outline: 1px dashed rgba(13, 110, 253, .45),
5
- list-drop-target-outline-offset: 2px,
6
- list-drop-denied-bg: rgba(220, 53, 69, .06),
7
- list-drop-denied-outline: 1px dashed rgba(220, 53, 69, .5),
8
- list-drop-denied-outline-offset: 2px,
9
- list-nested-margin-top: .35rem,
10
- list-nested-padding-left: 1.25rem,
11
- list-nested-border-left: 1px dashed rgba(0, 0, 0, .12),
12
-
13
- item-margin: .35rem 0,
14
- item-transition: opacity .15s ease,
15
- item-dragging-opacity: .85,
16
- item-ghost-opacity: .3,
17
-
18
- inner-gap: .5rem,
19
- inner-min-height: 40px,
20
- inner-padding: .45rem .65rem,
21
- inner-border: 1px solid rgba(0, 0, 0, .12),
22
- inner-bg: #fff,
23
- inner-border-radius: .45rem,
24
-
25
- handle-size: 1.85rem,
26
- handle-border: 1px solid rgba(0, 0, 0, .12),
27
- handle-bg: rgba(0, 0, 0, .03),
28
- handle-border-radius: .35rem,
29
- handle-cursor: grab,
30
- handle-active-cursor: grabbing,
31
-
32
- toggle-size: 1.85rem,
33
- toggle-border: 1px solid rgba(0, 0, 0, .12),
34
- toggle-bg: rgba(0, 0, 0, .03),
35
- toggle-border-radius: .35rem,
36
- toggle-color: rgba(0, 0, 0, .65),
37
- toggle-font-weight: 700,
38
- toggle-line-height: 1,
39
- toggle-hover-bg: rgba(0, 0, 0, .07),
40
- toggle-svg-size: 16px,
41
- toggle-svg-transition: transform .2s ease,
42
- toggle-svg-closed-transform: rotate(0deg),
43
- toggle-svg-open-transform: rotate(180deg),
44
-
45
- handle-icon-min-width: .9rem,
46
- handle-icon-color: rgba(0, 0, 0, .45),
47
- handle-icon-font-weight: 700,
48
- handle-icon-line-height: 1,
49
- handle-icon-letter-spacing: .06em,
50
-
51
- placeholder-border: 1px dashed rgba(13, 110, 253, .7),
52
- placeholder-bg: rgba(13, 110, 253, .08),
53
- placeholder-border-radius: .45rem,
54
- placeholder-margin: .35rem 0,
55
- placeholder-min-height: 40px,
56
-
57
- drag-element-opacity: .92,
58
- drag-element-transform: rotate(.5deg),
59
- drag-element-shadow: 0 8px 22px rgba(0, 0, 0, .18)
60
- );
1
+ $nestable-map: (
2
+ list-transition: "background-color .15s ease, outline-color .15s ease",
3
+ list-drop-target-bg: rgba(13, 110, 253, .06),
4
+ list-drop-target-outline: 1px dashed rgba(13, 110, 253, .45),
5
+ list-drop-target-outline-offset: 2px,
6
+ list-drop-denied-bg: rgba(220, 53, 69, .06),
7
+ list-drop-denied-outline: 1px dashed rgba(220, 53, 69, .5),
8
+ list-drop-denied-outline-offset: 2px,
9
+ list-nested-margin-top: .35rem,
10
+ list-nested-padding-left: 1.25rem,
11
+ list-nested-border-left: 1px dashed rgba(0, 0, 0, .12),
12
+
13
+ item-margin: .35rem 0,
14
+ item-transition: opacity .15s ease,
15
+ item-dragging-opacity: .85,
16
+ item-ghost-opacity: .3,
17
+
18
+ inner-gap: .5rem,
19
+ inner-min-height: 40px,
20
+ inner-padding: .45rem .65rem,
21
+ inner-border: 1px solid rgba(0, 0, 0, .12),
22
+ inner-bg: #fff,
23
+ inner-border-radius: .45rem,
24
+
25
+ handle-size: 1.85rem,
26
+ handle-border: 1px solid rgba(0, 0, 0, .12),
27
+ handle-bg: rgba(0, 0, 0, .03),
28
+ handle-border-radius: .35rem,
29
+ handle-cursor: grab,
30
+ handle-active-cursor: grabbing,
31
+
32
+ toggle-size: 1.85rem,
33
+ toggle-border: 1px solid rgba(0, 0, 0, .12),
34
+ toggle-bg: rgba(0, 0, 0, .03),
35
+ toggle-border-radius: .35rem,
36
+ toggle-color: rgba(0, 0, 0, .65),
37
+ toggle-font-weight: 700,
38
+ toggle-line-height: 1,
39
+ toggle-hover-bg: rgba(0, 0, 0, .07),
40
+ toggle-svg-size: 16px,
41
+ toggle-svg-transition: transform .2s ease,
42
+ toggle-svg-closed-transform: rotate(0deg),
43
+ toggle-svg-open-transform: rotate(180deg),
44
+
45
+ handle-icon-min-width: .9rem,
46
+ handle-icon-color: rgba(0, 0, 0, .45),
47
+ handle-icon-font-weight: 700,
48
+ handle-icon-line-height: 1,
49
+ handle-icon-letter-spacing: .06em,
50
+
51
+ placeholder-border: 1px dashed rgba(13, 110, 253, .7),
52
+ placeholder-bg: rgba(13, 110, 253, .08),
53
+ placeholder-border-radius: .45rem,
54
+ placeholder-margin: .35rem 0,
55
+ placeholder-min-height: 40px,
56
+
57
+ drag-element-opacity: .92,
58
+ drag-element-transform: rotate(.5deg),
59
+ drag-element-shadow: 0 8px 22px rgba(0, 0, 0, .18)
60
+ );
@@ -1,163 +1,163 @@
1
- /**
2
- *--------------------------------------------------------------------------
3
- * Module: VGNestable
4
- * Author: Vegas DEV
5
- * License: see 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-nestable {
15
- @include mix-vars('nestable', $nestable-map);
16
-
17
- &-list {
18
- list-style: none;
19
- margin: 0;
20
- padding: 0;
21
- transition: var(--vg-nestable-list-transition);
22
-
23
- &.is-drop-target {
24
- background: var(--vg-nestable-list-drop-target-bg);
25
- outline: var(--vg-nestable-list-drop-target-outline);
26
- outline-offset: var(--vg-nestable-list-drop-target-outline-offset);
27
- }
28
-
29
- &.is-drop-denied {
30
- background: var(--vg-nestable-list-drop-denied-bg);
31
- outline: var(--vg-nestable-list-drop-denied-outline);
32
- outline-offset: var(--vg-nestable-list-drop-denied-outline-offset);
33
- }
34
-
35
- .vg-nestable-list {
36
- margin-top: var(--vg-nestable-list-nested-margin-top);
37
- padding-left: var(--vg-nestable-list-nested-padding-left);
38
- border-left: var(--vg-nestable-list-nested-border-left);
39
- }
40
- }
41
-
42
- &-item {
43
- margin: var(--vg-nestable-item-margin);
44
- position: relative;
45
- transition: var(--vg-nestable-item-transition);
46
-
47
- &.is-dragging {
48
- opacity: var(--vg-nestable-item-dragging-opacity);
49
- }
50
-
51
- &.is-drag-ghost {
52
- opacity: var(--vg-nestable-item-ghost-opacity);
53
- }
54
- }
55
-
56
- &-inner {
57
- display: flex;
58
- align-items: center;
59
- gap: var(--vg-nestable-inner-gap);
60
- min-height: var(--vg-nestable-inner-min-height);
61
- padding: var(--vg-nestable-inner-padding);
62
- border: var(--vg-nestable-inner-border);
63
- background: var(--vg-nestable-inner-bg);
64
- border-radius: var(--vg-nestable-inner-border-radius);
65
- }
66
-
67
- &-handle {
68
- flex: 0 0 auto;
69
- display: inline-flex;
70
- align-items: center;
71
- justify-content: center;
72
- width: var(--vg-nestable-handle-size);
73
- min-height: var(--vg-nestable-handle-size);
74
- padding: 0;
75
- border: var(--vg-nestable-handle-border);
76
- background: var(--vg-nestable-handle-bg);
77
- border-radius: var(--vg-nestable-handle-border-radius);
78
- cursor: var(--vg-nestable-handle-cursor);
79
- user-select: none;
80
-
81
- &:active {
82
- cursor: var(--vg-nestable-handle-active-cursor);
83
- }
84
- }
85
-
86
- &-collapse-toggle {
87
- flex: 0 0 auto;
88
- display: inline-flex;
89
- align-items: center;
90
- justify-content: center;
91
- width: var(--vg-nestable-toggle-size);
92
- min-height: var(--vg-nestable-toggle-size);
93
- padding: 0;
94
- border: var(--vg-nestable-toggle-border);
95
- background: var(--vg-nestable-toggle-bg);
96
- border-radius: var(--vg-nestable-toggle-border-radius);
97
- cursor: pointer;
98
- color: var(--vg-nestable-toggle-color);
99
- font-weight: var(--vg-nestable-toggle-font-weight);
100
- line-height: var(--vg-nestable-toggle-line-height);
101
-
102
- &:hover {
103
- background: var(--vg-nestable-toggle-hover-bg);
104
- }
105
-
106
- svg {
107
- width: var(--vg-nestable-toggle-svg-size);
108
- height: var(--vg-nestable-toggle-svg-size);
109
- transition: var(--vg-nestable-toggle-svg-transition);
110
- transform: var(--vg-nestable-toggle-svg-closed-transform);
111
-
112
- path {
113
- fill: currentColor;
114
- }
115
- }
116
-
117
- &[aria-expanded="true"] {
118
- svg {
119
- transform: var(--vg-nestable-toggle-svg-open-transform);
120
- }
121
- }
122
- }
123
-
124
- &-handle-icon {
125
- flex: 0 0 auto;
126
- display: inline-flex;
127
- align-items: center;
128
- justify-content: center;
129
- min-width: var(--vg-nestable-handle-icon-min-width);
130
- color: var(--vg-nestable-handle-icon-color);
131
- font-weight: var(--vg-nestable-handle-icon-font-weight);
132
- line-height: var(--vg-nestable-handle-icon-line-height);
133
- letter-spacing: var(--vg-nestable-handle-icon-letter-spacing);
134
- }
135
-
136
- &-content {
137
- flex: 1 1 auto;
138
- min-width: 0;
139
- }
140
-
141
- &-placeholder {
142
- list-style: none;
143
- border: var(--vg-nestable-placeholder-border);
144
- background: var(--vg-nestable-placeholder-bg);
145
- border-radius: var(--vg-nestable-placeholder-border-radius);
146
- margin: var(--vg-nestable-placeholder-margin);
147
- min-height: var(--vg-nestable-placeholder-min-height);
148
- }
149
-
150
- &-placeholder-hidden {
151
- border: 0;
152
- background: transparent;
153
- margin: 0;
154
- min-height: 0;
155
- height: 0 !important;
156
- }
157
-
158
- &-drag-element {
159
- opacity: var(--vg-nestable-drag-element-opacity);
160
- transform: var(--vg-nestable-drag-element-transform);
161
- box-shadow: var(--vg-nestable-drag-element-shadow);
162
- }
163
- }
1
+ /**
2
+ *--------------------------------------------------------------------------
3
+ * Module: VGNestable
4
+ * Author: Vegas DEV
5
+ * License: see 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-nestable {
15
+ @include mix-vars('nestable', $nestable-map);
16
+
17
+ &-list {
18
+ list-style: none;
19
+ margin: 0;
20
+ padding: 0;
21
+ transition: var(--vg-nestable-list-transition);
22
+
23
+ &.is-drop-target {
24
+ background: var(--vg-nestable-list-drop-target-bg);
25
+ outline: var(--vg-nestable-list-drop-target-outline);
26
+ outline-offset: var(--vg-nestable-list-drop-target-outline-offset);
27
+ }
28
+
29
+ &.is-drop-denied {
30
+ background: var(--vg-nestable-list-drop-denied-bg);
31
+ outline: var(--vg-nestable-list-drop-denied-outline);
32
+ outline-offset: var(--vg-nestable-list-drop-denied-outline-offset);
33
+ }
34
+
35
+ .vg-nestable-list {
36
+ margin-top: var(--vg-nestable-list-nested-margin-top);
37
+ padding-left: var(--vg-nestable-list-nested-padding-left);
38
+ border-left: var(--vg-nestable-list-nested-border-left);
39
+ }
40
+ }
41
+
42
+ &-item {
43
+ margin: var(--vg-nestable-item-margin);
44
+ position: relative;
45
+ transition: var(--vg-nestable-item-transition);
46
+
47
+ &.is-dragging {
48
+ opacity: var(--vg-nestable-item-dragging-opacity);
49
+ }
50
+
51
+ &.is-drag-ghost {
52
+ opacity: var(--vg-nestable-item-ghost-opacity);
53
+ }
54
+ }
55
+
56
+ &-inner {
57
+ display: flex;
58
+ align-items: center;
59
+ gap: var(--vg-nestable-inner-gap);
60
+ min-height: var(--vg-nestable-inner-min-height);
61
+ padding: var(--vg-nestable-inner-padding);
62
+ border: var(--vg-nestable-inner-border);
63
+ background: var(--vg-nestable-inner-bg);
64
+ border-radius: var(--vg-nestable-inner-border-radius);
65
+ }
66
+
67
+ &-handle {
68
+ flex: 0 0 auto;
69
+ display: inline-flex;
70
+ align-items: center;
71
+ justify-content: center;
72
+ width: var(--vg-nestable-handle-size);
73
+ min-height: var(--vg-nestable-handle-size);
74
+ padding: 0;
75
+ border: var(--vg-nestable-handle-border);
76
+ background: var(--vg-nestable-handle-bg);
77
+ border-radius: var(--vg-nestable-handle-border-radius);
78
+ cursor: var(--vg-nestable-handle-cursor);
79
+ user-select: none;
80
+
81
+ &:active {
82
+ cursor: var(--vg-nestable-handle-active-cursor);
83
+ }
84
+ }
85
+
86
+ &-collapse-toggle {
87
+ flex: 0 0 auto;
88
+ display: inline-flex;
89
+ align-items: center;
90
+ justify-content: center;
91
+ width: var(--vg-nestable-toggle-size);
92
+ min-height: var(--vg-nestable-toggle-size);
93
+ padding: 0;
94
+ border: var(--vg-nestable-toggle-border);
95
+ background: var(--vg-nestable-toggle-bg);
96
+ border-radius: var(--vg-nestable-toggle-border-radius);
97
+ cursor: pointer;
98
+ color: var(--vg-nestable-toggle-color);
99
+ font-weight: var(--vg-nestable-toggle-font-weight);
100
+ line-height: var(--vg-nestable-toggle-line-height);
101
+
102
+ &:hover {
103
+ background: var(--vg-nestable-toggle-hover-bg);
104
+ }
105
+
106
+ svg {
107
+ width: var(--vg-nestable-toggle-svg-size);
108
+ height: var(--vg-nestable-toggle-svg-size);
109
+ transition: var(--vg-nestable-toggle-svg-transition);
110
+ transform: var(--vg-nestable-toggle-svg-closed-transform);
111
+
112
+ path {
113
+ fill: currentColor;
114
+ }
115
+ }
116
+
117
+ &[aria-expanded="true"] {
118
+ svg {
119
+ transform: var(--vg-nestable-toggle-svg-open-transform);
120
+ }
121
+ }
122
+ }
123
+
124
+ &-handle-icon {
125
+ flex: 0 0 auto;
126
+ display: inline-flex;
127
+ align-items: center;
128
+ justify-content: center;
129
+ min-width: var(--vg-nestable-handle-icon-min-width);
130
+ color: var(--vg-nestable-handle-icon-color);
131
+ font-weight: var(--vg-nestable-handle-icon-font-weight);
132
+ line-height: var(--vg-nestable-handle-icon-line-height);
133
+ letter-spacing: var(--vg-nestable-handle-icon-letter-spacing);
134
+ }
135
+
136
+ &-content {
137
+ flex: 1 1 auto;
138
+ min-width: 0;
139
+ }
140
+
141
+ &-placeholder {
142
+ list-style: none;
143
+ border: var(--vg-nestable-placeholder-border);
144
+ background: var(--vg-nestable-placeholder-bg);
145
+ border-radius: var(--vg-nestable-placeholder-border-radius);
146
+ margin: var(--vg-nestable-placeholder-margin);
147
+ min-height: var(--vg-nestable-placeholder-min-height);
148
+ }
149
+
150
+ &-placeholder-hidden {
151
+ border: 0;
152
+ background: transparent;
153
+ margin: 0;
154
+ min-height: 0;
155
+ height: 0 !important;
156
+ }
157
+
158
+ &-drag-element {
159
+ opacity: var(--vg-nestable-drag-element-opacity);
160
+ transform: var(--vg-nestable-drag-element-transform);
161
+ box-shadow: var(--vg-nestable-drag-element-shadow);
162
+ }
163
+ }
@@ -46,13 +46,13 @@ const EVENT_KEY_CLEAR = `${NAME_KEY}.clear`;
46
46
  const EVENT_KEY_ERROR = `${NAME_KEY}.error`;
47
47
  const EVENT_KEY_LOAD_NEXT = `${NAME_KEY}.loadNext`;
48
48
 
49
- const SELECTOR_DATA_TOGGLE = '[data-vg-toggle="select"]';
50
- const SELECTOR_CURRENT = `.${CLASS_NAME_CURRENT}`;
51
- const SELECTOR_DROPDOWN = `.${CLASS_NAME_DROPDOWN}`;
52
- const SELECTOR_SEARCH_INPUT = `.${CLASS_NAME_SEARCH} input`;
53
- const SELECTOR_LIST = `.${CLASS_NAME_LIST}`;
54
- const SELECTOR_LOAD_MORE_BTN = `.${CLASS_NAME_LOAD_MORE}`;
55
- const DATA_ATTR_COPY_EXCLUDE_DEFAULT = ['inited', 'updating', 'exclude'];
49
+ const SELECTOR_DATA_TOGGLE = '[data-vg-toggle="select"]';
50
+ const SELECTOR_CURRENT = `.${CLASS_NAME_CURRENT}`;
51
+ const SELECTOR_DROPDOWN = `.${CLASS_NAME_DROPDOWN}`;
52
+ const SELECTOR_SEARCH_INPUT = `.${CLASS_NAME_SEARCH} input`;
53
+ const SELECTOR_LIST = `.${CLASS_NAME_LIST}`;
54
+ const SELECTOR_LOAD_MORE_BTN = `.${CLASS_NAME_LOAD_MORE}`;
55
+ const DATA_ATTR_COPY_EXCLUDE_DEFAULT = ['inited', 'updating', 'exclude'];
56
56
 
57
57
  /**
58
58
  * Класс VGSelect
@@ -68,8 +68,8 @@ class VGSelect extends BaseModule {
68
68
  constructor(element, params = {}) {
69
69
  super(element, params);
70
70
 
71
- this._params = this._getParams(element, mergeDeepObject({
72
- lang: document.documentElement.lang || 'ru',
71
+ this._params = this._getParams(element, mergeDeepObject({
72
+ lang: document.documentElement.lang || 'ru',
73
73
  // Dropdown placement behavior:
74
74
  // - none: default CSS positioning (no JS)
75
75
  // - auto: choose top/bottom based on available space in overflow ancestor/viewport
@@ -88,10 +88,10 @@ class VGSelect extends BaseModule {
88
88
  perpage: 20,
89
89
  loadMoreText: 'Загрузить ещё',
90
90
  },
91
- close: true,
92
- tree: false,
93
- exclude: '',
94
- placeholder: '',
91
+ close: true,
92
+ tree: false,
93
+ exclude: 'data-filter-param',
94
+ placeholder: '',
95
95
  onInit: null,
96
96
  onShow: null,
97
97
  onHide: null,
@@ -254,34 +254,33 @@ class VGSelect extends BaseModule {
254
254
  parent.appendChild(frag);
255
255
  }
256
256
 
257
- static _isTreeEnabled(selector, params = {}) {
258
- if (typeof params.tree === 'boolean') return params.tree;
259
- if (selector?.dataset && typeof selector.dataset.tree !== 'undefined') {
260
- return normalizeData(selector.dataset.tree) === true;
261
- }
262
-
263
- return false;
264
- }
265
-
266
- static _getDataAttrCopyExclusions(selector, params = {}) {
267
- const rawExclude = typeof params.exclude === 'string'
268
- ? params.exclude
269
- : (selector.dataset.exclude || '');
270
- const customExcluded = rawExclude
271
- .split(',')
272
- .map(item => this._normalizeDataAttrKey(item))
273
- .filter(Boolean);
274
-
275
- return new Set([...DATA_ATTR_COPY_EXCLUDE_DEFAULT, ...customExcluded]);
276
- }
277
-
278
- static _normalizeDataAttrKey(value) {
279
- return String(value || '')
280
- .trim()
281
- .replace(/^data-/, '')
282
- .toLowerCase()
283
- .replace(/-([a-z0-9])/g, (_, chr) => chr.toUpperCase());
284
- }
257
+ static _isTreeEnabled(selector, params = {}) {
258
+ if (typeof params.tree === 'boolean') return params.tree;
259
+ if (selector?.dataset && typeof selector.dataset.tree !== 'undefined') {
260
+ return normalizeData(selector.dataset.tree) === true;
261
+ }
262
+
263
+ return false;
264
+ }
265
+
266
+ static _getDataAttrCopyExclusions(selector, params = {}) {
267
+ const rawExclude = typeof params.exclude === 'string'
268
+ ? params.exclude
269
+ : (selector.dataset.exclude || '');
270
+ const customExcluded = rawExclude
271
+ .split(',')
272
+ .map(item => this._normalizeDataAttrKey(item))
273
+ .filter(Boolean);
274
+
275
+ return new Set([...DATA_ATTR_COPY_EXCLUDE_DEFAULT, ...customExcluded]);
276
+ }
277
+
278
+ static _normalizeDataAttrKey(value) {
279
+ return String(value || '')
280
+ .trim()
281
+ .replace(/^data-/, '')
282
+ .toLowerCase();
283
+ }
285
284
 
286
285
  /**
287
286
  * Проверяет, является ли значение "пустым" (соответствует placeholder)
@@ -339,14 +338,14 @@ class VGSelect extends BaseModule {
339
338
  container.classList.add('disabled');
340
339
  }
341
340
 
342
- const elData = Manipulator.get(selector);
343
- if (!isEmptyObj(elData)) {
344
- const excludeDataAttrs = this._getDataAttrCopyExclusions(selector, params);
345
- Object.keys(elData).forEach(key => {
346
- if (excludeDataAttrs.has(key)) return;
347
- Manipulator.set(container, `data-${key}`, elData[key]);
348
- });
349
- }
341
+ const elData = Manipulator.get(selector);
342
+ if (!isEmptyObj(elData)) {
343
+ const excludeDataAttrs = this._getDataAttrCopyExclusions(selector, params);
344
+ Object.keys(elData).forEach(key => {
345
+ if (excludeDataAttrs.has(key)) return;
346
+ Manipulator.set(container, `data-${key}`, elData[key]);
347
+ });
348
+ }
350
349
 
351
350
  const placeholder = selector.dataset.placeholder || '';
352
351
  const isMultiple = selector.multiple;
@@ -401,8 +400,6 @@ class VGSelect extends BaseModule {
401
400
  this.updateUI(selector);
402
401
  const instance = VGSelect.getInstance(container);
403
402
 
404
- console.log(instance);
405
-
406
403
  let searchInput = null;
407
404
  if (Manipulator.has(selector, 'data-search-enabled')) {
408
405
  const search = document.createElement('div');
@@ -794,7 +791,6 @@ class VGSelect extends BaseModule {
794
791
  static changeSelector(select, value, data = {}) {
795
792
  const container = select.nextElementSibling;
796
793
  const instance = container ? VGSelect.getInstance(container) : null;
797
- const prevValue = select.value;
798
794
 
799
795
  select.setAttribute('data-updating', 'true');
800
796
  try {
@@ -804,13 +800,16 @@ class VGSelect extends BaseModule {
804
800
  return;
805
801
  }
806
802
 
807
- const oldValue = select.value;
808
803
  const wasSelected = opt.selected;
809
804
  const selectedText = opt.textContent.trim();
810
805
 
811
- [...select.options].forEach(o => o.selected = false);
812
- opt.selected = true;
813
- select.value = opt.value;
806
+ if (select.multiple) {
807
+ opt.selected = data?.selected === false ? false : true;
808
+ } else {
809
+ [...select.options].forEach(o => o.selected = false);
810
+ opt.selected = true;
811
+ select.value = opt.value;
812
+ }
814
813
 
815
814
  this.updateUI(select);
816
815
 
@@ -849,9 +848,13 @@ class VGSelect extends BaseModule {
849
848
  const selectedText = opt.textContent.trim();
850
849
  const value = opt.value;
851
850
 
852
- [...select.options].forEach(o => o.selected = false);
853
- opt.selected = true;
854
- select.value = opt.value;
851
+ if (select.multiple) {
852
+ opt.selected = data?.selected === false ? false : true;
853
+ } else {
854
+ [...select.options].forEach(o => o.selected = false);
855
+ opt.selected = true;
856
+ select.value = opt.value;
857
+ }
855
858
 
856
859
  this.updateUI(select);
857
860