bfg-common 1.5.60 → 1.5.61

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 (181) 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 +5 -2
  7. package/assets/localization/local_en.json +5 -2
  8. package/assets/localization/local_hy.json +5 -2
  9. package/assets/localization/local_kk.json +5 -2
  10. package/assets/localization/local_ru.json +5 -2
  11. package/assets/localization/local_zh.json +5 -2
  12. package/assets/scss/common/normalize.scss +339 -339
  13. package/components/atoms/TheIcon3.vue +50 -50
  14. package/components/atoms/collapse/CollapseNav.vue +165 -165
  15. package/components/atoms/dropdown/dropdown/Dropdown.vue +168 -168
  16. package/components/atoms/modal/bySteps/BySteps.vue +253 -253
  17. package/components/atoms/perPage/PerPage.vue +58 -58
  18. package/components/atoms/stack/StackBlock.vue +185 -185
  19. package/components/atoms/table/dataGrid/DataGridColumnSwitch.vue +222 -222
  20. package/components/atoms/table/dataGrid/lib/config/settingsTable.ts +94 -94
  21. package/components/atoms/table/dataGrid/lib/utils/export.ts +16 -16
  22. package/components/atoms/tabs/VerticalTabs.vue +105 -105
  23. package/components/atoms/tooltip/Signpost.vue +227 -227
  24. package/components/common/accordion/Recursion.vue +222 -222
  25. package/components/common/browse/BrowseNew.vue +237 -237
  26. package/components/common/browse/BrowseOld.vue +217 -217
  27. package/components/common/browse/blocks/contents/Files.vue +37 -37
  28. package/components/common/browse/blocks/contents/FilesOld.vue +72 -72
  29. package/components/common/browse/blocks/contents/filesNew/FilesNew.vue +96 -96
  30. package/components/common/browse/blocks/contents/filesNew/Skeleton.vue +18 -18
  31. package/components/common/context/Context.vue +111 -111
  32. package/components/common/context/lib/models/interfaces.ts +31 -31
  33. package/components/common/context/recursion/Recursion.vue +87 -87
  34. package/components/common/context/recursion/RecursionNew.vue +238 -238
  35. package/components/common/context/recursion/RecursionOld.vue +228 -228
  36. package/components/common/details/DetailsItem.vue +109 -109
  37. package/components/common/diagramMain/DiagramMain.vue +897 -897
  38. package/components/common/diagramMain/Header.vue +214 -214
  39. package/components/common/layout/theHeader/helpMenu/About.vue +82 -82
  40. package/components/common/layout/theHeader/helpMenu/aboutNew/AboutNew.vue +103 -103
  41. package/components/common/layout/theHeader/userMenu/modals/preferences/view/ViewOld.vue +112 -112
  42. package/components/common/mainNavigationPanel/MainNavigationPanelOld.vue +311 -311
  43. package/components/common/modals/unsavedChanges/UnsavedChanges.vue +56 -56
  44. package/components/common/monitor/overview/OverviewOld.vue +139 -139
  45. package/components/common/pages/home/headline/Headline.vue +45 -45
  46. package/components/common/pages/home/headline/HeadlineOld.vue +42 -42
  47. package/components/common/pages/home/lib/models/interfaces.ts +48 -48
  48. package/components/common/pages/home/widgets/Widgets.vue +49 -49
  49. package/components/common/pages/home/widgets/WidgetsNew.vue +86 -86
  50. package/components/common/pages/home/widgets/WidgetsOld.vue +34 -34
  51. package/components/common/pages/home/widgets/hosts/Hosts.vue +27 -27
  52. package/components/common/pages/home/widgets/hosts/lib/config/items.ts +23 -23
  53. package/components/common/pages/home/widgets/vms/Vms.vue +26 -26
  54. package/components/common/pages/home/widgets/vms/VmsOld.vue +35 -35
  55. package/components/common/pages/home/widgets/vms/lib/config/items.ts +19 -19
  56. package/components/common/pages/packages/Packages.vue +208 -208
  57. package/components/common/pages/shortcuts/block/BlockNew.vue +96 -96
  58. package/components/common/pages/shortcuts/block/BlockOld.vue +68 -68
  59. package/components/common/portlets/customAttributes/Portlet.vue +667 -667
  60. package/components/common/portlets/tag/Portlet.vue +433 -433
  61. package/components/common/recursionTree/RecursionTree.vue +223 -223
  62. package/components/common/select/button/ButtonDropdown.vue +108 -108
  63. package/components/common/spiceConsole/Drawer.vue +370 -370
  64. package/components/common/spiceConsole/lib/models/interfaces.ts +5 -5
  65. package/components/common/split/horizontal/HorizontalOld.vue +337 -337
  66. package/components/common/split/vertical/Vertical.vue +160 -160
  67. package/components/common/tools/Actions.vue +202 -202
  68. package/components/common/vm/actions/add/Add.vue +784 -774
  69. package/components/common/vm/actions/add/New.vue +429 -0
  70. package/components/common/vm/actions/add/Old.vue +371 -0
  71. package/components/common/vm/actions/add/lib/config/steps.ts +263 -247
  72. package/components/common/vm/actions/clone/Clone.vue +798 -798
  73. package/components/common/vm/actions/clone/lib/config/steps.ts +291 -291
  74. package/components/common/vm/actions/clone/toTemplate/ToTemplate.vue +626 -634
  75. package/components/common/vm/actions/clone/toTemplate/lib/config/steps.ts +116 -116
  76. package/components/common/vm/actions/common/customizeHardware/CustomizeHardware.vue +275 -275
  77. package/components/common/vm/actions/common/customizeHardware/CustomizeHardwareNew.vue +274 -274
  78. package/components/common/vm/actions/common/customizeHardware/CustomizeHardwareOld.vue +177 -177
  79. package/components/common/vm/actions/common/customizeHardware/virtualHardware/VirtualHardware.vue +698 -698
  80. package/components/common/vm/actions/common/customizeHardware/virtualHardware/VirtualHardwareNew.vue +410 -410
  81. package/components/common/vm/actions/common/customizeHardware/virtualHardware/VirtualHardwareOld.vue +319 -319
  82. package/components/common/vm/actions/common/customizeHardware/virtualHardware/browseView/BrowseView.vue +219 -219
  83. package/components/common/vm/actions/common/customizeHardware/virtualHardware/bus/Bus.vue +99 -99
  84. package/components/common/vm/actions/common/customizeHardware/virtualHardware/bus/BusNew.vue +117 -117
  85. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/CdDvdDrive.vue +232 -232
  86. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/CdDvdDriveNew.vue +164 -164
  87. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/CdDvdDriveOld.vue +168 -168
  88. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/Media.vue +25 -25
  89. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/MediaNew.vue +70 -70
  90. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/MediaOld.vue +50 -50
  91. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/Cpu.vue +338 -338
  92. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/shares/Shares.vue +140 -140
  93. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/shares/lib/config/options.ts +28 -28
  94. package/components/common/vm/actions/common/customizeHardware/virtualHardware/limit/Limit.vue +220 -220
  95. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/NewHardDisk.vue +368 -368
  96. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/NewHardDiskNew.vue +232 -232
  97. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/NewHardDiskOld.vue +250 -250
  98. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/mode/ModeOld.vue +56 -56
  99. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/sharing/SharingNew.vue +44 -44
  100. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/NewNetwork.vue +286 -286
  101. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/NewNetworkNew.vue +124 -124
  102. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/location/LocationOld.vue +134 -134
  103. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/location/new/New.vue +63 -63
  104. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/location/new/table/lib/config/config.ts +95 -95
  105. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/macAddress/MacAddress.vue +119 -119
  106. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/macAddress/MacAddressNew.vue +69 -69
  107. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/macAddress/MacAddressOld.vue +83 -83
  108. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/NewPciDevice.vue +205 -205
  109. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/directPathIo/DirectPathIoNew.vue +66 -66
  110. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/directPathIo/DirectPathIoOld.vue +62 -62
  111. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/dynamicDirectPathIo/DynamicDirectPathIo.vue +31 -31
  112. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/dynamicDirectPathIo/DynamicDirectPathIoNew.vue +84 -84
  113. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/dynamicDirectPathIo/DynamicDirectPathIoOld.vue +76 -76
  114. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/Note.vue +15 -15
  115. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/NoteNew.vue +42 -42
  116. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/NoteOld.vue +30 -30
  117. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/nvidiaGrid/NvidiaGrid.vue +41 -41
  118. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/nvidiaGrid/NvidiaGridNew.vue +81 -81
  119. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/nvidiaGrid/NvidiaGridOld.vue +84 -84
  120. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newUsbController/NewUsbControllerNew.vue +56 -56
  121. package/components/common/vm/actions/common/customizeHardware/virtualHardware/other/Other.vue +16 -16
  122. package/components/common/vm/actions/common/customizeHardware/virtualHardware/other/OtherNew.vue +30 -30
  123. package/components/common/vm/actions/common/customizeHardware/virtualHardware/videoCard/VideoCardNew.vue +104 -104
  124. package/components/common/vm/actions/common/customizeHardware/virtualHardware/videoCard/VideoCardOld.vue +112 -112
  125. package/components/common/vm/actions/common/customizeHardware/virtualHardware/videoCard/totalVideoMemory/TotalVideoMemoryNew.vue +54 -54
  126. package/components/common/vm/actions/common/customizeHardware/vmoptions/Vmoptions.vue +145 -145
  127. package/components/common/vm/actions/common/customizeHardware/vmoptions/VmoptionsNew.vue +102 -102
  128. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/BootOptionsNew.vue +75 -75
  129. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/delay/Delay.vue +26 -26
  130. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/firmware/Firmware.vue +57 -57
  131. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/firmware/FirmwareNew.vue +42 -42
  132. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/menu/MenuNew.vue +25 -25
  133. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/order/Order.vue +171 -171
  134. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/order/OrderNew.vue +50 -50
  135. package/components/common/vm/actions/common/customizeHardware/vmoptions/generalOptions/GeneralOptionsNew.vue +141 -141
  136. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/New.vue +140 -140
  137. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/copyPaste/CopyPasteNew.vue +30 -30
  138. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/fileTransfer/FileTransferNew.vue +30 -30
  139. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/folderSharing/FolderSharingNew.vue +30 -30
  140. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/keymap/Keymap.vue +32 -32
  141. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/keymap/KeymapNew.vue +39 -39
  142. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/password/Password.vue +103 -103
  143. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/password/PasswordNew.vue +102 -102
  144. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/password/PasswordOld.vue +94 -94
  145. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirection.vue +28 -28
  146. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirectionNew.vue +38 -38
  147. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirectionOld.vue +44 -44
  148. package/components/common/vm/actions/common/lib/utils/capabilities.ts +52 -52
  149. package/components/common/vm/actions/common/select/compatibility/Compatibility.vue +162 -162
  150. package/components/common/vm/actions/common/select/createType/CreateType.vue +38 -74
  151. package/components/common/vm/actions/common/select/createType/New.vue +84 -0
  152. package/components/common/vm/actions/common/select/createType/Old.vue +70 -0
  153. package/components/common/vm/actions/common/select/createType/lib/config/items.ts +24 -4
  154. package/components/common/vm/actions/common/select/createType/lib/models/interfaces.ts +5 -0
  155. package/components/common/vm/actions/common/select/name/Name.vue +167 -236
  156. package/components/common/vm/actions/common/select/name/New.vue +143 -0
  157. package/components/common/vm/actions/common/select/name/Old.vue +119 -0
  158. package/components/common/vm/actions/common/select/storage/Storage.vue +130 -130
  159. package/components/common/vm/actions/common/select/storage/StorageOld.vue +129 -129
  160. package/components/common/vm/actions/common/select/template/Template.vue +64 -65
  161. package/components/common/vm/actions/common/select/template/TemplateTreeView.vue +88 -88
  162. package/components/common/vm/actions/editSettings/new/Skeleton.vue +88 -88
  163. package/components/common/wizards/datastore/add/lib/config/steps.ts +138 -138
  164. package/components/common/wizards/datastore/add/nfs/accessibility/Accessibility.vue +60 -60
  165. package/components/common/wizards/datastore/add/readyComplete/ReadyComplete.vue +92 -92
  166. package/components/common/wizards/network/add/steps/SelectConnectionType.vue +105 -105
  167. package/components/common/wizards/vm/migrate/lib/config/constructDataReady.ts +220 -220
  168. package/components/common/wizards/vm/migrate/select/network/Network.vue +103 -103
  169. package/components/common/wizards/vm/migrate/select/network/table/network/Network.vue +150 -150
  170. package/components/common/wizards/vm/migrate/select/network/table/network/lib/config/advancedTable.ts +91 -91
  171. package/components/common/wizards/vm/migrate/select/priority/Priority.vue +43 -43
  172. package/composables/productNameLocal.ts +30 -30
  173. package/composables/useAppVersion.ts +21 -21
  174. package/package.json +1 -1
  175. package/plugins/date.ts +233 -233
  176. package/plugins/directives.ts +24 -24
  177. package/public/spice-console/lib/images/bitmap.js +203 -203
  178. package/public/spice-console/network/spicechannel.js +383 -383
  179. package/store/main/mutations.ts +7 -7
  180. package/store/main/state.ts +7 -7
  181. package/store/tasks/mappers/recentTasks.ts +64 -64
