bfg-common 1.5.835 → 1.5.836

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 (33) hide show
  1. package/assets/localization/local_be.json +3 -7
  2. package/assets/localization/local_en.json +3 -7
  3. package/assets/localization/local_hy.json +3 -7
  4. package/assets/localization/local_kk.json +3 -7
  5. package/assets/localization/local_ru.json +3 -7
  6. package/assets/localization/local_zh.json +3 -7
  7. package/components/common/layout/theHeader/Old.vue +1 -5
  8. package/components/common/monitor/advanced/tools/chartOptionsModal/lib/utils/checkSubmit.ts +1 -1
  9. package/components/common/pages/backups/modals/lib/config/restore.ts +1 -0
  10. package/components/common/pages/backups/modals/lib/models/interfaces.ts +1 -0
  11. package/components/common/vm/actions/add/Add.vue +2 -0
  12. package/components/common/vm/actions/add/New.vue +3 -0
  13. package/components/common/vm/actions/add/Old.vue +3 -0
  14. package/components/common/vm/actions/clone/Clone.vue +65 -61
  15. package/components/common/vm/actions/clone/new/New.vue +2 -0
  16. package/components/common/vm/actions/clone/old/Old.vue +2 -0
  17. package/components/common/vm/actions/common/customizeHardware/CustomizeHardware.vue +3 -0
  18. package/components/common/vm/actions/common/customizeHardware/New.vue +3 -0
  19. package/components/common/vm/actions/common/customizeHardware/Old.vue +3 -0
  20. package/components/common/vm/actions/common/customizeHardware/virtualHardware/New.vue +22 -2
  21. package/components/common/vm/actions/common/customizeHardware/virtualHardware/Old.vue +20 -2
  22. package/components/common/vm/actions/common/customizeHardware/virtualHardware/VirtualHardware.vue +107 -4
  23. package/components/common/vm/actions/common/customizeHardware/virtualHardware/lib/config/dropdownItems.ts +9 -3
  24. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newUsbDevice/New.vue +73 -0
  25. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newUsbDevice/NewUsbDevice.vue +72 -0
  26. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newUsbDevice/Old.vue +65 -0
  27. package/components/common/vm/actions/common/lib/models/interfaces.ts +1 -0
  28. package/components/common/vm/actions/editSettings/EditSettings.vue +3 -0
  29. package/components/common/vm/actions/editSettings/Old.vue +3 -0
  30. package/components/common/vm/actions/editSettings/new/New.vue +3 -0
  31. package/components/common/vm/actions/lib/utils.ts +2 -0
  32. package/lib/models/store/vm/interfaces.ts +2 -0
  33. package/package.json +1 -1
@@ -3585,7 +3585,9 @@
3585
3585
  "selectOptions": "Выберыце параметры",
3586
3586
  "configureOptionsForNewVm": "Наладзьце параметры запуску і вызначце тып кланавання для новай віртуальнай машыны.",
3587
3587
  "configureOptionsForCloneVm": "Наладзьце параметры запуску, аперацыйнай сістэмы і абсталявання новай віртуальнай машыны.",
3588
- "vmStoragePolicy": "VM storage policy"
3588
+ "vmStoragePolicy": "Палітыка захоўвання ВМ",
3589
+ "hostUsbDevice": "USB-прылада хоста",
3590
+ "newHostUsbDevice": "Новая USB-прылада хоста"
3589
3591
  },
3590
3592
  "feedback": {
3591
3593
  "additionalDetailsHelp": "Даведка па дадатковых звестках",
@@ -3990,11 +3992,5 @@
3990
3992
  "autostart": "Аўтазапуск",
3991
3993
  "enableAutostart": "Уключыць аўтазапуск",
3992
3994
  "disableAutostart": "Адключыць аўтазапуск"
3993
- },
3994
- "temp": {
3995
- "title": "Віртуальны metro storage кластар",
3996
- "stepTitle": "Выберыце зыходны хост",
3997
- "serverAddress": "Адрас сервера",
3998
- "fqdnOrIpAddress": "FQDN або IP-адрас"
3999
3995
  }
4000
3996
  }
@@ -3589,7 +3589,9 @@
3589
3589
  "selectOptions": "Select Options",
3590
3590
  "configureOptionsForNewVm": "Configure startup parameters and define the cloning type for the new virtual machine.",
3591
3591
  "configureOptionsForCloneVm": "Configure startup parameters, operating system, and hardware for the new virtual machine.",
3592
- "vmStoragePolicy": "VM storage policy"
3592
+ "vmStoragePolicy": "VM storage policy",
3593
+ "hostUsbDevice": "Host USB Device",
3594
+ "newHostUsbDevice": "New Host USB Device"
3593
3595
  },
3594
3596
  "feedback": {
3595
3597
  "additionalDetailsHelp": "Additional Details Help",
@@ -3994,11 +3996,5 @@
3994
3996
  "autostart": "Autostart",
3995
3997
  "enableAutostart": "Enable autostart",
3996
3998
  "disableAutostart": "Disable autostart"
3997
- },
3998
- "temp": {
3999
- "title": "Virtual metro storage cluster",
4000
- "stepTitle": "Select source host",
4001
- "serverAddress": "Server Address",
4002
- "fqdnOrIpAddress": "FQDN or IP address"
4003
3999
  }
4004
4000
  }
@@ -3589,7 +3589,9 @@
3589
3589
  "selectOptions": "Ընտրեք պարամետրերը",
3590
3590
  "configureOptionsForNewVm": "Կարգավորեք մեկնարկային պարամետրերը և սահմանեք նոր վիրտուալ մեքենայի կլոնավորման տեսակը:",
3591
3591
  "configureOptionsForCloneVm": "Կարգավորեք նոր վիրտուալ մեքենայի մեկնարկային պարամետրերը, օպերացիոն համակարգը և սարքավորումները:",
3592
- "vmStoragePolicy": "VM storage policy"
3592
+ "vmStoragePolicy": "ՎՄ պահպանման քաղաքականություն",
3593
+ "hostUsbDevice": "Հոստի USB սարք",
3594
+ "newHostUsbDevice": "Հոստի նոր USB սարք"
3593
3595
  },
3594
3596
  "feedback": {
3595
3597
  "additionalDetailsHelp": "Լրացուցիչ մանրամասներ Օգնություն",
@@ -3994,11 +3996,5 @@
3994
3996
  "autostart": "Ավտոմատ մեկնարկ",
3995
3997
  "enableAutostart": "Միացնել ավտոմատ մեկնարկը",
3996
3998
  "disableAutostart": "Անջատել ավտոմատ մեկնարկը"
3997
- },
3998
- "temp": {
3999
- "title": "Վիրտուալ metro storage կլաստեր",
4000
- "stepTitle": "Ընտրեք աղբյուրի հոստ",
4001
- "serverAddress": "Սերվերի հասցե",
4002
- "fqdnOrIpAddress": "FQDN կամ IP հասցե"
4003
3999
  }
4004
4000
  }
@@ -3589,7 +3589,9 @@
3589
3589
  "selectOptions": "Параметрлерді таңдаңыз",
3590
3590
  "configureOptionsForNewVm": "Жаңа виртуалды машинаның іске қосу параметрлерін баптаңыз және клондау түрін анықтаңыз.",
3591
3591
  "configureOptionsForCloneVm": "Жаңа виртуалды машинаның іске қосу параметрлерін, операциялық жүйесін және жабдықтарын баптаңыз.",
