bfg-common 1.5.23 → 1.5.24

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