bfg-common 1.5.57 → 1.5.59

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 (182) 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/combobox/Combobox.vue +2 -0
  16. package/components/atoms/dropdown/dropdown/Dropdown.vue +168 -168
  17. package/components/atoms/modal/bySteps/BySteps.vue +253 -253
  18. package/components/atoms/perPage/PerPage.vue +58 -58
  19. package/components/atoms/stack/StackBlock.vue +185 -185
  20. package/components/atoms/table/dataGrid/DataGridColumnSwitch.vue +222 -222
  21. package/components/atoms/table/dataGrid/lib/config/settingsTable.ts +94 -94
  22. package/components/atoms/table/dataGrid/lib/utils/export.ts +16 -16
  23. package/components/atoms/tabs/VerticalTabs.vue +105 -105
  24. package/components/atoms/tooltip/Signpost.vue +227 -227
  25. package/components/common/accordion/Recursion.vue +222 -222
  26. package/components/common/browse/BrowseNew.vue +237 -237
  27. package/components/common/browse/BrowseOld.vue +217 -217
  28. package/components/common/browse/blocks/contents/Files.vue +37 -37
  29. package/components/common/browse/blocks/contents/FilesOld.vue +72 -72
  30. package/components/common/browse/blocks/contents/filesNew/FilesNew.vue +96 -96
  31. package/components/common/browse/blocks/contents/filesNew/Skeleton.vue +18 -18
  32. package/components/common/context/Context.vue +111 -111
  33. package/components/common/context/lib/models/interfaces.ts +31 -31
  34. package/components/common/context/recursion/Recursion.vue +87 -87
  35. package/components/common/context/recursion/RecursionNew.vue +238 -238
  36. package/components/common/context/recursion/RecursionOld.vue +228 -228
  37. package/components/common/details/DetailsItem.vue +109 -109
  38. package/components/common/diagramMain/DiagramMain.vue +897 -897
  39. package/components/common/diagramMain/Header.vue +214 -214
  40. package/components/common/layout/theHeader/helpMenu/About.vue +82 -82
  41. package/components/common/layout/theHeader/helpMenu/aboutNew/AboutNew.vue +103 -103
  42. package/components/common/layout/theHeader/userMenu/modals/preferences/view/ViewOld.vue +112 -112
  43. package/components/common/mainNavigationPanel/MainNavigationPanelOld.vue +311 -311
  44. package/components/common/modals/unsavedChanges/UnsavedChanges.vue +56 -56
  45. package/components/common/monitor/overview/OverviewOld.vue +139 -139
  46. package/components/common/pages/home/headline/Headline.vue +45 -45
  47. package/components/common/pages/home/headline/HeadlineOld.vue +42 -42
  48. package/components/common/pages/home/lib/models/interfaces.ts +48 -48
  49. package/components/common/pages/home/widgets/Widgets.vue +49 -49
  50. package/components/common/pages/home/widgets/WidgetsNew.vue +86 -86
  51. package/components/common/pages/home/widgets/WidgetsOld.vue +34 -34
  52. package/components/common/pages/home/widgets/hosts/Hosts.vue +27 -27
  53. package/components/common/pages/home/widgets/hosts/lib/config/items.ts +23 -23
  54. package/components/common/pages/home/widgets/vms/Vms.vue +26 -26
  55. package/components/common/pages/home/widgets/vms/VmsOld.vue +35 -35
  56. package/components/common/pages/home/widgets/vms/lib/config/items.ts +19 -19
  57. package/components/common/pages/packages/Packages.vue +208 -208
  58. package/components/common/pages/shortcuts/block/BlockNew.vue +96 -96
  59. package/components/common/pages/shortcuts/block/BlockOld.vue +68 -68
  60. package/components/common/portlets/customAttributes/Portlet.vue +667 -667
  61. package/components/common/portlets/tag/Portlet.vue +433 -433
  62. package/components/common/recursionTree/RecursionTree.vue +223 -223
  63. package/components/common/select/button/ButtonDropdown.vue +108 -108
  64. package/components/common/spiceConsole/Drawer.vue +370 -370
  65. package/components/common/spiceConsole/lib/models/interfaces.ts +5 -5
  66. package/components/common/split/horizontal/HorizontalOld.vue +337 -337
  67. package/components/common/split/vertical/Vertical.vue +160 -160
  68. package/components/common/tools/Actions.vue +202 -202
  69. package/components/common/vm/actions/add/Add.vue +727 -774
  70. package/components/common/vm/actions/add/New.vue +375 -0
  71. package/components/common/vm/actions/add/Old.vue +318 -0
  72. package/components/common/vm/actions/add/lib/config/steps.ts +247 -247
  73. package/components/common/vm/actions/clone/Clone.vue +798 -798
  74. package/components/common/vm/actions/clone/lib/config/steps.ts +291 -291
  75. package/components/common/vm/actions/clone/toTemplate/ToTemplate.vue +634 -634
  76. package/components/common/vm/actions/clone/toTemplate/lib/config/steps.ts +116 -116
  77. package/components/common/vm/actions/common/customizeHardware/CustomizeHardware.vue +275 -275
  78. package/components/common/vm/actions/common/customizeHardware/CustomizeHardwareNew.vue +274 -274
  79. package/components/common/vm/actions/common/customizeHardware/CustomizeHardwareOld.vue +177 -177
  80. package/components/common/vm/actions/common/customizeHardware/virtualHardware/VirtualHardware.vue +698 -698
  81. package/components/common/vm/actions/common/customizeHardware/virtualHardware/VirtualHardwareNew.vue +410 -410
  82. package/components/common/vm/actions/common/customizeHardware/virtualHardware/VirtualHardwareOld.vue +319 -319
  83. package/components/common/vm/actions/common/customizeHardware/virtualHardware/browseView/BrowseView.vue +219 -219
  84. package/components/common/vm/actions/common/customizeHardware/virtualHardware/bus/Bus.vue +99 -99
  85. package/components/common/vm/actions/common/customizeHardware/virtualHardware/bus/BusNew.vue +117 -117
  86. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/CdDvdDrive.vue +232 -232
  87. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/CdDvdDriveNew.vue +164 -164
  88. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/CdDvdDriveOld.vue +168 -168
  89. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/Media.vue +25 -25
  90. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/MediaNew.vue +70 -70
  91. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/MediaOld.vue +50 -50
  92. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/Cpu.vue +338 -338
  93. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/shares/Shares.vue +140 -140
  94. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/shares/lib/config/options.ts +28 -28
  95. package/components/common/vm/actions/common/customizeHardware/virtualHardware/limit/Limit.vue +220 -220
  96. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/NewHardDisk.vue +368 -368
  97. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/NewHardDiskNew.vue +232 -232
  98. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/NewHardDiskOld.vue +250 -250
  99. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/mode/ModeOld.vue +56 -56
  100. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/sharing/SharingNew.vue +44 -44
  101. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/NewNetwork.vue +286 -286
  102. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/NewNetworkNew.vue +124 -124
  103. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/location/LocationOld.vue +134 -134
  104. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/location/new/New.vue +63 -63
  105. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/location/new/table/lib/config/config.ts +95 -95
  106. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/macAddress/MacAddress.vue +119 -119
  107. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/macAddress/MacAddressNew.vue +69 -69
  108. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/macAddress/MacAddressOld.vue +83 -83
  109. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/NewPciDevice.vue +205 -205
  110. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/directPathIo/DirectPathIoNew.vue +66 -66
  111. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/directPathIo/DirectPathIoOld.vue +62 -62
  112. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/dynamicDirectPathIo/DynamicDirectPathIo.vue +31 -31
  113. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/dynamicDirectPathIo/DynamicDirectPathIoNew.vue +84 -84
  114. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/dynamicDirectPathIo/DynamicDirectPathIoOld.vue +76 -76
  115. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/Note.vue +15 -15
  116. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/NoteNew.vue +42 -42
  117. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/NoteOld.vue +30 -30
  118. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/nvidiaGrid/NvidiaGrid.vue +41 -41
  119. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/nvidiaGrid/NvidiaGridNew.vue +81 -81
  120. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/nvidiaGrid/NvidiaGridOld.vue +84 -84
  121. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newUsbController/NewUsbControllerNew.vue +56 -56
  122. package/components/common/vm/actions/common/customizeHardware/virtualHardware/other/Other.vue +16 -16
  123. package/components/common/vm/actions/common/customizeHardware/virtualHardware/other/OtherNew.vue +30 -30
  124. package/components/common/vm/actions/common/customizeHardware/virtualHardware/videoCard/VideoCardNew.vue +104 -104
  125. package/components/common/vm/actions/common/customizeHardware/virtualHardware/videoCard/VideoCardOld.vue +112 -112
  126. package/components/common/vm/actions/common/customizeHardware/virtualHardware/videoCard/totalVideoMemory/TotalVideoMemoryNew.vue +54 -54
  127. package/components/common/vm/actions/common/customizeHardware/vmoptions/Vmoptions.vue +145 -145
  128. package/components/common/vm/actions/common/customizeHardware/vmoptions/VmoptionsNew.vue +102 -102
  129. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/BootOptionsNew.vue +75 -75
  130. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/delay/Delay.vue +26 -26
  131. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/firmware/Firmware.vue +57 -57
  132. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/firmware/FirmwareNew.vue +42 -42
  133. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/menu/MenuNew.vue +25 -25
  134. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/order/Order.vue +171 -171
  135. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/order/OrderNew.vue +50 -50
  136. package/components/common/vm/actions/common/customizeHardware/vmoptions/generalOptions/GeneralOptionsNew.vue +141 -141
  137. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/New.vue +140 -140
  138. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/copyPaste/CopyPasteNew.vue +30 -30
  139. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/fileTransfer/FileTransferNew.vue +30 -30
  140. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/folderSharing/FolderSharingNew.vue +30 -30
  141. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/keymap/Keymap.vue +32 -32
  142. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/keymap/KeymapNew.vue +39 -39
  143. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/password/Password.vue +103 -103
  144. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/password/PasswordNew.vue +102 -102
  145. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/password/PasswordOld.vue +94 -94
  146. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirection.vue +28 -28
  147. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirectionNew.vue +38 -38
  148. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirectionOld.vue +44 -44
  149. package/components/common/vm/actions/common/lib/utils/capabilities.ts +52 -52
  150. package/components/common/vm/actions/common/select/compatibility/Compatibility.vue +162 -162
  151. package/components/common/vm/actions/common/select/createType/CreateType.vue +38 -74
  152. package/components/common/vm/actions/common/select/createType/New.vue +84 -0
  153. package/components/common/vm/actions/common/select/createType/Old.vue +70 -0
  154. package/components/common/vm/actions/common/select/createType/lib/config/items.ts +24 -4
  155. package/components/common/vm/actions/common/select/createType/lib/models/interfaces.ts +5 -0
  156. package/components/common/vm/actions/common/select/name/Name.vue +167 -236
  157. package/components/common/vm/actions/common/select/name/New.vue +143 -0
  158. package/components/common/vm/actions/common/select/name/Old.vue +119 -0
  159. package/components/common/vm/actions/common/select/storage/Storage.vue +130 -130
  160. package/components/common/vm/actions/common/select/storage/StorageOld.vue +129 -129
  161. package/components/common/vm/actions/common/select/template/Template.vue +65 -65
  162. package/components/common/vm/actions/common/select/template/TemplateTreeView.vue +88 -88
  163. package/components/common/vm/actions/editSettings/new/Skeleton.vue +88 -88
  164. package/components/common/wizards/datastore/add/lib/config/steps.ts +138 -138
  165. package/components/common/wizards/datastore/add/nfs/accessibility/Accessibility.vue +60 -60
  166. package/components/common/wizards/datastore/add/readyComplete/ReadyComplete.vue +92 -92
  167. package/components/common/wizards/network/add/steps/SelectConnectionType.vue +105 -105
  168. package/components/common/wizards/vm/migrate/lib/config/constructDataReady.ts +220 -220
  169. package/components/common/wizards/vm/migrate/select/network/Network.vue +103 -103
  170. package/components/common/wizards/vm/migrate/select/network/table/network/Network.vue +150 -150
  171. package/components/common/wizards/vm/migrate/select/network/table/network/lib/config/advancedTable.ts +91 -91
  172. package/components/common/wizards/vm/migrate/select/priority/Priority.vue +43 -43
  173. package/composables/productNameLocal.ts +30 -30
  174. package/composables/useAppVersion.ts +21 -21
  175. package/package.json +1 -1
  176. package/plugins/date.ts +233 -233
  177. package/plugins/directives.ts +24 -24
  178. package/public/spice-console/lib/images/bitmap.js +203 -203
  179. package/public/spice-console/network/spicechannel.js +383 -383
  180. package/store/main/mutations.ts +7 -7
  181. package/store/main/state.ts +7 -7
  182. 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>