3592
- "vmStoragePolicy": "VM storage policy"
3592
+ "vmStoragePolicy": "ВМ сақтау саясаты",
3593
+ "hostUsbDevice": "Хосттың USB құрылғысы",
3594
+ "newHostUsbDevice": "Хосттың жаңа USB құрылғысы"
3593
3595
  },
3594
3596
  "feedback": {
3595
3597
  "additionalDetailsHelp": "Қосымша мәліметтер анықтамасы",
@@ -3994,11 +3996,5 @@
3994
3996
  "autostart": "Автожаңғалту",
3995
3997
  "enableAutostart": "Автожаңғалтуды қосу",
3996
3998
  "disableAutostart": "Автожаңғалтуды өшіру"
3997
- },
3998
- "temp": {
3999
- "title": "Виртуалды metro storage кластері",
4000
- "stepTitle": "Дереккөз хостты таңдаңыз",
4001
- "serverAddress": "Сервердің мекенжайы",
4002
- "fqdnOrIpAddress": "FQDN немесе IP-мекенжай"
4003
3999
  }
4004
4000
  }
@@ -3588,7 +3588,9 @@
3588
3588
  "selectOptions": "Выберите параметры",
3589
3589
  "configureOptionsForNewVm": "Настройте параметры запуска и определите тип клонирования для новой виртуальной машины.",
3590
3590
  "configureOptionsForCloneVm": "Настройте параметры запуска, операционной системы и оборудования новой виртуальной машины.",
3591
- "vmStoragePolicy": "VM storage policy"
3591
+ "vmStoragePolicy": "Политика хранения ВМ",
3592
+ "hostUsbDevice": "USB-устройство хоста",
3593
+ "newHostUsbDevice": "Новое USB-устройство хоста"
3592
3594
  },
3593
3595
  "feedback": {
3594
3596
  "additionalDetailsHelp": "Дополнительная информация Помощь",
@@ -3993,11 +3995,5 @@
3993
3995
  "autostart": "Автозапуск",
3994
3996
  "enableAutostart": "Автозапуск вкл",
3995
3997
  "disableAutostart": "Автозапуск выкл"
3996
- },
3997
- "temp": {
3998
- "title": "Виртуальный metro storage кластер",
3999
- "stepTitle": "Выберите исходный хост",
4000
- "serverAddress": "Адрес сервера",
4001
- "fqdnOrIpAddress": "FQDN или IP-адрес"
4002
3998
  }
4003
3999
  }
@@ -3586,7 +3586,9 @@
3586
3586
  "selectOptions": "选择选项",
3587
3587
  "configureOptionsForNewVm": "配置启动参数并定义新虚拟机的克隆类型。",
3588
3588
  "configureOptionsForCloneVm": "配置新虚拟机的启动参数、操作系统和硬件。",
3589
- "vmStoragePolicy": "VM storage policy"
3589
+ "vmStoragePolicy": "虚拟机存储策略",
3590
+ "hostUsbDevice": "主机USB设备",
3591
+ "newHostUsbDevice": "新主机USB设备"
3590
3592
  },
3591
3593
  "feedback": {
3592
3594
  "additionalDetailsHelp": "其他详细信息帮助",
@@ -3991,11 +3993,5 @@
3991
3993
  "autostart": "自动启动",
3992
3994
  "enableAutostart": "启用自动启动",
3993
3995
  "disableAutostart": "禁用自动启动"
3994
- },
3995
- "temp": {
3996
- "title": "虚拟Metro存储集群",
3997
- "stepTitle": "选择源主机",
3998
- "serverAddress": "服务器地址",
3999
- "fqdnOrIpAddress": "FQDN或IP地址"
4000
3996
  }
4001
3997
  }
@@ -29,7 +29,7 @@
29
29
  >
30
30
  </nuxt-link>
31
31
  </div>
32
- <form style="width: 100%; height: 100%" @click="onTemp">
32
+ <form>
33
33
  <atoms-input-search />
34
34
  </form>
35
35
 
@@ -146,10 +146,6 @@ const onUpdateLanguage = (language: string): void => {
146
146
  }
147
147
 
148
148
  const isShowFeedback = ref<boolean>(false)
149
-
150
- const onTemp = (): void => {
151
- useLocalStorage('temp', true)
152
- }
153
149
  </script>
154
150
 
155
151
  <style scoped lang="scss">
@@ -1,7 +1,7 @@
1
1
  import type { UI_I_AdvancedCounterItem } from '~/components/common/monitor/advanced/tools/chartOptionsModal/counters/table/lib/models/interfaces'
2
2
  import {
3
3
  allowedHostCpuFieldNotObject,
4
- // allowedHostNetworkFieldNotObject,
4
+ allowedHostNetworkFieldNotObject,
5
5
  } from '~/components/common/monitor/advanced/tools/chartOptionsModal/lib/config'
6
6
 
