bfg-common 1.5.408 → 1.5.410

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 (176) hide show
  1. package/CODE_STYLE.md +109 -109
  2. package/assets/img/icons/icons-sprite-dark-3.svg +227 -227
  3. package/assets/img/icons/icons-sprite-dark-5.svg +488 -488
  4. package/assets/img/icons/icons-sprite-light-3.svg +227 -227
  5. package/assets/img/icons/icons-sprite-light-5.svg +488 -488
  6. package/assets/localization/local_be.json +11 -1
  7. package/assets/localization/local_en.json +11 -1
  8. package/assets/localization/local_hy.json +11 -1
  9. package/assets/localization/local_kk.json +11 -1
  10. package/assets/localization/local_ru.json +12 -2
  11. package/assets/localization/local_zh.json +11 -1
  12. package/components/atoms/TheIcon3.vue +50 -50
  13. package/components/atoms/collapse/CollapseNav.vue +170 -170
  14. package/components/atoms/collapse/CollapseNavItem.vue +226 -226
  15. package/components/atoms/nav/NavBar.vue +159 -159
  16. package/components/atoms/perPage/PerPage.vue +58 -58
  17. package/components/atoms/table/dataGrid/DataGrid.vue +1717 -1717
  18. package/components/atoms/table/dataGrid/DataGridColumnSwitch.vue +277 -277
  19. package/components/atoms/table/dataGrid/lib/config/settingsTable.ts +94 -94
  20. package/components/atoms/table/dataGrid/lib/utils/export.ts +16 -16
  21. package/components/atoms/tabs/VerticalTabs.vue +105 -105
  22. package/components/common/backup/storage/actions/add/lib/config/steps.ts +168 -168
  23. package/components/common/backup/storage/actions/add/steps/hostAccessibility/HostAccessibility.vue +52 -52
  24. package/components/common/backup/storage/actions/add/steps/readyComplete/ReadyComplete.vue +45 -45
  25. package/components/common/backup/storage/actions/delete/Delete.vue +65 -65
  26. package/components/common/browse/blocks/Container.vue +234 -234
  27. package/components/common/browse/blocks/contents/filesNew/Skeleton.vue +18 -18
  28. package/components/common/browse/blocks/lib/models/types.ts +1 -1
  29. package/components/common/browse/lib/models/interfaces.ts +5 -5
  30. package/components/common/context/lib/models/interfaces.ts +33 -33
  31. package/components/common/diagramMain/adapter/AdapterItems.vue +61 -61
  32. package/components/common/diagramMain/lib/config/initial.ts +50 -50
  33. package/components/common/diagramMain/lib/models/types.ts +21 -21
  34. package/components/common/diagramMain/lib/utils/utils.ts +331 -331
  35. package/components/common/diagramMain/modals/editSettings/ConfirmTeamingSettingsModal.vue +40 -40
  36. package/components/common/diagramMain/modals/editSettings/tabs/NetworkProperties.vue +214 -214
  37. package/components/common/diagramMain/modals/editSettings/tabs/Security.vue +189 -189
  38. package/components/common/diagramMain/modals/editSettings/tabs/SwitchProperties.vue +163 -163
  39. package/components/common/diagramMain/modals/editSettings/tabs/TeamingFailover.vue +175 -175
  40. package/components/common/diagramMain/modals/editSettings/tabs/port/IpvFourSettings.vue +346 -346
  41. package/components/common/diagramMain/modals/lib/config/initial.ts +180 -180
  42. package/components/common/diagramMain/modals/lib/config/networkModal.ts +398 -398
  43. package/components/common/diagramMain/modals/lib/config/vmKernelAdapter.ts +90 -90
  44. package/components/common/diagramMain/modals/lib/mappers/mappers.ts +87 -87
  45. package/components/common/diagramMain/modals/lib/utils/index.ts +24 -24
  46. package/components/common/diagramMain/modals/migrateVmkernelAdapter/lib/config/steps.ts +114 -114
  47. package/components/common/diagramMain/modals/migrateVmkernelAdapter/steps/ConnectionSettings.vue +169 -169
  48. package/components/common/diagramMain/modals/migrateVmkernelAdapter/steps/SelectVmkernelAdapter.vue +159 -159
  49. package/components/common/diagramMain/modals/migrateVmkernelAdapter/validations/common.ts +14 -14
  50. package/components/common/diagramMain/modals/migrateVmkernelAdapter/validations/connectionSettings.ts +137 -137
  51. package/components/common/diagramMain/modals/migrateVmkernelAdapter/validations/selectVmkernelAdapter.ts +52 -52
  52. package/components/common/diagramMain/modals/migrateVmkernelAdapter/validations/validations.ts +19 -19
  53. package/components/common/diagramMain/network/Network.vue +141 -141
  54. package/components/common/diagramMain/port/Ports.vue +47 -47
  55. package/components/common/layout/theHeader/helpMenu/About.vue +82 -82
  56. package/components/common/layout/theHeader/userMenu/modals/preferences/view/ViewOld.vue +112 -112
  57. package/components/common/monitor/overview/OverviewOld.vue +139 -139
  58. package/components/common/pages/home/headline/Headline.vue +45 -45
  59. package/components/common/pages/home/headline/HeadlineOld.vue +42 -42
  60. package/components/common/pages/home/lib/models/interfaces.ts +48 -48
  61. package/components/common/pages/home/widgets/Widgets.vue +49 -49
  62. package/components/common/pages/home/widgets/WidgetsNew.vue +88 -88
  63. package/components/common/pages/home/widgets/WidgetsOld.vue +36 -36
  64. package/components/common/pages/home/widgets/hosts/Hosts.vue +27 -27
  65. package/components/common/pages/home/widgets/hosts/lib/config/items.ts +23 -23
  66. package/components/common/pages/home/widgets/vms/Vms.vue +26 -26
  67. package/components/common/pages/home/widgets/vms/VmsOld.vue +35 -35
  68. package/components/common/pages/home/widgets/vms/lib/config/items.ts +19 -19
  69. package/components/common/pages/packages/Packages.vue +208 -208
  70. package/components/common/pages/shortcuts/block/BlockOld.vue +68 -68
  71. package/components/common/readyToComplete/ReadyToComplete.vue +17 -17
  72. package/components/common/recursionTree/RecursionTree.vue +223 -223
  73. package/components/common/select/button/ButtonDropdown.vue +112 -112
  74. package/components/common/select/radio/RadioGroup.vue +137 -137
  75. package/components/common/spiceConsole/Drawer.vue +381 -381
  76. package/components/common/spiceConsole/SpiceConsole.vue +127 -127
  77. package/components/common/spiceConsole/lib/models/interfaces.ts +5 -5
  78. package/components/common/tools/Actions.vue +207 -207
  79. package/components/common/vm/actions/add/Old.vue +388 -388
  80. package/components/common/vm/actions/add/folderTreeView/FolderTreeView.vue +72 -72
  81. package/components/common/vm/actions/add/folderTreeView/New.vue +40 -40
  82. package/components/common/vm/actions/add/folderTreeView/Old.vue +50 -50
  83. package/components/common/vm/actions/clone/Clone.vue +823 -823
  84. package/components/common/vm/actions/clone/lib/config/steps.ts +291 -291
  85. package/components/common/vm/actions/clone/toTemplate/lib/config/steps.ts +116 -116
  86. package/components/common/vm/actions/common/customizeHardware/virtualHardware/VirtualHardwareOld.vue +321 -321
  87. package/components/common/vm/actions/common/customizeHardware/virtualHardware/browseView/BrowseView.vue +227 -227
  88. package/components/common/vm/actions/common/customizeHardware/virtualHardware/bus/Bus.vue +100 -100
  89. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/CdDvdDrive.vue +232 -232
  90. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/CdDvdDriveOld.vue +168 -168
  91. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/Media.vue +25 -25
  92. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/MediaNew.vue +78 -78
  93. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/MediaOld.vue +50 -50
  94. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/shares/Shares.vue +140 -140
  95. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/shares/lib/config/options.ts +28 -28
  96. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/tooltip/TooltipNew.vue +154 -154
  97. package/components/common/vm/actions/common/customizeHardware/virtualHardware/lib/config/dropdownItems.ts +155 -155
  98. package/components/common/vm/actions/common/customizeHardware/virtualHardware/limit/Limit.vue +220 -220
  99. package/components/common/vm/actions/common/customizeHardware/virtualHardware/memory/Memory.vue +307 -307
  100. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/NewHardDisk.vue +385 -385
  101. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/location/Location.vue +154 -154
  102. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/location/LocationOld.vue +85 -85
  103. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/NewNetwork.vue +288 -288
  104. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/location/new/table/lib/config/config.ts +94 -94
  105. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/macAddress/MacAddress.vue +119 -119
  106. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/NewPciDevice.vue +205 -205
  107. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/directPathIo/DirectPathIoNew.vue +66 -66
  108. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/directPathIo/DirectPathIoOld.vue +62 -62
  109. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/dynamicDirectPathIo/DynamicDirectPathIo.vue +31 -31
  110. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/dynamicDirectPathIo/DynamicDirectPathIoOld.vue +76 -76
  111. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/Note.vue +15 -15
  112. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/NoteNew.vue +42 -42
  113. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/NoteOld.vue +30 -30
  114. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/nvidiaGrid/NvidiaGridOld.vue +84 -84
  115. package/components/common/vm/actions/common/customizeHardware/virtualHardware/other/Other.vue +16 -16
  116. package/components/common/vm/actions/common/customizeHardware/virtualHardware/videoCard/VideoCard.vue +154 -154
  117. package/components/common/vm/actions/common/customizeHardware/virtualHardware/videoCard/numberDisplays/NumberDisplays.vue +53 -53
  118. package/components/common/vm/actions/common/customizeHardware/vmoptions/Vmoptions.vue +155 -155
  119. package/components/common/vm/actions/common/customizeHardware/vmoptions/VmoptionsNew.vue +130 -130
  120. package/components/common/vm/actions/common/customizeHardware/vmoptions/VmoptionsOld.vue +113 -113
  121. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/delay/Delay.vue +32 -32
  122. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/firmware/Firmware.vue +60 -60
  123. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/order/Order.vue +174 -174
  124. package/components/common/vm/actions/common/customizeHardware/vmoptions/generalOptions/GeneralOptions.vue +95 -95
  125. package/components/common/vm/actions/common/customizeHardware/vmoptions/generalOptions/GeneralOptionsOld.vue +155 -155
  126. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/keymap/Keymap.vue +32 -32
  127. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/keymap/KeymapOld.vue +44 -44
  128. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/password/Password.vue +103 -103
  129. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirection.vue +28 -28
  130. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirectionOld.vue +44 -44
  131. package/components/common/vm/actions/common/select/compatibility/Old.vue +107 -107
  132. package/components/common/vm/actions/common/select/computeResource/ComputeResource.vue +143 -143
  133. package/components/common/vm/actions/common/select/computeResource/New.vue +184 -184
  134. package/components/common/vm/actions/common/select/computeResource/treeView/TreeView.vue +131 -131
  135. package/components/common/vm/actions/common/select/createType/CreateType.vue +38 -38
  136. package/components/common/vm/actions/common/select/createType/lib/config/items.ts +48 -48
  137. package/components/common/vm/actions/common/select/createType/lib/models/interfaces.ts +5 -5
  138. package/components/common/vm/actions/common/select/os/Old.vue +152 -152
  139. package/components/common/vm/actions/common/select/os/Os.vue +139 -139
  140. package/components/common/vm/actions/common/select/storage/Storage.vue +155 -155
  141. package/components/common/vm/actions/common/select/storage/new/New.vue +300 -300
  142. package/components/common/vm/actions/common/select/storage/new/lib/models/interfaces.ts +5 -5
  143. package/components/common/vm/actions/common/select/storage/new/lib/utils/utils.ts +21 -21
  144. package/components/common/vm/actions/common/select/template/old/Old.vue +50 -50
  145. package/components/common/vm/actions/editSettings/EditSettings.vue +242 -242
  146. package/components/common/vm/actions/editSettings/new/Skeleton.vue +88 -88
  147. package/components/common/vmt/actions/add/lib/models/interfaces.ts +23 -23
  148. package/components/common/wizards/datastore/add/New.vue +7 -6
  149. package/components/common/wizards/datastore/add/steps/hostAccessibility/table/new/New.vue +9 -4
  150. package/components/common/wizards/datastore/add/steps/nameAndConfigure/NameAndConfigure.vue +13 -5
  151. package/components/common/wizards/datastore/add/steps/nameAndConfigure/NameAndConfigureNew.vue +4 -0
  152. package/components/common/wizards/datastore/add/steps/nameAndDevice/NameAndDeviceNew.vue +1 -0
  153. package/components/common/wizards/datastore/add/steps/nameAndDevice/table/new/New.vue +12 -4
  154. package/components/common/wizards/datastore/add/steps/nameAndDevice/table/new/lib/models/enums.ts +1 -1
  155. package/components/common/wizards/datastore/add/steps/typeMode/lib/config/typeOptions.ts +43 -43
  156. package/components/common/wizards/network/add/steps/SelectConnectionType.vue +104 -104
  157. package/components/common/wizards/network/add/steps/SelectedTargetDevice.vue +467 -467
  158. package/components/common/wizards/vm/migrate/Migrate.vue +349 -349
  159. package/components/common/wizards/vm/migrate/lib/config/constructDataReady.ts +220 -220
  160. package/components/common/wizards/vm/migrate/lib/config/steps.ts +157 -157
  161. package/components/common/wizards/vm/migrate/lib/validations.ts +68 -68
  162. package/components/common/wizards/vm/migrate/select/network/Network.vue +103 -103
  163. package/components/common/wizards/vm/migrate/select/network/table/network/lib/config/advancedTable.ts +91 -91
  164. package/components/common/wizards/vm/migrate/select/type/lib/config/typeOptions.ts +45 -45
  165. package/composables/productNameLocal.ts +30 -30
  166. package/composables/useAppVersion.ts +21 -21
  167. package/package.json +2 -2
  168. package/plugins/date.ts +233 -233
  169. package/plugins/panelStates.ts +70 -70
  170. package/plugins/text.ts +59 -59
  171. package/public/spice-console/lib/images/bitmap.js +203 -203
  172. package/public/spice-console/network/spicechannel.js +390 -390
  173. package/store/main/mutations.ts +7 -7
  174. package/store/main/state.ts +7 -7
  175. package/store/tasks/lib/models/enums.ts +4 -4
  176. package/store/tasks/mappers/recentTasks.ts +79 -79
