bfg-common 1.5.20 → 1.5.21

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 (200) hide show
  1. package/CODE_STYLE.md +109 -109
  2. package/assets/scss/common/normalize.scss +339 -361
  3. package/assets/scss/common/utilities.scss +1 -1
  4. package/components/atoms/TheIcon3.vue +50 -50
  5. package/components/atoms/autocomplete/Autocomplete.vue +3 -3
  6. package/components/atoms/collapse/CollapseNav.vue +165 -165
  7. package/components/atoms/combobox/Combobox.vue +1 -1
  8. package/components/atoms/datepicker/Datepicker.vue +1 -1
  9. package/components/atoms/dropdown/dropdown/Dropdown.vue +168 -168
  10. package/components/atoms/list/dragDropList/DragDropList.vue +1 -1
  11. package/components/atoms/loader/Loader.vue +1 -1
  12. package/components/atoms/loader/PreLoader.vue +1 -1
  13. package/components/atoms/modal/Modal.vue +2 -2
  14. package/components/atoms/modal/bySteps/BySteps.vue +253 -253
  15. package/components/atoms/modal/byStepsSecond/ByStepsSecond.vue +1 -1
  16. package/components/atoms/perPage/PerPage.vue +58 -58
  17. package/components/atoms/popover/Popover.vue +1 -1
  18. package/components/atoms/popup/SimplePopup.vue +1 -1
  19. package/components/atoms/select/TheSelect.vue +1 -1
  20. package/components/atoms/stack/StackBlock.vue +185 -185
  21. package/components/atoms/table/compact/Compact.vue +5 -5
  22. package/components/atoms/table/dataGrid/DataGrid.vue +4 -4
  23. package/components/atoms/table/dataGrid/DataGridColumnSwitch.vue +222 -222
  24. package/components/atoms/table/dataGrid/lib/config/settingsTable.ts +94 -94
  25. package/components/atoms/table/dataGrid/lib/utils/export.ts +16 -16
  26. package/components/atoms/tabs/VerticalTabs.vue +105 -105
  27. package/components/atoms/tooltip/Signpost.vue +1 -1
  28. package/components/atoms/tooltip/Text.vue +1 -1
  29. package/components/atoms/tooltip/Tooltip.vue +1 -1
  30. package/components/atoms/tooltip/TooltipError.vue +1 -1
  31. package/components/atoms/wizard/Wizard.vue +2 -2
  32. package/components/common/accordion/Accordion.vue +1 -1
  33. package/components/common/accordion/Recursion.vue +222 -222
  34. package/components/common/adapterManager/AddAdapterModal.vue +1 -1
  35. package/components/common/browse/BrowseNew.vue +237 -237
  36. package/components/common/browse/BrowseOld.vue +217 -217
  37. package/components/common/browse/blocks/Container.vue +1 -1
  38. package/components/common/browse/blocks/contents/Files.vue +37 -37
  39. package/components/common/browse/blocks/contents/FilesOld.vue +72 -72
  40. package/components/common/browse/blocks/contents/filesNew/FilesNew.vue +96 -96
  41. package/components/common/browse/blocks/contents/filesNew/Skeleton.vue +18 -18
  42. package/components/common/context/Context.vue +111 -111
  43. package/components/common/context/lib/models/interfaces.ts +31 -31
  44. package/components/common/context/recursion/Recursion.vue +87 -87
  45. package/components/common/context/recursion/RecursionNew.vue +238 -238
  46. package/components/common/context/recursion/RecursionOld.vue +228 -228
  47. package/components/common/details/DetailsItem.vue +109 -109
  48. package/components/common/diagramMain/DiagramMain.vue +897 -897
  49. package/components/common/diagramMain/Header.vue +214 -214
  50. package/components/common/diagramMain/modals/ManagePhysicalAdaptersModal.vue +1 -1
  51. package/components/common/diagramMain/modals/editSettings/EditSettings.vue +1 -1
  52. package/components/common/diagramMain/modals/editSettings/EditSettingsModal.vue +1 -1
  53. package/components/common/diagramMain/modals/remove/RemoveModalOld.vue +1 -1
  54. package/components/common/feedback/Buttons.vue +1 -1
  55. package/components/common/feedback/Feedback.vue +1 -1
  56. package/components/common/feedback/Message.vue +3 -3
  57. package/components/common/graph/Graph.vue +104 -104
  58. package/components/common/help/navbar/left/Left.vue +1 -1
  59. package/components/common/layout/theHeader/TheHeaderNew.vue +1 -1
  60. package/components/common/layout/theHeader/TheHeaderOld.vue +1 -1
  61. package/components/common/layout/theHeader/helpMenu/About.vue +82 -82
  62. package/components/common/layout/theHeader/helpMenu/aboutNew/AboutNew.vue +103 -103
  63. package/components/common/layout/theHeader/userMenu/modals/preferences/view/ViewOld.vue +112 -112
  64. package/components/common/mainNavigationPanel/MainNavigationPanelNew.vue +336 -336
  65. package/components/common/mainNavigationPanel/MainNavigationPanelOld.vue +311 -311
  66. package/components/common/modals/unsavedChanges/UnsavedChanges.vue +56 -56
  67. package/components/common/monitor/advanced/graphView/GraphViewOld.vue +1 -1
  68. package/components/common/monitor/advanced/tools/chartOptionsModal/counters/CountersNew.vue +1 -1
  69. package/components/common/monitor/advanced/tools/chartOptionsModal/counters/table/lib/config/utils.ts +1040 -1040
  70. package/components/common/monitor/overview/OverviewOld.vue +139 -139
  71. package/components/common/monitor/resourceAllocation/resourceAllocation.vue +1 -1
  72. package/components/common/pages/home/StatusContent.vue +49 -49
  73. package/components/common/pages/home/headline/Headline.vue +45 -45
  74. package/components/common/pages/home/headline/HeadlineOld.vue +42 -42
  75. package/components/common/pages/home/lib/models/interfaces.ts +48 -48
  76. package/components/common/pages/home/widgets/Widgets.vue +49 -49
  77. package/components/common/pages/home/widgets/WidgetsNew.vue +86 -86
  78. package/components/common/pages/home/widgets/WidgetsOld.vue +34 -34
  79. package/components/common/pages/home/widgets/hosts/Hosts.vue +27 -27
  80. package/components/common/pages/home/widgets/hosts/lib/config/items.ts +23 -23
  81. package/components/common/pages/home/widgets/vms/Vms.vue +26 -26
  82. package/components/common/pages/home/widgets/vms/VmsOld.vue +35 -35
  83. package/components/common/pages/home/widgets/vms/lib/config/items.ts +19 -19
  84. package/components/common/pages/packages/Packages.vue +208 -208
  85. package/components/common/pages/shortcuts/block/BlockNew.vue +96 -96
  86. package/components/common/pages/shortcuts/block/BlockOld.vue +68 -68
  87. package/components/common/pages/tasks/Tasks.vue +1 -1
  88. package/components/common/portlets/customAttributes/Portlet.vue +667 -667
  89. package/components/common/portlets/tag/Portlet.vue +433 -433
  90. package/components/common/recursionTree/RecursionTree.vue +223 -223
  91. package/components/common/select/button/ButtonDropdown.vue +108 -108
  92. package/components/common/spiceConsole/Drawer.vue +370 -370
  93. package/components/common/spiceConsole/lib/models/interfaces.ts +5 -5
  94. package/components/common/split/horizontal/HorizontalNew.vue +376 -376
  95. package/components/common/split/horizontal/HorizontalOld.vue +337 -337
  96. package/components/common/split/vertical/Vertical.vue +160 -160
  97. package/components/common/split/vertical/VerticalNew.vue +2 -2
  98. package/components/common/split/vertical/VerticalOld.vue +1 -1
  99. package/components/common/tools/Actions.vue +188 -188
  100. package/components/common/vm/actions/add/Add.vue +622 -622
  101. package/components/common/vm/actions/clone/Clone.vue +639 -639
  102. package/components/common/vm/actions/clone/lib/config/steps.ts +129 -129
  103. package/components/common/vm/actions/clone/toTemplate/ToTemplate.vue +634 -634
  104. package/components/common/vm/actions/clone/toTemplate/lib/config/steps.ts +116 -116
  105. package/components/common/vm/actions/common/customizeHardware/CustomizeHardware.vue +275 -275
  106. package/components/common/vm/actions/common/customizeHardware/CustomizeHardwareNew.vue +274 -274
  107. package/components/common/vm/actions/common/customizeHardware/CustomizeHardwareOld.vue +177 -177
  108. package/components/common/vm/actions/common/customizeHardware/virtualHardware/VirtualHardware.vue +698 -698
  109. package/components/common/vm/actions/common/customizeHardware/virtualHardware/VirtualHardwareNew.vue +410 -410
  110. package/components/common/vm/actions/common/customizeHardware/virtualHardware/VirtualHardwareOld.vue +319 -319
  111. package/components/common/vm/actions/common/customizeHardware/virtualHardware/browseView/BrowseView.vue +219 -219
  112. package/components/common/vm/actions/common/customizeHardware/virtualHardware/bus/Bus.vue +99 -99
  113. package/components/common/vm/actions/common/customizeHardware/virtualHardware/bus/BusNew.vue +117 -117
  114. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/CdDvdDrive.vue +232 -232
  115. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/CdDvdDriveNew.vue +164 -164
  116. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/CdDvdDriveOld.vue +168 -168
  117. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/Media.vue +25 -25
  118. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/MediaNew.vue +70 -70
  119. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/MediaOld.vue +50 -50
  120. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/Cpu.vue +338 -338
  121. package/components/common/vm/actions/common/customizeHardware/virtualHardware/limit/Limit.vue +220 -220
  122. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/NewHardDisk.vue +368 -368
  123. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/NewHardDiskNew.vue +232 -232
  124. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/NewHardDiskOld.vue +250 -250
  125. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/mode/ModeOld.vue +56 -56
  126. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/sharing/SharingNew.vue +44 -44
  127. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/NewNetwork.vue +286 -286
  128. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/NewNetworkNew.vue +124 -124
  129. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/location/LocationOld.vue +134 -134
  130. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/location/new/New.vue +63 -63
  131. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/location/new/table/lib/config/config.ts +95 -95
  132. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/macAddress/MacAddress.vue +119 -119
  133. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/macAddress/MacAddressNew.vue +69 -69
  134. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/macAddress/MacAddressOld.vue +83 -83
  135. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/NewPciDevice.vue +205 -205
  136. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/directPathIo/DirectPathIoNew.vue +66 -66
  137. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/directPathIo/DirectPathIoOld.vue +62 -62
  138. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/dynamicDirectPathIo/DynamicDirectPathIo.vue +31 -31
  139. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/dynamicDirectPathIo/DynamicDirectPathIoNew.vue +84 -84
  140. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/dynamicDirectPathIo/DynamicDirectPathIoOld.vue +76 -76
  141. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/Note.vue +15 -15
  142. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/NoteNew.vue +42 -42
  143. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/NoteOld.vue +30 -30
  144. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/nvidiaGrid/NvidiaGrid.vue +41 -41
  145. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/nvidiaGrid/NvidiaGridNew.vue +81 -81
  146. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/nvidiaGrid/NvidiaGridOld.vue +84 -84
  147. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newUsbController/NewUsbControllerNew.vue +56 -56
  148. package/components/common/vm/actions/common/customizeHardware/virtualHardware/other/Other.vue +16 -16
  149. package/components/common/vm/actions/common/customizeHardware/virtualHardware/other/OtherNew.vue +30 -30
  150. package/components/common/vm/actions/common/customizeHardware/virtualHardware/videoCard/VideoCardNew.vue +104 -104
  151. package/components/common/vm/actions/common/customizeHardware/virtualHardware/videoCard/VideoCardOld.vue +112 -112
  152. package/components/common/vm/actions/common/customizeHardware/virtualHardware/videoCard/totalVideoMemory/TotalVideoMemoryNew.vue +54 -54
  153. package/components/common/vm/actions/common/customizeHardware/vmoptions/Vmoptions.vue +145 -145
  154. package/components/common/vm/actions/common/customizeHardware/vmoptions/VmoptionsNew.vue +102 -102
  155. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/BootOptionsNew.vue +75 -75
  156. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/delay/Delay.vue +26 -26
  157. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/firmware/Firmware.vue +57 -57
  158. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/firmware/FirmwareNew.vue +42 -42
  159. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/menu/MenuNew.vue +25 -25
  160. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/order/Order.vue +171 -171
  161. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/order/OrderNew.vue +50 -50
  162. package/components/common/vm/actions/common/customizeHardware/vmoptions/generalOptions/GeneralOptionsNew.vue +141 -141
  163. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/New.vue +140 -140
  164. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/copyPaste/CopyPasteNew.vue +30 -30
  165. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/fileTransfer/FileTransferNew.vue +30 -30
  166. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/folderSharing/FolderSharingNew.vue +30 -30
  167. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/keymap/Keymap.vue +32 -32
  168. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/keymap/KeymapNew.vue +39 -39
  169. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/password/Password.vue +103 -103
  170. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/password/PasswordNew.vue +102 -102
  171. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/password/PasswordOld.vue +94 -94
  172. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirection.vue +28 -28
  173. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirectionNew.vue +38 -38
  174. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirectionOld.vue +44 -44
  175. package/components/common/vm/actions/common/select/storage/Storage.vue +130 -130
  176. package/components/common/vm/actions/common/select/storage/StorageOld.vue +129 -129
  177. package/components/common/vm/actions/editSettings/new/Skeleton.vue +88 -88
  178. package/components/common/wizards/datastore/add/lib/config/steps.ts +138 -138
  179. package/components/common/wizards/datastore/add/nfs/accessibility/Accessibility.vue +60 -60
  180. package/components/common/wizards/datastore/add/nfs/configuration/_serversList/DeletePopover.vue +1 -1
  181. package/components/common/wizards/datastore/add/readyComplete/ReadyComplete.vue +92 -92
  182. package/components/common/wizards/datastore/add/sharedStorm/partitionConfiguration/graphicTooltip/graphicTooltip.vue +1 -1
  183. package/components/common/wizards/network/add/steps/SelectConnectionType.vue +105 -105
  184. package/components/common/wizards/vm/migrate/Migrate.vue +302 -302
  185. package/components/common/wizards/vm/migrate/lib/config/constructDataReady.ts +220 -220
  186. package/components/common/wizards/vm/migrate/select/network/Network.vue +103 -103
  187. package/components/common/wizards/vm/migrate/select/network/table/network/Network.vue +150 -150
  188. package/components/common/wizards/vm/migrate/select/network/table/network/lib/config/advancedTable.ts +91 -91
  189. package/components/common/wizards/vm/migrate/select/priority/Priority.vue +43 -43
  190. package/composables/productNameLocal.ts +30 -30
  191. package/composables/useAppVersion.ts +21 -21
  192. package/package.json +2 -2
  193. package/plugins/date.ts +233 -233
  194. package/plugins/directives.ts +24 -24
  195. package/public/spice-console/lib/images/bitmap.js +203 -203
  196. package/public/spice-console/network/spicechannel.js +383 -383
  197. package/store/main/mutations.ts +7 -7
  198. package/store/main/state.ts +7 -7
  199. package/store/tasks/mappers/recentTasks.ts +64 -64
  200. package/package.json~ +0 -42
@@ -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>