bfg-common 1.4.874 → 1.4.875

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. package/assets/img/icons/icons-sprite-dark-3.svg +227 -227
  2. package/assets/img/icons/icons-sprite-dark-5.svg +488 -488
  3. package/assets/img/icons/icons-sprite-light-3.svg +227 -227
  4. package/assets/img/icons/icons-sprite-light-5.svg +488 -488
  5. package/assets/scss/common/normalize.scss +361 -361
  6. package/components/atoms/TheIcon3.vue +50 -50
  7. package/components/atoms/autocomplete/Autocomplete.vue +301 -301
  8. package/components/atoms/collapse/CollapseNav.vue +164 -164
  9. package/components/atoms/dropdown/dropdown/Dropdown.vue +168 -168
  10. package/components/atoms/modal/bySteps/BySteps.vue +253 -253
  11. package/components/atoms/stack/StackBlock.vue +185 -185
  12. package/components/atoms/table/dataGrid/DataGrid.vue +1704 -1704
  13. package/components/atoms/table/dataGrid/DataGridColumnSwitch.vue +222 -222
  14. package/components/atoms/table/dataGrid/lib/config/settingsTable.ts +94 -94
  15. package/components/atoms/table/dataGrid/lib/utils/export.ts +16 -16
  16. package/components/common/browse/BrowseNew.vue +237 -237
  17. package/components/common/browse/BrowseOld.vue +217 -217
  18. package/components/common/browse/blocks/contents/Files.vue +37 -37
  19. package/components/common/browse/blocks/contents/FilesOld.vue +72 -72
  20. package/components/common/browse/blocks/contents/filesNew/FilesNew.vue +96 -96
  21. package/components/common/browse/blocks/contents/filesNew/Skeleton.vue +18 -18
  22. package/components/common/browse/blocks/lib/models/types.ts +1 -1
  23. package/components/common/browse/lib/models/interfaces.ts +5 -5
  24. package/components/common/context/Context.vue +111 -111
  25. package/components/common/context/lib/models/interfaces.ts +30 -30
  26. package/components/common/context/recursion/Recursion.vue +87 -87
  27. package/components/common/context/recursion/RecursionOld.vue +227 -227
  28. package/components/common/details/DetailsItem.vue +109 -109
  29. package/components/common/diagramMain/Header.vue +211 -211
  30. package/components/common/diagramMain/adapter/AdapterItems.vue +61 -61
  31. package/components/common/diagramMain/lib/config/initial.ts +50 -50
  32. package/components/common/diagramMain/lib/models/types.ts +21 -21
  33. package/components/common/diagramMain/lib/utils/utils.ts +331 -331
  34. package/components/common/diagramMain/modals/ManagePhysicalAdaptersModal.vue +330 -330
  35. package/components/common/diagramMain/modals/editSettings/ConfirmTeamingSettingsModal.vue +40 -40
  36. package/components/common/diagramMain/modals/editSettings/EditSettings.vue +497 -497
  37. package/components/common/diagramMain/modals/editSettings/EditSettingsModal.vue +812 -812
  38. package/components/common/diagramMain/modals/editSettings/tabs/NetworkProperties.vue +214 -214
  39. package/components/common/diagramMain/modals/editSettings/tabs/Security.vue +189 -189
  40. package/components/common/diagramMain/modals/editSettings/tabs/SwitchProperties.vue +163 -163
  41. package/components/common/diagramMain/modals/editSettings/tabs/TeamingFailover.vue +175 -175
  42. package/components/common/diagramMain/modals/editSettings/tabs/port/IpvFourSettings.vue +346 -346
  43. package/components/common/diagramMain/modals/editSettings/tabs/port/PortProperties.vue +205 -205
  44. package/components/common/diagramMain/modals/lib/config/diagramConfig.ts +23 -23
  45. package/components/common/diagramMain/modals/lib/config/initial.ts +180 -180
  46. package/components/common/diagramMain/modals/lib/config/vmKernelAdapter.ts +90 -90
  47. package/components/common/diagramMain/modals/lib/mappers/mappers.ts +87 -87
  48. package/components/common/diagramMain/modals/lib/utils/index.ts +24 -24
  49. package/components/common/diagramMain/modals/migrateVmkernelAdapter/lib/config/steps.ts +114 -114
  50. package/components/common/diagramMain/modals/migrateVmkernelAdapter/steps/ConnectionSettings.vue +169 -169
  51. package/components/common/diagramMain/modals/migrateVmkernelAdapter/steps/SelectVmkernelAdapter.vue +159 -159
  52. package/components/common/diagramMain/modals/migrateVmkernelAdapter/validations/common.ts +14 -14
  53. package/components/common/diagramMain/modals/migrateVmkernelAdapter/validations/connectionSettings.ts +137 -137
  54. package/components/common/diagramMain/modals/migrateVmkernelAdapter/validations/selectVmkernelAdapter.ts +52 -52
  55. package/components/common/diagramMain/modals/migrateVmkernelAdapter/validations/validations.ts +19 -19
  56. package/components/common/diagramMain/port/Ports.vue +47 -47
  57. package/components/common/graph/Graph.vue +104 -104
  58. package/components/common/layout/theHeader/helpMenu/About.vue +82 -82
  59. package/components/common/layout/theHeader/helpMenu/aboutNew/AboutNew.vue +103 -103
  60. package/components/common/modals/unsavedChanges/UnsavedChanges.vue +56 -56
  61. package/components/common/monitor/overview/OverviewNew.vue +142 -142
  62. package/components/common/monitor/overview/OverviewOld.vue +139 -139
  63. package/components/common/monitor/overview/filters/Filters.vue +166 -166
  64. package/components/common/monitor/overview/filters/FiltersNew.vue +172 -172
  65. package/components/common/monitor/overview/filters/FiltersOld.vue +151 -151
  66. package/components/common/monitor/overview/filters/customIntervalModal/CustomIntervalModal.vue +175 -175
  67. package/components/common/monitor/overview/filters/customIntervalModal/CustomIntervalModalOld.vue +161 -161
  68. package/components/common/pages/home/StatusContent.vue +49 -49
  69. package/components/common/pages/home/headline/Headline.vue +45 -45
  70. package/components/common/pages/home/headline/HeadlineOld.vue +42 -42
  71. package/components/common/pages/home/lib/models/interfaces.ts +48 -48
  72. package/components/common/pages/home/widgets/Widgets.vue +49 -49
  73. package/components/common/pages/home/widgets/WidgetsNew.vue +86 -86
  74. package/components/common/pages/home/widgets/WidgetsOld.vue +34 -34
  75. package/components/common/pages/home/widgets/hosts/Hosts.vue +27 -27
  76. package/components/common/pages/home/widgets/hosts/lib/config/items.ts +23 -23
  77. package/components/common/pages/home/widgets/vms/Vms.vue +26 -26
  78. package/components/common/pages/home/widgets/vms/VmsOld.vue +35 -35
  79. package/components/common/pages/home/widgets/vms/lib/config/items.ts +19 -19
  80. package/components/common/pages/packages/Packages.vue +208 -208
  81. package/components/common/recursionTree/RecursionTree.vue +223 -223
  82. package/components/common/select/button/ButtonDropdown.vue +108 -108
  83. package/components/common/spiceConsole/Drawer.vue +370 -370
  84. package/components/common/spiceConsole/lib/models/interfaces.ts +5 -5
  85. package/components/common/split/horizontal/HorizontalNew.vue +376 -376
  86. package/components/common/split/horizontal/HorizontalOld.vue +337 -337
  87. package/components/common/split/vertical/Vertical.vue +160 -160
  88. package/components/common/vm/actions/add/Add.vue +622 -622
  89. package/components/common/vm/actions/clone/Clone.vue +639 -639
  90. package/components/common/vm/actions/clone/lib/config/steps.ts +129 -129
  91. package/components/common/vm/actions/clone/toTemplate/ToTemplate.vue +634 -634
  92. package/components/common/vm/actions/clone/toTemplate/lib/config/steps.ts +116 -116
  93. package/components/common/vm/actions/common/customizeHardware/CustomizeHardware.vue +275 -275
  94. package/components/common/vm/actions/common/customizeHardware/CustomizeHardwareNew.vue +274 -274
  95. package/components/common/vm/actions/common/customizeHardware/CustomizeHardwareOld.vue +177 -177
  96. package/components/common/vm/actions/common/customizeHardware/virtualHardware/VirtualHardware.vue +698 -698
  97. package/components/common/vm/actions/common/customizeHardware/virtualHardware/VirtualHardwareNew.vue +410 -410
  98. package/components/common/vm/actions/common/customizeHardware/virtualHardware/VirtualHardwareOld.vue +319 -319
  99. package/components/common/vm/actions/common/customizeHardware/virtualHardware/browseView/BrowseView.vue +219 -219
  100. package/components/common/vm/actions/common/customizeHardware/virtualHardware/bus/Bus.vue +99 -99
  101. package/components/common/vm/actions/common/customizeHardware/virtualHardware/bus/BusNew.vue +117 -117
  102. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/CdDvdDrive.vue +232 -232
  103. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/CdDvdDriveNew.vue +164 -164
  104. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/CdDvdDriveOld.vue +168 -168
  105. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/Media.vue +25 -25
  106. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/MediaNew.vue +70 -70
  107. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/MediaOld.vue +50 -50
  108. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/Cpu.vue +338 -338
  109. package/components/common/vm/actions/common/customizeHardware/virtualHardware/limit/Limit.vue +220 -220
  110. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/NewHardDisk.vue +368 -368
  111. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/NewHardDiskNew.vue +232 -232
  112. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/NewHardDiskOld.vue +250 -250
  113. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/mode/ModeOld.vue +56 -56
  114. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/sharing/SharingNew.vue +44 -44
  115. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/NewNetworkNew.vue +124 -124
  116. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/location/LocationOld.vue +134 -134
  117. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/location/new/New.vue +63 -63
  118. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/location/new/table/lib/config/config.ts +95 -95
  119. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/macAddress/MacAddress.vue +119 -119
  120. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/macAddress/MacAddressNew.vue +69 -69
  121. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/macAddress/MacAddressOld.vue +83 -83
  122. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/NewPciDevice.vue +205 -205
  123. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/directPathIo/DirectPathIoNew.vue +66 -66
  124. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/directPathIo/DirectPathIoOld.vue +62 -62
  125. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/dynamicDirectPathIo/DynamicDirectPathIo.vue +31 -31
  126. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/dynamicDirectPathIo/DynamicDirectPathIoNew.vue +84 -84
  127. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/dynamicDirectPathIo/DynamicDirectPathIoOld.vue +76 -76
  128. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/Note.vue +15 -15
  129. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/NoteNew.vue +42 -42
  130. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/NoteOld.vue +30 -30
  131. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/nvidiaGrid/NvidiaGrid.vue +41 -41
  132. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/nvidiaGrid/NvidiaGridNew.vue +81 -81
  133. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/nvidiaGrid/NvidiaGridOld.vue +84 -84
  134. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newUsbController/NewUsbControllerNew.vue +56 -56
  135. package/components/common/vm/actions/common/customizeHardware/virtualHardware/other/Other.vue +16 -16
  136. package/components/common/vm/actions/common/customizeHardware/virtualHardware/other/OtherNew.vue +30 -30
  137. package/components/common/vm/actions/common/customizeHardware/virtualHardware/videoCard/VideoCardNew.vue +104 -104
  138. package/components/common/vm/actions/common/customizeHardware/virtualHardware/videoCard/VideoCardOld.vue +112 -112
  139. package/components/common/vm/actions/common/customizeHardware/virtualHardware/videoCard/totalVideoMemory/TotalVideoMemoryNew.vue +54 -54
  140. package/components/common/vm/actions/common/customizeHardware/vmoptions/Vmoptions.vue +145 -145
  141. package/components/common/vm/actions/common/customizeHardware/vmoptions/VmoptionsNew.vue +102 -102
  142. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/BootOptionsNew.vue +75 -75
  143. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/delay/Delay.vue +26 -26
  144. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/firmware/Firmware.vue +57 -57
  145. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/firmware/FirmwareNew.vue +42 -42
  146. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/menu/MenuNew.vue +25 -25
  147. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/order/Order.vue +171 -171
  148. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/order/OrderNew.vue +50 -50
  149. package/components/common/vm/actions/common/customizeHardware/vmoptions/generalOptions/GeneralOptionsNew.vue +141 -141
  150. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/New.vue +140 -140
  151. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/copyPaste/CopyPasteNew.vue +30 -30
  152. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/fileTransfer/FileTransferNew.vue +30 -30
  153. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/folderSharing/FolderSharingNew.vue +30 -30
  154. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/keymap/Keymap.vue +32 -32
  155. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/keymap/KeymapNew.vue +39 -39
  156. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/password/Password.vue +103 -103
  157. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/password/PasswordNew.vue +102 -102
  158. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/password/PasswordOld.vue +94 -94
  159. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirection.vue +28 -28
  160. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirectionNew.vue +38 -38
  161. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirectionOld.vue +44 -44
  162. package/components/common/vm/actions/common/select/storage/Storage.vue +130 -130
  163. package/components/common/vm/actions/common/select/storage/StorageOld.vue +129 -129
  164. package/components/common/vm/actions/editSettings/new/Skeleton.vue +88 -88
  165. package/components/common/wizards/datastore/add/lib/config/steps.ts +138 -138
  166. package/components/common/wizards/vm/migrate/Migrate.vue +302 -302
  167. package/components/common/wizards/vm/migrate/lib/config/constructDataReady.ts +220 -220
  168. package/components/common/wizards/vm/migrate/select/network/Network.vue +103 -103
  169. package/components/common/wizards/vm/migrate/select/network/table/network/Network.vue +150 -150
  170. package/components/common/wizards/vm/migrate/select/network/table/network/lib/config/advancedTable.ts +91 -91
  171. package/components/common/wizards/vm/migrate/select/priority/Priority.vue +43 -43
  172. package/composables/productNameLocal.ts +30 -30
  173. package/composables/useAppVersion.ts +21 -21
  174. package/modules/setLastUpdateTime/index.ts +6 -6
  175. package/package.json +1 -1
  176. package/plugins/date.ts +233 -233
  177. package/plugins/recursion.ts +311 -311
  178. package/public/spice-console/lib/images/bitmap.js +203 -203
  179. package/public/spice-console/network/spicechannel.js +383 -383
  180. package/store/main/mutations.ts +7 -7
  181. package/store/main/state.ts +7 -7
  182. package/store/tasks/mappers/recentTasks.ts +64 -64
