bfg-common 1.4.882 → 1.4.884

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 (191) hide show
  1. package/assets/localization/local_be.json +1 -1
  2. package/assets/localization/local_en.json +7 -7
  3. package/assets/localization/local_hy.json +1 -1
  4. package/assets/localization/local_kk.json +1 -1
  5. package/assets/localization/local_ru.json +1 -1
  6. package/assets/localization/local_zh.json +1 -1
  7. package/assets/scss/common/normalize.scss +361 -361
  8. package/components/atoms/TheIcon3.vue +50 -50
  9. package/components/atoms/autocomplete/Autocomplete.vue +301 -301
  10. package/components/atoms/collapse/CollapseNav.vue +165 -165
  11. package/components/atoms/dropdown/dropdown/Dropdown.vue +168 -168
  12. package/components/atoms/modal/bySteps/BySteps.vue +253 -253
  13. package/components/atoms/stack/StackBlock.vue +185 -185
  14. package/components/atoms/table/dataGrid/DataGrid.vue +1704 -1704
  15. package/components/atoms/table/dataGrid/DataGridColumnSwitch.vue +222 -222
  16. package/components/atoms/table/dataGrid/lib/config/settingsTable.ts +94 -94
  17. package/components/atoms/table/dataGrid/lib/utils/export.ts +16 -16
  18. package/components/atoms/tabs/VerticalTabs.vue +105 -105
  19. package/components/common/browse/BrowseNew.vue +237 -237
  20. package/components/common/browse/BrowseOld.vue +217 -217
  21. package/components/common/browse/blocks/contents/Files.vue +37 -37
  22. package/components/common/browse/blocks/contents/FilesOld.vue +72 -72
  23. package/components/common/browse/blocks/contents/filesNew/FilesNew.vue +96 -96
  24. package/components/common/browse/blocks/contents/filesNew/Skeleton.vue +18 -18
  25. package/components/common/chartOptionsModal/counters/timespan/form/Form.vue +102 -92
  26. package/components/common/chartOptionsModal/counters/timespan/form/FormNew.vue +39 -18
  27. package/components/common/context/Context.vue +111 -111
  28. package/components/common/context/lib/models/interfaces.ts +30 -30
  29. package/components/common/context/recursion/Recursion.vue +87 -87
  30. package/components/common/context/recursion/RecursionOld.vue +227 -227
  31. package/components/common/details/DetailsItem.vue +109 -109
  32. package/components/common/graph/Graph.vue +104 -104
  33. package/components/common/graph/GraphNew.vue +4 -2
  34. package/components/common/layout/theHeader/helpMenu/About.vue +82 -82
  35. package/components/common/layout/theHeader/helpMenu/aboutNew/AboutNew.vue +103 -103
  36. package/components/common/layout/theHeader/userMenu/modals/preferences/view/ViewOld.vue +112 -112
  37. package/components/common/mainNavigationPanel/MainNavigationPanelNew.vue +335 -335
  38. package/components/common/mainNavigationPanel/MainNavigationPanelOld.vue +310 -310
  39. package/components/common/modals/unsavedChanges/UnsavedChanges.vue +56 -56
  40. package/components/common/monitor/advanced/Advanced.vue +2 -0
  41. package/components/common/monitor/advanced/AdvancedNew.vue +28 -16
  42. package/components/common/monitor/advanced/graphView/GraphView.vue +0 -1
  43. package/components/common/monitor/advanced/graphView/GraphViewNew.vue +5 -4
  44. package/components/common/monitor/advanced/table/tableNew/TableNew.vue +8 -1
  45. package/components/common/monitor/advanced/table/tableNew/lib/config/options.ts +2 -2
  46. package/components/common/monitor/advanced/tools/Tools.vue +123 -121
  47. package/components/common/monitor/advanced/tools/ToolsNew.vue +9 -0
  48. package/components/common/monitor/advanced/tools/chartOptionsModal/ChartOptionsModal.vue +34 -0
  49. package/components/common/monitor/advanced/tools/chartOptionsModal/ChartOptionsModalNew.vue +17 -5
  50. package/components/common/monitor/advanced/tools/chartOptionsModal/NotificationNew.vue +2 -0
  51. package/components/common/monitor/advanced/tools/chartOptionsModal/actions/ActionsNew.vue +38 -12
  52. package/components/common/monitor/advanced/tools/chartOptionsModal/actions/lib/utils/optionsActions.ts +1 -1
  53. package/components/common/monitor/advanced/tools/chartOptionsModal/counters/Counters.vue +76 -66
  54. package/components/common/monitor/advanced/tools/chartOptionsModal/counters/CountersNew.vue +43 -2
  55. package/components/common/monitor/advanced/tools/chartOptionsModal/counters/table/lib/config/utils.ts +1040 -1040
  56. package/components/common/monitor/advanced/tools/chartOptionsModal/counters/table/tableNew/TableNew.vue +2 -0
  57. package/components/common/monitor/advanced/tools/chartOptionsModal/counters/timespan/Timespan.vue +10 -0
  58. package/components/common/monitor/advanced/tools/chartOptionsModal/counters/timespan/TimespanNew.vue +43 -14
  59. package/components/common/monitor/advanced/tools/chartOptionsModal/counters/timespan/object/objectNew/ObjectNew.vue +6 -0
  60. package/components/common/monitor/advanced/tools/chartOptionsModal/metrics/Metrics.vue +1 -1
  61. package/components/common/monitor/advanced/tools/chartOptionsModal/metrics/MetricsNew.vue +143 -0
  62. package/components/common/monitor/overview/OverviewNew.vue +142 -142
  63. package/components/common/monitor/overview/OverviewOld.vue +139 -139
  64. package/components/common/monitor/overview/filters/Filters.vue +166 -166
  65. package/components/common/monitor/overview/filters/FiltersNew.vue +172 -172
  66. package/components/common/monitor/overview/filters/FiltersOld.vue +151 -151
  67. package/components/common/monitor/overview/filters/customIntervalModal/CustomIntervalModal.vue +175 -175
  68. package/components/common/monitor/overview/filters/customIntervalModal/CustomIntervalModalOld.vue +161 -161
  69. package/components/common/pages/home/StatusContent.vue +49 -49
  70. package/components/common/pages/home/headline/Headline.vue +45 -45
  71. package/components/common/pages/home/headline/HeadlineOld.vue +42 -42
  72. package/components/common/pages/home/lib/models/interfaces.ts +48 -48
  73. package/components/common/pages/home/widgets/Widgets.vue +49 -49
  74. package/components/common/pages/home/widgets/WidgetsNew.vue +86 -86
  75. package/components/common/pages/home/widgets/WidgetsOld.vue +34 -34
  76. package/components/common/pages/home/widgets/hosts/Hosts.vue +27 -27
  77. package/components/common/pages/home/widgets/hosts/lib/config/items.ts +23 -23
  78. package/components/common/pages/home/widgets/vms/Vms.vue +26 -26
  79. package/components/common/pages/home/widgets/vms/VmsOld.vue +35 -35
  80. package/components/common/pages/home/widgets/vms/lib/config/items.ts +19 -19
  81. package/components/common/pages/packages/Packages.vue +208 -208
  82. package/components/common/pages/shortcuts/block/BlockNew.vue +96 -96
  83. package/components/common/pages/shortcuts/block/BlockOld.vue +68 -68
  84. package/components/common/portlets/customAttributes/Portlet.vue +667 -667
  85. package/components/common/portlets/tag/Portlet.vue +433 -433
  86. package/components/common/recursionTree/RecursionTree.vue +223 -223
  87. package/components/common/select/button/ButtonDropdown.vue +108 -108
  88. package/components/common/spiceConsole/Drawer.vue +370 -370
  89. package/components/common/spiceConsole/lib/models/interfaces.ts +5 -5
  90. package/components/common/split/horizontal/HorizontalNew.vue +376 -376
  91. package/components/common/split/horizontal/HorizontalOld.vue +337 -337
  92. package/components/common/split/vertical/Vertical.vue +160 -160
  93. package/components/common/vm/actions/add/Add.vue +622 -622
  94. package/components/common/vm/actions/clone/Clone.vue +639 -639
  95. package/components/common/vm/actions/clone/lib/config/steps.ts +129 -129
  96. package/components/common/vm/actions/clone/toTemplate/ToTemplate.vue +634 -634
  97. package/components/common/vm/actions/clone/toTemplate/lib/config/steps.ts +116 -116
  98. package/components/common/vm/actions/common/customizeHardware/CustomizeHardware.vue +275 -275
  99. package/components/common/vm/actions/common/customizeHardware/CustomizeHardwareNew.vue +274 -274
  100. package/components/common/vm/actions/common/customizeHardware/CustomizeHardwareOld.vue +177 -177
  101. package/components/common/vm/actions/common/customizeHardware/virtualHardware/VirtualHardware.vue +698 -698
  102. package/components/common/vm/actions/common/customizeHardware/virtualHardware/VirtualHardwareNew.vue +410 -410
  103. package/components/common/vm/actions/common/customizeHardware/virtualHardware/VirtualHardwareOld.vue +319 -319
  104. package/components/common/vm/actions/common/customizeHardware/virtualHardware/browseView/BrowseView.vue +219 -219
  105. package/components/common/vm/actions/common/customizeHardware/virtualHardware/bus/Bus.vue +99 -99
  106. package/components/common/vm/actions/common/customizeHardware/virtualHardware/bus/BusNew.vue +117 -117
  107. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/CdDvdDrive.vue +232 -232
  108. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/CdDvdDriveNew.vue +164 -164
  109. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/CdDvdDriveOld.vue +168 -168
  110. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/Media.vue +25 -25
  111. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/MediaNew.vue +70 -70
  112. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/MediaOld.vue +50 -50
  113. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/Cpu.vue +338 -338
  114. package/components/common/vm/actions/common/customizeHardware/virtualHardware/limit/Limit.vue +220 -220
  115. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/NewHardDisk.vue +368 -368
  116. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/NewHardDiskNew.vue +232 -232
  117. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/NewHardDiskOld.vue +250 -250
  118. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/mode/ModeOld.vue +56 -56
  119. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/sharing/SharingNew.vue +44 -44
  120. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/NewNetwork.vue +286 -286
  121. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/NewNetworkNew.vue +124 -124
  122. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/location/LocationOld.vue +134 -134
  123. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/location/new/New.vue +63 -63
  124. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/location/new/table/lib/config/config.ts +95 -95
  125. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/macAddress/MacAddress.vue +119 -119
  126. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/macAddress/MacAddressNew.vue +69 -69
  127. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/macAddress/MacAddressOld.vue +83 -83
  128. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/NewPciDevice.vue +205 -205
  129. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/directPathIo/DirectPathIoNew.vue +66 -66
  130. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/directPathIo/DirectPathIoOld.vue +62 -62
  131. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/dynamicDirectPathIo/DynamicDirectPathIo.vue +31 -31
  132. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/dynamicDirectPathIo/DynamicDirectPathIoNew.vue +84 -84
  133. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/dynamicDirectPathIo/DynamicDirectPathIoOld.vue +76 -76
  134. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/Note.vue +15 -15
  135. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/NoteNew.vue +42 -42
  136. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/NoteOld.vue +30 -30
  137. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/nvidiaGrid/NvidiaGrid.vue +41 -41
  138. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/nvidiaGrid/NvidiaGridNew.vue +81 -81
  139. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/nvidiaGrid/NvidiaGridOld.vue +84 -84
  140. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newUsbController/NewUsbControllerNew.vue +56 -56
  141. package/components/common/vm/actions/common/customizeHardware/virtualHardware/other/Other.vue +16 -16
  142. package/components/common/vm/actions/common/customizeHardware/virtualHardware/other/OtherNew.vue +30 -30
  143. package/components/common/vm/actions/common/customizeHardware/virtualHardware/videoCard/VideoCardNew.vue +104 -104
  144. package/components/common/vm/actions/common/customizeHardware/virtualHardware/videoCard/VideoCardOld.vue +112 -112
  145. package/components/common/vm/actions/common/customizeHardware/virtualHardware/videoCard/totalVideoMemory/TotalVideoMemoryNew.vue +54 -54
  146. package/components/common/vm/actions/common/customizeHardware/vmoptions/Vmoptions.vue +145 -145
  147. package/components/common/vm/actions/common/customizeHardware/vmoptions/VmoptionsNew.vue +102 -102
  148. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/BootOptionsNew.vue +75 -75
  149. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/delay/Delay.vue +26 -26
  150. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/firmware/Firmware.vue +57 -57
  151. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/firmware/FirmwareNew.vue +42 -42
  152. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/menu/MenuNew.vue +25 -25
  153. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/order/Order.vue +171 -171
  154. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/order/OrderNew.vue +50 -50
  155. package/components/common/vm/actions/common/customizeHardware/vmoptions/generalOptions/GeneralOptionsNew.vue +141 -141
  156. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/New.vue +140 -140
  157. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/copyPaste/CopyPasteNew.vue +30 -30
  158. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/fileTransfer/FileTransferNew.vue +30 -30
  159. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/folderSharing/FolderSharingNew.vue +30 -30
  160. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/keymap/Keymap.vue +32 -32
  161. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/keymap/KeymapNew.vue +39 -39
  162. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/password/Password.vue +103 -103
  163. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/password/PasswordNew.vue +102 -102
  164. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/password/PasswordOld.vue +94 -94
  165. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirection.vue +28 -28
  166. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirectionNew.vue +38 -38
  167. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirectionOld.vue +44 -44
  168. package/components/common/vm/actions/common/select/storage/Storage.vue +130 -130
  169. package/components/common/vm/actions/common/select/storage/StorageOld.vue +129 -129
  170. package/components/common/vm/actions/editSettings/new/Skeleton.vue +88 -88
  171. package/components/common/wizards/datastore/add/lib/config/steps.ts +138 -138
  172. package/components/common/wizards/vm/migrate/Migrate.vue +302 -302
  173. package/components/common/wizards/vm/migrate/lib/config/constructDataReady.ts +220 -220
  174. package/components/common/wizards/vm/migrate/select/network/Network.vue +103 -103
  175. package/components/common/wizards/vm/migrate/select/network/table/network/Network.vue +150 -150
  176. package/components/common/wizards/vm/migrate/select/network/table/network/lib/config/advancedTable.ts +91 -91
  177. package/components/common/wizards/vm/migrate/select/priority/Priority.vue +43 -43
  178. package/composables/productNameLocal.ts +30 -30
  179. package/composables/useAppVersion.ts +21 -21
  180. package/lib/models/interfaces.ts +1 -1
  181. package/package.json +2 -2
  182. package/plugins/date.ts +233 -233
  183. package/plugins/directives.ts +24 -24
  184. package/plugins/recursion.ts +311 -311
  185. package/public/spice-console/lib/images/bitmap.js +203 -203
  186. package/public/spice-console/network/spicechannel.js +383 -383
  187. package/store/main/mutations.ts +7 -7
  188. package/store/main/state.ts +7 -7
  189. package/store/tasks/mappers/recentTasks.ts +64 -64
  190. package/components/common/monitor/advanced/tools/chartOptionsModal/metrics/metricsNew/MetricsNew.vue +0 -101
  191. package/components/common/monitor/advanced/tools/chartOptionsModal/metrics/metricsNew/lib/utils/constructAccordion.ts +0 -32
@@ -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>