bfg-common 1.5.550 → 1.5.551

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 (169) 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 +18 -3
  7. package/assets/localization/local_en.json +18 -3
  8. package/assets/localization/local_hy.json +18 -3
  9. package/assets/localization/local_kk.json +18 -3
  10. package/assets/localization/local_ru.json +18 -3
  11. package/assets/localization/local_zh.json +18 -3
  12. package/components/atoms/TheIcon3.vue +50 -50
  13. package/components/atoms/collapse/CollapseNav.vue +170 -170
  14. package/components/atoms/perPage/PerPage.vue +58 -58
  15. package/components/atoms/table/dataGrid/DataGrid.vue +1718 -1718
  16. package/components/atoms/table/dataGrid/DataGridPagination.vue +97 -97
  17. package/components/atoms/table/dataGrid/lib/config/settingsTable.ts +94 -94
  18. package/components/atoms/table/dataGrid/lib/utils/export.ts +16 -16
  19. package/components/common/backup/storage/actions/add/Add.vue +251 -251
  20. package/components/common/backup/storage/actions/add/lib/utils.ts +51 -51
  21. package/components/common/browse/blocks/contents/filesNew/Skeleton.vue +18 -18
  22. package/components/common/diagramMain/modals/lib/config/portModal.ts +251 -251
  23. package/components/common/diagramMain/modals/lib/config/vCenterModal.ts +48 -48
  24. package/components/common/diagramMain/port/Port.vue +580 -580
  25. package/components/common/layout/theHeader/helpMenu/About.vue +79 -79
  26. package/components/common/layout/theHeader/helpMenu/aboutOld/AboutOld.vue +79 -79
  27. package/components/common/modals/confirmByInput/ConfirmByInput.vue +9 -1
  28. package/components/common/modals/confirmByInput/ConfirmByInputNew.vue +7 -2
  29. package/components/common/pages/backups/DetailView.vue +52 -52
  30. package/components/common/pages/backups/lib/models/interfaces.ts +36 -36
  31. package/components/common/pages/backups/modals/Modals.vue +243 -243
  32. package/components/common/pages/backups/modals/createBackup/New.vue +8 -2
  33. package/components/common/pages/backups/modals/createBackup/configuration/backupWindow/BackupWindow.vue +29 -29
  34. package/components/common/pages/backups/modals/createBackup/configuration/maxBandwidth/MaxBandwidth.vue +69 -69
  35. package/components/common/pages/backups/modals/createBackup/configuration/strategy/Strategy.vue +38 -38
  36. package/components/common/pages/backups/modals/createBackup/lib/config/readyToCompleteOptions.ts +69 -69
  37. package/components/common/pages/backups/modals/createBackup/lib/models/interfaces.ts +8 -8
  38. package/components/common/pages/backups/modals/lib/config/restore.ts +115 -115
  39. package/components/common/pages/backups/modals/lib/models/interfaces.ts +186 -186
  40. package/components/common/pages/backups/modals/restore/Restore.vue +9 -5
  41. package/components/common/pages/backups/modals/restore/RestoreNew.vue +13 -3
  42. package/components/common/pages/backups/modals/restore/RestoreOld.vue +6 -18
  43. package/components/common/pages/backups/modals/restore/name/lib/models/interfaces.ts +6 -6
  44. package/components/common/pages/home/lib/models/interfaces.ts +48 -48
  45. package/components/common/pages/home/widgets/hosts/Hosts.vue +27 -27
  46. package/components/common/pages/home/widgets/hosts/lib/config/items.ts +23 -23
  47. package/components/common/pages/home/widgets/vms/VmsOld.vue +35 -35
  48. package/components/common/pages/home/widgets/vms/lib/config/items.ts +19 -19
  49. package/components/common/pages/scheduledTasks/lib/utils/utils.ts +84 -84
  50. package/components/common/readyToComplete/ReadyToComplete.vue +17 -17
  51. package/components/common/select/radio/RadioGroup.vue +137 -137
  52. package/components/common/spiceConsole/Drawer.vue +420 -420
  53. package/components/common/spiceConsole/SpiceConsole.vue +184 -184
  54. package/components/common/spiceConsole/lib/models/interfaces.ts +5 -5
  55. package/components/common/tools/Actions.vue +207 -207
  56. package/components/common/treeView/TreeView.vue +52 -52
  57. package/components/common/vm/actions/add/Add.vue +950 -877
  58. package/components/common/vm/actions/add/New.vue +690 -652
  59. package/components/common/vm/actions/add/Old.vue +402 -363
  60. package/components/common/vm/actions/add/lib/config/steps.ts +347 -347
  61. package/components/common/vm/actions/clone/Clone.vue +809 -809
  62. package/components/common/vm/actions/clone/new/New.vue +457 -457
  63. package/components/common/vm/actions/clone/old/Old.vue +378 -378
  64. package/components/common/vm/actions/common/customizeHardware/CustomizeHardware.vue +308 -243
  65. package/components/common/vm/actions/common/customizeHardware/CustomizeHardwareNew.vue +373 -328
  66. package/components/common/vm/actions/common/customizeHardware/CustomizeHardwareOld.vue +205 -161
  67. package/components/common/vm/actions/common/customizeHardware/virtualHardware/VirtualHardware.vue +728 -694
  68. package/components/common/vm/actions/common/customizeHardware/virtualHardware/VirtualHardwareNew.vue +523 -512
  69. package/components/common/vm/actions/common/customizeHardware/virtualHardware/VirtualHardwareOld.vue +339 -328
  70. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/Cpu.vue +368 -348
  71. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/CpuNew.vue +248 -241
  72. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/CpuOld.vue +189 -184
  73. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/shares/Shares.vue +140 -140
  74. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/shares/lib/config/options.ts +28 -28
  75. package/components/common/vm/actions/common/customizeHardware/virtualHardware/memory/Memory.vue +313 -300
  76. package/components/common/vm/actions/common/customizeHardware/virtualHardware/memory/MemoryNew.vue +158 -158
  77. package/components/common/vm/actions/common/customizeHardware/virtualHardware/memory/MemoryOld.vue +155 -155
  78. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/NewHardDisk.vue +427 -427
  79. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/location/Location.vue +154 -154
  80. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/macAddress/MacAddress.vue +119 -119
  81. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/dynamicDirectPathIo/DynamicDirectPathIo.vue +31 -31
  82. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newUsbController/NewUsbController.vue +58 -47
  83. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newUsbController/NewUsbControllerNew.vue +65 -68
  84. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newUsbController/NewUsbControllerOld.vue +61 -64
  85. package/components/common/vm/actions/common/customizeHardware/virtualHardware/other/Other.vue +16 -16
  86. package/components/common/vm/actions/common/customizeHardware/virtualHardware/videoCard/VideoCard.vue +162 -140
  87. package/components/common/vm/actions/common/customizeHardware/virtualHardware/videoCard/VideoCardNew.vue +5 -6
  88. package/components/common/vm/actions/common/customizeHardware/virtualHardware/videoCard/VideoCardOld.vue +5 -6
  89. package/components/common/vm/actions/common/customizeHardware/virtualHardware/videoCard/lib/config/options.ts +4 -4
  90. package/components/common/vm/actions/common/customizeHardware/virtualHardware/videoCard/numberDisplays/NumberDisplays.vue +53 -53
  91. package/components/common/vm/actions/common/customizeHardware/vmoptions/Vmoptions.vue +163 -76
  92. package/components/common/vm/actions/common/customizeHardware/vmoptions/VmoptionsNew.vue +138 -87
  93. package/components/common/vm/actions/common/customizeHardware/vmoptions/VmoptionsOld.vue +120 -71
  94. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/BootOptions.vue +110 -46
  95. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/BootOptionsNew.vue +85 -65
  96. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/BootOptionsOld.vue +91 -70
  97. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/delay/Delay.vue +32 -32
  98. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/firmware/Firmware.vue +60 -60
  99. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/order/Order.vue +174 -156
  100. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/order/OrderNew.vue +74 -109
  101. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/order/OrderOld.vue +66 -104
  102. package/components/common/vm/actions/common/customizeHardware/vmoptions/generalOptions/GeneralOptions.vue +101 -86
  103. package/components/common/vm/actions/common/customizeHardware/vmoptions/generalOptions/GeneralOptionsNew.vue +173 -163
  104. package/components/common/vm/actions/common/customizeHardware/vmoptions/generalOptions/GeneralOptionsOld.vue +170 -162
  105. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/New.vue +148 -142
  106. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/Old.vue +141 -135
  107. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/RemoteConsoleOptions.vue +178 -74
  108. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/keymap/Keymap.vue +32 -32
  109. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/keymap/{New.vue → KeymapNew.vue} +45 -45
  110. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/keymap/{Old.vue → KeymapOld.vue} +47 -47
  111. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/password/Password.vue +103 -102
  112. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirection.vue +28 -28
  113. package/components/common/vm/actions/common/customizeHardware/vmoptions/tools/Tools.vue +49 -26
  114. package/components/common/vm/actions/common/lib/models/interfaces.ts +157 -189
  115. package/components/common/vm/actions/common/select/compatibility/Old.vue +107 -107
  116. package/components/common/vm/actions/common/select/createType/CreateType.vue +38 -38
  117. package/components/common/vm/actions/common/select/createType/lib/models/interfaces.ts +5 -5
  118. package/components/common/vm/actions/common/select/os/Old.vue +152 -152
  119. package/components/common/vm/actions/common/select/os/Os.vue +139 -139
  120. package/components/common/vm/actions/common/select/storage/Old.vue +125 -125
  121. package/components/common/vm/actions/common/select/storage/Storage.vue +178 -178
  122. package/components/common/vm/actions/common/select/storage/new/New.vue +311 -311
  123. package/components/common/vm/actions/common/select/storage/new/lib/models/interfaces.ts +5 -5
  124. package/components/common/vm/actions/common/select/storage/new/lib/utils/utils.ts +21 -21
  125. package/components/common/vm/actions/common/select/template/old/Old.vue +50 -50
  126. package/components/common/vm/actions/editSettings/new/Skeleton.vue +88 -88
  127. package/components/common/vm/actions/lib/models/interfaces.ts +40 -15
  128. package/components/common/vm/actions/lib/utils.ts +239 -244
  129. package/components/common/vm/actions/register/Register.vue +352 -352
  130. package/components/common/vm/actions/register/lib/config/steps.ts +86 -86
  131. package/components/common/wizards/common/compatibility/Compatibility.vue +35 -35
  132. package/components/common/wizards/common/compatibility/New.vue +99 -99
  133. package/components/common/wizards/common/compatibility/Old.vue +53 -53
  134. package/components/common/wizards/common/steps/computeResource/ComputeResource.vue +86 -86
  135. package/components/common/wizards/common/steps/computeResource/New.vue +93 -93
  136. package/components/common/wizards/common/steps/computeResource/Old.vue +103 -103
  137. package/components/common/wizards/common/steps/name/Name.vue +178 -178
  138. package/components/common/wizards/common/steps/name/New.vue +221 -221
  139. package/components/common/wizards/common/steps/name/Old.vue +121 -121
  140. package/components/common/wizards/common/steps/name/lib/models/interfaces.ts +4 -4
  141. package/components/common/wizards/common/steps/name/location/Location.vue +85 -85
  142. package/components/common/wizards/common/steps/name/location/New.vue +40 -40
  143. package/components/common/wizards/datastore/add/Add.vue +228 -228
  144. package/components/common/wizards/datastore/add/lib/utils.ts +85 -85
  145. package/components/common/wizards/datastore/add/steps/typeMode/lib/config/typeOptions.ts +43 -43
  146. package/components/common/wizards/vm/migrate/select/computeResource/ComputeResource.vue +205 -205
  147. package/components/common/wizards/vm/migrate/select/network/Network.vue +103 -103
  148. package/composables/useAppVersion.ts +21 -21
  149. package/composables/useLocal.ts +6 -6
  150. package/composables/useLocalCommon.ts +39 -39
  151. package/package.json +3 -1
  152. package/plugins/console.ts +21 -21
  153. package/plugins/date.ts +233 -233
  154. package/plugins/mouse.ts +21 -21
  155. package/plugins/panelStates.ts +70 -70
  156. package/plugins/text.ts +59 -59
  157. package/public/spice-console/application/clientgui.js +854 -854
  158. package/public/spice-console/application/packetfactory.js +211 -211
  159. package/public/spice-console/application/virtualmouse.js +147 -147
  160. package/public/spice-console/lib/images/bitmap.js +203 -203
  161. package/public/spice-console/network/spicechannel.js +440 -440
  162. package/public/spice-console/process/cursorprocess.js +121 -121
  163. package/public/spice-console/process/inputprocess.js +227 -227
  164. package/public/spice-console/process/mainprocess.js +210 -210
  165. package/public/spice-console/run.js +210 -210
  166. package/store/main/mutations.ts +7 -7
  167. package/store/main/state.ts +7 -7
  168. /package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/password/{New.vue → PasswordNew.vue} +0 -0
  169. /package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/password/{Old.vue → PasswordOld.vue} +0 -0
