bfg-common 1.4.873 → 1.4.874

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 (183) 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/AdapterItem.vue +7 -2
  31. package/components/common/diagramMain/adapter/AdapterItems.vue +61 -61
  32. package/components/common/diagramMain/lib/config/initial.ts +50 -50
  33. package/components/common/diagramMain/lib/models/interfaces.ts +8 -8
  34. package/components/common/diagramMain/lib/models/types.ts +21 -21
  35. package/components/common/diagramMain/lib/utils/utils.ts +331 -331
  36. package/components/common/diagramMain/modals/ManagePhysicalAdaptersModal.vue +330 -330
  37. package/components/common/diagramMain/modals/editSettings/ConfirmTeamingSettingsModal.vue +40 -40
  38. package/components/common/diagramMain/modals/editSettings/EditSettings.vue +497 -497
  39. package/components/common/diagramMain/modals/editSettings/EditSettingsModal.vue +812 -812
  40. package/components/common/diagramMain/modals/editSettings/tabs/NetworkProperties.vue +214 -214
  41. package/components/common/diagramMain/modals/editSettings/tabs/Security.vue +189 -189
  42. package/components/common/diagramMain/modals/editSettings/tabs/SwitchProperties.vue +163 -163
  43. package/components/common/diagramMain/modals/editSettings/tabs/TeamingFailover.vue +175 -175
  44. package/components/common/diagramMain/modals/editSettings/tabs/port/IpvFourSettings.vue +346 -346
  45. package/components/common/diagramMain/modals/editSettings/tabs/port/PortProperties.vue +205 -205
  46. package/components/common/diagramMain/modals/lib/config/diagramConfig.ts +23 -23
  47. package/components/common/diagramMain/modals/lib/config/initial.ts +180 -180
  48. package/components/common/diagramMain/modals/lib/config/vmKernelAdapter.ts +90 -90
  49. package/components/common/diagramMain/modals/lib/mappers/mappers.ts +87 -87
  50. package/components/common/diagramMain/modals/lib/utils/index.ts +24 -24
  51. package/components/common/diagramMain/modals/migrateVmkernelAdapter/lib/config/steps.ts +114 -114
  52. package/components/common/diagramMain/modals/migrateVmkernelAdapter/steps/ConnectionSettings.vue +169 -169
  53. package/components/common/diagramMain/modals/migrateVmkernelAdapter/steps/SelectVmkernelAdapter.vue +159 -159
  54. package/components/common/diagramMain/modals/migrateVmkernelAdapter/validations/common.ts +14 -14
  55. package/components/common/diagramMain/modals/migrateVmkernelAdapter/validations/connectionSettings.ts +137 -137
  56. package/components/common/diagramMain/modals/migrateVmkernelAdapter/validations/selectVmkernelAdapter.ts +52 -52
  57. package/components/common/diagramMain/modals/migrateVmkernelAdapter/validations/validations.ts +19 -19
  58. package/components/common/diagramMain/port/Ports.vue +47 -47
  59. package/components/common/graph/Graph.vue +104 -104
  60. package/components/common/layout/theHeader/helpMenu/About.vue +82 -82
  61. package/components/common/layout/theHeader/helpMenu/aboutNew/AboutNew.vue +103 -103
  62. package/components/common/modals/unsavedChanges/UnsavedChanges.vue +56 -56
  63. package/components/common/monitor/overview/OverviewNew.vue +142 -142
  64. package/components/common/monitor/overview/OverviewOld.vue +139 -139
  65. package/components/common/monitor/overview/filters/Filters.vue +166 -166
  66. package/components/common/monitor/overview/filters/FiltersNew.vue +172 -172
  67. package/components/common/monitor/overview/filters/FiltersOld.vue +151 -151
  68. package/components/common/monitor/overview/filters/customIntervalModal/CustomIntervalModal.vue +175 -175
  69. package/components/common/monitor/overview/filters/customIntervalModal/CustomIntervalModalOld.vue +161 -161
  70. package/components/common/pages/home/StatusContent.vue +49 -49
  71. package/components/common/pages/home/headline/Headline.vue +45 -45
  72. package/components/common/pages/home/headline/HeadlineOld.vue +42 -42
  73. package/components/common/pages/home/lib/models/interfaces.ts +48 -48
  74. package/components/common/pages/home/widgets/Widgets.vue +49 -49
  75. package/components/common/pages/home/widgets/WidgetsNew.vue +86 -86
  76. package/components/common/pages/home/widgets/WidgetsOld.vue +34 -34
  77. package/components/common/pages/home/widgets/hosts/Hosts.vue +27 -27
  78. package/components/common/pages/home/widgets/hosts/lib/config/items.ts +23 -23
  79. package/components/common/pages/home/widgets/vms/Vms.vue +26 -26
  80. package/components/common/pages/home/widgets/vms/VmsOld.vue +35 -35
  81. package/components/common/pages/home/widgets/vms/lib/config/items.ts +19 -19
  82. package/components/common/pages/packages/Packages.vue +208 -208
  83. package/components/common/recursionTree/RecursionTree.vue +223 -223
  84. package/components/common/select/button/ButtonDropdown.vue +108 -108
  85. package/components/common/spiceConsole/Drawer.vue +370 -370
  86. package/components/common/spiceConsole/lib/models/interfaces.ts +5 -5
  87. package/components/common/split/horizontal/HorizontalNew.vue +376 -376
  88. package/components/common/split/horizontal/HorizontalOld.vue +337 -337
  89. package/components/common/split/vertical/Vertical.vue +160 -160
  90. package/components/common/vm/actions/add/Add.vue +622 -622
  91. package/components/common/vm/actions/clone/Clone.vue +639 -639
  92. package/components/common/vm/actions/clone/lib/config/steps.ts +129 -129
  93. package/components/common/vm/actions/clone/toTemplate/ToTemplate.vue +634 -634
  94. package/components/common/vm/actions/clone/toTemplate/lib/config/steps.ts +116 -116
  95. package/components/common/vm/actions/common/customizeHardware/CustomizeHardware.vue +275 -275
  96. package/components/common/vm/actions/common/customizeHardware/CustomizeHardwareNew.vue +274 -274
  97. package/components/common/vm/actions/common/customizeHardware/CustomizeHardwareOld.vue +177 -177
  98. package/components/common/vm/actions/common/customizeHardware/virtualHardware/VirtualHardware.vue +698 -698
  99. package/components/common/vm/actions/common/customizeHardware/virtualHardware/VirtualHardwareNew.vue +410 -410
  100. package/components/common/vm/actions/common/customizeHardware/virtualHardware/VirtualHardwareOld.vue +319 -319
  101. package/components/common/vm/actions/common/customizeHardware/virtualHardware/browseView/BrowseView.vue +219 -219
  102. package/components/common/vm/actions/common/customizeHardware/virtualHardware/bus/Bus.vue +99 -99
  103. package/components/common/vm/actions/common/customizeHardware/virtualHardware/bus/BusNew.vue +117 -117
  104. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/CdDvdDrive.vue +232 -232
  105. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/CdDvdDriveNew.vue +164 -164
  106. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/CdDvdDriveOld.vue +168 -168
  107. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/Media.vue +25 -25
  108. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/MediaNew.vue +70 -70
  109. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/MediaOld.vue +50 -50
  110. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/Cpu.vue +338 -338
  111. package/components/common/vm/actions/common/customizeHardware/virtualHardware/limit/Limit.vue +220 -220
  112. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/NewHardDisk.vue +368 -368
  113. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/NewHardDiskNew.vue +232 -232
  114. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/NewHardDiskOld.vue +250 -250
  115. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/mode/ModeOld.vue +56 -56
  116. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/sharing/SharingNew.vue +44 -44
  117. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/NewNetworkNew.vue +124 -124
  118. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/location/LocationOld.vue +134 -134
  119. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/location/new/New.vue +63 -63
  120. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/location/new/table/lib/config/config.ts +95 -95
  121. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/macAddress/MacAddress.vue +119 -119
  122. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/macAddress/MacAddressNew.vue +69 -69
  123. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/macAddress/MacAddressOld.vue +83 -83
  124. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/NewPciDevice.vue +205 -205
  125. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/directPathIo/DirectPathIoNew.vue +66 -66
  126. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/directPathIo/DirectPathIoOld.vue +62 -62
  127. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/dynamicDirectPathIo/DynamicDirectPathIo.vue +31 -31
  128. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/dynamicDirectPathIo/DynamicDirectPathIoNew.vue +84 -84
  129. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/dynamicDirectPathIo/DynamicDirectPathIoOld.vue +76 -76
  130. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/Note.vue +15 -15
  131. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/NoteNew.vue +42 -42
  132. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/NoteOld.vue +30 -30
  133. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/nvidiaGrid/NvidiaGrid.vue +41 -41
  134. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/nvidiaGrid/NvidiaGridNew.vue +81 -81
  135. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/nvidiaGrid/NvidiaGridOld.vue +84 -84
  136. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newUsbController/NewUsbControllerNew.vue +56 -56
  137. package/components/common/vm/actions/common/customizeHardware/virtualHardware/other/Other.vue +16 -16
  138. package/components/common/vm/actions/common/customizeHardware/virtualHardware/other/OtherNew.vue +30 -30
  139. package/components/common/vm/actions/common/customizeHardware/virtualHardware/videoCard/VideoCardNew.vue +104 -104
  140. package/components/common/vm/actions/common/customizeHardware/virtualHardware/videoCard/VideoCardOld.vue +112 -112
  141. package/components/common/vm/actions/common/customizeHardware/virtualHardware/videoCard/totalVideoMemory/TotalVideoMemoryNew.vue +54 -54
  142. package/components/common/vm/actions/common/customizeHardware/vmoptions/Vmoptions.vue +145 -145
  143. package/components/common/vm/actions/common/customizeHardware/vmoptions/VmoptionsNew.vue +102 -102
  144. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/BootOptionsNew.vue +75 -75
  145. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/delay/Delay.vue +26 -26
  146. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/firmware/Firmware.vue +57 -57
  147. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/firmware/FirmwareNew.vue +42 -42
  148. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/menu/MenuNew.vue +25 -25
  149. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/order/Order.vue +171 -171
  150. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/order/OrderNew.vue +50 -50
  151. package/components/common/vm/actions/common/customizeHardware/vmoptions/generalOptions/GeneralOptionsNew.vue +141 -141
  152. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/New.vue +140 -140
  153. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/copyPaste/CopyPasteNew.vue +30 -30
  154. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/fileTransfer/FileTransferNew.vue +30 -30
  155. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/folderSharing/FolderSharingNew.vue +30 -30
  156. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/keymap/Keymap.vue +32 -32
  157. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/keymap/KeymapNew.vue +39 -39
  158. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/password/Password.vue +103 -103
  159. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/password/PasswordNew.vue +102 -102
  160. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/password/PasswordOld.vue +94 -94
  161. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirection.vue +28 -28
  162. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirectionNew.vue +38 -38
  163. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirectionOld.vue +44 -44
  164. package/components/common/vm/actions/common/select/storage/Storage.vue +130 -130
  165. package/components/common/vm/actions/common/select/storage/StorageOld.vue +129 -129
  166. package/components/common/vm/actions/editSettings/new/Skeleton.vue +88 -88
  167. package/components/common/wizards/datastore/add/lib/config/steps.ts +138 -138
  168. package/components/common/wizards/vm/migrate/Migrate.vue +302 -302
  169. package/components/common/wizards/vm/migrate/lib/config/constructDataReady.ts +220 -220
  170. package/components/common/wizards/vm/migrate/select/network/Network.vue +103 -103
  171. package/components/common/wizards/vm/migrate/select/network/table/network/Network.vue +150 -150
  172. package/components/common/wizards/vm/migrate/select/network/table/network/lib/config/advancedTable.ts +91 -91
  173. package/components/common/wizards/vm/migrate/select/priority/Priority.vue +43 -43
  174. package/composables/productNameLocal.ts +30 -30
  175. package/composables/useAppVersion.ts +21 -21
  176. package/package.json +1 -1
  177. package/plugins/date.ts +233 -233
  178. package/plugins/recursion.ts +311 -311
  179. package/public/spice-console/lib/images/bitmap.js +203 -203
  180. package/public/spice-console/network/spicechannel.js +383 -383
  181. package/store/main/mutations.ts +7 -7
  182. package/store/main/state.ts +7 -7
  183. 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>