@@ -1,202 +1,202 @@
1
- <template>
2
- <!-- :style="{ 'padding-right': rightSpace + 'px' }"-->
3
- <div
4
- :id="id"
5
- class="btn-group"
6
- :style="{ paddingRight: spaceForCollapseBtn + 'px' }"
7
- >
8
- <div v-for="(button, key) in props.actions" :key="button.type">
9
- <label v-if="button.uploaded" v-development="button.development">
10
- <span
11
- :class="[`btn btn-link ${props.size}`]"
12
- :data-id="`${button.testId}-text`"
13
- >
14
- <slot name="icon" :data="button" />
15
- {{ button.text }}
16
- </span>
17
- <input
18
- :id="`select-file-button-${key}`"
19
- :data-id="button.testId"
20
- type="file"
21
- :disabled="button.disabled"
22
- :multiple="button?.multiple || false"
23
- class="btn-group__file"
24
- @change="(event) => onSelectFiles(event, button.type, key)"
25
- />
26
- </label>
27
-
28
- <button
29
- v-else
30
- :id="`actions-button-${key}`"
31
- v-development="button.development"
32
- :data-id="button.testId"
33
- :class="[`btn btn-link ${props.size}`]"
34
- :disabled="button.disabled"
35
- @click="onClickButton(button.type)"
36
- >
37
- <slot name="icon" :data="button" />
38
- {{ button.text }}
39
- </button>
40
- </div>
41
- <atoms-collapse-nav
42
- v-show="collapsedItems.length"
43
- :test-id="`${props.testId}-item`"
44
- :items="collapsedItems"
45
- close-after-click
46
- class="nav-tabs"
47
- @change="onClickButton"
48
- @select-file="onSelectFiles"
49
- />
50
- </div>
51
- </template>
52
-
53
- <script lang="ts" setup>
54
- import type { UI_I_Button } from '~/components/common/tools/lib/models/interfaces'
55
- import type { UI_I_CollapseNavItem } from '~/components/atoms/collapse/lib/models/interfaces'
56
-
57
- const props = withDefaults(
58
- defineProps<{
59
- actions: UI_I_Button[]
60
- testId: string
61
- size?: 'btn-sm' | ''
62
- }>(),
63
- {
64
- size: 'btn-sm',
65
- }
66
- )
67
- const emits = defineEmits<{
68
- (event: 'click', value1: string, value2?: Event | null): void
69
- }>()
70
-
71
- const onClickButton = (type: string): void => {
72
- emits('click', type)
73
- }
74
-
75
- const onSelectFiles = (event: Event, type: string, key: number): void => {
76
- emits('click', type, event)
77
-
78
- const input = document.getElementById(
79
- `select-file-button-${key}`
80
- ) as HTMLInputElement | null
81
- input && (input.value = '')
82
- }
83
-
84
- const visibleCount = ref<number>(props.actions.length)
85
- const collapsedItems = computed<UI_I_CollapseNavItem[]>(() => {
86
- return props.actions
87
- .filter((_, index) => {
88
- return index >= visibleCount.value
89
- })
90
- .map((item) => {
91
- return {
92
- text: item.text,
93
- value: item.type,
94
- disabled: item.disabled,
95
- development: item.development,
96
- uploaded: item.uploaded,
97
- testId: item.testId,
98
- }
99
- })
100
- })
101
- watch(
102
- () => props.actions,
103
- () => {
104
- // visibleCount.value = newValue.length
105
- outputSize()
106
- },
107
- { deep: true }
108
- )
109
-
110
- // const rightSpace = ref<number>(0)
111
- // watch(
112
- // collapsedItems,
113
- // (newValue) => {
114
- // let space = 0
115
- // const element: any = document.getElementById(id.value)
116
- // if (!element || !newValue.length) space = 0
117
- // else if (element.lastChild?.className?.includes('tabs-overflow')) {
118
- // space =
119
- // element.getBoundingClientRect().right -
120
- // element.lastChild.getBoundingClientRect().left
121
- // }
122
- //
123
- // rightSpace.value = space
124
- // },
125
- // { deep: true }
126
- // )
127
-
128
-
129
- const spaceForCollapseBtn = ref<number>(65)
130
- const outputSize = (): void => {
131
- const el = document.getElementById(id.value)
132
- if (!el) return
133
-
134
- const elWidth = el.clientWidth
135
- // const elItems = el.children
136
- const elItems = Array.from(el.children).filter(
137
- (item) => !item.classList.contains('nav-tabs')
138
- )
139
- // const elItemsMarginLeft = parseInt(getComputedStyle(elItems[0]).marginLeft)
140
- // const elItemsMarginRight = parseInt(getComputedStyle(elItems[0]).marginRight)
141
- // const childrenMarginX = elItemsMarginLeft + elItemsMarginRight
142
-
143
- // let childrenWidth = -10 // TODO Найти способ лучше. Не всегда совпадает ширина элементов с шириной родительского элемента
144
- let childrenWidth = spaceForCollapseBtn.value // TODO Найти способ лучше. Не всегда совпадает ширина элементов с шириной родительского элемента
145
- let count = 0
146
- for (let i = 0; i < elItems.length; i++) {
147
- const elItemsMarginLeft = parseInt(getComputedStyle(elItems[i]).marginLeft)
148
- const elItemsMarginRight = parseInt(
149
- getComputedStyle(elItems[i]).marginRight
150
- )
151
- const childrenMarginX = elItemsMarginLeft + elItemsMarginRight
152
-
153
- childrenWidth += elItems[i].clientWidth + childrenMarginX
154
- // const isWrap = elWidth - rightSpace.value < childrenWidth
155
- const isWrap = elWidth < childrenWidth
156
-
157
- if (isWrap) break
158
- count++
159
- }
160
-
161
- visibleCount.value = count
162
- }
163
-
164
- const setResizeObserve = (): void => {
165
- const el = document.getElementById(id.value)
166
-
167
- if (!el) {
168
- setTimeout(setResizeObserve, 0)
169
- return
170
- }
171
-
172
- new ResizeObserver(outputSize).observe(el)
173
- }
174
- const id = ref<string>('')
175
- onMounted(() => {
176
- id.value = `tool-actions-${useUniqueId()}`
177
- setResizeObserve()
178
- })
179
- </script>
180
-
181
- <style lang="scss" scoped>
182
- .btn {
183
- &:disabled {
184
- color: var(--btn-link-disabled);
185
- }
186
- &-group {
187
- margin-top: 10px;
188
- box-shadow: none;
189
- position: relative;
190
- overflow: hidden;
191
- display: flex;
192
- flex-wrap: wrap;
193
- min-height: 25px;
194
- height: 25px;
195
- box-sizing: content-box;
196
-
197
- &__file {
198
- display: none;
199
- }
200
- }
201
- }
202
- </style>
1
+ <template>
2
+ <!-- :style="{ 'padding-right': rightSpace + 'px' }"-->
3
+ <div
4
+ :id="id"
5
+ class="btn-group"
6
+ :style="{ paddingRight: spaceForCollapseBtn + 'px' }"
7
+ >
8
+ <div v-for="(button, key) in props.actions" :key="button.type">
9
+ <label v-if="button.uploaded" v-development="button.development">
10
+ <span
11
+ :class="[`btn btn-link ${props.size}`]"
12
+ :data-id="`${button.testId}-text`"
13
+ >
14
+ <slot name="icon" :data="button" />
15
+ {{ button.text }}
16
+ </span>
17
+ <input
18
+ :id="`select-file-button-${key}`"
19
+ :data-id="button.testId"
20
+ type="file"
21
+ :disabled="button.disabled"
22
+ :multiple="button?.multiple || false"
23
+ class="btn-group__file"
24
+ @change="(event) => onSelectFiles(event, button.type, key)"
25
+ />
26
+ </label>
27
+
28
+ <button
29
+ v-else
30
+ :id="`actions-button-${key}`"
31
+ v-development="button.development"
32
+ :data-id="button.testId"
33
+ :class="[`btn btn-link ${props.size}`]"
34
+ :disabled="button.disabled"
35
+ @click="onClickButton(button.type)"
36
+ >
37
+ <slot name="icon" :data="button" />
38
+ {{ button.text }}
39
+ </button>
40
+ </div>
41
+ <atoms-collapse-nav
42
+ v-show="collapsedItems.length"
43
+ :test-id="`${props.testId}-item`"
44
+ :items="collapsedItems"
45
+ close-after-click
46
+ class="nav-tabs"
47
+ @change="onClickButton"
48
+ @select-file="onSelectFiles"
49
+ />
50
+ </div>
51
+ </template>
52
+
53
+ <script lang="ts" setup>
54
+ import type { UI_I_Button } from '~/components/common/tools/lib/models/interfaces'
55
+ import type { UI_I_CollapseNavItem } from '~/components/atoms/collapse/lib/models/interfaces'
56
+
57
+ const props = withDefaults(
58
+ defineProps<{
59
+ actions: UI_I_Button[]
60
+ testId: string
61
+ size?: 'btn-sm' | ''
62
+ }>(),
63
+ {
64
+ size: 'btn-sm',
65
+ }
66
+ )
67
+ const emits = defineEmits<{
68
+ (event: 'click', value1: string, value2?: Event | null): void
69
+ }>()
70
+
71
+ const onClickButton = (type: string): void => {
72
+ emits('click', type)
73
+ }
74
+
75
+ const onSelectFiles = (event: Event, type: string, key: number): void => {
76
+ emits('click', type, event)
77
+
78
+ const input = document.getElementById(
79
+ `select-file-button-${key}`
80
+ ) as HTMLInputElement | null
81
+ input && (input.value = '')
82
+ }
83
+
84
+ const visibleCount = ref<number>(props.actions.length)
85
+ const collapsedItems = computed<UI_I_CollapseNavItem[]>(() => {
86
+ return props.actions
87
+ .filter((_, index) => {
88
+ return index >= visibleCount.value
89
+ })
90
+ .map((item) => {
91
+ return {
92
+ text: item.text,
93
+ value: item.type,
94
+ disabled: item.disabled,
95
+ development: item.development,
96
+ uploaded: item.uploaded,
97
+ testId: item.testId,
98
+ }
99
+ })
100
+ })
101
+ watch(
102
+ () => props.actions,
103
+ () => {
104
+ // visibleCount.value = newValue.length
105
+ outputSize()
106
+ },
107
+ { deep: true }
108
+ )
109
+
110
+ // const rightSpace = ref<number>(0)
111
+ // watch(
112
+ // collapsedItems,
113
+ // (newValue) => {
114
+ // let space = 0
115
+ // const element: any = document.getElementById(id.value)
116
+ // if (!element || !newValue.length) space = 0
117
+ // else if (element.lastChild?.className?.includes('tabs-overflow')) {
118
+ // space =
119
+ // element.getBoundingClientRect().right -
120
+ // element.lastChild.getBoundingClientRect().left
121
+ // }
122
+ //
123
+ // rightSpace.value = space
124
+ // },
125
+ // { deep: true }
126
+ // )
127
+
128
+
129
+ const spaceForCollapseBtn = ref<number>(65)
130
+ const outputSize = (): void => {
131
+ const el = document.getElementById(id.value)
132
+ if (!el) return
133
+
134
+ const elWidth = el.clientWidth
135
+ // const elItems = el.children
136
+ const elItems = Array.from(el.children).filter(
137
+ (item) => !item.classList.contains('nav-tabs')
138
+ )
139
+ // const elItemsMarginLeft = parseInt(getComputedStyle(elItems[0]).marginLeft)
140
+ // const elItemsMarginRight = parseInt(getComputedStyle(elItems[0]).marginRight)
141
+ // const childrenMarginX = elItemsMarginLeft + elItemsMarginRight
142
+
143
+ // let childrenWidth = -10 // TODO Найти способ лучше. Не всегда совпадает ширина элементов с шириной родительского элемента
144
+ let childrenWidth = spaceForCollapseBtn.value // TODO Найти способ лучше. Не всегда совпадает ширина элементов с шириной родительского элемента
145
+ let count = 0
146
+ for (let i = 0; i < elItems.length; i++) {
147
+ const elItemsMarginLeft = parseInt(getComputedStyle(elItems[i]).marginLeft)
148
+ const elItemsMarginRight = parseInt(
149
+ getComputedStyle(elItems[i]).marginRight
150
+ )
151
+ const childrenMarginX = elItemsMarginLeft + elItemsMarginRight
152
+
153
+ childrenWidth += elItems[i].clientWidth + childrenMarginX
154
+ // const isWrap = elWidth - rightSpace.value < childrenWidth
155
+ const isWrap = elWidth < childrenWidth
156
+
157
+ if (isWrap) break
158
+ count++
159
+ }
160
+
161
+ visibleCount.value = count
162
+ }
163
+
164
+ const setResizeObserve = (): void => {
165
+ const el = document.getElementById(id.value)
166
+
167
+ if (!el) {
168
+ setTimeout(setResizeObserve, 0)
169
+ return
170
+ }
171
+
172
+ new ResizeObserver(outputSize).observe(el)
173
+ }
174
+ const id = ref<string>('')
175
+ onMounted(() => {
176
+ id.value = `tool-actions-${useUniqueId()}`
177
+ setResizeObserve()
178
+ })
179
+ </script>
180
+
181
+ <style lang="scss" scoped>
182
+ .btn {
183
+ &:disabled {
184
+ color: var(--btn-link-disabled);
185
+ }
186
+ &-group {
187
+ margin-top: 10px;
188
+ box-shadow: none;
189
+ position: relative;
190
+ overflow: hidden;
191
+ display: flex;
192
+ flex-wrap: wrap;
193
+ min-height: 25px;
194
+ height: 25px;
195
+ box-sizing: content-box;
196
+
197
+ &__file {
198
+ display: none;
199
+ }
200
+ }
201
+ }
202
+ </style>