@@ -1,698 +1,698 @@
1
- <template>
2
- <common-vm-actions-common-customize-hardware-virtual-hardware-new
3
- v-if="isNewView"
4
- v-model:cpu-invalid="cpuInvalid"
5
- v-model:memory-invalid="memoryInvalid"
6
- v-model:video-card-invalid="videoCardInvalid"
7
- :nodes="props.nodes"
8
- :files="props.files"
9
- :is-edit="props.isEdit"
10
- :storage="props.storage"
11
- :project="props.project"
12
- :max-cpus="props.maxCpus"
13
- :max-memory="props.maxMemory"
14
- :cpu-models="props.cpuModels"
15
- :datastore="props.datastore"
16
- :networks-type="networksType"
17
- :networks-table="props.networksTable"
18
- :dropdown-items="dropdownItems"
19
- :hard-disks-type="hardDisksType"
20
- :networks-index="networksIndex"
21
- :hard-disks-index="hardDisksIndex"
22
- :pci-devices-type="pciDevicesType"
23
- :is-show-file-modal="isShowFileModal"
24
- :pci-devices-index="pciDevicesIndex"
25
- :cd-dvd-drives-type="cdDvdDrivesType"
26
- :cd-dvd-drives-index="cdDvdDrivesIndex"
27
- :error-validation-fields="errorValidationFields"
28
- :get-datastore-table-func="getDatastoreTableFunc"
29
- :cpu="cpu"
30
- :state="state"
31
- :memory="memory"
32
- :networks="networksLocal"
33
- :hard-disks="hardDisksLocal"
34
- :video-card="videoCard"
35
- :pci-devices="pciDevicesLocal"
36
- :cd-dvd-drives="cdDvdDrivesLocal"
37
- :usb-controller="usbController"
38
- :guest-machine-type="guestMachineType"
39
- :passthrough-devices="passthroughDevices"
40
- :mediated-devices="mediatedDevices"
41
- :vm-cpu-help-text-second="vmCpuHelpTextSecond"
42
- :compute-resource="props.computeResource"
43
- @add-device="onAddDevice"
44
- @get-storage="emits('get-storage', $event)"
45
- @remove-network="onRemoveNetwork"
46
- @hide-file-modal="isShowFileModal = false"
47
- @remove-hard-disk="onRemoveHardDisk(...$event)"
48
- @remove-pci-device="onRemovePciDevice"
49
- @get-networks-table="emits('get-networks-table', $event)"
50
- @add-exist-hard-disk="onAddExistHardDisk"
51
- @roll-back-hard-disk="onRollBackHardDisk"
52
- @set-invalid-network="onSetInvalidNetwork(...$event)"
53
- @remove-cd-dvd-drive="onRemoveCdDvdDrive(...$event)"
54
- @show-datastore-child="emits('show-datastore-child', $event)"
55
- @get-folders-or-files="emits('get-folders-or-files', $event)"
56
- @send-data-cpu-method="onSendDataCpuMethod"
57
- @set-invalid-hard-disk="onSetInvalidHardDisk(...$event)"
58
- @remove-error-by-title="emits('remove-error-by-title', $event)"
59
- @roll-back-cd-dvd-drive="onRollBackCdDvdDrive"
60
- @set-invalid-pci-device="onSetInvalidPciDevice(...$event)"
61
- @get-active-device-child="emits('get-active-device-child', $event)"
62
- @send-data-memory-method="onSendDataMemoryMethod"
63
- @send-data-video-card-method="onSendDataVideoCardMethod"
64
- @send-data-new-network-method="sendDataNewNetworkMethod(...$event)"
65
- @send-data-pci-devices-method="onSendDataPciDevicesMethod(...$event)"
66
- @send-data-new-hard-disk-method="onSendDataNewHardDiskMethod(...$event)"
67
- @send-data-new-cd-dvd-drive-method="sendDataNewCdDvdDriveMethod(...$event)"
68
- @send-data-new-usb-controller-method="onSendDataNewUsbControllerMethod"
69
- />
70
- <common-vm-actions-common-customize-hardware-virtual-hardware-old
71
- v-else
72
- v-model:cpu-invalid="cpuInvalid"
73
- v-model:memory-invalid="memoryInvalid"
74
- v-model:video-card-invalid="videoCardInvalid"
75
- :nodes="props.nodes"
76
- :files="props.files"
77
- :is-edit="props.isEdit"
78
- :storage="props.storage"
79
- :project="props.project"
80
- :max-cpus="props.maxCpus"
81
- :max-memory="props.maxMemory"
82
- :cpu-models="props.cpuModels"
83
- :datastore="props.datastore"
84
- :networks-type="networksType"
85
- :networks-table="props.networksTable"
86
- :dropdown-items="dropdownItems"
87
- :hard-disks-type="hardDisksType"
88
- :networks-index="networksIndex"
89
- :hard-disks-index="hardDisksIndex"
90
- :pci-devices-type="pciDevicesType"
91
- :is-show-file-modal="isShowFileModal"
92
- :pci-devices-index="pciDevicesIndex"
93
- :cd-dvd-drives-type="cdDvdDrivesType"
94
- :cd-dvd-drives-index="cdDvdDrivesIndex"
95
- :error-validation-fields="errorValidationFields"
96
- :get-datastore-table-func="getDatastoreTableFunc"
97
- :cpu="cpu"
98
- :state="state"
99
- :memory="memory"
100
- :networks="networksLocal"
101
- :hard-disks="hardDisksLocal"
102
- :video-card="videoCard"
103
- :pci-devices="pciDevicesLocal"
104
- :cd-dvd-drives="cdDvdDrivesLocal"
105
- :usb-controller="usbController"
106
- :guest-machine-type="guestMachineType"
107
- :passthrough-devices="passthroughDevices"
108
- :mediated-devices="mediatedDevices"
109
- :vm-cpu-help-text-second="vmCpuHelpTextSecond"
110
- :compute-resource="props.computeResource"
111
- @add-device="onAddDevice"
112
- @get-storage="emits('get-storage', $event)"
113
- @remove-network="onRemoveNetwork"
114
- @hide-file-modal="isShowFileModal = false"
115
- @remove-hard-disk="onRemoveHardDisk(...$event)"
116
- @remove-pci-device="onRemovePciDevice"
117
- @get-networks-table="emits('get-networks-table', $event)"
118
- @add-exist-hard-disk="onAddExistHardDisk"
119
- @roll-back-hard-disk="onRollBackHardDisk"
120
- @set-invalid-network="onSetInvalidNetwork(...$event)"
121
- @remove-cd-dvd-drive="onRemoveCdDvdDrive(...$event)"
122
- @show-datastore-child="emits('show-datastore-child', $event)"
123
- @get-folders-or-files="emits('get-folders-or-files', $event)"
124
- @send-data-cpu-method="onSendDataCpuMethod"
125
- @set-invalid-hard-disk="onSetInvalidHardDisk(...$event)"
126
- @remove-error-by-title="emits('remove-error-by-title', $event)"
127
- @roll-back-cd-dvd-drive="onRollBackCdDvdDrive"
128
- @set-invalid-pci-device="onSetInvalidPciDevice(...$event)"
129
- @get-active-device-child="emits('get-active-device-child', $event)"
130
- @send-data-memory-method="onSendDataMemoryMethod"
131
- @send-data-video-card-method="onSendDataVideoCardMethod"
132
- @send-data-new-network-method="sendDataNewNetworkMethod(...$event)"
133
- @send-data-pci-devices-method="onSendDataPciDevicesMethod(...$event)"
134
- @send-data-new-hard-disk-method="onSendDataNewHardDiskMethod(...$event)"
135
- @send-data-new-cd-dvd-drive-method="sendDataNewCdDvdDriveMethod(...$event)"
136
- @send-data-new-usb-controller-method="onSendDataNewUsbControllerMethod"
137
- />
138
- </template>
139
-
140
- <script setup lang="ts">
141
- import type { UI_T_Project } from '~/lib/models/types'
142
- import type { UI_I_DatastoreTableItem } from '~/lib/models/store/storage/interfaces'
143
- import type { UI_I_NetworkTableItem } from '~/lib/models/store/network/interfaces'
144
- import type { UI_I_TablePayload } from '~/lib/models/table/interfaces'
145
- import type { UI_I_FolderOrFileTreePayload } from '~/lib/models/store/storage/interfaces'
146
- import type { UI_I_FileTreeNode } from '~/components/lib/models/interfaces'
147
- import type {
148
- UI_I_SendDataCpu,
149
- UI_I_SendDataMemory,
150
- UI_I_SendDataNewHardDisk,
151
- UI_I_SendDataNewNetwork,
152
- UI_I_SendDataVideoCard,
153
- UI_I_InvalidKeys,
154
- UI_I_SendDataVirtualHardware,
155
- UI_I_SendDataNewCdDvdDrive,
156
- // UI_I_HardDisk,
157
- UI_I_SendDataNewPciDevice,
158
- } from '~/components/common/vm/actions/common/customizeHardware/virtualHardware/lib/models/interfaces'
159
- import type { UI_I_ErrorValidationField } from '~/lib/models/store/interfaces'
160
- import type {
161
- UI_T_HardDiskType,
162
- UI_T_NetworkType,
163
- UI_T_CdDvdType,
164
- } from '~/components/common/vm/actions/common/customizeHardware/virtualHardware/lib/models/types'
165
- import type { UI_I_OptionItem } from '~/components/atoms/lib/models/interfaces'
166
- import type {
167
- UI_I_DropdownTreeItem,
168
- UI_I_DropdownTreeItemChild,
169
- } from '~/components/atoms/dropdown/tree/lib/models/interfaces'
170
- import type { UI_I_Localization } from '~/lib/models/interfaces'
171
- import type {
172
- API_UI_I_VmEditCpu,
173
- API_UI_I_VmEditMemory,
174
- UI_I_MediatedDevice,
175
- UI_I_PciDevice,
176
- } from '~/lib/models/store/vm/interfaces'
177
- import { dropdownItemsFunc } from './lib/config/dropdownItems'
178
- import type {UI_I_TreeNode} from "~/components/common/recursionTree/lib/models/interfaces";
179
-
180
- const props = defineProps<{
181
- storage: UI_I_DatastoreTableItem | null
182
- cpuModels: UI_I_OptionItem[]
183
- maxCpus: number
184
- maxMemory: number
185
- isEdit: boolean
186
- isClone: boolean
187
- errorValidationFields: UI_I_ErrorValidationField<string>[]
188
- nodes: UI_I_FileTreeNode[]
189
- files: UI_I_FileTreeNode[]
190
- networksTable: UI_I_NetworkTableItem[]
191
- getDatastoreTableFunc: (payload: UI_I_TablePayload) => Promise<void>
192
- datastore: UI_I_DatastoreTableItem[]
193
- state?: string | number
194
- cpu?: API_UI_I_VmEditCpu
195
- memory?: API_UI_I_VmEditMemory
196
- vmCpuHelpTextSecond?: string
197
- hardDisks?: UI_I_SendDataNewHardDisk[] | null
198
- cdDvdDrives?: UI_I_SendDataNewCdDvdDrive[] | null
199
- networks?: UI_I_SendDataNewNetwork[] | null
200
- videoCard?: UI_I_SendDataVideoCard
201
- usbController?: string
202
- pciDevices?: UI_I_SendDataNewPciDevice[]
203
- passthroughDevices?: UI_I_PciDevice[]
204
- mediatedDevices?: UI_I_MediatedDevice[]
205
- project: UI_T_Project
206
- guestMachineType?: UI_I_OptionItem | null
207
- computeResource?: UI_I_TreeNode | null
208
- }>()
209
- const emits = defineEmits<{
210
- (event: 'send-data', value: UI_I_SendDataVirtualHardware): void
211
- (event: 'invalid', value: string[]): void
212
- (event: 'get-storage', value: UI_I_TablePayload): void
213
- (event: 'get-folders-or-files', value: UI_I_FolderOrFileTreePayload): void
214
- (event: 'get-active-device-child', value: UI_I_FileTreeNode): void
215
- (event: 'show-datastore-child', value: UI_I_FileTreeNode): void
216
- (event: 'remove-error-by-title', value: string): void
217
- (event: 'get-networks-table', value: UI_I_TablePayload): void
218
- (event: 'get-pci-devices'): void
219
- }>()
220
-
221
- const { $store, $binary }: any = useNuxtApp()
222
- const isNewView = computed<boolean>(() => $store.getters['main/getIsNewView'])
223
-
224
- const localization = computed<UI_I_Localization>(() => useLocal())
225
-
226
- const dropdownItems = computed<UI_I_DropdownTreeItem[]>(() =>
227
- dropdownItemsFunc(
228
- localization.value,
229
- props.state,
230
- props.passthroughDevices,
231
- props.mediatedDevices
232
- )
233
- )
234
-
235
- const hardDisksIndex = ref<number[]>([0])
236
- const hardDisksType = ref<UI_T_HardDiskType[]>(['new'])
237
- const hardDisksLocal = ref<UI_I_SendDataNewHardDisk[]>([
238
- {
239
- create: true,
240
- size: 90,
241
- source: '',
242
- boot_order: -1,
243
- },
244
- ])
245
- watch(
246
- () => props.hardDisks,
247
- (newValue) => {
248
- if ((!props.isEdit && !props.isClone) || !newValue) return
249
-
250
- const count = newValue?.length || 0
251
- hardDisksIndex.value = [...Array(count).keys()]
252
- hardDisksLocal.value = newValue
253
- if (props.isEdit) {
254
- hardDisksType.value = Array(count).fill('edit')
255
- } else if (props.isClone) {
256
- hardDisksType.value = Array(count).fill('clone')
257
- hardDisksLocal.value = newValue.map((hardDisk) => {
258
- hardDisk.create = true
259
- return hardDisk
260
- })
261
- }
262
- },
263
- { immediate: true }
264
- )
265
-
266
- const addHardDisk = (
267
- create = true,
268
- size = 90,
269
- source = '',
270
- type: UI_T_HardDiskType = 'new',
271
- provisioned_type?: number // При добавлении существующей
272
- ): void => {
273
- const newIndex = (hardDisksIndex.value.at(-1) ?? -1) + 1
274
- hardDisksIndex.value.push(newIndex)
275
- hardDisksType.value.push(type)
276
-
277
- let provisionType = 'thick'
278
- if (provisioned_type === 1) provisionType = 'thin'
279
-
280
- hardDisksLocal.value.push({
281
- create,
282
- size,
283
- source,
284
- attach: true,
285
- boot_order: 0, // Убираем галочку
286
- provision_type: provisionType,
287
- })
288
- sendData()
289
- }
290
- const onAddExistHardDisk = (file: UI_I_FileTreeNode): void => {
291
- addHardDisk(
292
- false,
293
- $binary.bToGb(file.size),
294
- file.path,
295
- 'exist',
296
- file.provisioned_type
297
- )
298
- }
299
- const onRemoveHardDisk = (
300
- index: number,
301
- hardDisk: UI_I_SendDataNewHardDisk
302
- ): void => {
303
- const removeIndex = hardDisksIndex.value.indexOf(index)
304
-
305
- if (!hardDisk.create && !hardDisk.attach) {
306
- hardDisksType.value = hardDisksType.value.map((item, key) => {
307
- if (key === removeIndex) return 'removed'
308
- return item
309
- })
310
- sendData()
311
- return
312
- }
313
-
314
- hardDisksIndex.value = hardDisksIndex.value.filter((item) => item !== index)
315
- hardDisksType.value = hardDisksType.value.filter(
316
- (_item, key) => key !== removeIndex
317
- )
318
-
319
- hardDisksLocal.value = hardDisksLocal.value.filter(
320
- (_hardDisk, key: number) => {
321
- return removeIndex !== key
322
- }
323
- )
324
-
325
- delete newHardDiskInvalidKeys.value[index]
326
- delete sendDataNewHardDisk.value[index]
327
- sendData()
328
- }
329
- const onRollBackHardDisk = (index: number): void => {
330
- const removeIndex = hardDisksIndex.value.indexOf(index)
331
- hardDisksType.value = hardDisksType.value.map((item, key) => {
332
- if (key === removeIndex) return 'edit'
333
- return item
334
- })
335
- }
336
-
337
- const defaultNetwork = {
338
- network: '',
339
- net_bridge: '',
340
- mac: '',
341
- target: '',
342
- model: '',
343
- boot_order: -1,
344
- }
345
- const networksLocal = ref<UI_I_SendDataNewNetwork[]>([
346
- useDeepCopy(defaultNetwork),
347
- ])
348
- const networksType = ref<UI_T_NetworkType[]>(['new'])
349
- const networksIndex = ref<number[]>([0])
350
- watch(
351
- () => props.networks,
352
- (newValue) => {
353
- if ((!props.isEdit && !props.isClone) || !newValue) return
354
-
355
- // networksLocal.value = newValue
356
- // networksType.value = Array(newValue.length).fill('edit')
357
- const count = newValue?.length || 0
358
- networksIndex.value = [...Array(count).keys()]
359
- networksLocal.value = newValue
360
- if (props.isEdit) {
361
- networksType.value = Array(count).fill('edit')
362
- } else if (props.isClone) {
363
- networksType.value = Array(count).fill('clone')
364
- }
365
- },
366
- { immediate: true }
367
- )
368
- const addNetwork = (): void => {
369
- const index = (networksIndex.value.at(-1) ?? -1) + 1
370
- networksIndex.value.push(index)
371
- networksType.value.push('new')
372
-
373
- networksLocal.value.push({
374
- ...useDeepCopy(defaultNetwork),
375
- boot_order: 0, // Убираем галочку
376
- })
377
- }
378
- const onRemoveNetwork = (index: number): void => {
379
- const removeIndex = networksIndex.value.indexOf(index)
380
- networksIndex.value = networksIndex.value.filter((item) => item !== index)
381
- networksType.value = networksType.value.filter(
382
- (_item, key) => key !== removeIndex
383
- )
384
- networksLocal.value = networksLocal.value.filter(
385
- (_network, key: number) => removeIndex !== key
386
- )
387
-
388
- delete newNetworkInvalidKeys.value[index]
389
- delete sendDataNewNetwork.value[index]
390
- sendData()
391
- }
392
-
393
- const defaultCdDvdDriver: UI_I_SendDataNewCdDvdDrive = {
394
- create: false,
395
- attach: false,
396
- source: '',
397
- bus: '',
398
- device_type: 'cdrom',
399
- boot_order: -1,
400
- }
401
- const cdDvdDrivesLocal = ref<UI_I_SendDataNewCdDvdDrive[]>([
402
- useDeepCopy(defaultCdDvdDriver),
403
- ])
404
- const cdDvdDrivesIndex = ref<number[]>([0])
405
- const cdDvdDrivesType = ref<UI_T_CdDvdType[]>(['new'])
406
- watch(
407
- () => props.cdDvdDrives,
408
- (newValue) => {
409
- if ((!props.isEdit && !props.isClone) || !newValue) return
410
-
411
- // cdDvdDrivesLocal.value = newValue
412
- // cdDvdDrivesType.value = Array(newValue.length).fill('edit')
413
- const count = newValue?.length || 0
414
- cdDvdDrivesIndex.value = [...Array(count).keys()]
415
- cdDvdDrivesLocal.value = newValue
416
- if (props.isEdit) {
417
- cdDvdDrivesType.value = Array(count).fill('edit')
418
- } else if (props.isClone) {
419
- cdDvdDrivesType.value = Array(count).fill('new')
420
- }
421
- },
422
- { immediate: true }
423
- )
424
- const addCdDvdDrive = (): void => {
425
- const value = (cdDvdDrivesIndex.value.at(-1) ?? -1) + 1
426
- cdDvdDrivesIndex.value.push(value)
427
- cdDvdDrivesType.value.push('new')
428
- cdDvdDrivesLocal.value.push({
429
- ...useDeepCopy(defaultCdDvdDriver),
430
- attach: true,
431
- boot_order: 0, // Убираем галочку
432
- })
433
- }
434
- const onRemoveCdDvdDrive = (
435
- index: number,
436
- cdDvdDrive: UI_I_SendDataNewCdDvdDrive
437
- ): void => {
438
- const removeIndex = cdDvdDrivesIndex.value.indexOf(index)
439
-
440
- // if (!cdDvdDrive.create && !cdDvdDrive.attach) {
441
- if (cdDvdDrivesType.value[index] === 'edit' && !cdDvdDrive.attach) {
442
- cdDvdDrivesType.value = cdDvdDrivesType.value.map((item, key) => {
443
- if (key === removeIndex) return 'removed'
444
- return item
445
- })
446
- sendData()
447
- return
448
- }
449
-
450
- cdDvdDrivesIndex.value = cdDvdDrivesIndex.value.filter(
451
- (cdDvdDrive) => cdDvdDrive !== index
452
- )
453
- cdDvdDrivesType.value = cdDvdDrivesType.value.filter(
454
- (_item, key) => key !== index
455
- )
456
- cdDvdDrivesLocal.value = cdDvdDrivesLocal.value.filter(
457
- (_cdDvdDrive, key: number) => removeIndex !== key
458
- )
459
-
460
- delete sendDataNewCdDvdDrive.value[index]
461
- sendData()
462
- }
463
- const onRollBackCdDvdDrive = (index: number): void => {
464
- const removeIndex = cdDvdDrivesIndex.value.indexOf(index)
465
- cdDvdDrivesType.value = cdDvdDrivesType.value.map((item, key) => {
466
- if (key === removeIndex) return 'edit'
467
- return item
468
- })
469
- }
470
-
471
- const defaultPciDevice: UI_I_SendDataNewPciDevice = {
472
- address: '',
473
- vendor_name: '',
474
- class_name: '',
475
- device_name: '',
476
- }
477
- const pciDevicesIndex = ref<number[]>([0])
478
- const pciDevicesType = ref<('new' | 'edit' | 'removed')[]>(['new'])
479
- const pciDevicesLocal = ref<UI_I_SendDataNewPciDevice[]>([])
480
- watch(
481
- () => props.pciDevices,
482
- (newValue) => {
483
- if ((!props.isEdit && !props.isClone) || !newValue) return
484
-
485
- const count = newValue?.length || 0
486
- pciDevicesIndex.value = [...Array(count).keys()]
487
- pciDevicesLocal.value = newValue || []
488
- if (props.isEdit) {
489
- pciDevicesType.value = Array(count).fill('edit')
490
- } else if (props.isClone) {
491
- pciDevicesType.value = Array(count).fill('new')
492
- }
493
- },
494
- { immediate: true }
495
- )
496
-
497
- const addPciDevice = (): void => {
498
- const newIndex = (pciDevicesIndex.value.at(-1) ?? -1) + 1
499
- pciDevicesIndex.value.push(newIndex)
500
- pciDevicesType.value.push('new')
501
-
502
- pciDevicesLocal.value.push(useDeepCopy(defaultPciDevice))
503
- }
504
- const onRemovePciDevice = (index: number): void => {
505
- const removeIndex = pciDevicesIndex.value.indexOf(index)
506
- pciDevicesIndex.value = pciDevicesIndex.value.filter((item) => item !== index)
507
- pciDevicesType.value = pciDevicesType.value.filter(
508
- (_item, key) => key !== removeIndex
509
- )
510
-
511
- pciDevicesLocal.value = pciDevicesLocal.value.filter(
512
- (_pciDevice, key: number) => {
513
- return removeIndex !== key
514
- }
515
- )
516
-
517
- delete newPciDeviceInvalidKeys.value[index]
518
- delete sendDataNewPciDevices.value[index]
519
- sendData()
520
- }
521
-
522
- const isShowFileModal = ref<boolean>(false)
523
- const onAddDevice = (item: UI_I_DropdownTreeItemChild): void => {
524
- switch (item.value) {
525
- case 1:
526
- addHardDisk()
527
- break
528
- case 2:
529
- isShowFileModal.value = true
530
- break
531
- case 5:
532
- addCdDvdDrive()
533
- break
534
- case 10:
535
- addPciDevice()
536
- break
537
- case 14:
538
- addNetwork()
539
- break
540
- }
541
- }
542
-
543
- const cpuInvalid = ref<boolean>(false)
544
- const sendDataCpu = ref<UI_I_SendDataCpu | null>(null)
545
- const onSendDataCpuMethod = (data: UI_I_SendDataCpu): void => {
546
- sendDataCpu.value = data
547
- sendData()
548
- }
549
- const sendDataMemory = ref<UI_I_SendDataMemory | null>(null)
550
- const onSendDataMemoryMethod = (data: UI_I_SendDataMemory): void => {
551
- sendDataMemory.value = data
552
- sendData()
553
- }
554
- const sendDataNewHardDisk = ref<UI_I_SendDataNewHardDisk[]>([])
555
- const onSendDataNewHardDiskMethod = (
556
- data: UI_I_SendDataNewHardDisk,
557
- index: number
558
- ): void => {
559
- sendDataNewHardDisk.value[index] = data
560
- sendData()
561
- }
562
- const sendDataNewNetwork = ref<UI_I_SendDataNewNetwork[]>([])
563
- const sendDataNewNetworkMethod = (
564
- data: UI_I_SendDataNewNetwork,
565
- index: number
566
- ): void => {
567
- sendDataNewNetwork.value[index] = data
568
- sendData()
569
- }
570
- const sendDataNewCdDvdDrive = ref<UI_I_SendDataNewCdDvdDrive[]>([])
571
- const sendDataNewCdDvdDriveMethod = (
572
- data: UI_I_SendDataNewCdDvdDrive,
573
- index: number
574
- ): void => {
575
- sendDataNewCdDvdDrive.value[index] = data
576
- sendData()
577
- }
578
- const sendDataNewUsbController = ref<string | null>(null)
579
- const onSendDataNewUsbControllerMethod = (data: string): void => {
580
- sendDataNewUsbController.value = data
581
- sendData()
582
- }
583
- const sendDataNewPciDevices = ref<UI_I_SendDataNewPciDevice[]>([])
584
- const onSendDataPciDevicesMethod = (
585
- data: UI_I_SendDataNewPciDevice,
586
- index: number
587
- ): void => {
588
- sendDataNewPciDevices.value[index] = data
589
- sendData()
590
- }
591
- const sendDataVideoCard = ref<UI_I_SendDataVideoCard | null>(null)
592
- const onSendDataVideoCardMethod = (data: UI_I_SendDataVideoCard): void => {
593
- sendDataVideoCard.value = data
594
- sendData()
595
- }
596
-
597
- const sendData = (): void => {
598
- const cpu = sendDataCpu.value
599
- const memory = sendDataMemory.value
600
- const hardDisks = sendDataNewHardDisk.value.flat(2)
601
- const networks = sendDataNewNetwork.value.flat(2)
602
- const cdDvdDrives = sendDataNewCdDvdDrive.value.flat(2)
603
- const pciDevices = sendDataNewPciDevices.value.flat()
604
- const usbController = sendDataNewUsbController.value
605
- const videoCard = sendDataVideoCard.value
606
-
607
- const sendData: UI_I_SendDataVirtualHardware = {
608
- cpu,
609
- memory,
610
- usbController,
611
- pciDevices,
612
- networks,
613
- hardDisks,
614
- cdDvdDrives,
615
- videoCard,
616
- }
617
- emits('send-data', sendData)
618
- }
619
-
620
- const onSetInvalidHardDisk = (invalid: boolean, index: number): void => {
621
- newHardDiskInvalidKeys.value[index] = invalid
622
- }
623
-
624
- const onSetInvalidNetwork = (invalid: boolean, key: number): void => {
625
- newNetworkInvalidKeys.value[key] = invalid
626
- }
627
-
628
- const onSetInvalidPciDevice = (invalid: boolean, key: number): void => {
629
- newPciDeviceInvalidKeys.value[key] = invalid
630
- }
631
-
632
- const memoryInvalid = ref<boolean>(false)
633
- const videoCardInvalid = ref<boolean>(false)
634
- const newHardDiskInvalidKeys = ref<UI_I_InvalidKeys>({})
635
- const newNetworkInvalidKeys = ref<UI_I_InvalidKeys>({})
636
- const newPciDeviceInvalidKeys = ref<UI_I_InvalidKeys>({})
637
-
638
- watch(
639
- [
640
- cpuInvalid,
641
- memoryInvalid,
642
- newHardDiskInvalidKeys,
643
- newNetworkInvalidKeys,
644
- newPciDeviceInvalidKeys,
645
- videoCardInvalid,
646
- ],
647
- () => {
648
- const cpu = cpuInvalid.value ? localization.value.common.cpu : ''
649
- const memory = memoryInvalid.value ? localization.value.common.memory : ''
650
- const videoCard = videoCardInvalid.value
651
- ? localization.value.common.videoCard
652
- : ''
653
- let newHardDisk = ''
654
- Object.keys(newHardDiskInvalidKeys.value).forEach((key) => {
655
- if (!newHardDiskInvalidKeys.value[+key]) {
656
- return
657
- }
658
-
659
- newHardDisk +=
660
- (newHardDisk ? ', ' : '') +
661
- localization.value.common.newHardDisk +
662
- ' ' +
663
- (+key + 1)
664
- })
665
- let newNetwork = ''
666
- Object.keys(newNetworkInvalidKeys.value).forEach((key) => {
667
- if (!newNetworkInvalidKeys.value[+key]) {
668
- return
669
- }
670
-
671
- newNetwork +=
672
- (newNetwork ? ', ' : '') +
673
- localization.value.common.newNetwork +
674
- ' ' +
675
- (+key + 1)
676
- })
677
- // let pciDevice = ''
678
- // Object.keys(newPciDeviceInvalidKeys.value).forEach((key) => {
679
- // if (!newPciDeviceInvalidKeys.value[+key]) {
680
- // return
681
- // }
682
- //
683
- // pciDevice +=
684
- // (pciDevice ? ', ' : '') +
685
- // localization.value.common.pciDevice +
686
- // ' ' +
687
- // (+key + 1)
688
- // })
689
-
690
- emits('invalid', [cpu, memory, newHardDisk, newNetwork, videoCard])
691
- },
692
- { deep: true }
693
- )
694
-
695
- emits('get-pci-devices')
696
- </script>
697
-
698
- <style scoped lang="scss"></style>
1
+ <template>
2
+ <common-vm-actions-common-customize-hardware-virtual-hardware-new
3
+ v-if="isNewView"
4
+ v-model:cpu-invalid="cpuInvalid"
5
+ v-model:memory-invalid="memoryInvalid"
6
+ v-model:video-card-invalid="videoCardInvalid"
7
+ :nodes="props.nodes"
8
+ :files="props.files"
9
+ :is-edit="props.isEdit"
10
+ :storage="props.storage"
11
+ :project="props.project"
12
+ :max-cpus="props.maxCpus"
13
+ :max-memory="props.maxMemory"
14
+ :cpu-models="props.cpuModels"
15
+ :datastore="props.datastore"
16
+ :networks-type="networksType"
17
+ :networks-table="props.networksTable"
18
+ :dropdown-items="dropdownItems"
19
+ :hard-disks-type="hardDisksType"
20
+ :networks-index="networksIndex"
21
+ :hard-disks-index="hardDisksIndex"
22
+ :pci-devices-type="pciDevicesType"
23
+ :is-show-file-modal="isShowFileModal"
24
+ :pci-devices-index="pciDevicesIndex"
25
+ :cd-dvd-drives-type="cdDvdDrivesType"
26
+ :cd-dvd-drives-index="cdDvdDrivesIndex"
27
+ :error-validation-fields="errorValidationFields"
28
+ :get-datastore-table-func="getDatastoreTableFunc"
29
+ :cpu="cpu"
30
+ :state="state"
31
+ :memory="memory"
32
+ :networks="networksLocal"
33
+ :hard-disks="hardDisksLocal"
34
+ :video-card="videoCard"
35
+ :pci-devices="pciDevicesLocal"
36
+ :cd-dvd-drives="cdDvdDrivesLocal"
37
+ :usb-controller="usbController"
38
+ :guest-machine-type="guestMachineType"
39
+ :passthrough-devices="passthroughDevices"
40
+ :mediated-devices="mediatedDevices"
41
+ :vm-cpu-help-text-second="vmCpuHelpTextSecond"
42
+ :compute-resource="props.computeResource"
43
+ @add-device="onAddDevice"
44
+ @get-storage="emits('get-storage', $event)"
45
+ @remove-network="onRemoveNetwork"
46
+ @hide-file-modal="isShowFileModal = false"
47
+ @remove-hard-disk="onRemoveHardDisk(...$event)"
48
+ @remove-pci-device="onRemovePciDevice"
49
+ @get-networks-table="emits('get-networks-table', $event)"
50
+ @add-exist-hard-disk="onAddExistHardDisk"
51
+ @roll-back-hard-disk="onRollBackHardDisk"
52
+ @set-invalid-network="onSetInvalidNetwork(...$event)"
53
+ @remove-cd-dvd-drive="onRemoveCdDvdDrive(...$event)"
54
+ @show-datastore-child="emits('show-datastore-child', $event)"
55
+ @get-folders-or-files="emits('get-folders-or-files', $event)"
56
+ @send-data-cpu-method="onSendDataCpuMethod"
57
+ @set-invalid-hard-disk="onSetInvalidHardDisk(...$event)"
58
+ @remove-error-by-title="emits('remove-error-by-title', $event)"
59
+ @roll-back-cd-dvd-drive="onRollBackCdDvdDrive"
60
+ @set-invalid-pci-device="onSetInvalidPciDevice(...$event)"
61
+ @get-active-device-child="emits('get-active-device-child', $event)"
62
+ @send-data-memory-method="onSendDataMemoryMethod"
63
+ @send-data-video-card-method="onSendDataVideoCardMethod"
64
+ @send-data-new-network-method="sendDataNewNetworkMethod(...$event)"
65
+ @send-data-pci-devices-method="onSendDataPciDevicesMethod(...$event)"
66
+ @send-data-new-hard-disk-method="onSendDataNewHardDiskMethod(...$event)"
67
+ @send-data-new-cd-dvd-drive-method="sendDataNewCdDvdDriveMethod(...$event)"
68
+ @send-data-new-usb-controller-method="onSendDataNewUsbControllerMethod"
69
+ />
70
+ <common-vm-actions-common-customize-hardware-virtual-hardware-old
71
+ v-else
72
+ v-model:cpu-invalid="cpuInvalid"
73
+ v-model:memory-invalid="memoryInvalid"
74
+ v-model:video-card-invalid="videoCardInvalid"
75
+ :nodes="props.nodes"
76
+ :files="props.files"
77
+ :is-edit="props.isEdit"
78
+ :storage="props.storage"
79
+ :project="props.project"
80
+ :max-cpus="props.maxCpus"
81
+ :max-memory="props.maxMemory"
82
+ :cpu-models="props.cpuModels"
83
+ :datastore="props.datastore"
84
+ :networks-type="networksType"
85
+ :networks-table="props.networksTable"
86
+ :dropdown-items="dropdownItems"
87
+ :hard-disks-type="hardDisksType"
88
+ :networks-index="networksIndex"
89
+ :hard-disks-index="hardDisksIndex"
90
+ :pci-devices-type="pciDevicesType"
91
+ :is-show-file-modal="isShowFileModal"
92
+ :pci-devices-index="pciDevicesIndex"
93
+ :cd-dvd-drives-type="cdDvdDrivesType"
94
+ :cd-dvd-drives-index="cdDvdDrivesIndex"
95
+ :error-validation-fields="errorValidationFields"
96
+ :get-datastore-table-func="getDatastoreTableFunc"
97
+ :cpu="cpu"
98
+ :state="state"
99
+ :memory="memory"
100
+ :networks="networksLocal"
101
+ :hard-disks="hardDisksLocal"
102
+ :video-card="videoCard"
103
+ :pci-devices="pciDevicesLocal"
104
+ :cd-dvd-drives="cdDvdDrivesLocal"
105
+ :usb-controller="usbController"
106
+ :guest-machine-type="guestMachineType"
107
+ :passthrough-devices="passthroughDevices"
108
+ :mediated-devices="mediatedDevices"
109
+ :vm-cpu-help-text-second="vmCpuHelpTextSecond"
110
+ :compute-resource="props.computeResource"
111
+ @add-device="onAddDevice"
112
+ @get-storage="emits('get-storage', $event)"
113
+ @remove-network="onRemoveNetwork"
114
+ @hide-file-modal="isShowFileModal = false"
115
+ @remove-hard-disk="onRemoveHardDisk(...$event)"
116
+ @remove-pci-device="onRemovePciDevice"
117
+ @get-networks-table="emits('get-networks-table', $event)"
118
+ @add-exist-hard-disk="onAddExistHardDisk"
119
+ @roll-back-hard-disk="onRollBackHardDisk"
120
+ @set-invalid-network="onSetInvalidNetwork(...$event)"
121
+ @remove-cd-dvd-drive="onRemoveCdDvdDrive(...$event)"
122
+ @show-datastore-child="emits('show-datastore-child', $event)"
123
+ @get-folders-or-files="emits('get-folders-or-files', $event)"
124
+ @send-data-cpu-method="onSendDataCpuMethod"
125
+ @set-invalid-hard-disk="onSetInvalidHardDisk(...$event)"
126
+ @remove-error-by-title="emits('remove-error-by-title', $event)"
127
+ @roll-back-cd-dvd-drive="onRollBackCdDvdDrive"
128
+ @set-invalid-pci-device="onSetInvalidPciDevice(...$event)"
129
+ @get-active-device-child="emits('get-active-device-child', $event)"
130
+ @send-data-memory-method="onSendDataMemoryMethod"
131
+ @send-data-video-card-method="onSendDataVideoCardMethod"
132
+ @send-data-new-network-method="sendDataNewNetworkMethod(...$event)"
133
+ @send-data-pci-devices-method="onSendDataPciDevicesMethod(...$event)"
134
+ @send-data-new-hard-disk-method="onSendDataNewHardDiskMethod(...$event)"
135
+ @send-data-new-cd-dvd-drive-method="sendDataNewCdDvdDriveMethod(...$event)"
136
+ @send-data-new-usb-controller-method="onSendDataNewUsbControllerMethod"
137
+ />
138
+ </template>
139
+
140
+ <script setup lang="ts">
141
+ import type { UI_T_Project } from '~/lib/models/types'
142
+ import type { UI_I_DatastoreTableItem } from '~/lib/models/store/storage/interfaces'
143
+ import type { UI_I_NetworkTableItem } from '~/lib/models/store/network/interfaces'
144
+ import type { UI_I_TablePayload } from '~/lib/models/table/interfaces'
145
+ import type { UI_I_FolderOrFileTreePayload } from '~/lib/models/store/storage/interfaces'
146
+ import type { UI_I_FileTreeNode } from '~/components/lib/models/interfaces'
147
+ import type {
148
+ UI_I_SendDataCpu,
149
+ UI_I_SendDataMemory,
150
+ UI_I_SendDataNewHardDisk,
151
+ UI_I_SendDataNewNetwork,
152
+ UI_I_SendDataVideoCard,
153
+ UI_I_InvalidKeys,
154
+ UI_I_SendDataVirtualHardware,
155
+ UI_I_SendDataNewCdDvdDrive,
156
+ // UI_I_HardDisk,
157
+ UI_I_SendDataNewPciDevice,
158
+ } from '~/components/common/vm/actions/common/customizeHardware/virtualHardware/lib/models/interfaces'
159
+ import type { UI_I_ErrorValidationField } from '~/lib/models/store/interfaces'
160
+ import type {
161
+ UI_T_HardDiskType,
162
+ UI_T_NetworkType,
163
+ UI_T_CdDvdType,
164
+ } from '~/components/common/vm/actions/common/customizeHardware/virtualHardware/lib/models/types'
165
+ import type { UI_I_OptionItem } from '~/components/atoms/lib/models/interfaces'
166
+ import type {
167
+ UI_I_DropdownTreeItem,
168
+ UI_I_DropdownTreeItemChild,
169
+ } from '~/components/atoms/dropdown/tree/lib/models/interfaces'
170
+ import type { UI_I_Localization } from '~/lib/models/interfaces'
171
+ import type {
172
+ API_UI_I_VmEditCpu,
173
+ API_UI_I_VmEditMemory,
174
+ UI_I_MediatedDevice,
175
+ UI_I_PciDevice,
176
+ } from '~/lib/models/store/vm/interfaces'
177
+ import { dropdownItemsFunc } from './lib/config/dropdownItems'
178
+ import type {UI_I_TreeNode} from "~/components/common/recursionTree/lib/models/interfaces";
179
+
180
+ const props = defineProps<{
181
+ storage: UI_I_DatastoreTableItem | null
182
+ cpuModels: UI_I_OptionItem[]
183
+ maxCpus: number
184
+ maxMemory: number
185
+ isEdit: boolean
186
+ isClone: boolean
187
+ errorValidationFields: UI_I_ErrorValidationField<string>[]
188
+ nodes: UI_I_FileTreeNode[]
189
+ files: UI_I_FileTreeNode[]
190
+ networksTable: UI_I_NetworkTableItem[]
191
+ getDatastoreTableFunc: (payload: UI_I_TablePayload) => Promise<void>
192
+ datastore: UI_I_DatastoreTableItem[]
193
+ state?: string | number
194
+ cpu?: API_UI_I_VmEditCpu
195
+ memory?: API_UI_I_VmEditMemory
196
+ vmCpuHelpTextSecond?: string
197
+ hardDisks?: UI_I_SendDataNewHardDisk[] | null
198
+ cdDvdDrives?: UI_I_SendDataNewCdDvdDrive[] | null
199
+ networks?: UI_I_SendDataNewNetwork[] | null
200
+ videoCard?: UI_I_SendDataVideoCard
201
+ usbController?: string
202
+ pciDevices?: UI_I_SendDataNewPciDevice[]
203
+ passthroughDevices?: UI_I_PciDevice[]
204
+ mediatedDevices?: UI_I_MediatedDevice[]
205
+ project: UI_T_Project
206
+ guestMachineType?: UI_I_OptionItem | null
207
+ computeResource?: UI_I_TreeNode | null
208
+ }>()
209
+ const emits = defineEmits<{
210
+ (event: 'send-data', value: UI_I_SendDataVirtualHardware): void
211
+ (event: 'invalid', value: string[]): void
212
+ (event: 'get-storage', value: UI_I_TablePayload): void
213
+ (event: 'get-folders-or-files', value: UI_I_FolderOrFileTreePayload): void
214
+ (event: 'get-active-device-child', value: UI_I_FileTreeNode): void
215
+ (event: 'show-datastore-child', value: UI_I_FileTreeNode): void
216
+ (event: 'remove-error-by-title', value: string): void
217
+ (event: 'get-networks-table', value: UI_I_TablePayload): void
218
+ (event: 'get-pci-devices'): void
219
+ }>()
220
+
221
+ const { $store, $binary }: any = useNuxtApp()
222
+ const isNewView = computed<boolean>(() => $store.getters['main/getIsNewView'])
223
+
224
+ const localization = computed<UI_I_Localization>(() => useLocal())
225
+
226
+ const dropdownItems = computed<UI_I_DropdownTreeItem[]>(() =>
227
+ dropdownItemsFunc(
228
+ localization.value,
229
+ props.state,
230
+ props.passthroughDevices,
231
+ props.mediatedDevices
232
+ )
233
+ )
234
+
235
+ const hardDisksIndex = ref<number[]>([0])
236
+ const hardDisksType = ref<UI_T_HardDiskType[]>(['new'])
237
+ const hardDisksLocal = ref<UI_I_SendDataNewHardDisk[]>([
238
+ {
239
+ create: true,
240
+ size: 90,
241
+ source: '',
242
+ boot_order: -1,
243
+ },
244
+ ])
245
+ watch(
246
+ () => props.hardDisks,
247
+ (newValue) => {
248
+ if ((!props.isEdit && !props.isClone) || !newValue) return
249
+
250
+ const count = newValue?.length || 0
251
+ hardDisksIndex.value = [...Array(count).keys()]
252
+ hardDisksLocal.value = newValue
253
+ if (props.isEdit) {
254
+ hardDisksType.value = Array(count).fill('edit')
255
+ } else if (props.isClone) {
256
+ hardDisksType.value = Array(count).fill('clone')
257
+ hardDisksLocal.value = newValue.map((hardDisk) => {
258
+ hardDisk.create = true
259
+ return hardDisk
260
+ })
261
+ }
262
+ },
263
+ { immediate: true }
264
+ )
265
+
266
+ const addHardDisk = (
267
+ create = true,
268
+ size = 90,
269
+ source = '',
270
+ type: UI_T_HardDiskType = 'new',
271
+ provisioned_type?: number // При добавлении существующей
272
+ ): void => {
273
+ const newIndex = (hardDisksIndex.value.at(-1) ?? -1) + 1
274
+ hardDisksIndex.value.push(newIndex)
275
+ hardDisksType.value.push(type)
276
+
277
+ let provisionType = 'thick'
278
+ if (provisioned_type === 1) provisionType = 'thin'
279
+
280
+ hardDisksLocal.value.push({
281
+ create,
282
+ size,
283
+ source,
284
+ attach: true,
285
+ boot_order: 0, // Убираем галочку
286
+ provision_type: provisionType,
287
+ })
288
+ sendData()
289
+ }
290
+ const onAddExistHardDisk = (file: UI_I_FileTreeNode): void => {
291
+ addHardDisk(
292
+ false,
293
+ $binary.bToGb(file.size),
294
+ file.path,
295
+ 'exist',
296
+ file.provisioned_type
297
+ )
298
+ }
299
+ const onRemoveHardDisk = (
300
+ index: number,
301
+ hardDisk: UI_I_SendDataNewHardDisk
302
+ ): void => {
303
+ const removeIndex = hardDisksIndex.value.indexOf(index)
304
+
305
+ if (!hardDisk.create && !hardDisk.attach) {
306
+ hardDisksType.value = hardDisksType.value.map((item, key) => {
307
+ if (key === removeIndex) return 'removed'
308
+ return item
309
+ })
310
+ sendData()
311
+ return
312
+ }
313
+
314
+ hardDisksIndex.value = hardDisksIndex.value.filter((item) => item !== index)
315
+ hardDisksType.value = hardDisksType.value.filter(
316
+ (_item, key) => key !== removeIndex
317
+ )
318
+
319
+ hardDisksLocal.value = hardDisksLocal.value.filter(
320
+ (_hardDisk, key: number) => {
321
+ return removeIndex !== key
322
+ }
323
+ )
324
+
325
+ delete newHardDiskInvalidKeys.value[index]
326
+ delete sendDataNewHardDisk.value[index]
327
+ sendData()
328
+ }
329
+ const onRollBackHardDisk = (index: number): void => {
330
+ const removeIndex = hardDisksIndex.value.indexOf(index)
331
+ hardDisksType.value = hardDisksType.value.map((item, key) => {
332
+ if (key === removeIndex) return 'edit'
333
+ return item
334
+ })
335
+ }
336
+
337
+ const defaultNetwork = {
338
+ network: '',
339
+ net_bridge: '',
340
+ mac: '',
341
+ target: '',
342
+ model: '',
343
+ boot_order: -1,
344
+ }
345
+ const networksLocal = ref<UI_I_SendDataNewNetwork[]>([
346
+ useDeepCopy(defaultNetwork),
347
+ ])
348
+ const networksType = ref<UI_T_NetworkType[]>(['new'])
349
+ const networksIndex = ref<number[]>([0])
350
+ watch(
351
+ () => props.networks,
352
+ (newValue) => {
353
+ if ((!props.isEdit && !props.isClone) || !newValue) return
354
+
355
+ // networksLocal.value = newValue
356
+ // networksType.value = Array(newValue.length).fill('edit')
357
+ const count = newValue?.length || 0
358
+ networksIndex.value = [...Array(count).keys()]
359
+ networksLocal.value = newValue
360
+ if (props.isEdit) {
361
+ networksType.value = Array(count).fill('edit')
362
+ } else if (props.isClone) {
363
+ networksType.value = Array(count).fill('clone')
364
+ }
365
+ },
366
+ { immediate: true }
367
+ )
368
+ const addNetwork = (): void => {
369
+ const index = (networksIndex.value.at(-1) ?? -1) + 1
370
+ networksIndex.value.push(index)
371
+ networksType.value.push('new')
372
+
373
+ networksLocal.value.push({
374
+ ...useDeepCopy(defaultNetwork),
375
+ boot_order: 0, // Убираем галочку
376
+ })
377
+ }
378
+ const onRemoveNetwork = (index: number): void => {
379
+ const removeIndex = networksIndex.value.indexOf(index)
380
+ networksIndex.value = networksIndex.value.filter((item) => item !== index)
381
+ networksType.value = networksType.value.filter(
382
+ (_item, key) => key !== removeIndex
383
+ )
384
+ networksLocal.value = networksLocal.value.filter(
385
+ (_network, key: number) => removeIndex !== key
386
+ )
387
+
388
+ delete newNetworkInvalidKeys.value[index]
389
+ delete sendDataNewNetwork.value[index]
390
+ sendData()
391
+ }
392
+
393
+ const defaultCdDvdDriver: UI_I_SendDataNewCdDvdDrive = {
394
+ create: false,
395
+ attach: false,
396
+ source: '',
397
+ bus: '',
398
+ device_type: 'cdrom',
399
+ boot_order: -1,
400
+ }
401
+ const cdDvdDrivesLocal = ref<UI_I_SendDataNewCdDvdDrive[]>([
402
+ useDeepCopy(defaultCdDvdDriver),
403
+ ])
404
+ const cdDvdDrivesIndex = ref<number[]>([0])
405
+ const cdDvdDrivesType = ref<UI_T_CdDvdType[]>(['new'])
406
+ watch(
407
+ () => props.cdDvdDrives,
408
+ (newValue) => {
409
+ if ((!props.isEdit && !props.isClone) || !newValue) return
410
+
411
+ // cdDvdDrivesLocal.value = newValue
412
+ // cdDvdDrivesType.value = Array(newValue.length).fill('edit')
413
+ const count = newValue?.length || 0
414
+ cdDvdDrivesIndex.value = [...Array(count).keys()]
415
+ cdDvdDrivesLocal.value = newValue
416
+ if (props.isEdit) {
417
+ cdDvdDrivesType.value = Array(count).fill('edit')
418
+ } else if (props.isClone) {
419
+ cdDvdDrivesType.value = Array(count).fill('new')
420
+ }
421
+ },
422
+ { immediate: true }
423
+ )
424
+ const addCdDvdDrive = (): void => {
425
+ const value = (cdDvdDrivesIndex.value.at(-1) ?? -1) + 1
426
+ cdDvdDrivesIndex.value.push(value)
427
+ cdDvdDrivesType.value.push('new')
428
+ cdDvdDrivesLocal.value.push({
429
+ ...useDeepCopy(defaultCdDvdDriver),
430
+ attach: true,
431
+ boot_order: 0, // Убираем галочку
432
+ })
433
+ }
434
+ const onRemoveCdDvdDrive = (
435
+ index: number,
436
+ cdDvdDrive: UI_I_SendDataNewCdDvdDrive
437
+ ): void => {
438
+ const removeIndex = cdDvdDrivesIndex.value.indexOf(index)
439
+
440
+ // if (!cdDvdDrive.create && !cdDvdDrive.attach) {
441
+ if (cdDvdDrivesType.value[index] === 'edit' && !cdDvdDrive.attach) {
442
+ cdDvdDrivesType.value = cdDvdDrivesType.value.map((item, key) => {
443
+ if (key === removeIndex) return 'removed'
444
+ return item
445
+ })
446
+ sendData()
447
+ return
448
+ }
449
+
450
+ cdDvdDrivesIndex.value = cdDvdDrivesIndex.value.filter(
451
+ (cdDvdDrive) => cdDvdDrive !== index
452
+ )
453
+ cdDvdDrivesType.value = cdDvdDrivesType.value.filter(
454
+ (_item, key) => key !== index
455
+ )
456
+ cdDvdDrivesLocal.value = cdDvdDrivesLocal.value.filter(
457
+ (_cdDvdDrive, key: number) => removeIndex !== key
458
+ )
459
+
460
+ delete sendDataNewCdDvdDrive.value[index]
461
+ sendData()
462
+ }
463
+ const onRollBackCdDvdDrive = (index: number): void => {
464
+ const removeIndex = cdDvdDrivesIndex.value.indexOf(index)
465
+ cdDvdDrivesType.value = cdDvdDrivesType.value.map((item, key) => {
466
+ if (key === removeIndex) return 'edit'
467
+ return item
468
+ })
469
+ }
470
+
471
+ const defaultPciDevice: UI_I_SendDataNewPciDevice = {
472
+ address: '',
473
+ vendor_name: '',
474
+ class_name: '',
475
+ device_name: '',
476
+ }
477
+ const pciDevicesIndex = ref<number[]>([0])
478
+ const pciDevicesType = ref<('new' | 'edit' | 'removed')[]>(['new'])
479
+ const pciDevicesLocal = ref<UI_I_SendDataNewPciDevice[]>([])
480
+ watch(
481
+ () => props.pciDevices,
482
+ (newValue) => {
483
+ if ((!props.isEdit && !props.isClone) || !newValue) return
484
+
485
+ const count = newValue?.length || 0
486
+ pciDevicesIndex.value = [...Array(count).keys()]
487
+ pciDevicesLocal.value = newValue || []
488
+ if (props.isEdit) {
489
+ pciDevicesType.value = Array(count).fill('edit')
490
+ } else if (props.isClone) {
491
+ pciDevicesType.value = Array(count).fill('new')
492
+ }
493
+ },
494
+ { immediate: true }
495
+ )
496
+
497
+ const addPciDevice = (): void => {
498
+ const newIndex = (pciDevicesIndex.value.at(-1) ?? -1) + 1
499
+ pciDevicesIndex.value.push(newIndex)
500
+ pciDevicesType.value.push('new')
501
+
502
+ pciDevicesLocal.value.push(useDeepCopy(defaultPciDevice))
503
+ }
504
+ const onRemovePciDevice = (index: number): void => {
505
+ const removeIndex = pciDevicesIndex.value.indexOf(index)
506
+ pciDevicesIndex.value = pciDevicesIndex.value.filter((item) => item !== index)
507
+ pciDevicesType.value = pciDevicesType.value.filter(
508
+ (_item, key) => key !== removeIndex
509
+ )
510
+
511
+ pciDevicesLocal.value = pciDevicesLocal.value.filter(
512
+ (_pciDevice, key: number) => {
513
+ return removeIndex !== key
514
+ }
515
+ )
516
+
517
+ delete newPciDeviceInvalidKeys.value[index]
518
+ delete sendDataNewPciDevices.value[index]
519
+ sendData()
520
+ }
521
+
522
+ const isShowFileModal = ref<boolean>(false)
523
+ const onAddDevice = (item: UI_I_DropdownTreeItemChild): void => {
524
+ switch (item.value) {
525
+ case 1:
526
+ addHardDisk()
527
+ break
528
+ case 2:
529
+ isShowFileModal.value = true
530
+ break
531
+ case 5:
532
+ addCdDvdDrive()
533
+ break
534
+ case 10:
535
+ addPciDevice()
536
+ break
537
+ case 14:
538
+ addNetwork()
539
+ break
540
+ }
541
+ }
542
+
543
+ const cpuInvalid = ref<boolean>(false)
544
+ const sendDataCpu = ref<UI_I_SendDataCpu | null>(null)
545
+ const onSendDataCpuMethod = (data: UI_I_SendDataCpu): void => {
546
+ sendDataCpu.value = data
547
+ sendData()
548
+ }
549
+ const sendDataMemory = ref<UI_I_SendDataMemory | null>(null)
550
+ const onSendDataMemoryMethod = (data: UI_I_SendDataMemory): void => {
551
+ sendDataMemory.value = data
552
+ sendData()
553
+ }
554
+ const sendDataNewHardDisk = ref<UI_I_SendDataNewHardDisk[]>([])
555
+ const onSendDataNewHardDiskMethod = (
556
+ data: UI_I_SendDataNewHardDisk,
557
+ index: number
558
+ ): void => {
559
+ sendDataNewHardDisk.value[index] = data
560
+ sendData()
561
+ }
562
+ const sendDataNewNetwork = ref<UI_I_SendDataNewNetwork[]>([])
563
+ const sendDataNewNetworkMethod = (
564
+ data: UI_I_SendDataNewNetwork,
565
+ index: number
566
+ ): void => {
567
+ sendDataNewNetwork.value[index] = data
568
+ sendData()
569
+ }
570
+ const sendDataNewCdDvdDrive = ref<UI_I_SendDataNewCdDvdDrive[]>([])
571
+ const sendDataNewCdDvdDriveMethod = (
572
+ data: UI_I_SendDataNewCdDvdDrive,
573
+ index: number
574
+ ): void => {
575
+ sendDataNewCdDvdDrive.value[index] = data
576
+ sendData()
577
+ }
578
+ const sendDataNewUsbController = ref<string | null>(null)
579
+ const onSendDataNewUsbControllerMethod = (data: string): void => {
580
+ sendDataNewUsbController.value = data
581
+ sendData()
582
+ }
583
+ const sendDataNewPciDevices = ref<UI_I_SendDataNewPciDevice[]>([])
584
+ const onSendDataPciDevicesMethod = (
585
+ data: UI_I_SendDataNewPciDevice,
586
+ index: number
587
+ ): void => {
588
+ sendDataNewPciDevices.value[index] = data
589
+ sendData()
590
+ }
591
+ const sendDataVideoCard = ref<UI_I_SendDataVideoCard | null>(null)
592
+ const onSendDataVideoCardMethod = (data: UI_I_SendDataVideoCard): void => {
593
+ sendDataVideoCard.value = data
594
+ sendData()
595
+ }
596
+
597
+ const sendData = (): void => {
598
+ const cpu = sendDataCpu.value
599
+ const memory = sendDataMemory.value
600
+ const hardDisks = sendDataNewHardDisk.value.flat(2)
601
+ const networks = sendDataNewNetwork.value.flat(2)
602
+ const cdDvdDrives = sendDataNewCdDvdDrive.value.flat(2)
603
+ const pciDevices = sendDataNewPciDevices.value.flat()
604
+ const usbController = sendDataNewUsbController.value
605
+ const videoCard = sendDataVideoCard.value
606
+
607
+ const sendData: UI_I_SendDataVirtualHardware = {
608
+ cpu,
609
+ memory,
610
+ usbController,
611
+ pciDevices,
612
+ networks,
613
+ hardDisks,
614
+ cdDvdDrives,
615
+ videoCard,
616
+ }
617
+ emits('send-data', sendData)
618
+ }
619
+
620
+ const onSetInvalidHardDisk = (invalid: boolean, index: number): void => {
621
+ newHardDiskInvalidKeys.value[index] = invalid
622
+ }
623
+
624
+ const onSetInvalidNetwork = (invalid: boolean, key: number): void => {
625
+ newNetworkInvalidKeys.value[key] = invalid
626
+ }
627
+
628
+ const onSetInvalidPciDevice = (invalid: boolean, key: number): void => {
629
+ newPciDeviceInvalidKeys.value[key] = invalid
630
+ }
631
+
632
+ const memoryInvalid = ref<boolean>(false)
633
+ const videoCardInvalid = ref<boolean>(false)
634
+ const newHardDiskInvalidKeys = ref<UI_I_InvalidKeys>({})
635
+ const newNetworkInvalidKeys = ref<UI_I_InvalidKeys>({})
636
+ const newPciDeviceInvalidKeys = ref<UI_I_InvalidKeys>({})
637
+
638
+ watch(
639
+ [
640
+ cpuInvalid,
641
+ memoryInvalid,
642
+ newHardDiskInvalidKeys,
643
+ newNetworkInvalidKeys,
644
+ newPciDeviceInvalidKeys,
645
+ videoCardInvalid,
646
+ ],
647
+ () => {
648
+ const cpu = cpuInvalid.value ? localization.value.common.cpu : ''
649
+ const memory = memoryInvalid.value ? localization.value.common.memory : ''
650
+ const videoCard = videoCardInvalid.value
651
+ ? localization.value.common.videoCard
652
+ : ''
653
+ let newHardDisk = ''
654
+ Object.keys(newHardDiskInvalidKeys.value).forEach((key) => {
655
+ if (!newHardDiskInvalidKeys.value[+key]) {
656
+ return
657
+ }
658
+
659
+ newHardDisk +=
660
+ (newHardDisk ? ', ' : '') +
661
+ localization.value.common.newHardDisk +
662
+ ' ' +
663
+ (+key + 1)
664
+ })
665
+ let newNetwork = ''
666
+ Object.keys(newNetworkInvalidKeys.value).forEach((key) => {
667
+ if (!newNetworkInvalidKeys.value[+key]) {
668
+ return
669
+ }
670
+
671
+ newNetwork +=
672
+ (newNetwork ? ', ' : '') +
673
+ localization.value.common.newNetwork +
674
+ ' ' +
675
+ (+key + 1)
676
+ })
677
+ // let pciDevice = ''
678
+ // Object.keys(newPciDeviceInvalidKeys.value).forEach((key) => {
679
+ // if (!newPciDeviceInvalidKeys.value[+key]) {
680
+ // return
681
+ // }
682
+ //
683
+ // pciDevice +=
684
+ // (pciDevice ? ', ' : '') +
685
+ // localization.value.common.pciDevice +
686
+ // ' ' +
687
+ // (+key + 1)
688
+ // })
689
+
690
+ emits('invalid', [cpu, memory, newHardDisk, newNetwork, videoCard])
691
+ },
692
+ { deep: true }
693
+ )
694
+
695
+ emits('get-pci-devices')
696
+ </script>
697
+
698
+ <style scoped lang="scss"></style>