@@ -1,277 +1,277 @@
1
- <template>
2
- <div class="column-switch-wrap flex-align-center relative" @click.stop>
3
- <button
4
- :id="columnSwitchId"
5
- :data-id="`${props.testId}-toggle-button`"
6
- class="column-switch-btn"
7
- @click.stop="toggle"
8
- >
9
- <atoms-the-icon
10
- name="column-switch"
11
- width="16px"
12
- height="16px"
13
- class="toggle-icon"
14
- />
15
- </button>
16
-
17
- <div
18
- v-show="open"
19
- :id="`${columnSwitchId}-dropdown-menu`"
20
- :style="dropdownStyles"
21
- class="dropdown-menu"
22
- >
23
- <div class="column-switch">
24
- <div class="switch-header" data-id="switch-header-show-cols-title">
25
- {{ localization.common.showColumns }}
26
- </div>
27
- <ul class="switch-content list-unstyled">
28
- <li
29
- v-for="(item, key) in columnKeysPresent"
30
- :key="`${item.key}_${key}`"
31
- :data-id="`switch-content-${item.id}`"
32
- >
33
- <div class="clr-checkbox-wrapper">
34
- <input
35
- :id="`${props.testId}-${item.id}`"
36
- v-model="item.show"
37
- :data-id="`${props.testId}-${item.testId}`"
38
- :disabled="isLast && item.show"
39
- type="checkbox"
40
- @change="change($event, key)"
41
- />
42
- <label
43
- :for="`${props.testId}-${item.id}`"
44
- class="clr-control-label"
45
- :data-id="`${props.testId || 'data-grid'}-${item.id}-label`"
46
- >{{ item.text }}</label
47
- >
48
- </div>
49
- </li>
50
- </ul>
51
- <div class="switch-footer">
52
- <button
53
- :id="`${props.testId}-select-all-button`"
54
- :data-id="`${props.testId}-select-all-button`"
55
- class="btn btn-sm btn-link switch-button export-link"
56
- @click="selectAll"
57
- >
58
- {{ localization.common.selectAll }}
59
- </button>
60
- </div>
61
- </div>
62
- </div>
63
- </div>
64
- </template>
65
-
66
- <script setup lang="ts">
67
- import type {
68
- UI_I_HTMLSelectElement,
69
- UI_I_Localization,
70
- } from '~/lib/models/interfaces'
71
- import type { UI_I_ColumnKey } from '~/components/atoms/table/dataGrid/lib/models/interfaces'
72
-
73
- const props = withDefaults(
74
- defineProps<{
75
- columnKeys: UI_I_ColumnKey[]
76
- testId?: string
77
- }>(),
78
- { testId: 'ui-data-grid-column-switch' }
79
- )
80
- const emits = defineEmits<{
81
- (event: 'update:column-keys', value: UI_I_ColumnKey[]): void
82
- }>()
83
-
84
- const columnKeysPresent = computed<UI_I_ColumnKey[]>(() => {
85
- return props.columnKeys.map((item): UI_I_ColumnKey => {
86
- const testId = item.text
87
- .toLowerCase()
88
- .replace(/\s/g, '_')
89
- .replace(/[^\p{L}_]/gu, '') // разрешает буквы любых языков
90
- .replace(/__+/g, '_')
91
- .replace(/_$/, '')
92
- return { ...item, id: useUniqueId(), testId: `show-column-${testId}` }
93
- })
94
- })
95
-
96
- const localization = computed<UI_I_Localization>(() => useLocal())
97
-
98
- const columnSwitchId = ref<string>('')
99
-
100
- const isLast = computed<boolean>(
101
- () => props.columnKeys.filter((columnKey) => columnKey.show).length === 1
102
- )
103
-
104
- const change = (event: UI_I_HTMLSelectElement, key: number): void => {
105
- const newColumnKeys = props.columnKeys.map((columnKey, item) => {
106
- if (item !== key) {
107
- return columnKey
108
- }
109
-
110
- columnKey.show = event.target.checked
111
- return columnKey
112
- })
113
- emits('update:column-keys', newColumnKeys)
114
- }
115
- const selectAll = (): void => {
116
- const newColumnKeys = props.columnKeys.map((columnKey) => {
117
- columnKey.show = true
118
- return columnKey
119
- })
120
- emits('update:column-keys', newColumnKeys)
121
- }
122
-
123
- const windowClick = (): void => {
124
- hide()
125
- }
126
- onMounted(() => {
127
- window.addEventListener('click', windowClick)
128
- columnSwitchId.value = `column-switch-${useUniqueId()}`
129
- })
130
- onUnmounted(() => {
131
- window.removeEventListener('click', windowClick)
132
- })
133
-
134
- const open = ref<boolean>(false)
135
- const hide = (): void => {
136
- open.value = false
137
- }
138
- const toggle = (): void => {
139
- open.value = !open.value
140
- if (!open.value) {
141
- return
142
- }
143
-
144
- setTimeout(() => {
145
- setDropdownStyle()
146
- }, 0)
147
- }
148
-
149
- const dropdownStyles = ref<any>({})
150
- const setDropdownStyle = (): void => {
151
- dropdownStyles.value = {}
152
-
153
- const elem = document.getElementById(columnSwitchId.value)
154
- if (!elem) {
155
- setTimeout(() => setDropdownStyle(), 0)
156
- return
157
- }
158
- const { x, y, height } = elem.getBoundingClientRect()
159
-
160
- const dropdownMenu = document.getElementById(
161
- `${columnSwitchId.value}-dropdown-menu`
162
- )
163
-
164
- if (!dropdownMenu) return
165
-
166
- dropdownStyles.value.maxHeight = 'max-content'
167
-
168
- const windowH = window.innerHeight
169
-
170
- const dropdownMenuH = dropdownMenu.getBoundingClientRect().height
171
-
172
- if (y + dropdownMenuH >= windowH) {
173
- if (y - dropdownMenuH <= 0) {
174
- dropdownStyles.value.top = 'auto'
175
- dropdownStyles.value.bottom = '0'
176
- dropdownStyles.value.overflowY = 'auto'
177
- dropdownStyles.value.maxHeight = '100vh'
178
-
179
- const columnWwitch = document.querySelector(
180
- `#${columnSwitchId.value}-dropdown-menu .column-switch`
181
- )
182
-
183
- if (!columnWwitch) return
184
-
185
- columnWwitch.style.overflowY = 'hidden'
186
- } else {
187
- dropdownStyles.value.top = `${y - dropdownMenuH}px`
188
- }
189
- } else {
190
- dropdownStyles.value.top = `${y + height}px`
191
- }
192
-
193
- dropdownStyles.value.left = `${x}px`
194
- }
195
- const windowResize = (): void => {
196
- hide()
197
- }
198
- watch(
199
- () => dropdownStyles.value.top,
200
- (newValue: number) => {
201
- if (!newValue) return
202
-
203
- if (parseInt(newValue) < 0) {
204
- window.removeEventListener('resize', windowResize)
205
- } else {
206
- window.addEventListener('resize', windowResize)
207
- }
208
- }
209
- )
210
- </script>
211
-
212
- <style scoped lang="scss">
213
- .column-switch-wrap {
214
- .column-switch-btn {
215
- cursor: pointer;
216
- padding: 0;
217
- border: 0;
218
- display: flex;
219
- background-color: transparent;
220
-
221
- .toggle-icon {
222
- fill: #575757;
223
- }
224
- &:hover {
225
- .toggle-icon {
226
- fill: #0079b8;
227
- }
228
- }
229
- }
230
-
231
- .dropdown-menu {
232
- position: fixed;
233
- z-index: var(--z-fixed);
234
- visibility: unset;
235
- //transform: translateY(-100%);
236
- background-color: var(--block-view-bg-color);
237
- border-color: var(--global-border-color);
238
-
239
- .column-switch {
240
- border-style: none;
241
- box-shadow: none;
242
- height: 85%;
243
- max-height: calc(15rem + 100px);
244
- padding: 18px;
245
- width: 250px;
246
- display: flex;
247
- flex-direction: column;
248
-
249
- .switch-header {
250
- font-size: 16px;
251
- color: var(--global-font-color4);
252
- padding-bottom: 12px;
253
- }
254
-
255
- .switch-content {
256
- overflow-y: auto;
257
- .clr-control-label {
258
- white-space: normal;
259
- }
260
- }
261
-
262
- .switch-footer {
263
- button {
264
- padding: 0;
265
- margin: 0;
266
- font-size: 12px;
267
- letter-spacing: 1px;
268
- color: #0079b8;
269
- text-transform: uppercase;
270
- display: flex;
271
- align-items: center;
272
- }
273
- }
274
- }
275
- }
276
- }
277
- </style>
1
+ <template>
2
+ <div class="column-switch-wrap flex-align-center relative" @click.stop>
3
+ <button
4
+ :id="columnSwitchId"
5
+ :data-id="`${props.testId}-toggle-button`"
6
+ class="column-switch-btn"
7
+ @click.stop="toggle"
8
+ >
9
+ <atoms-the-icon
10
+ name="column-switch"
11
+ width="16px"
12
+ height="16px"
13
+ class="toggle-icon"
14
+ />
15
+ </button>
16
+
17
+ <div
18
+ v-show="open"
19
+ :id="`${columnSwitchId}-dropdown-menu`"
20
+ :style="dropdownStyles"
21
+ class="dropdown-menu"
22
+ >
23
+ <div class="column-switch">
24
+ <div class="switch-header" data-id="switch-header-show-cols-title">
25
+ {{ localization.common.showColumns }}
26
+ </div>
27
+ <ul class="switch-content list-unstyled">
28
+ <li
29
+ v-for="(item, key) in columnKeysPresent"
30
+ :key="`${item.key}_${key}`"
31
+ :data-id="`switch-content-${item.id}`"
32
+ >
33
+ <div class="clr-checkbox-wrapper">
34
+ <input
35
+ :id="`${props.testId}-${item.id}`"
36
+ v-model="item.show"
37
+ :data-id="`${props.testId}-${item.testId}`"
38
+ :disabled="isLast && item.show"
39
+ type="checkbox"
40
+ @change="change($event, key)"
41
+ />
42
+ <label
43
+ :for="`${props.testId}-${item.id}`"
44
+ class="clr-control-label"
45
+ :data-id="`${props.testId || 'data-grid'}-${item.id}-label`"
46
+ >{{ item.text }}</label
47
+ >
48
+ </div>
49
+ </li>
50
+ </ul>
51
+ <div class="switch-footer">
52
+ <button
53
+ :id="`${props.testId}-select-all-button`"
54
+ :data-id="`${props.testId}-select-all-button`"
55
+ class="btn btn-sm btn-link switch-button export-link"
56
+ @click="selectAll"
57
+ >
58
+ {{ localization.common.selectAll }}
59
+ </button>
60
+ </div>
61
+ </div>
62
+ </div>
63
+ </div>
64
+ </template>
65
+
66
+ <script setup lang="ts">
67
+ import type {
68
+ UI_I_HTMLSelectElement,
69
+ UI_I_Localization,
70
+ } from '~/lib/models/interfaces'
71
+ import type { UI_I_ColumnKey } from '~/components/atoms/table/dataGrid/lib/models/interfaces'
72
+
73
+ const props = withDefaults(
74
+ defineProps<{
75
+ columnKeys: UI_I_ColumnKey[]
76
+ testId?: string
77
+ }>(),
78
+ { testId: 'ui-data-grid-column-switch' }
79
+ )
80
+ const emits = defineEmits<{
81
+ (event: 'update:column-keys', value: UI_I_ColumnKey[]): void
82
+ }>()
83
+
84
+ const columnKeysPresent = computed<UI_I_ColumnKey[]>(() => {
85
+ return props.columnKeys.map((item): UI_I_ColumnKey => {
86
+ const testId = item.text
87
+ .toLowerCase()
88
+ .replace(/\s/g, '_')
89
+ .replace(/[^\p{L}_]/gu, '') // разрешает буквы любых языков
90
+ .replace(/__+/g, '_')
91
+ .replace(/_$/, '')
92
+ return { ...item, id: useUniqueId(), testId: `show-column-${testId}` }
93
+ })
94
+ })
95
+
96
+ const localization = computed<UI_I_Localization>(() => useLocal())
97
+
98
+ const columnSwitchId = ref<string>('')
99
+
100
+ const isLast = computed<boolean>(
101
+ () => props.columnKeys.filter((columnKey) => columnKey.show).length === 1
102
+ )
103
+
104
+ const change = (event: UI_I_HTMLSelectElement, key: number): void => {
105
+ const newColumnKeys = props.columnKeys.map((columnKey, item) => {
106
+ if (item !== key) {
107
+ return columnKey
108
+ }
109
+
110
+ columnKey.show = event.target.checked
111
+ return columnKey
112
+ })
113
+ emits('update:column-keys', newColumnKeys)
114
+ }
115
+ const selectAll = (): void => {
116
+ const newColumnKeys = props.columnKeys.map((columnKey) => {
117
+ columnKey.show = true
118
+ return columnKey
119
+ })
120
+ emits('update:column-keys', newColumnKeys)
121
+ }
122
+
123
+ const windowClick = (): void => {
124
+ hide()
125
+ }
126
+ onMounted(() => {
127
+ window.addEventListener('click', windowClick)
128
+ columnSwitchId.value = `column-switch-${useUniqueId()}`
129
+ })
130
+ onUnmounted(() => {
131
+ window.removeEventListener('click', windowClick)
132
+ })
133
+
134
+ const open = ref<boolean>(false)
135
+ const hide = (): void => {
136
+ open.value = false
137
+ }
138
+ const toggle = (): void => {
139
+ open.value = !open.value
140
+ if (!open.value) {
141
+ return
142
+ }
143
+
144
+ setTimeout(() => {
145
+ setDropdownStyle()
146
+ }, 0)
147
+ }
148
+
149
+ const dropdownStyles = ref<any>({})
150
+ const setDropdownStyle = (): void => {
151
+ dropdownStyles.value = {}
152
+
153
+ const elem = document.getElementById(columnSwitchId.value)
154
+ if (!elem) {
155
+ setTimeout(() => setDropdownStyle(), 0)
156
+ return
157
+ }
158
+ const { x, y, height } = elem.getBoundingClientRect()
159
+
160
+ const dropdownMenu = document.getElementById(
161
+ `${columnSwitchId.value}-dropdown-menu`
162
+ )
163
+
164
+ if (!dropdownMenu) return
165
+
166
+ dropdownStyles.value.maxHeight = 'max-content'
167
+
168
+ const windowH = window.innerHeight
169
+
170
+ const dropdownMenuH = dropdownMenu.getBoundingClientRect().height
171
+
172
+ if (y + dropdownMenuH >= windowH) {
173
+ if (y - dropdownMenuH <= 0) {
174
+ dropdownStyles.value.top = 'auto'
175
+ dropdownStyles.value.bottom = '0'
176
+ dropdownStyles.value.overflowY = 'auto'
177
+ dropdownStyles.value.maxHeight = '100vh'
178
+
179
+ const columnWwitch = document.querySelector(
180
+ `#${columnSwitchId.value}-dropdown-menu .column-switch`
181
+ )
182
+
183
+ if (!columnWwitch) return
184
+
185
+ columnWwitch.style.overflowY = 'hidden'
186
+ } else {
187
+ dropdownStyles.value.top = `${y - dropdownMenuH}px`
188
+ }
189
+ } else {
190
+ dropdownStyles.value.top = `${y + height}px`
191
+ }
192
+
193
+ dropdownStyles.value.left = `${x}px`
194
+ }
195
+ const windowResize = (): void => {
196
+ hide()
197
+ }
198
+ watch(
199
+ () => dropdownStyles.value.top,
200
+ (newValue: number) => {
201
+ if (!newValue) return
202
+
203
+ if (parseInt(newValue) < 0) {
204
+ window.removeEventListener('resize', windowResize)
205
+ } else {
206
+ window.addEventListener('resize', windowResize)
207
+ }
208
+ }
209
+ )
210
+ </script>
211
+
212
+ <style scoped lang="scss">
213
+ .column-switch-wrap {
214
+ .column-switch-btn {
215
+ cursor: pointer;
216
+ padding: 0;
217
+ border: 0;
218
+ display: flex;
219
+ background-color: transparent;
220
+
221
+ .toggle-icon {
222
+ fill: #575757;
223
+ }
224
+ &:hover {
225
+ .toggle-icon {
226
+ fill: #0079b8;
227
+ }
228
+ }
229
+ }
230
+
231
+ .dropdown-menu {
232
+ position: fixed;
233
+ z-index: var(--z-fixed);
234
+ visibility: unset;
235
+ //transform: translateY(-100%);
236
+ background-color: var(--block-view-bg-color);
237
+ border-color: var(--global-border-color);
238
+
239
+ .column-switch {
240
+ border-style: none;
241
+ box-shadow: none;
242
+ height: 85%;
243
+ max-height: calc(15rem + 100px);
244
+ padding: 18px;
245
+ width: 250px;
246
+ display: flex;
247
+ flex-direction: column;
248
+
249
+ .switch-header {
250
+ font-size: 16px;
251
+ color: var(--global-font-color4);
252
+ padding-bottom: 12px;
253
+ }
254
+
255
+ .switch-content {
256
+ overflow-y: auto;
257
+ .clr-control-label {
258
+ white-space: normal;
259
+ }
260
+ }
261
+
262
+ .switch-footer {
263
+ button {
264
+ padding: 0;
265
+ margin: 0;
266
+ font-size: 12px;
267
+ letter-spacing: 1px;
268
+ color: #0079b8;
269
+ text-transform: uppercase;
270
+ display: flex;
271
+ align-items: center;
272
+ }
273
+ }
274
+ }
275
+ }
276
+ }
277
+ </style>