@@ -1,512 +1,523 @@
1
- <template>
2
- <div class="virtual-hardware">
3
- <div class="action-wrap py-3">
4
- <span class="device-count">{{ deviceCountText }}</span>
5
-
6
- <div class="add-device-dropdown-wrap">
7
- <button
8
- id="add-device-dropdown"
9
- :class="['cursor-pointer', { active: isShowAddDeviceDropdown }]"
10
- data-id="add-device-dropdown"
11
- @click="isShowAddDeviceDropdown = !isShowAddDeviceDropdown"
12
- >
13
- <ui-icon name="plus" width="18" height="18" />
14
- <span class="add-device-dropdown-text">
15
- {{ addNewDeviceText }}
16
- </span>
17
- </button>
18
- <ui-dropdown
19
- :items="dropdownItems"
20
- :show="isShowAddDeviceDropdown"
21
- :margin-between-trigger="4"
22
- show-from-left
23
- width="max-content"
24
- elem-id="add-device-dropdown"
25
- test-id="add-device-dropdown"
26
- left
27
- max-height="400px"
28
- @select="onAddDevice"
29
- @hide="isShowAddDeviceDropdown = false"
30
- />
31
- </div>
32
- </div>
33
-
34
- <div class="overflow-auto virtual-hardware-content-block">
35
- <div class="stack-view">
36
- <common-vm-actions-common-customize-hardware-virtual-hardware-cpu
37
- v-model="model"
38
- :cpu-models="props.cpuModels"
39
- :is-edit="props.isEdit"
40
- :state="props.state"
41
- :error-validation-fields="props.errorValidationFields"
42
- :vm-cpu-help-text-second="props.vmCpuHelpTextSecond"
43
- @remove-error-by-title="emits('remove-error-by-title', $event)"
44
- @invalid="cpuInvalid = $event"
45
- />
46
- <common-vm-actions-common-customize-hardware-virtual-hardware-memory
47
- v-model="model"
48
- :max-memory="props.maxMemory"
49
- :is-edit="props.isEdit"
50
- :state="props.state"
51
- :error-validation-fields="props.errorValidationFields"
52
- @invalid="memoryInvalid = $event"
53
- @remove-error-by-title="emits('remove-error-by-title', $event)"
54
- />
55
- <common-vm-actions-common-customize-hardware-virtual-hardware-new-hard-disk
56
- v-for="(item, key) in props.hardDisks"
57
- :key="props.hardDisksIndex[key]"
58
- :index="props.hardDisksIndex[key]"
59
- :type="props.hardDisksType[key]"
60
- :storage="props.storage"
61
- :hard-disk="item"
62
- :error-validation-fields="props.errorValidationFields"
63
- :get-datastore-table-func="props.getDatastoreTableFunc"
64
- :datastore="props.datastore"
65
- :is-datastore-loading="props.isDatastoreLoading"
66
- :is-edit="props.isEdit"
67
- :state="props.state"
68
- :guest-machine-type="props.guestMachineType"
69
- :compute-resource="props.computeResource"
70
- @remove="emits('remove-hard-disk', [props.hardDisksIndex[key], item])"
71
- @roll-back="emits('roll-back-hard-disk', props.hardDisksIndex[key])"
72
- @send-data="
73
- emits('send-data-new-hard-disk-method', [
74
- $event,
75
- props.hardDisksIndex[key],
76
- ])
77
- "
78
- @invalid="
79
- emits('set-invalid-hard-disk', [$event, props.hardDisksIndex[key]])
80
- "
81
- @remove-error-by-title="emits('remove-error-by-title', $event)"
82
- />
83
- <common-vm-actions-common-customize-hardware-virtual-hardware-new-network
84
- v-for="(item, key) in props.networks"
85
- :key="props.networksIndex[key]"
86
- :index="props.networksIndex[key]"
87
- :type="props.networksType[key]"
88
- :network="item"
89
- :networks-table="props.networksTable"
90
- :error-validation-fields="props.errorValidationFields"
91
- :is-edit="props.isEdit"
92
- :state="props.state"
93
- :project="props.project"
94
- @remove="emits('remove-network', props.networksIndex[key])"
95
- @send-data="
96
- emits('send-data-new-network-method', [
97
- $event,
98
- props.networksIndex[key],
99
- ])
100
- "
101
- @invalid="
102
- emits('set-invalid-network', [$event, props.networksIndex[key]])
103
- "
104
- @remove-error-by-title="emits('remove-error-by-title', $event)"
105
- @get-networks-table="emits('get-networks-table', $event)"
106
- />
107
- <common-vm-actions-common-customize-hardware-virtual-hardware-cd-dvd-drive
108
- v-for="(item, key) in props.cdDvdDrives"
109
- :key="props.cdDvdDrivesIndex[key]"
110
- :index="props.cdDvdDrivesIndex[key]"
111
- :hard-disks-count="props.hardDisks?.length || 0"
112
- :type="props.cdDvdDrivesType[key]"
113
- :cd-dvd-drive="item"
114
- :nodes="props.nodes"
115
- :files="props.files"
116
- :error-validation-fields="props.errorValidationFields"
117
- :is-edit="props.isEdit"
118
- :state="props.state"
119
- :guest-machine-type="props.guestMachineType"
120
- :compute-resource="props.computeResource"
121
- @remove-error-by-title="emits('remove-error-by-title', $event)"
122
- @get-storage="emits('get-storage', $event)"
123
- @get-folders-or-files="emits('get-folders-or-files', $event)"
124
- @get-active-device-child="emits('get-active-device-child', $event)"
125
- @show-datastore-child="emits('show-datastore-child', $event)"
126
- @remove="
127
- emits('remove-cd-dvd-drive', [props.cdDvdDrivesIndex[key], item])
128
- "
129
- @roll-back="
130
- emits('roll-back-cd-dvd-drive', props.cdDvdDrivesIndex[key])
131
- "
132
- @send-data="
133
- emits('send-data-new-cd-dvd-drive-method', [
134
- $event,
135
- props.cdDvdDrivesIndex[key],
136
- ])
137
- "
138
- />
139
- <div v-for="(item, key) in model.usb_controllers" :key="key">
140
- <common-vm-actions-common-customize-hardware-virtual-hardware-new-usb-controller
141
- v-model="item.type"
142
- :is-edit="props.isEdit"
143
- :state="props.state"
144
- />
145
- </div>
146
- <template v-if="props.passthroughDevices || props.mediatedDevices">
147
- <common-vm-actions-common-customize-hardware-virtual-hardware-new-pci-device
148
- v-for="(item, key) in props.pciDevices"
149
- :key="props.pciDevicesIndex[key]"
150
- :index="props.pciDevicesIndex[key]"
151
- :pci-device="item"
152
- :error-validation-fields="props.errorValidationFields"
153
- :passthrough-devices="props.passthroughDevices"
154
- :mediated-devices="props.mediatedDevices"
155
- :type="props.pciDevicesType[key]"
156
- :is-edit="props.isEdit"
157
- :state="props.state"
158
- @remove="emits('remove-pci-device', props.pciDevicesIndex[key])"
159
- @send-data="
160
- emits('send-data-pci-devices-method', [
161
- $event,
162
- props.pciDevicesIndex[key],
163
- ])
164
- "
165
- @invalid="
166
- emits('set-invalid-pci-device', [
167
- $event,
168
- props.pciDevicesIndex[key],
169
- ])
170
- "
171
- @remove-error-by-title="emits('remove-error-by-title', $event)"
172
- />
173
- </template>
174
- <common-vm-actions-common-customize-hardware-virtual-hardware-video-card
175
- v-model="model.video_card"
176
- :is-edit="props.isEdit"
177
- :video-card="props.videoCard"
178
- :error-validation-fields="props.errorValidationFields"
179
- :state="props.state"
180
- @invalid="videoCardInvalid = $event"
181
- @remove-error-by-title="emits('remove-error-by-title', $event)"
182
- />
183
- <common-vm-actions-common-customize-hardware-virtual-hardware-other />
184
- <div
185
- v-if="props.compatibilityInfo"
186
- class="vm-hardware-version-wrap justify-end flex flex-1 mt-4"
187
- >
188
- <span class="vm-hardware-version">
189
- {{ props.compatibilityInfo }}
190
- </span>
191
- </div>
192
- </div>
193
- </div>
194
-
195
- <Teleport to="body">
196
- <common-vm-actions-common-customize-hardware-virtual-hardware-browse-view
197
- v-if="props.isShowFileModal"
198
- :nodes="props.nodes"
199
- :files="props.files"
200
- show
201
- @submit="emits('add-exist-hard-disk', $event)"
202
- @get-storage="emits('get-storage', $event)"
203
- @get-folders-or-files="emits('get-folders-or-files', $event)"
204
- @get-active-device-child="emits('get-active-device-child', $event)"
205
- @show-datastore-child="emits('show-datastore-child', $event)"
206
- @hide="emits('hide-file-modal')"
207
- />
208
- </Teleport>
209
- </div>
210
- </template>
211
-
212
- <script setup lang="ts">
213
- import type { UI_I_Dropdown } from '~/node_modules/bfg-uikit/components/ui/dropdown/models/interfaces'
214
- import type { UI_T_Project } from '~/lib/models/types'
215
- import type { UI_I_DatastoreTableItem } from '~/lib/models/store/storage/interfaces'
216
- import type { UI_I_NetworkTableItem } from '~/lib/models/store/network/interfaces'
217
- import type { UI_I_TablePayload } from '~/lib/models/table/interfaces'
218
- import type { UI_I_FolderOrFileTreePayload } from '~/lib/models/store/storage/interfaces'
219
- import type { UI_I_FileTreeNode } from '~/components/lib/models/interfaces'
220
- import type {
221
- UI_I_SendDataNewHardDisk,
222
- UI_I_SendDataNewNetwork,
223
- UI_I_SendDataVideoCard,
224
- UI_I_SendDataNewCdDvdDrive,
225
- UI_I_SendDataNewPciDevice,
226
- } from '~/components/common/vm/actions/common/customizeHardware/virtualHardware/lib/models/interfaces'
227
- import type { UI_I_ErrorValidationField } from '~/lib/models/store/interfaces'
228
- import type {
229
- UI_T_HardDiskType,
230
- UI_T_NetworkType,
231
- } from '~/components/common/vm/actions/common/customizeHardware/virtualHardware/lib/models/types'
232
- import type { UI_I_OptionItem } from '~/components/atoms/lib/models/interfaces'
233
- import type { UI_I_Localization } from '~/lib/models/interfaces'
234
- import type {
235
- API_UI_I_VmEditCpu,
236
- UI_I_MediatedDevice,
237
- UI_I_PciDevice,
238
- } from '~/lib/models/store/vm/interfaces'
239
- import type { UI_I_TreeNode } from '~/components/common/recursionTree/lib/models/interfaces'
240
- import type { UI_I_CreateVmData } from '~/components/common/vm/actions/common/lib/models/interfaces'
241
- import { dropdownItemsNewFunc } from './lib/config/dropdownItems'
242
-
243
- const model = defineModel<UI_I_CreateVmData>({ required: true })
244
-
245
- const cpuInvalid = defineModel<boolean>('cpuInvalid', { required: true })
246
- const memoryInvalid = defineModel<boolean>('memoryInvalid', { required: true })
247
- const videoCardInvalid = defineModel<boolean>('videoCardInvalid', {
248
- required: true,
249
- })
250
-
251
- const props = withDefaults(
252
- defineProps<{
253
- nodes: UI_I_FileTreeNode[]
254
- files: UI_I_FileTreeNode[]
255
- isEdit: boolean
256
- storage: UI_I_DatastoreTableItem | null
257
- project: UI_T_Project
258
- maxMemory: number
259
- cpuModels: UI_I_OptionItem[]
260
- datastore: UI_I_DatastoreTableItem[]
261
- isDatastoreLoading: boolean
262
- networksType: UI_T_NetworkType[]
263
- networksTable: UI_I_NetworkTableItem[]
264
- // dropdownItems: UI_I_DropdownTreeItem[]
265
- hardDisksType: UI_T_HardDiskType[]
266
- networksIndex: number[]
267
- hardDisksIndex: number[]
268
- pciDevicesType: UI_T_NetworkType[]
269
- isShowFileModal: boolean
270
- pciDevicesIndex: number[]
271
- cdDvdDrivesType: UI_T_NetworkType[]
272
- cdDvdDrivesIndex: number[]
273
- errorValidationFields: UI_I_ErrorValidationField<string>[]
274
- getDatastoreTableFunc: (payload: UI_I_TablePayload) => Promise<void>
275
- cpu?: API_UI_I_VmEditCpu
276
- state?: string | number
277
- networks?: UI_I_SendDataNewNetwork[] | null
278
- hardDisks?: UI_I_SendDataNewHardDisk[] | null
279
- videoCard?: UI_I_SendDataVideoCard
280
- pciDevices?: UI_I_SendDataNewPciDevice[]
281
- cdDvdDrives?: UI_I_SendDataNewCdDvdDrive[] | null
282
- guestMachineType?: UI_I_OptionItem | null
283
- passthroughDevices?: UI_I_PciDevice[]
284
- mediatedDevices?: UI_I_MediatedDevice[]
285
- vmCpuHelpTextSecond?: string
286
- computeResource?: UI_I_TreeNode | null
287
- compatibilityInfo?: string
288
- }>(),
289
- {
290
- cpu: undefined,
291
- state: undefined,
292
- networks: undefined,
293
- hardDisks: undefined,
294
- videoCard: undefined,
295
- pciDevices: undefined,
296
- cdDvdDrives: undefined,
297
- guestMachineType: undefined,
298
- passthroughDevices: undefined,
299
- mediatedDevices: undefined,
300
- vmCpuHelpTextSecond: undefined,
301
- computeResource: undefined,
302
- compatibilityInfo: undefined,
303
- }
304
- )
305
- const emits = defineEmits<{
306
- (event: 'add-device', value: { value: number }): void
307
- (event: 'get-storage', value: UI_I_TablePayload): void
308
- (event: 'remove-network', value: number): void
309
- (event: 'hide-file-modal'): void
310
- (event: 'remove-hard-disk', value: [number, UI_I_SendDataNewHardDisk]): void
311
- (event: 'remove-pci-device', value: number): void
312
- (event: 'get-networks-table', value: UI_I_TablePayload): void
313
- (event: 'add-exist-hard-disk', value: UI_I_FileTreeNode): void
314
- (event: 'roll-back-hard-disk', value: number): void
315
- (event: 'set-invalid-network', value: [boolean, number]): void
316
- (
317
- event: 'remove-cd-dvd-drive',
318
- value: [number, UI_I_SendDataNewCdDvdDrive]
319
- ): void
320
- (event: 'show-datastore-child', value: UI_I_FileTreeNode): void
321
- (event: 'get-folders-or-files', value: UI_I_FolderOrFileTreePayload): void
322
- (event: 'set-invalid-hard-disk', value: [boolean, number]): void
323
- (event: 'remove-error-by-title', value: string): void
324
- (event: 'roll-back-cd-dvd-drive', value: number): void
325
- (event: 'set-invalid-pci-device', value: [boolean, number]): void
326
- (event: 'get-active-device-child', value: UI_I_FileTreeNode): void
327
- (
328
- event: 'send-data-new-network-method',
329
- value: [UI_I_SendDataNewNetwork, number]
330
- ): void
331
- (
332
- event: 'send-data-pci-devices-method',
333
- value: [UI_I_SendDataNewPciDevice, number]
334
- ): void
335
- (
336
- event: 'send-data-new-hard-disk-method',
337
- value: [UI_I_SendDataNewHardDisk, number]
338
- ): void
339
- (
340
- event: 'send-data-new-cd-dvd-drive-method',
341
- value: [UI_I_SendDataNewCdDvdDrive, number]
342
- ): void
343
- }>()
344
-
345
- const { $text } = useNuxtApp()
346
-
347
- const localization = computed<UI_I_Localization>(() => useLocal())
348
-
349
- const isShowAddDeviceDropdown = ref<boolean>(false)
350
-
351
- // TODO
352
- const addNewDeviceText = computed<string>(() =>
353
- $text.toCapitalize(localization.value.common.addNewDevice)
354
- )
355
- const deviceCount = computed<number>(
356
- () =>
357
- (props.hardDisks?.length || 0) +
358
- (props.networks?.length || 0) +
359
- (props.cdDvdDrives?.length || 0) +
360
- (props.pciDevices?.length || 0) +
361
- 6
362
- )
363
- const deviceCountText = computed<string>(() =>
364
- localization.value.vmWizard.devices.replace(
365
- '{0}',
366
- deviceCount.value.toString()
367
- )
368
- )
369
- const dropdownItems = computed<UI_I_Dropdown[]>(() =>
370
- dropdownItemsNewFunc(
371
- localization.value,
372
- props.state,
373
- props.passthroughDevices,
374
- props.mediatedDevices
375
- )
376
- )
377
-
378
- const onAddDevice = (data: number): void => {
379
- isShowAddDeviceDropdown.value = false
380
- // из-за старого компонента
381
- emits('add-device', { value: data })
382
- }
383
- </script>
384
-
385
- <style>
386
- :root {
387
- --vm-wizard-block-view-bg-color: #fafafa;
388
- --add-device-dropdown-bg-color: #fff;
389
- --add-device-dropdown-bg-color-hover: #f6f7f8;
390
- --add-device-dropdown-active-bg-color-hover: #f0f8fd;
391
- --add-device-dropdown-border-color: #e9ebed;
392
- --add-device-dropdown-border-color-hover: #e9ebed;
393
- --add-device-dropdown-color: #4d5d69;
394
- --add-device-dropdown-color-hover: #4d5d69;
395
- --add-device-dropdown-item-title-color: #182531;
396
- }
397
- :root.dark-theme {
398
- --vm-wizard-block-view-bg-color: transparent;
399
- --add-device-dropdown-bg-color: #1b2a373d;
400
- //--add-device-dropdown-bg-color-hover: #2585b614;
401
- --add-device-dropdown-bg-color-hover: #b8bcc10a;
402
- --add-device-dropdown-active-bg-color-hover: #2785b614;
403
- --add-device-dropdown-border-color: #e9ebed1f;
404
- --add-device-dropdown-border-color-hover: #2ba2de;
405
- --add-device-dropdown-color: #e9eaec;
406
- --add-device-dropdown-color-hover: #2ba2de;
407
- --add-device-dropdown-item-title-color: #e9eaec;
408
- }
409
- </style>
410
-
411
- <style scoped lang="scss">
412
- .virtual-hardware {
413
- height: 100%;
414
- display: grid;
415
-
416
- .action-wrap {
417
- display: flex;
418
- align-items: center;
419
- justify-content: space-between;
420
- //padding: 12px;
421
-
422
- .device-count {
423
- font-size: 13px;
424
- font-weight: 500;
425
- line-height: 15.73px;
426
- color: #9da6ad;
427
- }
428
-
429
- .add-device-dropdown-wrap {
430
- #add-device-dropdown {
431
- display: flex;
432
- align-items: center;
433
- gap: 8px;
434
- background-color: var(--add-device-dropdown-bg-color);
435
- border: 1px solid var(--add-device-dropdown-border-color);
436
- border-radius: 6px;
437
- padding: 7px 12px;
438
- color: var(--add-device-dropdown-color);
439
- font-size: 13px;
440
- font-weight: 500;
441
- line-height: 15.73px;
442
- height: 32px;
443
-
444
- &:hover {
445
- background-color: var(--add-device-dropdown-bg-color-hover);
446
- border-color: var(--add-device-dropdown-border-color-hover);
447
- color: var(--add-device-dropdown-color-hover);
448
- }
449
-
450
- &.active {
451
- color: #008fd6;
452
- border-color: #008fd6;
453
-
454
- &:hover {
455
- background-color: var(--add-device-dropdown-active-bg-color-hover);
456
- }
457
- }
458
-
459
- .add-device-dropdown-text {
460
- font-weight: 500;
461
- font-family: 'Inter', sans-serif;
462
- text-transform: capitalize;
463
- }
464
- }
465
- :deep(.ui-popup-window) {
466
- overflow: hidden;
467
- padding: 8px 0;
468
-
469
- .ui-dropdown {
470
- overflow: auto;
471
- //max-height: calc(300px - 24px);
472
-
473
- .ui-dropdown-menu.md {
474
- padding: 0 8px;
475
-
476
- li {
477
- &.has-items .group-title {
478
- padding: 4px 8px 0;
479
- color: var(--add-device-dropdown-item-title-color);
480
- }
481
- &:not(:last-child) {
482
- margin-bottom: 4px;
483
- }
484
- //&:last-child ul li:last-child {
485
- //height: 26px;
486
- //align-items: flex-end;
487
- //}
488
- }
489
- }
490
- }
491
- }
492
- }
493
- }
494
- }
495
- .stack-view {
496
- display: flex;
497
- flex-direction: column;
498
- gap: 12px;
499
- padding-bottom: 12px;
500
- background-color: var(--vm-wizard-block-view-bg-color);
501
-
502
- .vm-hardware-version-wrap {
503
- align-items: flex-end;
504
- text-align: right;
505
-
506
- .vm-hardware-version {
507
- font-size: 13px;
508
- color: #9da6ad; // for light and dark
509
- }
510
- }
511
- }
512
- </style>
1
+ <template>
2
+ <div class="virtual-hardware">
3
+ <div class="action-wrap py-3">
4
+ <span class="device-count">{{ deviceCountText }}</span>
5
+
6
+ <div class="add-device-dropdown-wrap">
7
+ <button
8
+ id="add-device-dropdown"
9
+ :class="['cursor-pointer', { active: isShowAddDeviceDropdown }]"
10
+ data-id="add-device-dropdown"
11
+ @click="isShowAddDeviceDropdown = !isShowAddDeviceDropdown"
12
+ >
13
+ <ui-icon name="plus" width="18" height="18" />
14
+ <span class="add-device-dropdown-text">
15
+ {{ addNewDeviceText }}
16
+ </span>
17
+ </button>
18
+ <ui-dropdown
19
+ :items="dropdownItems"
20
+ :show="isShowAddDeviceDropdown"
21
+ :margin-between-trigger="4"
22
+ show-from-left
23
+ width="max-content"
24
+ elem-id="add-device-dropdown"
25
+ test-id="add-device-dropdown"
26
+ left
27
+ max-height="400px"
28
+ @select="onAddDevice"
29
+ @hide="isShowAddDeviceDropdown = false"
30
+ />
31
+ </div>
32
+ </div>
33
+
34
+ <div class="overflow-auto virtual-hardware-content-block">
35
+ <div class="stack-view">
36
+ <common-vm-actions-common-customize-hardware-virtual-hardware-cpu
37
+ :max-cpus="props.maxCpus"
38
+ :cpu-models="props.cpuModels"
39
+ :cpu="props.cpu"
40
+ :is-edit="props.isEdit"
41
+ :state="props.state"
42
+ :error-validation-fields="props.errorValidationFields"
43
+ :vm-cpu-help-text-second="props.vmCpuHelpTextSecond"
44
+ @send-data="emits('send-data-cpu-method', $event)"
45
+ @remove-error-by-title="emits('remove-error-by-title', $event)"
46
+ @invalid="cpuInvalid = $event"
47
+ />
48
+ <common-vm-actions-common-customize-hardware-virtual-hardware-memory
49
+ :max-memory="props.maxMemory"
50
+ :is-edit="props.isEdit"
51
+ :memory="props.memory"
52
+ :state="props.state"
53
+ :error-validation-fields="props.errorValidationFields"
54
+ @send-data="emits('send-data-memory-method', $event)"
55
+ @invalid="memoryInvalid = $event"
56
+ @remove-error-by-title="emits('remove-error-by-title', $event)"
57
+ />
58
+ <common-vm-actions-common-customize-hardware-virtual-hardware-new-hard-disk
59
+ v-for="(item, key) in props.hardDisks"
60
+ :key="props.hardDisksIndex[key]"
61
+ :index="props.hardDisksIndex[key]"
62
+ :type="props.hardDisksType[key]"
63
+ :storage="props.storage"
64
+ :hard-disk="item"
65
+ :error-validation-fields="props.errorValidationFields"
66
+ :get-datastore-table-func="props.getDatastoreTableFunc"
67
+ :datastore="props.datastore"
68
+ :is-datastore-loading="props.isDatastoreLoading"
69
+ :is-edit="props.isEdit"
70
+ :state="props.state"
71
+ :guest-machine-type="props.guestMachineType"
72
+ :compute-resource="props.computeResource"
73
+ @remove="emits('remove-hard-disk', [props.hardDisksIndex[key], item])"
74
+ @roll-back="emits('roll-back-hard-disk', props.hardDisksIndex[key])"
75
+ @send-data="
76
+ emits('send-data-new-hard-disk-method', [
77
+ $event,
78
+ props.hardDisksIndex[key],
79
+ ])
80
+ "
81
+ @invalid="
82
+ emits('set-invalid-hard-disk', [$event, props.hardDisksIndex[key]])
83
+ "
84
+ @remove-error-by-title="emits('remove-error-by-title', $event)"
85
+ />
86
+ <common-vm-actions-common-customize-hardware-virtual-hardware-new-network
87
+ v-for="(item, key) in props.networks"
88
+ :key="props.networksIndex[key]"
89
+ :index="props.networksIndex[key]"
90
+ :type="props.networksType[key]"
91
+ :network="item"
92
+ :networks-table="props.networksTable"
93
+ :error-validation-fields="props.errorValidationFields"
94
+ :is-edit="props.isEdit"
95
+ :state="props.state"
96
+ :project="props.project"
97
+ @remove="emits('remove-network', props.networksIndex[key])"
98
+ @send-data="
99
+ emits('send-data-new-network-method', [
100
+ $event,
101
+ props.networksIndex[key],
102
+ ])
103
+ "
104
+ @invalid="
105
+ emits('set-invalid-network', [$event, props.networksIndex[key]])
106
+ "
107
+ @remove-error-by-title="emits('remove-error-by-title', $event)"
108
+ @get-networks-table="emits('get-networks-table', $event)"
109
+ />
110
+ <common-vm-actions-common-customize-hardware-virtual-hardware-cd-dvd-drive
111
+ v-for="(item, key) in props.cdDvdDrives"
112
+ :key="props.cdDvdDrivesIndex[key]"
113
+ :index="props.cdDvdDrivesIndex[key]"
114
+ :hard-disks-count="props.hardDisks?.length || 0"
115
+ :type="props.cdDvdDrivesType[key]"
116
+ :cd-dvd-drive="item"
117
+ :nodes="props.nodes"
118
+ :files="props.files"
119
+ :error-validation-fields="props.errorValidationFields"
120
+ :is-edit="props.isEdit"
121
+ :state="props.state"
122
+ :guest-machine-type="props.guestMachineType"
123
+ :compute-resource="props.computeResource"
124
+ @remove-error-by-title="emits('remove-error-by-title', $event)"
125
+ @get-storage="emits('get-storage', $event)"
126
+ @get-folders-or-files="emits('get-folders-or-files', $event)"
127
+ @get-active-device-child="emits('get-active-device-child', $event)"
128
+ @show-datastore-child="emits('show-datastore-child', $event)"
129
+ @remove="
130
+ emits('remove-cd-dvd-drive', [props.cdDvdDrivesIndex[key], item])
131
+ "
132
+ @roll-back="
133
+ emits('roll-back-cd-dvd-drive', props.cdDvdDrivesIndex[key])
134
+ "
135
+ @send-data="
136
+ emits('send-data-new-cd-dvd-drive-method', [
137
+ $event,
138
+ props.cdDvdDrivesIndex[key],
139
+ ])
140
+ "
141
+ />
142
+ <common-vm-actions-common-customize-hardware-virtual-hardware-new-usb-controller
143
+ :usb-controller="props.usbController"
144
+ :is-edit="props.isEdit"
145
+ :state="props.state"
146
+ @send-data="emits('send-data-new-usb-controller-method', $event)"
147
+ />
148
+ <template v-if="props.passthroughDevices || props.mediatedDevices">
149
+ <common-vm-actions-common-customize-hardware-virtual-hardware-new-pci-device
150
+ v-for="(item, key) in props.pciDevices"
151
+ :key="props.pciDevicesIndex[key]"
152
+ :index="props.pciDevicesIndex[key]"
153
+ :pci-device="item"
154
+ :error-validation-fields="props.errorValidationFields"
155
+ :passthrough-devices="props.passthroughDevices"
156
+ :mediated-devices="props.mediatedDevices"
157
+ :type="props.pciDevicesType[key]"
158
+ :is-edit="props.isEdit"
159
+ :state="props.state"
160
+ @remove="emits('remove-pci-device', props.pciDevicesIndex[key])"
161
+ @send-data="
162
+ emits('send-data-pci-devices-method', [
163
+ $event,
164
+ props.pciDevicesIndex[key],
165
+ ])
166
+ "
167
+ @invalid="
168
+ emits('set-invalid-pci-device', [
169
+ $event,
170
+ props.pciDevicesIndex[key],
171
+ ])
172
+ "
173
+ @remove-error-by-title="emits('remove-error-by-title', $event)"
174
+ />
175
+ </template>
176
+ <common-vm-actions-common-customize-hardware-virtual-hardware-video-card
177
+ :is-edit="props.isEdit"
178
+ :video-card="props.videoCard"
179
+ :error-validation-fields="props.errorValidationFields"
180
+ :state="props.state"
181
+ @send-data="emits('send-data-video-card-method', $event)"
182
+ @invalid="videoCardInvalid = $event"
183
+ @remove-error-by-title="emits('remove-error-by-title', $event)"
184
+ />
185
+ <common-vm-actions-common-customize-hardware-virtual-hardware-other />
186
+ <div
187
+ v-if="props.compatibilityInfo"
188
+ class="vm-hardware-version-wrap justify-end flex flex-1 mt-4"
189
+ >
190
+ <span class="vm-hardware-version">
191
+ {{ props.compatibilityInfo }}
192
+ </span>
193
+ </div>
194
+ </div>
195
+ </div>
196
+
197
+ <Teleport to="body">
198
+ <common-vm-actions-common-customize-hardware-virtual-hardware-browse-view
199
+ v-if="props.isShowFileModal"
200
+ :nodes="props.nodes"
201
+ :files="props.files"
202
+ show
203
+ @submit="emits('add-exist-hard-disk', $event)"
204
+ @get-storage="emits('get-storage', $event)"
205
+ @get-folders-or-files="emits('get-folders-or-files', $event)"
206
+ @get-active-device-child="emits('get-active-device-child', $event)"
207
+ @show-datastore-child="emits('show-datastore-child', $event)"
208
+ @hide="emits('hide-file-modal')"
209
+ />
210
+ </Teleport>
211
+ </div>
212
+ </template>
213
+
214
+ <script setup lang="ts">
215
+ import type { UI_I_Dropdown } from '~/node_modules/bfg-uikit/components/ui/dropdown/models/interfaces'
216
+ import type { UI_T_Project } from '~/lib/models/types'
217
+ import type { UI_I_DatastoreTableItem } from '~/lib/models/store/storage/interfaces'
218
+ import type { UI_I_NetworkTableItem } from '~/lib/models/store/network/interfaces'
219
+ import type { UI_I_TablePayload } from '~/lib/models/table/interfaces'
220
+ import type { UI_I_FolderOrFileTreePayload } from '~/lib/models/store/storage/interfaces'
221
+ import type { UI_I_FileTreeNode } from '~/components/lib/models/interfaces'
222
+ import type {
223
+ UI_I_SendDataCpu,
224
+ UI_I_SendDataMemory,
225
+ UI_I_SendDataNewHardDisk,
226
+ UI_I_SendDataNewNetwork,
227
+ UI_I_SendDataVideoCard,
228
+ UI_I_SendDataNewCdDvdDrive,
229
+ UI_I_SendDataNewPciDevice,
230
+ } from '~/components/common/vm/actions/common/customizeHardware/virtualHardware/lib/models/interfaces'
231
+ import type { UI_I_ErrorValidationField } from '~/lib/models/store/interfaces'
232
+ import type {
233
+ UI_T_HardDiskType,
234
+ UI_T_NetworkType,
235
+ } from '~/components/common/vm/actions/common/customizeHardware/virtualHardware/lib/models/types'
236
+ import type { UI_I_OptionItem } from '~/components/atoms/lib/models/interfaces'
237
+ import type { UI_I_Localization } from '~/lib/models/interfaces'
238
+ import type {
239
+ API_UI_I_VmEditCpu,
240
+ API_UI_I_VmEditMemory,
241
+ UI_I_MediatedDevice,
242
+ UI_I_PciDevice,
243
+ } from '~/lib/models/store/vm/interfaces'
244
+ import type { UI_I_TreeNode } from '~/components/common/recursionTree/lib/models/interfaces'
245
+ import { dropdownItemsNewFunc } from './lib/config/dropdownItems'
246
+
247
+ const cpuInvalid = defineModel<boolean>('cpuInvalid', { required: true })
248
+ const memoryInvalid = defineModel<boolean>('memoryInvalid', { required: true })
249
+ const videoCardInvalid = defineModel<boolean>('videoCardInvalid', {
250
+ required: true,
251
+ })
252
+
253
+ const props = withDefaults(
254
+ defineProps<{
255
+ nodes: UI_I_FileTreeNode[]
256
+ files: UI_I_FileTreeNode[]
257
+ isEdit: boolean
258
+ storage: UI_I_DatastoreTableItem | null
259
+ project: UI_T_Project
260
+ maxCpus: number
261
+ maxMemory: number
262
+ cpuModels: UI_I_OptionItem[]
263
+ datastore: UI_I_DatastoreTableItem[]
264
+ isDatastoreLoading: boolean
265
+ networksType: UI_T_NetworkType[]
266
+ networksTable: UI_I_NetworkTableItem[]
267
+ // dropdownItems: UI_I_DropdownTreeItem[]
268
+ hardDisksType: UI_T_HardDiskType[]
269
+ networksIndex: number[]
270
+ hardDisksIndex: number[]
271
+ pciDevicesType: UI_T_NetworkType[]
272
+ isShowFileModal: boolean
273
+ pciDevicesIndex: number[]
274
+ cdDvdDrivesType: UI_T_NetworkType[]
275
+ cdDvdDrivesIndex: number[]
276
+ errorValidationFields: UI_I_ErrorValidationField<string>[]
277
+ getDatastoreTableFunc: (payload: UI_I_TablePayload) => Promise<void>
278
+ cpu?: API_UI_I_VmEditCpu
279
+ state?: string | number
280
+ memory?: API_UI_I_VmEditMemory
281
+ networks?: UI_I_SendDataNewNetwork[] | null
282
+ hardDisks?: UI_I_SendDataNewHardDisk[] | null
283
+ videoCard?: UI_I_SendDataVideoCard
284
+ pciDevices?: UI_I_SendDataNewPciDevice[]
285
+ cdDvdDrives?: UI_I_SendDataNewCdDvdDrive[] | null
286
+ usbController?: string
287
+ guestMachineType?: UI_I_OptionItem | null
288
+ passthroughDevices?: UI_I_PciDevice[]
289
+ mediatedDevices?: UI_I_MediatedDevice[]
290
+ vmCpuHelpTextSecond?: string
291
+ computeResource?: UI_I_TreeNode | null
292
+ compatibilityInfo?: string
293
+ }>(),
294
+ {
295
+ cpu: undefined,
296
+ state: undefined,
297
+ memory: undefined,
298
+ networks: undefined,
299
+ hardDisks: undefined,
300
+ videoCard: undefined,
301
+ pciDevices: undefined,
302
+ cdDvdDrives: undefined,
303
+ usbController: undefined,
304
+ guestMachineType: undefined,
305
+ passthroughDevices: undefined,
306
+ mediatedDevices: undefined,
307
+ vmCpuHelpTextSecond: undefined,
308
+ computeResource: undefined,
309
+ compatibilityInfo: undefined,
310
+ }
311
+ )
312
+ const emits = defineEmits<{
313
+ (event: 'add-device', value: { value: number }): void
314
+ (event: 'get-storage', value: UI_I_TablePayload): void
315
+ (event: 'remove-network', value: number): void
316
+ (event: 'hide-file-modal'): void
317
+ (event: 'remove-hard-disk', value: [number, UI_I_SendDataNewHardDisk]): void
318
+ (event: 'remove-pci-device', value: number): void
319
+ (event: 'get-networks-table', value: UI_I_TablePayload): void
320
+ (event: 'add-exist-hard-disk', value: UI_I_FileTreeNode): void
321
+ (event: 'roll-back-hard-disk', value: number): void
322
+ (event: 'set-invalid-network', value: [boolean, number]): void
323
+ (
324
+ event: 'remove-cd-dvd-drive',
325
+ value: [number, UI_I_SendDataNewCdDvdDrive]
326
+ ): void
327
+ (event: 'show-datastore-child', value: UI_I_FileTreeNode): void
328
+ (event: 'get-folders-or-files', value: UI_I_FolderOrFileTreePayload): void
329
+ (event: 'send-data-cpu-method', value: UI_I_SendDataCpu): void
330
+ (event: 'set-invalid-hard-disk', value: [boolean, number]): void
331
+ (event: 'remove-error-by-title', value: string): void
332
+ (event: 'roll-back-cd-dvd-drive', value: number): void
333
+ (event: 'set-invalid-pci-device', value: [boolean, number]): void
334
+ (event: 'get-active-device-child', value: UI_I_FileTreeNode): void
335
+ (event: 'send-data-memory-method', value: UI_I_SendDataMemory): void
336
+ (event: 'send-data-video-card-method', value: UI_I_SendDataVideoCard): void
337
+ (
338
+ event: 'send-data-new-network-method',
339
+ value: [UI_I_SendDataNewNetwork, number]
340
+ ): void
341
+ (
342
+ event: 'send-data-pci-devices-method',
343
+ value: [UI_I_SendDataNewPciDevice, number]
344
+ ): void
345
+ (
346
+ event: 'send-data-new-hard-disk-method',
347
+ value: [UI_I_SendDataNewHardDisk, number]
348
+ ): void
349
+ (
350
+ event: 'send-data-new-cd-dvd-drive-method',
351
+ value: [UI_I_SendDataNewCdDvdDrive, number]
352
+ ): void
353
+ (event: 'send-data-new-usb-controller-method', value: string): void
354
+ }>()
355
+
356
+ const { $text } = useNuxtApp()
357
+
358
+ const localization = computed<UI_I_Localization>(() => useLocal())
359
+
360
+ const isShowAddDeviceDropdown = ref<boolean>(false)
361
+
362
+ // TODO
363
+ const addNewDeviceText = computed<string>(() =>
364
+ $text.toCapitalize(localization.value.common.addNewDevice)
365
+ )
366
+ const deviceCount = computed<number>(
367
+ () =>
368
+ (props.hardDisks?.length || 0) +
369
+ (props.networks?.length || 0) +
370
+ (props.cdDvdDrives?.length || 0) +
371
+ (props.pciDevices?.length || 0) +
372
+ 6
373
+ )
374
+ const deviceCountText = computed<string>(() =>
375
+ localization.value.vmWizard.devices.replace(
376
+ '{0}',
377
+ deviceCount.value.toString()
378
+ )
379
+ )
380
+ const dropdownItems = computed<UI_I_Dropdown[]>(() =>
381
+ dropdownItemsNewFunc(
382
+ localization.value,
383
+ props.state,
384
+ props.passthroughDevices,
385
+ props.mediatedDevices
386
+ )
387
+ )
388
+
389
+ const onAddDevice = (data: number): void => {
390
+ isShowAddDeviceDropdown.value = false
391
+ // из-за старого компонента
392
+ emits('add-device', { value: data })
393
+ }
394
+ </script>
395
+
396
+ <style>
397
+ :root {
398
+ --vm-wizard-block-view-bg-color: #fafafa;
399
+ --add-device-dropdown-bg-color: #fff;
400
+ --add-device-dropdown-bg-color-hover: #f6f7f8;
401
+ --add-device-dropdown-active-bg-color-hover: #f0f8fd;
402
+ --add-device-dropdown-border-color: #e9ebed;
403
+ --add-device-dropdown-border-color-hover: #e9ebed;
404
+ --add-device-dropdown-color: #4d5d69;
405
+ --add-device-dropdown-color-hover: #4d5d69;
406
+ --add-device-dropdown-item-title-color: #182531;
407
+ }
408
+ :root.dark-theme {
409
+ --vm-wizard-block-view-bg-color: transparent;
410
+ --add-device-dropdown-bg-color: #1b2a373d;
411
+ //--add-device-dropdown-bg-color-hover: #2585b614;
412
+ --add-device-dropdown-bg-color-hover: #b8bcc10a;
413
+ --add-device-dropdown-active-bg-color-hover: #2785b614;
414
+ --add-device-dropdown-border-color: #e9ebed1f;
415
+ --add-device-dropdown-border-color-hover: #2ba2de;
416
+ --add-device-dropdown-color: #e9eaec;
417
+ --add-device-dropdown-color-hover: #2ba2de;
418
+ --add-device-dropdown-item-title-color: #e9eaec;
419
+ }
420
+ </style>
421
+
422
+ <style scoped lang="scss">
423
+ .virtual-hardware {
424
+ height: 100%;
425
+ display: grid;
426
+
427
+ .action-wrap {
428
+ display: flex;
429
+ align-items: center;
430
+ justify-content: space-between;
431
+ //padding: 12px;
432
+
433
+ .device-count {
434
+ font-size: 13px;
435
+ font-weight: 500;
436
+ line-height: 15.73px;
437
+ color: #9da6ad;
438
+ }
439
+
440
+ .add-device-dropdown-wrap {
441
+ #add-device-dropdown {
442
+ display: flex;
443
+ align-items: center;
444
+ gap: 8px;
445
+ background-color: var(--add-device-dropdown-bg-color);
446
+ border: 1px solid var(--add-device-dropdown-border-color);
447
+ border-radius: 6px;
448
+ padding: 7px 12px;
449
+ color: var(--add-device-dropdown-color);
450
+ font-size: 13px;
451
+ font-weight: 500;
452
+ line-height: 15.73px;
453
+ height: 32px;
454
+
455
+ &:hover {
456
+ background-color: var(--add-device-dropdown-bg-color-hover);
457
+ border-color: var(--add-device-dropdown-border-color-hover);
458
+ color: var(--add-device-dropdown-color-hover);
459
+ }
460
+
461
+ &.active {
462
+ color: #008fd6;
463
+ border-color: #008fd6;
464
+
465
+ &:hover {
466
+ background-color: var(--add-device-dropdown-active-bg-color-hover);
467
+ }
468
+ }
469
+
470
+ .add-device-dropdown-text {
471
+ font-weight: 500;
472
+ font-family: 'Inter', sans-serif;
473
+ text-transform: capitalize;
474
+ }
475
+ }
476
+ :deep(.ui-popup-window) {
477
+ overflow: hidden;
478
+ padding: 8px 0;
479
+
480
+ .ui-dropdown {
481
+ overflow: auto;
482
+ //max-height: calc(300px - 24px);
483
+
484
+ .ui-dropdown-menu.md {
485
+ padding: 0 8px;
486
+
487
+ li {
488
+ &.has-items .group-title {
489
+ padding: 4px 8px 0;
490
+ color: var(--add-device-dropdown-item-title-color);
491
+ }
492
+ &:not(:last-child) {
493
+ margin-bottom: 4px;
494
+ }
495
+ //&:last-child ul li:last-child {
496
+ //height: 26px;
497
+ //align-items: flex-end;
498
+ //}
499
+ }
500
+ }
501
+ }
502
+ }
503
+ }
504
+ }
505
+ }
506
+ .stack-view {
507
+ display: flex;
508
+ flex-direction: column;
509
+ gap: 12px;
510
+ padding-bottom: 12px;
511
+ background-color: var(--vm-wizard-block-view-bg-color);
512
+
513
+ .vm-hardware-version-wrap {
514
+ align-items: flex-end;
515
+ text-align: right;
516
+
517
+ .vm-hardware-version {
518
+ font-size: 13px;
519
+ color: #9da6ad; // for light and dark
520
+ }
521
+ }
522
+ }
523
+ </style>