7
7
  export const checkIsDisabledSubmit = (
@@ -45,6 +45,7 @@ export const restoreDefaultFormFunc = (): UI_I_RestoreForm => {
45
45
  disk_devices: [],
46
46
  network_devices: [],
47
47
  passthrough_pci_devices: [],
48
+ passthrough_usb_devices: [],
48
49
  options: {
49
50
  remote_console: {
50
51
  type: '',
@@ -126,6 +126,7 @@ export interface API_UI_I_Pvm {
126
126
  }
127
127
  }
128
128
  passthrough_pci_devices: any[]
129
+ passthrough_usb_devices: any[]
129
130
  snapshots: any
130
131
  storage: {
131
132
  folder: string
@@ -17,6 +17,7 @@
17
17
  :vm-cpu-help-text-second="props.vmCpuHelpTextSecond"
18
18
  :import-from-v-m-warev-sphere="props.importFromVMWarevSphere"
19
19
  :get-datastore-table-func="props.getDatastoreTableFunc"
20
+ :usb-devices="props.usbDevices"
20
21
  :passthrough-devices="props.passthroughDevices"
21
22
  :mediated-devices="props.mediatedDevices"
22
23
  :templates-tree="props.templatesTree"
@@ -143,6 +144,7 @@ const props = withDefaults(
143
144
  validateSendDataFunc: UI_T_AddVmFinishFunc<
144
145
  [UI_T_SelectedNavItem, null | number] | null
145
146
  >
147
+ usbDevices: any[]
146
148
  passthroughDevices: UI_I_PciDevice[]
147
149
  mediatedDevices: UI_I_MediatedDevice[]
148
150
  vmNameInWizard: string
@@ -269,6 +269,7 @@
269
269
  :datastore="props.datastore"
270
270
  :is-datastore-loading="props.isDatastoreLoading"
271
271
  :vm-cpu-help-text-second="props.vmCpuHelpTextSecond"
272
+ :usb-devices="props.usbDevices"
272
273
  :passthrough-devices="props.passthroughDevices"
273
274
  :mediated-devices="props.mediatedDevices"
274
275
  :compute-resource="computeResource"
@@ -329,6 +330,7 @@
329
330
  :datastore="props.datastore"
330
331
  :is-datastore-loading="props.isDatastoreLoading"
331
332
  :vm-cpu-help-text-second="props.vmCpuHelpTextSecond"
333
+ :usb-devices="props.usbDevices"
332
334
  :passthrough-devices="props.passthroughDevices"
333
335
  :mediated-devices="props.mediatedDevices"
334
336
  :compute-resource="computeResource"
@@ -462,6 +464,7 @@ const props = withDefaults(
462
464
  vmCpuHelpTextSecond: string
463
465
  importFromVMWarevSphere: string
464
466
  getDatastoreTableFunc: (payload: UI_I_TablePayload) => Promise<void>
467
+ usbDevices: any[]
465
468
  passthroughDevices: UI_I_PciDevice[]
466
469
  mediatedDevices: UI_I_MediatedDevice[]
467
470
  templatesTree: UI_I_TreeNode[]
@@ -118,6 +118,7 @@
118
118
  :datastore="props.datastore"
119
119
  :is-datastore-loading="props.isDatastoreLoading"
120
120
  :vm-cpu-help-text-second="props.vmCpuHelpTextSecond"
121
+ :usb-devices="props.usbDevices"
121
122
  :passthrough-devices="props.passthroughDevices"
122
123
  :mediated-devices="props.mediatedDevices"
123
124
  :compute-resource="computeResource"
@@ -156,6 +157,7 @@
156
157
  :datastore="props.datastore"
157
158
  :is-datastore-loading="props.isDatastoreLoading"
158
159
  :vm-cpu-help-text-second="props.vmCpuHelpTextSecond"
160
+ :usb-devices="props.usbDevices"
159
161
  :passthrough-devices="props.passthroughDevices"
160
162
  :mediated-devices="props.mediatedDevices"
161
163
  :compute-resource="computeResource"
@@ -261,6 +263,7 @@ const props = withDefaults(
261
263
  vmCpuHelpTextSecond: string
262
264
  importFromVMWarevSphere: string
263
265
  getDatastoreTableFunc: (payload: UI_I_TablePayload) => Promise<void>
266
+ usbDevices: any[]
264
267
  passthroughDevices: UI_I_PciDevice[]
265
268
  mediatedDevices: UI_I_MediatedDevice[]
266
269
  templatesTree: UI_I_TreeNode[]
@@ -1,64 +1,67 @@
1
1
  <template>
2
- <component
3
- :is="currentComponent"
4
- v-model="model"
5
- v-model:scheduler-task-form="schedulerTaskForm"
6
- v-model:compute-resource="vmForm.computeResource"
7
- v-model:location="location"
8
- :project="props.project"
9
- :nodes="props.nodes"
10
- :files="props.files"
11
- :networks-table="props.networksTable"
12
- :datastore="props.datastore"
13
- :is-datastore-loading="props.isDatastoreLoading"
14
- :error-validation-fields="props.errorValidationFields"
15
- :ready-complete-table-info="props.readyCompleteTableInfo"
16
- :vm-cpu-help-text-second="props.vmCpuHelpTextSecond"
17
- :get-datastore-table-func="props.getDatastoreTableFunc"
18
- :passthrough-devices="props.passthroughDevices"
19
- :mediated-devices="props.mediatedDevices"
20
- :name-request-url="props.nameRequestUrl"
21
- :selected-virtual-machine="props.selectedVirtualMachine"
22
- :is-new-vm-from-template="props.isNewVmFromTemplate"
23
- :compute-resource-tree="props.computeResourceTree"
24
- :location-nodes="props.locationNodes"
25
- :wizard="wizard"
26
- :selected-scheme="selectedScheme"
27
- :title="title"
28
- :name-form-submit="nameFormSubmit"
29
- :storage-submit="storageSubmit"
30
- :customize-hardware-submit="customizeHardwareSubmit"
31
- :selected-nav-item="selectedNavItem"
32
- :is-loading="isLoading"
33
- :allowed-location-kinds="allowedLocationKinds"
34
- :is-sphere="isSphere"
35
- :location-description="locationDescription"
36
- :name-test-ids="nameTestIds"
37
- :guest-os-families="guestOsFamilies"
38
- :guest-os-versions="guestOsVersions"
39
- :machine-types="machineTypes"
40
- :dynamic-steps="dynamicSteps"
41
- :is-loading-compute-tree="isLoadingComputeTree"
42
- :compute-resource-alert="computeResourceAlert"
43
- :compatibility-text="compatibilityText"
44
- :compatibility-info="compatibilityInfo"
45
- :max-memory="maxMemory"
46
- :cpu-models="cpuModels"
47
- @get-folders-or-files="emits('get-folders-or-files', $event)"
48
- @change-name="onChangeName"
49
- @change-storage="onChangeStorage"
50
- @change-select-options="onChangeSelectOptions"
51
- @change-clone-count="cloneCount = $event"
52
- @get-storage="emits('get-storage', $event)"
53
- @get-active-device-child="emits('get-active-device-child', $event)"
54
- @show-datastore-child="emits('show-datastore-child', $event)"
55
- @remove-error-by-title="emits('remove-error-by-title', $event)"
56
- @get-networks-table="emits('get-networks-table', $event)"
57
- @get-pci-devices="emits('get-pci-devices')"
58
- @change-steps="onChangeSteps"
59
- @hide="onHideModal"
60
- @finish="onFinish"
61
- />
2
+ <div>
3
+ <component
4
+ :is="currentComponent"
5
+ v-model="model"
6
+ v-model:scheduler-task-form="schedulerTaskForm"
7
+ v-model:compute-resource="vmForm.computeResource"
8
+ v-model:location="location"
9
+ :project="props.project"
10
+ :nodes="props.nodes"
11
+ :files="props.files"
12
+ :networks-table="props.networksTable"
13
+ :datastore="props.datastore"
14
+ :is-datastore-loading="props.isDatastoreLoading"
15
+ :error-validation-fields="props.errorValidationFields"
16
+ :ready-complete-table-info="props.readyCompleteTableInfo"
17
+ :vm-cpu-help-text-second="props.vmCpuHelpTextSecond"
18
+ :get-datastore-table-func="props.getDatastoreTableFunc"
19
+ :usb-devices="props.usbDevices"
20
+ :passthrough-devices="props.passthroughDevices"
21
+ :mediated-devices="props.mediatedDevices"
22
+ :name-request-url="props.nameRequestUrl"
23
+ :selected-virtual-machine="props.selectedVirtualMachine"
24
+ :is-new-vm-from-template="props.isNewVmFromTemplate"
25
+ :compute-resource-tree="props.computeResourceTree"
26
+ :location-nodes="props.locationNodes"
27
+ :wizard="wizard"
28
+ :selected-scheme="selectedScheme"
29
+ :title="title"
30
+ :name-form-submit="nameFormSubmit"
31
+ :storage-submit="storageSubmit"
32
+ :customize-hardware-submit="customizeHardwareSubmit"
33
+ :selected-nav-item="selectedNavItem"
34
+ :is-loading="isLoading"
35
+ :allowed-location-kinds="allowedLocationKinds"
36
+ :is-sphere="isSphere"
37
+ :location-description="locationDescription"
38
+ :name-test-ids="nameTestIds"
39
+ :guest-os-families="guestOsFamilies"
40
+ :guest-os-versions="guestOsVersions"
41
+ :machine-types="machineTypes"
42
+ :dynamic-steps="dynamicSteps"
43
+ :is-loading-compute-tree="isLoadingComputeTree"
44
+ :compute-resource-alert="computeResourceAlert"
45
+ :compatibility-text="compatibilityText"
46
+ :compatibility-info="compatibilityInfo"
47
+ :max-memory="maxMemory"
48
+ :cpu-models="cpuModels"
49
+ @get-folders-or-files="emits('get-folders-or-files', $event)"
50
+ @change-name="onChangeName"
51
+ @change-storage="onChangeStorage"
52
+ @change-select-options="onChangeSelectOptions"
53
+ @change-clone-count="cloneCount = $event"
54
+ @get-storage="emits('get-storage', $event)"
55
+ @get-active-device-child="emits('get-active-device-child', $event)"
56
+ @show-datastore-child="emits('show-datastore-child', $event)"
57
+ @remove-error-by-title="emits('remove-error-by-title', $event)"
58
+ @get-networks-table="emits('get-networks-table', $event)"
59
+ @get-pci-devices="emits('get-pci-devices')"
60
+ @change-steps="onChangeSteps"
61
+ @hide="onHideModal"
62
+ @finish="onFinish"
63
+ />
64
+ </div>
62
65
  </template>
63
66
 
64
67
  <script setup lang="ts">
@@ -121,6 +124,7 @@ const props = withDefaults(
121
124
  finishFunc: any
122
125
  getDatastoreTableFunc: (payload: UI_I_TablePayload) => Promise<void>
123
126
  validateSendDataFunc: any
127
+ usbDevices: any[]
124
128
  passthroughDevices: UI_I_PciDevice[]
125
129
  mediatedDevices: UI_I_MediatedDevice[]
126
130
  vmNameInWizard: string
@@ -657,7 +661,7 @@ const machineTypes = ref<UI_I_OptionItem[]>(capabilities.value.machineTypes)
657
661
 
658
662
  const compatibility = computed<UI_I_OptionItem[]>(() => capabilities.value.compatibility)
659
663
  const compatibilityInfo = computed<string>(() => {
660
- const selectedOption = compatibility.value.find(item => item.value === model.value.compatibility)
664
+ const selectedOption = compatibility.value.find(item => item.value === model.value?.compatibility)
661
665
 
662
666
  if (!selectedOption) return ''
663
667
 
@@ -174,6 +174,7 @@
174
174
  :networks-table="props.networksTable"
175
175
  :error-validation-fields="props.errorValidationFields"
176
176
  :vm-cpu-help-text-second="props.vmCpuHelpTextSecond"
177
+ :usb-devices="props.usbDevices"
177
178
  :passthrough-devices="props.passthroughDevices"
178
179
  :mediated-devices="props.mediatedDevices"
179
180
  :get-datastore-table-func="props.getDatastoreTableFunc"
@@ -314,6 +315,7 @@ const props = withDefaults(
314
315
  readyCompleteTableInfo: UI_I_TableInfoItem[]
315
316
  vmCpuHelpTextSecond: string
316
317
  getDatastoreTableFunc: (payload: UI_I_TablePayload) => Promise<void>
318
+ usbDevices: any[]
317
319
  passthroughDevices: UI_I_PciDevice[]
318
320
  mediatedDevices: UI_I_MediatedDevice[]
319
321
  nameRequestUrl: string
@@ -103,6 +103,7 @@
103
103
  :networks-table="props.networksTable"
104
104
  :error-validation-fields="props.errorValidationFields"
105
105
  :vm-cpu-help-text-second="props.vmCpuHelpTextSecond"
106
+ :usb-devices="props.usbDevices"
106
107
  :passthrough-devices="props.passthroughDevices"
107
108
  :mediated-devices="props.mediatedDevices"
108
109
  :get-datastore-table-func="props.getDatastoreTableFunc"
@@ -177,6 +178,7 @@ const props = withDefaults(
177
178
  readyCompleteTableInfo: UI_I_TableInfoItem[]
178
179
  vmCpuHelpTextSecond: string
179
180
  getDatastoreTableFunc: (payload: UI_I_TablePayload) => Promise<void>
181
+ usbDevices: any[]
180
182
  passthroughDevices: UI_I_PciDevice[]
181
183
  mediatedDevices: UI_I_MediatedDevice[]
182
184
  nameRequestUrl: string
@@ -23,6 +23,7 @@
23
23
  :is-edit="props.isEdit"
24
24
  :is-clone="props.isClone"
25
25
  :state="props.state"
26
+ :usb-devices="props.usbDevices"
26
27
  :passthrough-devices="props.passthroughDevices"
27
28
  :mediated-devices="props.mediatedDevices"
28
29
  :project="props.project"
@@ -101,6 +102,7 @@ const props = withDefaults(
101
102
  isEdit?: boolean
102
103
  isClone?: boolean
103
104
  state?: string | number
105
+ usbDevices?: any[]
104
106
  passthroughDevices?: UI_I_PciDevice[]
105
107
  mediatedDevices?: UI_I_MediatedDevice[]
106
108
  project?: UI_T_Project
@@ -119,6 +121,7 @@ const props = withDefaults(
119
121
  isEdit: false,
120
122
  isClone: false,
121
123
  state: undefined,
124
+ usbDevices: undefined,
122
125
  passthroughDevices: undefined,
123
126
  mediatedDevices: undefined,
124
127
  project: undefined,
@@ -45,6 +45,7 @@
45
45
  :datastore="props.datastore"
46
46
  :is-datastore-loading="props.isDatastoreLoading"
47
47
  :vm-cpu-help-text-second="props.vmCpuHelpTextSecond"
48
+ :usb-devices="props.usbDevices"
48
49
  :passthrough-devices="props.passthroughDevices"
49
50
  :mediated-devices="props.mediatedDevices"
50
51
  :project="props.project"
@@ -136,6 +137,7 @@ const props = withDefaults(
136
137
  hardDisks?: UI_I_SendDataNewHardDisk[] | null
137
138
  pciDevices?: UI_I_SendDataNewPciDevice[]
138
139
  cdDvdDrives?: UI_I_SendDataNewCdDvdDrive[] | null
140
+ usbDevices?: any[]
139
141
  passthroughDevices?: UI_I_PciDevice[]
140
142
  mediatedDevices?: UI_I_MediatedDevice[]
141
143
  vmCpuHelpTextSecond?: string
@@ -153,6 +155,7 @@ const props = withDefaults(
153
155
  hardDisks: undefined,
154
156
  pciDevices: undefined,
155
157
  cdDvdDrives: undefined,
158
+ usbDevices: undefined,
156
159
  passthroughDevices: undefined,
157
160
  mediatedDevices: undefined,
158
161
  vmCpuHelpTextSecond: undefined,
@@ -31,6 +31,7 @@
31
31
  :datastore="props.datastore"
32
32
  :is-datastore-loading="props.isDatastoreLoading"
33
33
  :vm-cpu-help-text-second="props.vmCpuHelpTextSecond"
34
+ :usb-devices="props.usbDevices"
34
35
  :passthrough-devices="props.passthroughDevices"
35
36
  :mediated-devices="props.mediatedDevices"
36
37
  :project="props.project"
@@ -118,6 +119,7 @@ const props = withDefaults(
118
119
  hardDisks?: UI_I_SendDataNewHardDisk[] | null
119
120
  pciDevices?: UI_I_SendDataNewPciDevice[]
120
121
  cdDvdDrives?: UI_I_SendDataNewCdDvdDrive[] | null
122
+ usbDevices?: any[]
121
123
  passthroughDevices?: UI_I_PciDevice[]
122
124
  mediatedDevices?: UI_I_MediatedDevice[]
123
125
  vmCpuHelpTextSecond?: string
@@ -134,6 +136,7 @@ const props = withDefaults(
134
136
  hardDisks: undefined,
135
137
  pciDevices: undefined,
136
138
  cdDvdDrives: undefined,
139
+ usbDevices: undefined,
137
140
  passthroughDevices: undefined,
138
141
  mediatedDevices: undefined,
139
142
  vmCpuHelpTextSecond: undefined,
@@ -58,8 +58,8 @@
58
58
  )"
59
59
  :key="props.hardDisksIndex[key]"
60
60
  >
61
- <!-- TODO 111-->
62
- <!-- v-model:vm-storage-policy="item.vm_storage_policy"-->
61
+ <!-- TODO 111-->
62
+ <!-- v-model:vm-storage-policy="item.vm_storage_policy"-->
63
63
  <common-vm-actions-common-customize-hardware-virtual-hardware-new-hard-disk
64
64
  v-model:size="item.size"
65
65
  v-model:provision-type="item.provision_type"
@@ -201,6 +201,19 @@
201
201
  "
202
202
  />
203
203
  </div>
204
+ <div v-for="(item, key) in model.passthrough_usb_devices" :key="key">
205
+ <common-vm-actions-common-customize-hardware-virtual-hardware-new-usb-device
206
+ :item="item"
207
+ :index="props.usbDevicesIndex[key]"
208
+ :type="props.usbDevicesType[key]"
209
+ :available-usb-devices="props.availableUsbDevices"
210
+ :state="props.state"
211
+ @change="
212
+ emits('change-usb-device', [props.usbDevicesIndex[key], $event])
213
+ "
214
+ @remove="emits('remove-usb-device', props.usbDevicesIndex[key])"
215
+ />
216
+ </div>
204
217
  <div v-for="(item, key) in model.usb_controllers" :key="key">
205
218
  <common-vm-actions-common-customize-hardware-virtual-hardware-new-usb-controller
206
219
  v-model="item.type"
@@ -283,6 +296,7 @@ import type { UI_I_ErrorValidationField } from '~/lib/models/store/interfaces'
283
296
  import type {
284
297
  UI_T_HardDiskType,
285
298
  UI_T_NetworkType,
299
+ UI_T_PciDeviceType,
286
300
  } from '~/components/common/vm/actions/common/customizeHardware/virtualHardware/lib/models/types'
287
301
  import type { UI_I_OptionItem } from '~/components/atoms/lib/models/interfaces'
288
302
  import type { UI_I_Localization } from '~/lib/models/interfaces'
@@ -324,6 +338,9 @@ const props = withDefaults(
324
338
  pciDevicesType: UI_T_NetworkType[]
325
339
  isShowFileModal: boolean
326
340
  pciDevicesIndex: number[]
341
+ availableUsbDevices: any[]
342
+ usbDevicesType: UI_T_PciDeviceType[]
343
+ usbDevicesIndex: number[]
327
344
  cdDvdDrivesType: UI_T_NetworkType[]
328
345
  cdDvdDrivesIndex: number[]
329
346
  errorValidationFields: UI_I_ErrorValidationField<string>[]
@@ -360,6 +377,8 @@ const emits = defineEmits<{
360
377
  (event: 'hide-file-modal'): void
361
378
  (event: 'remove-hard-disk', value: [number, UI_I_SendDataNewHardDisk]): void
362
379
  (event: 'remove-pci-device', value: number): void
380
+ (event: 'change-usb-device', value: [number, any]): void
381
+ (event: 'remove-usb-device', value: number): void
363
382
  (event: 'get-networks-table', value: UI_I_TablePayload): void
364
383
  (event: 'add-exist-hard-disk', value: UI_I_FileTreeNode): void
365
384
  (event: 'roll-back-hard-disk', value: number): void
@@ -399,6 +418,7 @@ const deviceCount = computed<number>(
399
418
  (model.value.disk_devices?.length || 0) +
400
419
  (model.value.network_devices?.length || 0) +
401
420
  (model.value.passthrough_pci_devices?.length || 0) +
421
+ (model.value.passthrough_usb_devices?.length || 0) +
402
422
  6
403
423
  )
404
424
  const deviceCountText = computed<string>(() =>
@@ -36,8 +36,8 @@
36
36
  )"
37
37
  :key="props.hardDisksIndex[key]"
38
38
  >
39
- <!-- TODO 111-->
40
- <!-- v-model:vm-storage-policy="item.vm_storage_policy"-->
39
+ <!-- TODO 111-->
40
+ <!-- v-model:vm-storage-policy="item.vm_storage_policy"-->
41
41
  <common-vm-actions-common-customize-hardware-virtual-hardware-new-hard-disk
42
42
  v-model:size="item.size"
43
43
  v-model:provision-type="item.provision_type"
@@ -181,6 +181,19 @@
181
181
  "
182
182
  />
183
183
  </div>
184
+ <div v-for="(item, key) in model.passthrough_usb_devices" :key="key">
185
+ <common-vm-actions-common-customize-hardware-virtual-hardware-new-usb-device
186
+ :item="item"
187
+ :index="props.usbDevicesIndex[key]"
188
+ :type="props.usbDevicesType[key]"
189
+ :available-usb-devices="props.availableUsbDevices"
190
+ :state="props.state"
191
+ @change="
192
+ emits('change-usb-device', [props.usbDevicesIndex[key], $event])
193
+ "
194
+ @remove="emits('remove-usb-device', props.usbDevicesIndex[key])"
195
+ />
196
+ </div>
184
197
  <div v-for="(item, key) in model.usb_controllers" :key="key">
185
198
  <common-vm-actions-common-customize-hardware-virtual-hardware-new-usb-controller
186
199
  v-model="item.type"
@@ -301,6 +314,9 @@ const props = withDefaults(
301
314
  pciDevicesType: UI_T_PciDeviceType[]
302
315
  isShowFileModal: boolean
303
316
  pciDevicesIndex: number[]
317
+ availableUsbDevices: any[]
318
+ usbDevicesType: UI_T_PciDeviceType[]
319
+ usbDevicesIndex: number[]
304
320
  cdDvdDrivesType: UI_T_CdDvdType[]
305
321
  cdDvdDrivesIndex: number[]
306
322
  errorValidationFields: UI_I_ErrorValidationField[]
@@ -333,6 +349,8 @@ const emits = defineEmits<{
333
349
  (event: 'hide-file-modal'): void
334
350
  (event: 'remove-hard-disk', value: [number, UI_I_SendDataNewHardDisk]): void
335
351
  (event: 'remove-pci-device', value: number): void
352
+ (event: 'change-usb-device', value: [number, any]): void
353
+ (event: 'remove-usb-device', value: number): void
336
354
  (event: 'get-networks-table', value: UI_I_TablePayload): void
337
355
  (event: 'add-exist-hard-disk', value: UI_I_FileTreeNode): void
338
356
  (event: 'roll-back-hard-disk', value: number): void
@@ -24,6 +24,9 @@
24
24
  :pci-devices-type="pciDevicesType"
25
25
  :is-show-file-modal="isShowFileModal"
26
26
  :pci-devices-index="pciDevicesIndex"
27
+ :available-usb-devices="availableUsbDevices"
28
+ :usb-devices-type="usbDevicesType"
29
+ :usb-devices-index="usbDevicesIndex"
27
30
  :cd-dvd-drives-type="cdDvdDrivesType"
28
31
  :cd-dvd-drives-index="cdDvdDrivesIndex"
29
32
  :error-validation-fields="errorValidationFields"
@@ -31,8 +34,8 @@
31
34
  :state="state"
32
35
  :video-card="videoCard"
33
36
  :guest-machine-type="guestMachineType"
34
- :passthrough-devices="passthroughDevices"
35
- :mediated-devices="mediatedDevices"
37
+ :passthrough-devices="props.passthroughDevices"
38
+ :mediated-devices="props.mediatedDevices"
36
39
  :vm-cpu-help-text-second="vmCpuHelpTextSecond"
37
40
  :compute-resource="props.computeResource"
38
41
  :compatibility-info="props.compatibilityInfo"
@@ -43,6 +46,8 @@
43
46
  @hide-file-modal="isShowFileModal = false"
44
47
  @remove-hard-disk="onRemoveHardDisk(...$event)"
45
48
  @remove-pci-device="onRemovePciDevice"
49
+ @remove-usb-device="onRemoveUsbDevice"
50
+ @change-usb-device="onChangeUsbDevice"
46
51
  @get-networks-table="emits('get-networks-table', $event)"
47
52
  @add-exist-hard-disk="onAddExistHardDisk"
48
53
  @roll-back-hard-disk="onRollBackHardDisk"
@@ -117,6 +122,7 @@ const props = withDefaults(
117
122
  cdDvdDrives?: UI_I_SendDataNewCdDvdDrive[] | null
118
123
  videoCard?: UI_I_SendDataVideoCard
119
124
  // pciDevices?: UI_I_SendDataNewPciDevice[]
125
+ usbDevices?: any[]
120
126
  passthroughDevices?: UI_I_PciDevice[]
121
127
  mediatedDevices?: UI_I_MediatedDevice[]
122
128
  guestMachineType?: UI_I_OptionItem | null
@@ -130,6 +136,7 @@ const props = withDefaults(
130
136
  cdDvdDrives: undefined,
131
137
  videoCard: undefined,
132
138
  // pciDevices: undefined,
139
+ usbDevices: () => [],
133
140
  passthroughDevices: undefined,
134
141
  mediatedDevices: undefined,
135
142
  guestMachineType: undefined,
@@ -158,12 +165,35 @@ const currentComponent = computed(() =>
158
165
 
159
166
  const localization = computed<UI_I_Localization>(() => useLocal())
160
167
 
168
+ const usbDevicesLocal = ref<any[]>(useDeepCopy(props.usbDevices))
169
+ watch(
170
+ () => props.usbDevices,
171
+ (newValue) => {
172
+ usbDevicesLocal.value = useDeepCopy(newValue)
173
+ },
174
+ { deep: true }
175
+ )
176
+
177
+ const availableUsbDevices = computed<any[]>(() => {
178
+ return (
179
+ usbDevicesLocal.value.filter((device) => {
180
+ if (device.passthrough === 'Pathroughed') return null
181
+
182
+ const isUniqueDevice = model.value.passthrough_usb_devices.every(
183
+ (item) => item.product_id !== device.product_id
184
+ )
185
+ if (isUniqueDevice) return device
186
+ }) || []
187
+ )
188
+ })
189
+
161
190
  const dropdownItems = computed<UI_I_DropdownTreeItem[]>(() =>
162
191
  dropdownItemsFunc(
163
192
  localization.value,
164
193
  props.state,
165
194
  props.passthroughDevices,
166
- props.mediatedDevices
195
+ props.mediatedDevices,
196
+ availableUsbDevices.value
167
197
  )
168
198
  )
169
199
 
@@ -557,7 +587,8 @@ const addPciDevice = (): void => {
557
587
  pciDevicesType.value.push('new')
558
588
 
559
589
  // pciDevicesLocal.value.push(useDeepCopy(defaultPciDevice))
560
- if (!model.value.passthrough_pci_devices) model.value.passthrough_pci_devices = []
590
+ if (!model.value.passthrough_pci_devices)
591
+ model.value.passthrough_pci_devices = []
561
592
  model.value.passthrough_pci_devices.push(useDeepCopy(defaultPciDevice))
562
593
  }
563
594
  const onRemovePciDevice = (index: number): void => {
@@ -573,6 +604,75 @@ const onRemovePciDevice = (index: number): void => {
573
604
  })
574
605
  }
575
606
 
607
+ const usbDevicesIndex = ref<number[]>([0])
608
+ const usbDevicesType = ref<('new' | 'edit' | 'removed')[]>(['new'])
609
+ if (!model.value.passthrough_usb_devices?.length) {
610
+ usbDevicesIndex.value = []
611
+ usbDevicesType.value = []
612
+ } else {
613
+ model.value.passthrough_usb_devices.forEach((_disk, _index, array) => {
614
+ if (!props.isEdit && !props.isClone) return
615
+
616
+ const count = array.length
617
+ usbDevicesIndex.value = [...Array(count).keys()]
618
+ if (props.isEdit) {
619
+ usbDevicesType.value = Array(count).fill('edit')
620
+ } else if (props.isClone) {
621
+ usbDevicesType.value = Array(count).fill('clone') // before been new
622
+ }
623
+ })
624
+ }
625
+
626
+ const addUsbDevice = (): void => {
627
+ const newIndex = (usbDevicesIndex.value.at(-1) ?? -1) + 1
628
+ usbDevicesIndex.value.push(newIndex)
629
+ usbDevicesType.value.push('new')
630
+
631
+ if (!model.value.passthrough_usb_devices)
632
+ model.value.passthrough_usb_devices = []
633
+ model.value.passthrough_usb_devices.push(
634
+ useDeepCopy(availableUsbDevices.value[0])
635
+ )
636
+ }
637
+ const onRemoveUsbDevice = (index: number): void => {
638
+ const removeIndex = usbDevicesIndex.value.indexOf(index)
639
+ usbDevicesIndex.value = usbDevicesIndex.value.filter((item) => item !== index)
640
+ usbDevicesType.value = usbDevicesType.value.filter(
641
+ (_item, key) => key !== removeIndex
642
+ )
643
+
644
+ let removedItemId = ''
645
+ model.value.passthrough_usb_devices =
646
+ model.value.passthrough_usb_devices.filter((usbDevice, key: number) => {
647
+ if (removeIndex === key) {
648
+ removedItemId = usbDevice.product_id
649
+ }
650
+ return removeIndex !== key
651
+ })
652
+
653
+ usbDevicesLocal.value = usbDevicesLocal.value.map((device) => {
654
+ if (removedItemId) {
655
+ device.passthrough = 'Enable'
656
+ }
657
+ return device
658
+ })
659
+ }
660
+ const onChangeUsbDevice = (data: [number, string]): void => {
661
+ const [index, value] = data
662
+
663
+ usbDevicesLocal.value = usbDevicesLocal.value.map((device) => {
664
+ if (model.value.passthrough_usb_devices[index].product_id === device.product_id) {
665
+ device.passthrough = 'Enable'
666
+ }
667
+ return device
668
+ })
669
+
670
+ const newItem = usbDevicesLocal.value.find(
671
+ (device) => device.product_id === +value
672
+ )
673
+ if (newItem) model.value.passthrough_usb_devices[index] = newItem
674
+ }
675
+
576
676
  const isShowFileModal = ref<boolean>(false)
577
677
  const onAddDevice = (item: UI_I_DropdownTreeItemChild): void => {
578
678
  switch (item.value) {
@@ -582,6 +682,9 @@ const onAddDevice = (item: UI_I_DropdownTreeItemChild): void => {
582
682
  case 2:
583
683
  isShowFileModal.value = true
584
684
  break
685
+ case 3:
686
+ addUsbDevice()
687
+ break
585
688
  case 5:
586
689
  addCdDvdDrive()
587
690
  break
@@ -7,7 +7,8 @@ export const dropdownItemsFunc = (
7
7
  localization: UI_I_Localization,
8
8
  state: string | number | undefined,
9
9
  passthroughDevices?: UI_I_PciDevice[],
10
- mediatedDevices?: any[]
10
+ mediatedDevices?: any[],
11
+ availableUsbDevices?: any[]
11
12
  ): UI_I_DropdownTreeItem[] => {
12
13
  const { $text } = useNuxtApp()
13
14
 
@@ -28,7 +29,12 @@ export const dropdownItemsFunc = (
28
29
  testId: 'existing-hard-disk',
29
30
  },
30
31
  // { text: 'RDM Disk', value: 2 },
31
- // { text: 'Host USB Device', value: 3 },
32
+ {
33
+ text: localization.vmWizard.hostUsbDevice,
34
+ value: 3,
35
+ disabled: !availableUsbDevices?.length,
36
+ testId: 'host-usb-device',
37
+ },
32
38
  // { text: 'NVDIMM', value: 4 },
33
39
  {
34
40
  text: localization.common.cdDvdDrive,
@@ -49,7 +55,7 @@ export const dropdownItemsFunc = (
49
55
 
50
56
  // TODO 700
51
57
  {
52
- text: localization.common.otherDevices,
58
+ text: localization.common.otherDevices,
53
59
  children: [
54
60
  {
55
61
  text: localization.common.pciDevice,
@@ -0,0 +1,73 @@
1
+ <template>
2
+ <ui-stack-block
3
+ :removable="props.isRemovable"
4
+ test-id="usb-device-stack-block"
5
+ has-children
6
+ @remove="emits('remove')"
7
+ >
8
+ <template #stackBlockKey>
9
+ <div
10
+ :id="`vm-wizard-toggle-block-usb-device-${props.index}`"
11
+ :data-id="`vm-wizard-toggle-block-usb-device-${props.index}`"
12
+ class="flex-align-center"
13
+ >
14
+ <span>{{ props.label }}</span>
15
+ </div>
16
+ </template>
17
+ <template #stackBlockContent>
18
+ <ui-select
19
+ id="usb-device-select"
20
+ v-model="selectedUsbDevice"
21
+ :items="items"
22
+ width="auto"
23
+ test-id="usb-device-select"
24
+ size="sm"
25
+ @change="onChange"
26
+ />
27
+ </template>
28
+ </ui-stack-block>
29
+ </template>
30
+
31
+ <script setup lang="ts">
32
+ // import type { UI_T_PciDeviceType } from '~/components/common/vm/actions/common/customizeHardware/virtualHardware/lib/models/types'
33
+ // import type {
34
+ // UI_I_PciDevice,
35
+ // } from '~/lib/models/store/vm/interfaces'
36
+
37
+ import type { UI_T_SelectedValue } from 'bfg-uikit/components/ui/select/models/types'
38
+ import type { UI_I_Dropdown } from 'bfg-uikit/components/ui/dropdown/models/interfaces'
39
+
40
+ const props = defineProps<{
41
+ item: any
42
+ index: number
43
+ type: any
44
+ usbDevices: any[]
45
+ isRemovable: boolean
46
+ label: string
47
+ }>()
48
+
49
+ const emits = defineEmits<{
50
+ (event: 'change', value: any): void
51
+ (event: 'remove'): void
52
+ }>()
53
+
54
+ const items = computed<UI_I_Dropdown[]>(() => {
55
+ return props.usbDevices.map((device) => {
56
+ return {
57
+ text: device.product_name,
58
+ value: device.product_id,
59
+ }
60
+ })
61
+ })
62
+ const selectedUsbDevice = ref<any>(props.item.product_id)
63
+
64
+ const onChange = (value: UI_T_SelectedValue): void => {
65
+ emits('change', value)
66
+ }
67
+ </script>
68
+
69
+ <style scoped lang="scss">
70
+ :deep(.stack-block.not-children .stack-block-label) {
71
+ height: auto;
72
+ }
73
+ </style>
@@ -0,0 +1,72 @@
1
+ <template>
2
+ <component
3
+ :is="currentComponent"
4
+ :item="props.item"
5
+ :index="props.index"
6
+ :type="props.type"
7
+ :is-removable="isRemovable"
8
+ :label="label"
9
+ :usb-devices="availableUsbDevicesLocal"
10
+ @change="emits('change', $event)"
11
+ @remove="emits('remove')"
12
+ />
13
+ </template>
14
+
15
+ <script setup lang="ts">
16
+ import type { UI_I_Localization } from '~/lib/models/interfaces'
17
+ import type { UI_T_PciDeviceType } from '~/components/common/vm/actions/common/customizeHardware/virtualHardware/lib/models/types'
18
+
19
+ const props = withDefaults(
20
+ defineProps<{
21
+ item: any
22
+ index: number
23
+ type: UI_T_PciDeviceType
24
+ availableUsbDevices: any[]
25
+ state?: string | number
26
+ }>(),
27
+ {
28
+ state: undefined,
29
+ }
30
+ )
31
+ const emits = defineEmits<{
32
+ (event: 'change', value: any): void
33
+ (event: 'remove'): void
34
+ }>()
35
+
36
+ const { $store }: any = useNuxtApp()
37
+ const isNewView = computed<boolean>(() => $store.getters['main/getIsNewView'])
38
+ const currentComponent = computed(() =>
39
+ isNewView.value
40
+ ? defineAsyncComponent(() => import('./New.vue'))
41
+ : defineAsyncComponent(() => import('./Old.vue'))
42
+ )
43
+
44
+ const localization = computed<UI_I_Localization>(() => useLocal())
45
+
46
+ const availableUsbDevicesLocal = computed<any[]>(() => {
47
+ return [...props.availableUsbDevices, props.item]
48
+ })
49
+
50
+ const isRunning = computed<boolean>(() => {
51
+ return props.state === 2
52
+ })
53
+ const isEdit = computed<boolean>(() => {
54
+ return props.type === 'edit'
55
+ })
56
+
57
+ const isRemovable = computed<boolean>(() => {
58
+ // return !props.isEdit || !isRunning.value
59
+ return !isEdit.value || !isRunning.value
60
+ })
61
+
62
+ const label = computed<string>(() => {
63
+ if (isEdit.value)
64
+ return `${localization.value.vmWizard.hostUsbDevice} ${
65
+ props.index + 1
66
+ }`
67
+
68
+ return `${localization.value.vmWizard.newHostUsbDevice} *`
69
+ })
70
+ </script>
71
+
72
+ <style scoped lang="scss"></style>
@@ -0,0 +1,65 @@
1
+ <template>
2
+ <div class="hardware-usb-device">
3
+ <atoms-stack-block
4
+ :removable="props.isRemovable"
5
+ test-id="usb-device-stack-block"
6
+ :has-children="false"
7
+ @remove="emits('remove')"
8
+ >
9
+ <template #stackBlockKey>
10
+ <div
11
+ :id="`vm-wizard-toggle-block-usb-device-${props.index}`"
12
+ :data-id="`vm-wizard-toggle-block-usb-device-${props.index}`"
13
+ class="flex-align-center"
14
+ >
15
+ <span>{{ props.label }}</span>
16
+ </div>
17
+ </template>
18
+ <template #stackBlockContent>
19
+ <div class="select">
20
+ <select
21
+ id="usb-device-select"
22
+ :value="props.item.product_id"
23
+ data-id="usb-device-select"
24
+ @change="onChange"
25
+ @click.stop
26
+ >
27
+ <option
28
+ v-for="(item, key) in props.usbDevices"
29
+ :key="key"
30
+ :value="item.product_id"
31
+ >
32
+ {{ item.product_name }}
33
+ </option>
34
+ </select>
35
+ </div>
36
+ </template>
37
+ </atoms-stack-block>
38
+ </div>
39
+ </template>
40
+
41
+ <script setup lang="ts">
42
+ // import type { UI_T_PciDeviceType } from '~/components/common/vm/actions/common/customizeHardware/virtualHardware/lib/models/types'
43
+ // import type {
44
+ // UI_I_PciDevice,
45
+ // } from '~/lib/models/store/vm/interfaces'
46
+
47
+ const props = defineProps<{
48
+ item: any
49
+ index: number
50
+ type: any
51
+ usbDevices: any[]
52
+ isRemovable: boolean
53
+ label: string
54
+ }>()
55
+ const emits = defineEmits<{
56
+ (event: 'change', value: string): void
57
+ (event: 'remove'): void
58
+ }>()
59
+
60
+ const onChange = (event: any): void => {
61
+ emits('change', event.target.value)
62
+ }
63
+ </script>
64
+
65
+ <style scoped lang="scss"></style>
@@ -137,6 +137,7 @@ export interface UI_I_CreateVmData {
137
137
  )[]
138
138
  network_devices: UI_I_SendDataNewNetwork[]
139
139
  passthrough_pci_devices: UI_I_SendDataNewPciDevice[]
140
+ passthrough_usb_devices: any[]
140
141
  usb_controllers: {
141
142
  type: string
142
143
  }[]
@@ -14,6 +14,7 @@
14
14
  :error-validation-fields="props.errorValidationFields"
15
15
  :state="props.state"
16
16
  :vm-name-old="vmNameOld"
17
+ :usb-devices="props.usbDevices"
17
18
  :passthrough-devices="props.passthroughDevices"
18
19
  :mediated-devices="props.mediatedDevices"
19
20
  :get-datastore-table-func="props.getDatastoreTableFunc"
@@ -73,6 +74,7 @@ const props = withDefaults(
73
74
  validateSendDataFunc: UI_T_EditVmFinishFunc
74
75
  getDatastoreTableFunc?: (payload: UI_I_TablePayload) => Promise<void>
75
76
  state?: string | number
77
+ usbDevices?: any[]
76
78
  passthroughDevices?: UI_I_PciDevice[]
77
79
  mediatedDevices?: UI_I_MediatedDevice[]
78
80
  capabilities?: UI_I_Capabilities
@@ -81,6 +83,7 @@ const props = withDefaults(
81
83
  {
82
84
  getDatastoreTableFunc: undefined,
83
85
  state: undefined,
86
+ usbDevices: undefined,
84
87
  passthroughDevices: undefined,
85
88
  mediatedDevices: undefined,
86
89
  capabilities: undefined,
@@ -35,6 +35,7 @@
35
35
  :networks-table="props.networksTable"
36
36
  :error-validation-fields="props.errorValidationFields"
37
37
  :vm-cpu-help-text-second="props.vmCpuHelpTextSecond"
38
+ :usb-devices="props.usbDevices"
38
39
  :passthrough-devices="props.passthroughDevices"
39
40
  :mediated-devices="props.mediatedDevices"
40
41
  :state="props.state"
@@ -95,6 +96,7 @@ const props = withDefaults(
95
96
  cpuModels: UI_I_OptionItem[]
96
97
  state?: string | number
97
98
  vmNameOld?: string
99
+ usbDevices?: any[]
98
100
  passthroughDevices?: UI_I_PciDevice[]
99
101
  mediatedDevices?: any[]
100
102
  getDatastoreTableFunc?: (payload: UI_I_TablePayload) => Promise<void>
@@ -104,6 +106,7 @@ const props = withDefaults(
104
106
  {
105
107
  state: undefined,
106
108
  vmNameOld: undefined,
109
+ usbDevices: undefined,
107
110
  passthroughDevices: undefined,
108
111
  mediatedDevices: undefined,
109
112
  getDatastoreTableFunc: undefined,
@@ -38,6 +38,7 @@
38
38
  :networks-table="props.networksTable"
39
39
  :error-validation-fields="props.errorValidationFields"
40
40
  :vm-cpu-help-text-second="props.vmCpuHelpTextSecond"
41
+ :usb-devices="props.usbDevices"
41
42
  :passthrough-devices="props.passthroughDevices"
42
43
  :mediated-devices="props.mediatedDevices"
43
44
  :state="props.state"
@@ -102,6 +103,7 @@ const props = withDefaults(
102
103
  cpuModels: UI_I_OptionItem[]
103
104
  state?: string | number
104
105
  vmNameOld?: string
106
+ usbDevices?: any[]
105
107
  passthroughDevices?: UI_I_PciDevice[]
106
108
  mediatedDevices?: any[]
107
109
  getDatastoreTableFunc?: (payload: UI_I_TablePayload) => Promise<void>
@@ -111,6 +113,7 @@ const props = withDefaults(
111
113
  {
112
114
  state: undefined,
113
115
  vmNameOld: undefined,
116
+ usbDevices: undefined,
114
117
  passthroughDevices: undefined,
115
118
  mediatedDevices: undefined,
116
119
  getDatastoreTableFunc: undefined,
@@ -139,6 +139,7 @@ export const constructSendDataForm = (
139
139
  disk_devices,
140
140
  network_devices,
141
141
  passthrough_pci_devices,
142
+ passthrough_usb_devices,
142
143
  cpu,
143
144
  memory,
144
145
  usb_controllers,
@@ -169,6 +170,7 @@ export const constructSendDataForm = (
169
170
  disk_devices: diskDevices,
170
171
  network_devices: network_devices,
171
172
  passthrough_pci_devices: passthrough_pci_devices,
173
+ passthrough_usb_devices: passthrough_usb_devices,
172
174
  cpu: {
173
175
  vcpus: cpu.vcpus,
174
176
  max_vcpus: cpu.hotplug ? cpu.max_vcpus : 0,
@@ -210,6 +210,7 @@ export interface API_UI_I_Pvm {
210
210
  }
211
211
  }
212
212
  passthrough_pci_devices: any[]
213
+ passthrough_usb_devices: any[]
213
214
  snapshots: any
214
215
  storage: {
215
216
  folder: string
@@ -391,6 +392,7 @@ export interface API_UI_I_VmReadyToComplete {
391
392
  usb_controllers: API_UI_I_VmReadyToCompleteUsbController[]
392
393
  video_card: API_UI_I_VmReadyToCompleteVideoCard
393
394
  passthrough_pci_devices: API_UI_I_VmReadyToCompletePciDevice[]
395
+ passthrough_usb_devices: any[]
394
396
  }
395
397
  compute_resource?: string
396
398
  location?: string
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "bfg-common",
3
3
  "private": false,
4
- "version": "1.5.835",
4
+ "version": "1.5.836",
5
5
  "scripts": {
6
6
  "build": "nuxt build",
7
7
  "dev": "nuxt dev --port=3002",