bfg-common 1.5.42 → 1.5.44

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 (197) hide show
  1. package/CODE_STYLE.md +109 -109
  2. package/assets/img/icons/icons-sprite-dark-3.svg +227 -227
  3. package/assets/img/icons/icons-sprite-dark-5.svg +488 -488
  4. package/assets/img/icons/icons-sprite-light-3.svg +227 -227
  5. package/assets/img/icons/icons-sprite-light-5.svg +488 -488
  6. package/assets/scss/common/normalize.scss +339 -339
  7. package/components/atoms/TheIcon3.vue +50 -50
  8. package/components/atoms/collapse/CollapseNav.vue +165 -165
  9. package/components/atoms/dropdown/dropdown/Dropdown.vue +168 -168
  10. package/components/atoms/modal/bySteps/BySteps.vue +253 -253
  11. package/components/atoms/perPage/PerPage.vue +58 -58
  12. package/components/atoms/stack/StackBlock.vue +185 -185
  13. package/components/atoms/table/dataGrid/DataGrid.vue +1 -1
  14. package/components/atoms/table/dataGrid/DataGridColumnSwitch.vue +222 -222
  15. package/components/atoms/table/dataGrid/lib/config/settingsTable.ts +94 -94
  16. package/components/atoms/table/dataGrid/lib/utils/export.ts +16 -16
  17. package/components/atoms/tabs/VerticalTabs.vue +105 -105
  18. package/components/atoms/tooltip/Signpost.vue +227 -227
  19. package/components/common/accordion/Recursion.vue +222 -222
  20. package/components/common/browse/BrowseNew.vue +237 -237
  21. package/components/common/browse/BrowseOld.vue +217 -217
  22. package/components/common/browse/blocks/contents/Files.vue +37 -37
  23. package/components/common/browse/blocks/contents/FilesOld.vue +72 -72
  24. package/components/common/browse/blocks/contents/filesNew/FilesNew.vue +96 -96
  25. package/components/common/browse/blocks/contents/filesNew/Skeleton.vue +18 -18
  26. package/components/common/browse/blocks/lib/models/types.ts +1 -1
  27. package/components/common/browse/lib/models/interfaces.ts +5 -5
  28. package/components/common/context/Context.vue +111 -111
  29. package/components/common/context/lib/models/interfaces.ts +31 -31
  30. package/components/common/context/recursion/Recursion.vue +87 -87
  31. package/components/common/context/recursion/RecursionNew.vue +238 -238
  32. package/components/common/context/recursion/RecursionOld.vue +228 -228
  33. package/components/common/details/DetailsItem.vue +109 -109
  34. package/components/common/diagramMain/DiagramMain.vue +897 -897
  35. package/components/common/diagramMain/Header.vue +214 -214
  36. package/components/common/diagramMain/adapter/AdapterItems.vue +61 -61
  37. package/components/common/diagramMain/lib/config/initial.ts +50 -50
  38. package/components/common/diagramMain/lib/models/types.ts +21 -21
  39. package/components/common/diagramMain/lib/utils/utils.ts +331 -331
  40. package/components/common/diagramMain/modals/editSettings/ConfirmTeamingSettingsModal.vue +40 -40
  41. package/components/common/diagramMain/modals/editSettings/tabs/NetworkProperties.vue +214 -214
  42. package/components/common/diagramMain/modals/editSettings/tabs/Security.vue +189 -189
  43. package/components/common/diagramMain/modals/editSettings/tabs/SwitchProperties.vue +163 -163
  44. package/components/common/diagramMain/modals/editSettings/tabs/TeamingFailover.vue +175 -175
  45. package/components/common/diagramMain/modals/editSettings/tabs/port/IpvFourSettings.vue +346 -346
  46. package/components/common/diagramMain/modals/editSettings/tabs/port/PortProperties.vue +205 -205
  47. package/components/common/diagramMain/modals/lib/config/initial.ts +180 -180
  48. package/components/common/diagramMain/modals/lib/config/vmKernelAdapter.ts +90 -90
  49. package/components/common/diagramMain/modals/lib/mappers/mappers.ts +87 -87
  50. package/components/common/diagramMain/modals/lib/utils/index.ts +24 -24
  51. package/components/common/diagramMain/modals/migrateVmkernelAdapter/lib/config/steps.ts +114 -114
  52. package/components/common/diagramMain/modals/migrateVmkernelAdapter/steps/ConnectionSettings.vue +169 -169
  53. package/components/common/diagramMain/modals/migrateVmkernelAdapter/steps/SelectVmkernelAdapter.vue +159 -159
  54. package/components/common/diagramMain/modals/migrateVmkernelAdapter/validations/common.ts +14 -14
  55. package/components/common/diagramMain/modals/migrateVmkernelAdapter/validations/connectionSettings.ts +137 -137
  56. package/components/common/diagramMain/modals/migrateVmkernelAdapter/validations/selectVmkernelAdapter.ts +52 -52
  57. package/components/common/diagramMain/modals/migrateVmkernelAdapter/validations/validations.ts +19 -19
  58. package/components/common/diagramMain/port/Ports.vue +47 -47
  59. package/components/common/layout/theHeader/helpMenu/About.vue +82 -82
  60. package/components/common/layout/theHeader/helpMenu/aboutNew/AboutNew.vue +103 -103
  61. package/components/common/layout/theHeader/userMenu/modals/preferences/view/ViewOld.vue +112 -112
  62. package/components/common/mainNavigationPanel/MainNavigationPanelNew.vue +336 -336
  63. package/components/common/mainNavigationPanel/MainNavigationPanelOld.vue +311 -311
  64. package/components/common/modals/unsavedChanges/UnsavedChanges.vue +56 -56
  65. package/components/common/monitor/overview/OverviewOld.vue +139 -139
  66. package/components/common/pages/home/StatusContent.vue +49 -49
  67. package/components/common/pages/home/headline/Headline.vue +45 -45
  68. package/components/common/pages/home/headline/HeadlineOld.vue +42 -42
  69. package/components/common/pages/home/lib/models/interfaces.ts +48 -48
  70. package/components/common/pages/home/widgets/Widgets.vue +49 -49
  71. package/components/common/pages/home/widgets/WidgetsNew.vue +86 -86
  72. package/components/common/pages/home/widgets/WidgetsOld.vue +34 -34
  73. package/components/common/pages/home/widgets/hosts/Hosts.vue +27 -27
  74. package/components/common/pages/home/widgets/hosts/lib/config/items.ts +23 -23
  75. package/components/common/pages/home/widgets/vms/Vms.vue +26 -26
  76. package/components/common/pages/home/widgets/vms/VmsOld.vue +35 -35
  77. package/components/common/pages/home/widgets/vms/lib/config/items.ts +19 -19
  78. package/components/common/pages/packages/Packages.vue +208 -208
  79. package/components/common/pages/shortcuts/block/BlockNew.vue +96 -96
  80. package/components/common/pages/shortcuts/block/BlockOld.vue +68 -68
  81. package/components/common/portlets/customAttributes/Portlet.vue +667 -667
  82. package/components/common/portlets/tag/Portlet.vue +433 -433
  83. package/components/common/recursionTree/RecursionTree.vue +223 -223
  84. package/components/common/select/button/ButtonDropdown.vue +108 -108
  85. package/components/common/spiceConsole/Drawer.vue +370 -370
  86. package/components/common/spiceConsole/lib/models/interfaces.ts +5 -5
  87. package/components/common/split/horizontal/HorizontalNew.vue +376 -376
  88. package/components/common/split/horizontal/HorizontalOld.vue +337 -337
  89. package/components/common/split/vertical/Vertical.vue +160 -160
  90. package/components/common/tools/Actions.vue +188 -188
  91. package/components/common/vm/actions/add/Add.vue +774 -772
  92. package/components/common/vm/actions/add/lib/config/steps.ts +247 -247
  93. package/components/common/vm/actions/clone/Clone.vue +798 -668
  94. package/components/common/vm/actions/clone/lib/config/steps.ts +291 -178
  95. package/components/common/vm/actions/clone/toTemplate/ToTemplate.vue +634 -634
  96. package/components/common/vm/actions/clone/toTemplate/lib/config/steps.ts +116 -116
  97. package/components/common/vm/actions/common/customizeHardware/CustomizeHardware.vue +275 -275
  98. package/components/common/vm/actions/common/customizeHardware/CustomizeHardwareNew.vue +274 -274
  99. package/components/common/vm/actions/common/customizeHardware/CustomizeHardwareOld.vue +177 -177
  100. package/components/common/vm/actions/common/customizeHardware/virtualHardware/VirtualHardware.vue +698 -698
  101. package/components/common/vm/actions/common/customizeHardware/virtualHardware/VirtualHardwareNew.vue +410 -410
  102. package/components/common/vm/actions/common/customizeHardware/virtualHardware/VirtualHardwareOld.vue +319 -319
  103. package/components/common/vm/actions/common/customizeHardware/virtualHardware/browseView/BrowseView.vue +219 -219
  104. package/components/common/vm/actions/common/customizeHardware/virtualHardware/bus/Bus.vue +99 -99
  105. package/components/common/vm/actions/common/customizeHardware/virtualHardware/bus/BusNew.vue +117 -117
  106. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/CdDvdDrive.vue +232 -232
  107. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/CdDvdDriveNew.vue +164 -164
  108. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/CdDvdDriveOld.vue +168 -168
  109. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/Media.vue +25 -25
  110. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/MediaNew.vue +70 -70
  111. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/MediaOld.vue +50 -50
  112. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/Cpu.vue +338 -338
  113. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/shares/Shares.vue +140 -140
  114. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/shares/lib/config/options.ts +28 -28
  115. package/components/common/vm/actions/common/customizeHardware/virtualHardware/limit/Limit.vue +220 -220
  116. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/NewHardDisk.vue +368 -368
  117. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/NewHardDiskNew.vue +232 -232
  118. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/NewHardDiskOld.vue +250 -250
  119. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/mode/ModeOld.vue +56 -56
  120. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/sharing/SharingNew.vue +44 -44
  121. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/NewNetwork.vue +286 -286
  122. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/NewNetworkNew.vue +124 -124
  123. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/location/LocationOld.vue +134 -134
  124. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/location/new/New.vue +63 -63
  125. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/location/new/table/lib/config/config.ts +95 -95
  126. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/macAddress/MacAddress.vue +119 -119
  127. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/macAddress/MacAddressNew.vue +69 -69
  128. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/macAddress/MacAddressOld.vue +83 -83
  129. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/NewPciDevice.vue +205 -205
  130. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/directPathIo/DirectPathIoNew.vue +66 -66
  131. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/directPathIo/DirectPathIoOld.vue +62 -62
  132. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/dynamicDirectPathIo/DynamicDirectPathIo.vue +31 -31
  133. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/dynamicDirectPathIo/DynamicDirectPathIoNew.vue +84 -84
  134. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/dynamicDirectPathIo/DynamicDirectPathIoOld.vue +76 -76
  135. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/Note.vue +15 -15
  136. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/NoteNew.vue +42 -42
  137. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/NoteOld.vue +30 -30
  138. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/nvidiaGrid/NvidiaGrid.vue +41 -41
  139. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/nvidiaGrid/NvidiaGridNew.vue +81 -81
  140. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/nvidiaGrid/NvidiaGridOld.vue +84 -84
  141. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newUsbController/NewUsbControllerNew.vue +56 -56
  142. package/components/common/vm/actions/common/customizeHardware/virtualHardware/other/Other.vue +16 -16
  143. package/components/common/vm/actions/common/customizeHardware/virtualHardware/other/OtherNew.vue +30 -30
  144. package/components/common/vm/actions/common/customizeHardware/virtualHardware/videoCard/VideoCardNew.vue +104 -104
  145. package/components/common/vm/actions/common/customizeHardware/virtualHardware/videoCard/VideoCardOld.vue +112 -112
  146. package/components/common/vm/actions/common/customizeHardware/virtualHardware/videoCard/totalVideoMemory/TotalVideoMemoryNew.vue +54 -54
  147. package/components/common/vm/actions/common/customizeHardware/vmoptions/Vmoptions.vue +145 -145
  148. package/components/common/vm/actions/common/customizeHardware/vmoptions/VmoptionsNew.vue +102 -102
  149. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/BootOptionsNew.vue +75 -75
  150. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/delay/Delay.vue +26 -26
  151. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/firmware/Firmware.vue +57 -57
  152. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/firmware/FirmwareNew.vue +42 -42
  153. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/menu/MenuNew.vue +25 -25
  154. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/order/Order.vue +171 -171
  155. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/order/OrderNew.vue +50 -50
  156. package/components/common/vm/actions/common/customizeHardware/vmoptions/generalOptions/GeneralOptionsNew.vue +141 -141
  157. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/New.vue +140 -140
  158. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/copyPaste/CopyPasteNew.vue +30 -30
  159. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/fileTransfer/FileTransferNew.vue +30 -30
  160. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/folderSharing/FolderSharingNew.vue +30 -30
  161. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/keymap/Keymap.vue +32 -32
  162. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/keymap/KeymapNew.vue +39 -39
  163. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/password/Password.vue +103 -103
  164. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/password/PasswordNew.vue +102 -102
  165. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/password/PasswordOld.vue +94 -94
  166. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirection.vue +28 -28
  167. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirectionNew.vue +38 -38
  168. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirectionOld.vue +44 -44
  169. package/components/common/vm/actions/common/lib/models/interfaces.ts +1 -0
  170. package/components/common/vm/actions/common/lib/utils/capabilities.ts +52 -51
  171. package/components/common/vm/actions/common/select/createType/CreateType.vue +74 -74
  172. package/components/common/vm/actions/common/select/storage/Storage.vue +130 -130
  173. package/components/common/vm/actions/common/select/storage/StorageOld.vue +129 -129
  174. package/components/common/vm/actions/common/select/template/Template.vue +65 -65
  175. package/components/common/vm/actions/common/select/template/TemplateTreeView.vue +88 -88
  176. package/components/common/vm/actions/editSettings/new/Skeleton.vue +88 -88
  177. package/components/common/wizards/datastore/add/lib/config/steps.ts +138 -138
  178. package/components/common/wizards/datastore/add/nfs/accessibility/Accessibility.vue +60 -60
  179. package/components/common/wizards/datastore/add/readyComplete/ReadyComplete.vue +92 -92
  180. package/components/common/wizards/network/add/steps/SelectConnectionType.vue +105 -105
  181. package/components/common/wizards/vm/migrate/lib/config/constructDataReady.ts +220 -220
  182. package/components/common/wizards/vm/migrate/select/network/Network.vue +103 -103
  183. package/components/common/wizards/vm/migrate/select/network/table/network/Network.vue +150 -150
  184. package/components/common/wizards/vm/migrate/select/network/table/network/lib/config/advancedTable.ts +91 -91
  185. package/components/common/wizards/vm/migrate/select/priority/Priority.vue +43 -43
  186. package/composables/productNameLocal.ts +30 -30
  187. package/composables/useAppVersion.ts +21 -21
  188. package/lib/models/store/interfaces.ts +1 -0
  189. package/lib/models/store/vm/interfaces.ts +2 -0
  190. package/package.json +1 -1
  191. package/plugins/date.ts +233 -233
  192. package/plugins/directives.ts +24 -24
  193. package/public/spice-console/lib/images/bitmap.js +203 -203
  194. package/public/spice-console/network/spicechannel.js +383 -383
  195. package/store/main/mutations.ts +7 -7
  196. package/store/main/state.ts +7 -7
  197. package/store/tasks/mappers/recentTasks.ts +64 -64
@@ -1,772 +1,774 @@
1
- <template>
2
- <div class="add-vm">
3
- <atoms-wizard
4
- show
5
- :wizard="wizard"
6
- :selected-scheme="selectedScheme"
7
- :title="localization.common.newVirtualMachine2"
8
- :localization="localization"
9
- test-id="new-virtual-machine-wizard"
10
- @change-steps="onChangeSteps"
11
- @hide="onHideModal"
12
- @submit="onFinish"
13
- >
14
- <template #modalBody="{ selectedStep }">
15
- <div class="add-vm-content">
16
- <common-vm-actions-common-select-create-type
17
- v-show="selectedStep.id === dynamicSteps.creationType"
18
- v-model="selectedCreateType"
19
- :import-from-v-m-warev-sphere="props.importFromVMWarevSphere"
20
- />
21
- <common-vm-actions-common-select-template
22
- v-show="selectedStep.id === dynamicSteps.selectTemplate"
23
- :template-submit="templateSubmit"
24
- :templates-tree="props.templatesTree"
25
- @submit="onChangeTemplate"
26
- />
27
- <common-vm-actions-common-select-name
28
- v-show="
29
- selectedStep.id === dynamicSteps.selectName ||
30
- selectedStep.id === dynamicSteps.selectNameFolder
31
- "
32
- :show="
33
- selectedStep.id === dynamicSteps.selectName ||
34
- selectedStep.id === dynamicSteps.selectNameFolder
35
- "
36
- :name-form-submit="nameFormSubmit"
37
- :project="props.project"
38
- :data-center="props.dataCenter"
39
- @submit="onChangeName(...$event)"
40
- @check-name="emits('check-name', $event)"
41
- />
42
- <common-vm-actions-common-select-compute-resource
43
- v-if="isSphere"
44
- v-show="selectedStep.id === dynamicSteps.selectComputeResource"
45
- v-model="vmForm.computeResource"
46
- :compute-resource-submit="computeResourceSubmit"
47
- :data-center="vmForm.dataCenter"
48
- :compute-resource="props.computeResource"
49
- :compute-resource-tree="props.computeResourceTree"
50
- @submit="onChangeComputeResource"
51
- @select-compute-resource-tree="onSelectComputeResourceTree"
52
- @get-compute-resource-tree="
53
- emits('get-compute-resource-tree', $event)
54
- "
55
- @show-compute-resource-tree="
56
- emits('show-compute-resource-tree', $event)
57
- "
58
- @clear-compute-resource-tree="
59
- emits('clear-compute-resource-tree', $event)
60
- "
61
- />
62
- <common-vm-actions-common-select-storage
63
- v-show="selectedStep.id === dynamicSteps.selectStorage"
64
- :storage-submit="storageSubmit"
65
- :datastore="props.datastore"
66
- :get-datastore-table-func="props.getDatastoreTableFunc"
67
- @submit="onChangeStorage"
68
- />
69
- <common-vm-actions-common-select-options
70
- v-show="selectedStep.id === dynamicSteps.selectOptions"
71
- @change="onChangeSelectOptions"
72
- />
73
- <common-vm-actions-common-select-compatibility
74
- v-show="selectedStep.id === dynamicSteps.compatibility"
75
- :options="compatibility"
76
- :error-validation-fields="props.errorValidationFields"
77
- @change="onChangeCompatibility"
78
- @remove-error-by-title="emits('remove-error-by-title', $event)"
79
- />
80
- <common-vm-actions-common-select-os
81
- v-show="
82
- selectedStep.id === dynamicSteps.selectGuestOSMachineType ||
83
- selectedStep.id === dynamicSteps.selectGuestOS
84
- "
85
- v-model:machine-type="vmForm.guestMachineType"
86
- v-model:guest-os-family="vmForm.guestOsFamily"
87
- v-model:guest-os-version="vmForm.guestOsVersion"
88
- :families-options="guestOsFamilies"
89
- :versions-options="guestOsVersions"
90
- :machine-types-options="machineTypes"
91
- :error-validation-fields="props.errorValidationFields"
92
- @remove-error-by-title="emits('remove-error-by-title', $event)"
93
- />
94
- <common-vm-actions-common-customize-hardware
95
- v-show="selectedStep.id === dynamicSteps.customizeHardware"
96
- :project="props.project"
97
- :vm-name="vmForm.name"
98
- :guest-machine-type="vmForm.guestMachineType"
99
- :guest-os-family="vmForm.guestOsFamily"
100
- :guest-os-version="vmForm.guestOsVersion"
101
- :storage="vmForm.storage"
102
- :hard-disks-for-boot-options="virtualHardwareHardDisksLocal"
103
- :cd-dvd-drives-for-boot-options="virtualHardwareCdDvdDrivesLocal"
104
- :networks-for-boot-options="virtualHardwareNetworksLocal"
105
- :cd-dvd-drives="virtualHardwareCdDvdDrivesLocal"
106
- :customize-hardware-submit="customizeHardwareSubmit"
107
- :max-cpus="maxCpus"
108
- :max-memory="maxMemory"
109
- :cpu-models="cpuModels"
110
- :selected-nav-item="selectedNavItem"
111
- :nodes="props.nodes"
112
- :files="props.files"
113
- :networks-table="props.networksTable"
114
- :error-validation-fields="props.errorValidationFields"
115
- :get-datastore-table-func="props.getDatastoreTableFunc"
116
- :datastore="props.datastore"
117
- :vm-cpu-help-text-second="props.vmCpuHelpTextSecond"
118
- :passthrough-devices="props.passthroughDevices"
119
- :mediated-devices="props.mediatedDevices"
120
- :compute-resource="vmForm.computeResource"
121
- @change-boot-order="onChangeBootOrder"
122
- @send-data="onChangeCustomizeHardware"
123
- @get-storage="emits('get-storage', $event)"
124
- @get-folders-or-files="emits('get-folders-or-files', $event)"
125
- @get-active-device-child="emits('get-active-device-child', $event)"
126
- @show-datastore-child="emits('show-datastore-child', $event)"
127
- @remove-error-by-title="emits('remove-error-by-title', $event)"
128
- @get-networks-table="emits('get-networks-table', $event)"
129
- @get-pci-devices="emits('get-pci-devices')"
130
- />
131
- <common-ready-to-complete
132
- v-if="selectedStep.id === dynamicSteps.readyComplete"
133
- :data="props.readyCompleteTableInfo"
134
- />
135
- <span
136
- v-if="selectedStep.id > dynamicSteps.compatibility"
137
- class="vm-hardware-version"
138
- >{{ compatibilityInfo }}</span
139
- >
140
- </div>
141
- </template>
142
-
143
- <template #modalFooterContent>
144
- <div v-if="isShowPowerOn" class="power-on-by-default-wrap">
145
- <input
146
- id="power-on-by-default"
147
- v-model="isPowerOnByDefault"
148
- data-id="power-on-by-default"
149
- type="checkbox"
150
- />
151
- <label for="power-on-by-default" class="label-text-normal">{{
152
- localization.common.powerOnByDefault
153
- }}</label>
154
- </div>
155
- </template>
156
- </atoms-wizard>
157
- </div>
158
- </template>
159
-
160
- <script setup lang="ts">
161
- import type {
162
- UI_I_Localization,
163
- UI_I_ArbitraryObject,
164
- } from '~/lib/models/interfaces'
165
- import type { UI_T_Project } from '~/lib/models/types'
166
- import type { UI_I_FileTreeNode } from '~/components/lib/models/interfaces'
167
- import type { UI_I_NetworkTableItem } from '~/lib/models/store/network/interfaces'
168
- import type {
169
- UI_I_DatastoreTableItem,
170
- UI_I_FolderOrFileTreePayload,
171
- } from '~/lib/models/store/storage/interfaces'
172
- import type {
173
- API_UI_I_Error,
174
- UI_I_ErrorValidationField,
175
- } from '~/lib/models/store/interfaces'
176
- import type { UI_I_TablePayload } from '~/lib/models/table/interfaces'
177
- import type { UI_I_TableInfoItem } from '~/components/atoms/table/info/lib/models/interfaces'
178
- import type {
179
- UI_T_AddVmFinishFunc,
180
- UI_T_SelectedNavItem,
181
- } from '~/components/common/vm/actions/common/lib/models/types'
182
- import type { UI_I_TreeNode } from '~/components/common/recursionTree/lib/models/interfaces'
183
- import type {
184
- UI_I_ValidationReturn,
185
- UI_I_WizardStep,
186
- } from '~/components/atoms/wizard/lib/models/interfaces'
187
- import type {
188
- UI_I_Capabilities,
189
- UI_I_VmForm,
190
- UI_I_VmFormCash,
191
- } from '~/components/common/vm/actions/common/lib/models/interfaces'
192
- import type { UI_I_SendDataCustomizeHardware } from '~/components/common/vm/actions/common/customizeHardware/lib/models/interfaces'
193
- import type { UI_I_OsChange } from '~/components/common/vm/actions/common/select/lib/models/interfaces'
194
- import type {
195
- UI_I_SendDataCpu,
196
- UI_I_SendDataMemory,
197
- UI_I_SendDataNewCdDvdDrive,
198
- UI_I_SendDataNewHardDisk,
199
- UI_I_SendDataNewNetwork,
200
- } from '~/components/common/vm/actions/common/customizeHardware/virtualHardware/lib/models/interfaces'
201
- import type { UI_I_OptionItem } from '~/components/atoms/lib/models/interfaces'
202
- import type { UI_T_ChangeBootOrder } from '~/components/common/vm/actions/lib/models/types'
203
- import type {
204
- UI_I_MediatedDevice,
205
- UI_I_PciDevice,
206
- } from '~/lib/models/store/vm/interfaces'
207
- import { capabilities } from '~/components/common/vm/actions/common/lib/config/capabilities'
208
- import {
209
- stepsSchemeInitial,
210
- stepsFunc,
211
- dynamicSteps,
212
- } from '~/components/common/vm/actions/add/lib/config/steps'
213
- import Wizard from '~/components/atoms/wizard/lib/utils/utils'
214
- import { mapCapabilities } from '~/components/common/vm/actions/common/lib/utils/capabilities'
215
-
216
- const props = defineProps<{
217
- project: UI_T_Project
218
- nodes: UI_I_FileTreeNode[]
219
- files: UI_I_FileTreeNode[]
220
- networksTable: UI_I_NetworkTableItem[]
221
- datastore: UI_I_DatastoreTableItem[]
222
- errorValidationFields: UI_I_ErrorValidationField[]
223
- readyCompleteTableInfo: UI_I_TableInfoItem[]
224
- vmCpuHelpTextSecond: string
225
- importFromVMWarevSphere: string
226
- finishFunc: UI_T_AddVmFinishFunc
227
- getDatastoreTableFunc: (payload: UI_I_TablePayload) => Promise<void>
228
- validateSendDataFunc: UI_T_AddVmFinishFunc<
229
- [UI_T_SelectedNavItem, null | number] | null
230
- >
231
- passthroughDevices: UI_I_PciDevice[]
232
- mediatedDevices: UI_I_MediatedDevice[]
233
- vmNameInWizard: string
234
- templatesTree: UI_I_TreeNode[]
235
- capabilities?: UI_I_Capabilities
236
- dataCenter?: UI_I_TreeNode // для сферы
237
- computeResource?: UI_I_TreeNode // для сферы
238
- computeResourceTree?: UI_I_TreeNode[] // для сферы
239
- }>()
240
-
241
- const emits = defineEmits<{
242
- (event: 'check-name', value: [string, (error: API_UI_I_Error) => void]): void
243
- (event: 'get-storage', value: UI_I_TablePayload): void
244
- (event: 'get-folders-or-files', value: UI_I_FolderOrFileTreePayload): void
245
- (event: 'get-active-device-child', value: UI_I_FileTreeNode): void
246
- (event: 'show-datastore-child', value: UI_I_FileTreeNode): void
247
- (event: 'remove-error-by-title', value: string): void
248
- (event: 'get-networks-table', value: UI_I_TablePayload): void
249
- (event: 'get-pci-devices'): void
250
- (event: 'get-pci-devices'): void
251
- (event: 'hide'): void
252
- (
253
- event: 'get-compute-resource-tree',
254
- value: { id: string | number; cb: () => void }
255
- ): void // для сферы
256
- (event: 'show-compute-resource-tree', value: UI_I_TreeNode): void // для сферы
257
- (event: 'select-compute-resource-tree', value: UI_I_TreeNode): void // для сферы
258
- (event: 'clear-compute-resource-tree'): void // для сферы
259
- }>()
260
-
261
- const { $recursion } = useNuxtApp()
262
-
263
- const localization = computed<UI_I_Localization>(() => useLocal())
264
-
265
- const isSphere = computed<boolean>(() => props.project === 'sphere')
266
-
267
- watch(
268
- () => props.capabilities,
269
- () => {
270
- if (props.capabilities) mapCapabilities(props.capabilities)
271
- },
272
- { deep: true, immediate: true }
273
- )
274
-
275
- const selectedCreateType = ref<string>('0')
276
-
277
- const wizard: Wizard = new Wizard(
278
- stepsFunc(localization.value),
279
- stepsSchemeInitial
280
- )
281
- watch(
282
- selectedCreateType,
283
- (newValue) => {
284
- switch (newValue) {
285
- case '0':
286
- wizard.changeScheme(isSphere.value ? 1 : 0)
287
- break
288
- case '1':
289
- wizard.changeScheme(2)
290
- }
291
- },
292
- { immediate: true }
293
- )
294
- // if (isSphere.value) wizard.changeScheme(1)
295
- const selectedScheme = computed<number[]>(() => wizard.selectedScheme.value)
296
- // const alertMessages = computed<string[][]>(() => wizard.alertMessages.value)
297
-
298
- const isShowPowerOn = computed<boolean>(
299
- () => wizard.selectedStepId > dynamicSteps.customizeHardware
300
- )
301
-
302
- const onChangeSteps = async (value: UI_I_WizardStep[]): Promise<void> => {
303
- wizard.changeSteps(value, validationFunc, validateSendData)
304
- }
305
- const validationFunc = async (
306
- value: UI_I_WizardStep[],
307
- currentStep: UI_I_WizardStep,
308
- nextStep: UI_I_WizardStep
309
- ): Promise<UI_I_ValidationReturn> => {
310
- let stepHasError = false
311
- let stepShouldStop = {
312
- ifOnCurrentStep: false,
313
- ifFromAnyStep: false,
314
- stoppageStepId: -1,
315
- }
316
-
317
- wizard.setLoader(true)
318
- if (
319
- wizard.isValidateForStep(
320
- dynamicSteps.selectTemplate,
321
- currentStep.id,
322
- nextStep.id
323
- )
324
- ) {
325
- const templateValidation = await checkTemplate(value)
326
-
327
- value = templateValidation.newValue
328
- stepHasError = stepHasError || templateValidation.stepHasError
329
- } else if (
330
- wizard.isValidateForStep(
331
- isSphere.value ? dynamicSteps.selectNameFolder : dynamicSteps.selectName,
332
- currentStep.id,
333
- nextStep.id
334
- )
335
- ) {
336
- const nameValidation = await checkName(value)
337
-
338
- value = nameValidation.newValue
339
- stepHasError = stepHasError || nameValidation.stepHasError
340
- } else if (
341
- isSphere.value &&
342
- wizard.isValidateForStep(
343
- dynamicSteps.selectComputeResource,
344
- currentStep.id,
345
- nextStep.id
346
- )
347
- ) {
348
- const computeResourceValidation = await checkComputeResource(value)
349
-
350
- value = computeResourceValidation.newValue
351
- stepHasError = stepHasError || computeResourceValidation.stepHasError
352
- } else if (
353
- wizard.isValidateForStep(
354
- dynamicSteps.selectStorage,
355
- currentStep.id,
356
- nextStep.id
357
- )
358
- ) {
359
- const storageValidation = await checkStorage(value)
360
-
361
- value = storageValidation.newValue
362
-
363
- stepHasError = stepHasError || storageValidation.stepHasError
364
- } else if (
365
- wizard.isValidateForStep(
366
- dynamicSteps.customizeHardware,
367
- currentStep.id,
368
- nextStep.id
369
- )
370
- ) {
371
- const storageValidation = await checkCustomizeHardware(value)
372
-
373
- value = storageValidation.newValue
374
-
375
- stepHasError = stepHasError || storageValidation.stepHasError
376
- }
377
- wizard.setLoader(false)
378
-
379
- return {
380
- newValue: value,
381
- stepHasError,
382
- stepShouldStop,
383
- }
384
- }
385
-
386
- const checkTemplate = async (
387
- value: UI_I_WizardStep[]
388
- ): Promise<UI_I_ValidationReturn> => {
389
- let stepHasError = false
390
-
391
- return new Promise((resolve) => {
392
- templateSubmit.value = (isValid: boolean) => {
393
- if (!isValid) {
394
- stepHasError = wizard.setValidation(
395
- dynamicSteps.selectTemplate,
396
- 'template',
397
- {
398
- fieldMessage: 'aaa',
399
- alertMessage: 'aaa',
400
- }
401
- )
402
- } else if (wizard.hasMessage(dynamicSteps.selectTemplate, 'template')) {
403
- value = wizard.removeValidation(
404
- dynamicSteps.selectTemplate,
405
- 'template',
406
- value
407
- )
408
- }
409
-
410
- resolve({
411
- stepHasError,
412
- newValue: value,
413
- })
414
- templateSubmit.value = null
415
- }
416
- })
417
- }
418
- const checkName = async (
419
- value: UI_I_WizardStep[]
420
- ): Promise<UI_I_ValidationReturn> => {
421
- let stepHasError = false
422
-
423
- return new Promise((resolve) => {
424
- const step = isSphere.value
425
- ? dynamicSteps.selectNameFolder
426
- : dynamicSteps.selectName
427
- nameFormSubmit.value = (isValid: boolean) => {
428
- if (!isValid) {
429
- stepHasError = wizard.setValidation(step, 'name', {
430
- fieldMessage: 'aaa',
431
- alertMessage: 'aaa',
432
- })
433
- } else if (wizard.hasMessage(step, 'name')) {
434
- value = wizard.removeValidation(step, 'name', value)
435
- }
436
-
437
- resolve({
438
- stepHasError,
439
- newValue: value,
440
- })
441
- nameFormSubmit.value = null
442
- }
443
- })
444
- }
445
- const checkComputeResource = async (
446
- value: UI_I_WizardStep[]
447
- ): Promise<UI_I_ValidationReturn> => {
448
- let stepHasError = false
449
-
450
- return new Promise((resolve) => {
451
- computeResourceSubmit.value = (isValid: boolean) => {
452
- if (!isValid) {
453
- stepHasError = wizard.setValidation(
454
- dynamicSteps.selectComputeResource,
455
- 'computeResource',
456
- {
457
- fieldMessage: 'aaa',
458
- alertMessage: 'aaa',
459
- }
460
- )
461
- } else if (
462
- wizard.hasMessage(dynamicSteps.selectComputeResource, 'computeResource')
463
- ) {
464
- value = wizard.removeValidation(
465
- dynamicSteps.selectComputeResource,
466
- 'computeResource',
467
- value
468
- )
469
- }
470
-
471
- resolve({
472
- stepHasError,
473
- newValue: value,
474
- })
475
- computeResourceSubmit.value = null
476
- }
477
- })
478
- }
479
- const checkStorage = async (
480
- value: UI_I_WizardStep[]
481
- ): Promise<UI_I_ValidationReturn> => {
482
- let stepHasError = false
483
-
484
- return new Promise((resolve) => {
485
- storageSubmit.value = (isValid: boolean) => {
486
- if (!isValid) {
487
- stepHasError = wizard.setValidation(
488
- dynamicSteps.selectStorage,
489
- 'storage',
490
- {
491
- fieldMessage: 'aaa',
492
- alertMessage: 'aaa',
493
- }
494
- )
495
- } else if (wizard.hasMessage(dynamicSteps.selectStorage, 'storage')) {
496
- value = wizard.removeValidation(
497
- dynamicSteps.selectStorage,
498
- 'storage',
499
- value
500
- )
501
- }
502
-
503
- resolve({
504
- stepHasError,
505
- newValue: value,
506
- })
507
- storageSubmit.value = null
508
- }
509
- })
510
- }
511
- const checkCustomizeHardware = async (
512
- value: UI_I_WizardStep[]
513
- ): Promise<UI_I_ValidationReturn> => {
514
- let stepHasError = false
515
-
516
- return new Promise((resolve) => {
517
- customizeHardwareSubmit.value = (isValid: boolean) => {
518
- if (!isValid) {
519
- stepHasError = wizard.setValidation(
520
- dynamicSteps.customizeHardware,
521
- 'customizeHardware',
522
- {
523
- fieldMessage: 'aaa',
524
- alertMessage: 'aaa',
525
- }
526
- )
527
- } else if (
528
- wizard.hasMessage(dynamicSteps.customizeHardware, 'customizeHardware')
529
- ) {
530
- value = wizard.removeValidation(
531
- dynamicSteps.customizeHardware,
532
- 'customizeHardware',
533
- value
534
- )
535
- }
536
-
537
- resolve({
538
- stepHasError,
539
- newValue: value,
540
- })
541
- storageSubmit.value = null
542
- }
543
- })
544
- }
545
-
546
- const storageIdCash = ref<string | null>(null)
547
- const vmForm = ref<UI_I_VmForm>({
548
- name: '',
549
- compatibility: '',
550
- guestMachineType: null,
551
- guestOsFamily: null,
552
- guestOsVersion: null,
553
- computeResource: null,
554
- storage: null,
555
- locationPath: '',
556
- dataCenter: null,
557
- })
558
- const vmFormCash = ref<UI_I_VmFormCash>({
559
- dataCenterId: null,
560
- computeResourceTypeAndId: null,
561
- })
562
-
563
- const onChangeName = (name: string, node: UI_I_TreeNode): void => {
564
- vmForm.value.name = name
565
- if (isSphere.value) {
566
- vmForm.value.locationPath = node.id
567
- vmForm.value.dataCenter = $recursion.findParentByValue(
568
- node,
569
- 'datacenter',
570
- 'type',
571
- 'parent'
572
- )
573
- vmFormCash.value.dataCenterId = vmForm.value.dataCenter?.id || null
574
- }
575
- }
576
- // // Для сферы
577
- const computeResourcePath = ref<string>('')
578
- const onSelectComputeResourceTree = (node: UI_I_TreeNode): void => {
579
- emits('select-compute-resource-tree', node)
580
- computeResourcePath.value = node.id
581
- }
582
- const onChangeComputeResource = (node: UI_I_TreeNode): void => {
583
- vmForm.value.computeResource = node
584
- // const type = node.type.toUpperCase()
585
- // schedRequirementsTemplate.value = `sched_requirements="(${type}_ID=${node.id})"\\`
586
- vmFormCash.value.computeResourceTypeAndId = `${node.type}${node.id}` || null
587
- }
588
- const onChangeStorage = (storage: UI_I_DatastoreTableItem | null): void => {
589
- if (!storage) return
590
-
591
- vmForm.value.storage = storage
592
- storageIdCash.value = storage.id
593
- }
594
- const compatibilityInfo = ref<string>('')
595
- const onChangeCompatibility = (compatibility: UI_I_OptionItem): void => {
596
- vmForm.value.compatibility = compatibility.value
597
-
598
- const version = compatibility.value.split('-')[1]
599
- compatibilityInfo.value = `${localization.value.common.compatibility}: ${compatibility.text} (${localization.value.common.vmVersion} ${version})`
600
- }
601
- const customizeHardware = ref<UI_I_SendDataCustomizeHardware | null>(null)
602
- const onChangeCustomizeHardware = (
603
- data: UI_I_SendDataCustomizeHardware
604
- ): void => {
605
- customizeHardware.value = data
606
- }
607
-
608
- const virtualHardwareHardDisksLocal = computed<
609
- UI_I_SendDataNewHardDisk[] | null
610
- >(() => customizeHardware.value?.virtualHardware?.hardDisks || null)
611
- const virtualHardwareNetworksLocal = computed<UI_I_SendDataNewNetwork[] | null>(
612
- () => customizeHardware.value?.virtualHardware?.networks || null
613
- )
614
- const virtualHardwareCdDvdDrivesLocal = computed<
615
- UI_I_SendDataNewCdDvdDrive[] | null
616
- >(() => customizeHardware.value?.virtualHardware?.cdDvdDrives || null)
617
-
618
- const virtualHardwareCpu = computed<UI_I_SendDataCpu | null>(
619
- () => customizeHardware.value?.virtualHardware?.cpu || null
620
- )
621
- const virtualHardwareMemory = computed<UI_I_SendDataMemory | null>(
622
- () => customizeHardware.value?.virtualHardware?.memory || null
623
- )
624
- const virtualHardwareHardDisks = ref<UI_I_SendDataNewHardDisk[] | null>(null)
625
- const virtualHardwareCdDvdDrives = ref<UI_I_SendDataNewCdDvdDrive[] | null>(
626
- null
627
- )
628
- const virtualHardwareNetworks = ref<UI_I_SendDataNewNetwork[] | null>(null)
629
- const onChangeBootOrder = (data: UI_T_ChangeBootOrder): void => {
630
- virtualHardwareHardDisks.value = data[0]
631
- virtualHardwareCdDvdDrives.value = data[1]
632
- virtualHardwareNetworks.value = data[2]
633
- }
634
-
635
- const isPowerOnByDefault = ref<boolean>(true)
636
-
637
- watch(
638
- () => props.vmNameInWizard,
639
- (newValue) => {
640
- vmForm.value.name = newValue
641
- }
642
- )
643
-
644
- const validateSendData = async (
645
- value: UI_I_WizardStep[]
646
- ): Promise<UI_I_ValidationReturn> => {
647
- wizard.setLoader(true)
648
- let stepHasError = false
649
-
650
- const data = await props.validateSendDataFunc(
651
- vmForm.value,
652
- virtualHardwareCpu.value,
653
- virtualHardwareMemory.value,
654
- customizeHardware.value,
655
- virtualHardwareNetworks.value,
656
- virtualHardwareHardDisks.value,
657
- virtualHardwareCdDvdDrives.value,
658
- isPowerOnByDefault.value,
659
- localization.value,
660
- vmForm.value.locationPath, // для сферы
661
- computeResourcePath.value // для сферы
662
- )
663
-
664
- wizard.setLoader(false)
665
- if (data) {
666
- stepHasError = true
667
- selectedNavItem.value = data[0]
668
- data[1] !== null && wizard.selectStepHard(data[1])
669
- }
670
-
671
- return {
672
- stepHasError,
673
- newValue: value,
674
- }
675
- }
676
- const onFinish = (): void => {
677
- wizard.setLoader(false)
678
- props
679
- .finishFunc(
680
- vmForm.value,
681
- virtualHardwareCpu.value,
682
- virtualHardwareMemory.value,
683
- customizeHardware.value,
684
- virtualHardwareNetworks.value,
685
- virtualHardwareHardDisks.value,
686
- virtualHardwareCdDvdDrives.value,
687
- isPowerOnByDefault.value,
688
- localization.value,
689
- vmForm.value.locationPath, // для сферы
690
- computeResourcePath.value, // для сферы
691
- false
692
- )
693
- .then(() => {
694
- onHideModal()
695
- wizard.setLoader(false)
696
- })
697
- }
698
-
699
- const selectedNavItem = ref<UI_T_SelectedNavItem>(0)
700
-
701
- const nameFormSubmit = ref<null | Function>(null)
702
- const templateSubmit = ref<null | Function>(null)
703
- const computeResourceSubmit = ref<null | Function>(null)
704
- const storageSubmit = ref<null | Function>(null)
705
- const customizeHardwareSubmit = ref<null | Function>(null)
706
- const compatibility = ref<UI_I_OptionItem[]>(
707
- capabilities.compatibility.filter((camp) => {
708
- let result = true
709
- // if (isDev && camp.value === 'pvm-2') result = false
710
- if (camp.value === 'pvm-2') result = false
711
- return result
712
- })
713
- )
714
- const guestOsFamilies = ref<UI_I_OptionItem[]>(capabilities.guestOsFamilies)
715
- const guestOsVersions = ref<UI_I_ArbitraryObject<UI_I_OptionItem[]>>(
716
- capabilities.guestOsVersions
717
- )
718
- const machineTypes = ref<UI_I_OptionItem[]>(capabilities.machineTypes)
719
- const cpuModels = ref<UI_I_OptionItem[]>(capabilities.cpuModels)
720
- const maxCpus = ref<number>(capabilities.maxCpus)
721
- const maxMemory = ref<number>(capabilities.maxMemory)
722
-
723
- const selectedTemplate = ref<string>('')
724
- const onChangeTemplate = (id: string): void => {
725
- selectedTemplate.value = id
726
- }
727
- const selectedOptions = ref<string[]>([])
728
- const onChangeSelectOptions = (options: string[]) => {
729
- selectedOptions.value = options
730
- if (
731
- options.includes('customize-os') &&
732
- options.includes('customize-hardware')
733
- ) {
734
- wizard.changeScheme(5)
735
- } else if (options.includes('customize-os')) {
736
- wizard.changeScheme(3)
737
- } else if (options.includes('customize-hardware')) {
738
- wizard.changeScheme(4)
739
- } else {
740
- wizard.changeScheme(2)
741
- }
742
- }
743
-
744
- const onHideModal = (): void => {
745
- emits('hide')
746
- }
747
- </script>
748
-
749
- <style scoped lang="scss">
750
- :deep(.modal-body) {
751
- display: flex;
752
- flex-direction: column;
753
- }
754
- .add-vm-content {
755
- display: flex;
756
- flex-direction: column;
757
- flex: 1;
758
- }
759
- .vm-hardware-version {
760
- align-self: flex-end;
761
- margin-top: auto;
762
- }
763
- .power-on-by-default-wrap {
764
- display: flex;
765
- align-items: center;
766
- margin-right: auto;
767
-
768
- input {
769
- margin-right: 6px;
770
- }
771
- }
772
- </style>
1
+ <template>
2
+ <div class="add-vm">
3
+ <atoms-wizard
4
+ show
5
+ :wizard="wizard"
6
+ :selected-scheme="selectedScheme"
7
+ :title="localization.common.newVirtualMachine2"
8
+ :localization="localization"
9
+ test-id="new-virtual-machine-wizard"
10
+ @change-steps="onChangeSteps"
11
+ @hide="onHideModal"
12
+ @submit="onFinish"
13
+ >
14
+ <template #modalBody="{ selectedStep }">
15
+ <div class="add-vm-content">
16
+ <common-vm-actions-common-select-create-type
17
+ v-show="selectedStep.id === dynamicSteps.creationType"
18
+ v-model="selectedCreateType"
19
+ :import-from-v-m-warev-sphere="props.importFromVMWarevSphere"
20
+ />
21
+ <common-vm-actions-common-select-template
22
+ v-show="selectedStep.id === dynamicSteps.selectTemplate"
23
+ :template-submit="templateSubmit"
24
+ :templates-tree="props.templatesTree"
25
+ @submit="onChangeTemplate"
26
+ />
27
+ <common-vm-actions-common-select-name
28
+ v-show="
29
+ selectedStep.id === dynamicSteps.selectName ||
30
+ selectedStep.id === dynamicSteps.selectNameFolder
31
+ "
32
+ :show="
33
+ selectedStep.id === dynamicSteps.selectName ||
34
+ selectedStep.id === dynamicSteps.selectNameFolder
35
+ "
36
+ :name-form-submit="nameFormSubmit"
37
+ :project="props.project"
38
+ :data-center="props.dataCenter"
39
+ @submit="onChangeName(...$event)"
40
+ @check-name="emits('check-name', $event)"
41
+ />
42
+ <common-vm-actions-common-select-compute-resource
43
+ v-if="isSphere"
44
+ v-show="selectedStep.id === dynamicSteps.selectComputeResource"
45
+ v-model="vmForm.computeResource"
46
+ :compute-resource-submit="computeResourceSubmit"
47
+ :data-center="vmForm.dataCenter"
48
+ :compute-resource="props.computeResource"
49
+ :compute-resource-tree="props.computeResourceTree"
50
+ @submit="onChangeComputeResource"
51
+ @select-compute-resource-tree="onSelectComputeResourceTree"
52
+ @get-compute-resource-tree="
53
+ emits('get-compute-resource-tree', $event)
54
+ "
55
+ @show-compute-resource-tree="
56
+ emits('show-compute-resource-tree', $event)
57
+ "
58
+ @clear-compute-resource-tree="
59
+ emits('clear-compute-resource-tree', $event)
60
+ "
61
+ />
62
+ <common-vm-actions-common-select-storage
63
+ v-show="selectedStep.id === dynamicSteps.selectStorage"
64
+ :storage-submit="storageSubmit"
65
+ :datastore="props.datastore"
66
+ :get-datastore-table-func="props.getDatastoreTableFunc"
67
+ @submit="onChangeStorage"
68
+ />
69
+ <common-vm-actions-common-select-options
70
+ v-show="selectedStep.id === dynamicSteps.selectOptions"
71
+ @change="onChangeSelectOptions"
72
+ />
73
+ <common-vm-actions-common-select-compatibility
74
+ v-show="selectedStep.id === dynamicSteps.compatibility"
75
+ :options="compatibility"
76
+ :error-validation-fields="props.errorValidationFields"
77
+ @change="onChangeCompatibility"
78
+ @remove-error-by-title="emits('remove-error-by-title', $event)"
79
+ />
80
+ <common-vm-actions-common-select-os
81
+ v-show="
82
+ selectedStep.id === dynamicSteps.selectGuestOSMachineType ||
83
+ selectedStep.id === dynamicSteps.selectGuestOS
84
+ "
85
+ v-model:machine-type="vmForm.guestMachineType"
86
+ v-model:guest-os-family="vmForm.guestOsFamily"
87
+ v-model:guest-os-version="vmForm.guestOsVersion"
88
+ :families-options="guestOsFamilies"
89
+ :versions-options="guestOsVersions"
90
+ :machine-types-options="machineTypes"
91
+ :error-validation-fields="props.errorValidationFields"
92
+ @remove-error-by-title="emits('remove-error-by-title', $event)"
93
+ />
94
+ <common-vm-actions-common-customize-hardware
95
+ v-show="selectedStep.id === dynamicSteps.customizeHardware"
96
+ :project="props.project"
97
+ :vm-name="vmForm.name"
98
+ :guest-machine-type="vmForm.guestMachineType"
99
+ :guest-os-family="vmForm.guestOsFamily"
100
+ :guest-os-version="vmForm.guestOsVersion"
101
+ :storage="vmForm.storage"
102
+ :hard-disks-for-boot-options="virtualHardwareHardDisksLocal"
103
+ :cd-dvd-drives-for-boot-options="virtualHardwareCdDvdDrivesLocal"
104
+ :networks-for-boot-options="virtualHardwareNetworksLocal"
105
+ :cd-dvd-drives="virtualHardwareCdDvdDrivesLocal"
106
+ :customize-hardware-submit="customizeHardwareSubmit"
107
+ :max-cpus="maxCpus"
108
+ :max-memory="maxMemory"
109
+ :cpu-models="cpuModels"
110
+ :selected-nav-item="selectedNavItem"
111
+ :nodes="props.nodes"
112
+ :files="props.files"
113
+ :networks-table="props.networksTable"
114
+ :error-validation-fields="props.errorValidationFields"
115
+ :get-datastore-table-func="props.getDatastoreTableFunc"
116
+ :datastore="props.datastore"
117
+ :vm-cpu-help-text-second="props.vmCpuHelpTextSecond"
118
+ :passthrough-devices="props.passthroughDevices"
119
+ :mediated-devices="props.mediatedDevices"
120
+ :compute-resource="vmForm.computeResource"
121
+ @change-boot-order="onChangeBootOrder"
122
+ @send-data="onChangeCustomizeHardware"
123
+ @get-storage="emits('get-storage', $event)"
124
+ @get-folders-or-files="emits('get-folders-or-files', $event)"
125
+ @get-active-device-child="emits('get-active-device-child', $event)"
126
+ @show-datastore-child="emits('show-datastore-child', $event)"
127
+ @remove-error-by-title="emits('remove-error-by-title', $event)"
128
+ @get-networks-table="emits('get-networks-table', $event)"
129
+ @get-pci-devices="emits('get-pci-devices')"
130
+ />
131
+ <common-ready-to-complete
132
+ v-if="selectedStep.id === dynamicSteps.readyComplete"
133
+ :data="props.readyCompleteTableInfo"
134
+ />
135
+ <span
136
+ v-if="selectedStep.id > dynamicSteps.compatibility"
137
+ class="vm-hardware-version"
138
+ >{{ compatibilityInfo }}</span
139
+ >
140
+ </div>
141
+ </template>
142
+
143
+ <template #modalFooterContent>
144
+ <div v-if="isShowPowerOn" class="power-on-by-default-wrap">
145
+ <input
146
+ id="power-on-by-default"
147
+ v-model="isPowerOnByDefault"
148
+ data-id="power-on-by-default"
149
+ type="checkbox"
150
+ />
151
+ <label for="power-on-by-default" class="label-text-normal">{{
152
+ localization.common.powerOnByDefault
153
+ }}</label>
154
+ </div>
155
+ </template>
156
+ </atoms-wizard>
157
+ </div>
158
+ </template>
159
+
160
+ <script setup lang="ts">
161
+ import type {
162
+ UI_I_Localization,
163
+ UI_I_ArbitraryObject,
164
+ } from '~/lib/models/interfaces'
165
+ import type { UI_T_Project } from '~/lib/models/types'
166
+ import type { UI_I_FileTreeNode } from '~/components/lib/models/interfaces'
167
+ import type { UI_I_NetworkTableItem } from '~/lib/models/store/network/interfaces'
168
+ import type {
169
+ UI_I_DatastoreTableItem,
170
+ UI_I_FolderOrFileTreePayload,
171
+ } from '~/lib/models/store/storage/interfaces'
172
+ import type {
173
+ API_UI_I_Error,
174
+ UI_I_ErrorValidationField,
175
+ } from '~/lib/models/store/interfaces'
176
+ import type { UI_I_TablePayload } from '~/lib/models/table/interfaces'
177
+ import type { UI_I_TableInfoItem } from '~/components/atoms/table/info/lib/models/interfaces'
178
+ import type {
179
+ UI_T_AddVmFinishFunc,
180
+ UI_T_SelectedNavItem,
181
+ } from '~/components/common/vm/actions/common/lib/models/types'
182
+ import type { UI_I_TreeNode } from '~/components/common/recursionTree/lib/models/interfaces'
183
+ import type {
184
+ UI_I_ValidationReturn,
185
+ UI_I_WizardStep,
186
+ } from '~/components/atoms/wizard/lib/models/interfaces'
187
+ import type {
188
+ UI_I_Capabilities,
189
+ UI_I_VmForm,
190
+ UI_I_VmFormCash,
191
+ } from '~/components/common/vm/actions/common/lib/models/interfaces'
192
+ import type { UI_I_SendDataCustomizeHardware } from '~/components/common/vm/actions/common/customizeHardware/lib/models/interfaces'
193
+ import type { UI_I_OsChange } from '~/components/common/vm/actions/common/select/lib/models/interfaces'
194
+ import type {
195
+ UI_I_SendDataCpu,
196
+ UI_I_SendDataMemory,
197
+ UI_I_SendDataNewCdDvdDrive,
198
+ UI_I_SendDataNewHardDisk,
199
+ UI_I_SendDataNewNetwork,
200
+ } from '~/components/common/vm/actions/common/customizeHardware/virtualHardware/lib/models/interfaces'
201
+ import type { UI_I_OptionItem } from '~/components/atoms/lib/models/interfaces'
202
+ import type { UI_T_ChangeBootOrder } from '~/components/common/vm/actions/lib/models/types'
203
+ import type {
204
+ UI_I_MediatedDevice,
205
+ UI_I_PciDevice,
206
+ } from '~/lib/models/store/vm/interfaces'
207
+ import { capabilities } from '~/components/common/vm/actions/common/lib/config/capabilities'
208
+ import {
209
+ stepsSchemeInitial,
210
+ stepsFunc,
211
+ dynamicSteps,
212
+ } from '~/components/common/vm/actions/add/lib/config/steps'
213
+ import Wizard from '~/components/atoms/wizard/lib/utils/utils'
214
+ import { mapCapabilities } from '~/components/common/vm/actions/common/lib/utils/capabilities'
215
+
216
+ const props = defineProps<{
217
+ project: UI_T_Project
218
+ nodes: UI_I_FileTreeNode[]
219
+ files: UI_I_FileTreeNode[]
220
+ networksTable: UI_I_NetworkTableItem[]
221
+ datastore: UI_I_DatastoreTableItem[]
222
+ errorValidationFields: UI_I_ErrorValidationField[]
223
+ readyCompleteTableInfo: UI_I_TableInfoItem[]
224
+ vmCpuHelpTextSecond: string
225
+ importFromVMWarevSphere: string
226
+ finishFunc: UI_T_AddVmFinishFunc
227
+ getDatastoreTableFunc: (payload: UI_I_TablePayload) => Promise<void>
228
+ validateSendDataFunc: UI_T_AddVmFinishFunc<
229
+ [UI_T_SelectedNavItem, null | number] | null
230
+ >
231
+ passthroughDevices: UI_I_PciDevice[]
232
+ mediatedDevices: UI_I_MediatedDevice[]
233
+ vmNameInWizard: string
234
+ templatesTree: UI_I_TreeNode[]
235
+ capabilities?: UI_I_Capabilities
236
+ dataCenter?: UI_I_TreeNode // для сферы
237
+ computeResource?: UI_I_TreeNode // для сферы
238
+ computeResourceTree?: UI_I_TreeNode[] // для сферы
239
+ }>()
240
+
241
+ const emits = defineEmits<{
242
+ (event: 'check-name', value: [string, (error: API_UI_I_Error) => void]): void
243
+ (event: 'get-storage', value: UI_I_TablePayload): void
244
+ (event: 'get-folders-or-files', value: UI_I_FolderOrFileTreePayload): void
245
+ (event: 'get-active-device-child', value: UI_I_FileTreeNode): void
246
+ (event: 'show-datastore-child', value: UI_I_FileTreeNode): void
247
+ (event: 'remove-error-by-title', value: string): void
248
+ (event: 'get-networks-table', value: UI_I_TablePayload): void
249
+ (event: 'get-pci-devices'): void
250
+ (event: 'get-pci-devices'): void
251
+ (event: 'hide'): void
252
+ (
253
+ event: 'get-compute-resource-tree',
254
+ value: { id: string | number; cb: () => void }
255
+ ): void // для сферы
256
+ (event: 'show-compute-resource-tree', value: UI_I_TreeNode): void // для сферы
257
+ (event: 'select-compute-resource-tree', value: UI_I_TreeNode): void // для сферы
258
+ (event: 'clear-compute-resource-tree'): void // для сферы
259
+ }>()
260
+
261
+ const { $recursion } = useNuxtApp()
262
+
263
+ const localization = computed<UI_I_Localization>(() => useLocal())
264
+
265
+ const isSphere = computed<boolean>(() => props.project === 'sphere')
266
+
267
+ watch(
268
+ () => props.capabilities,
269
+ () => {
270
+ if (props.capabilities) mapCapabilities(props.capabilities)
271
+ },
272
+ { deep: true, immediate: true }
273
+ )
274
+
275
+ const selectedCreateType = ref<string>('0')
276
+
277
+ const wizard: Wizard = new Wizard(
278
+ stepsFunc(localization.value),
279
+ stepsSchemeInitial
280
+ )
281
+ watch(
282
+ selectedCreateType,
283
+ (newValue) => {
284
+ switch (newValue) {
285
+ case '0':
286
+ wizard.changeScheme(isSphere.value ? 1 : 0)
287
+ break
288
+ case '1':
289
+ wizard.changeScheme(2)
290
+ }
291
+ },
292
+ { immediate: true }
293
+ )
294
+ // if (isSphere.value) wizard.changeScheme(1)
295
+ const selectedScheme = computed<number[]>(() => wizard.selectedScheme.value)
296
+ // const alertMessages = computed<string[][]>(() => wizard.alertMessages.value)
297
+
298
+ const isShowPowerOn = computed<boolean>(
299
+ () => wizard.selectedStepId > dynamicSteps.customizeHardware
300
+ )
301
+
302
+ const onChangeSteps = async (value: UI_I_WizardStep[]): Promise<void> => {
303
+ wizard.changeSteps(value, validationFunc, validateSendData)
304
+ }
305
+ const validationFunc = async (
306
+ value: UI_I_WizardStep[],
307
+ currentStep: UI_I_WizardStep,
308
+ nextStep: UI_I_WizardStep
309
+ ): Promise<UI_I_ValidationReturn> => {
310
+ let stepHasError = false
311
+ let stepShouldStop = {
312
+ ifOnCurrentStep: false,
313
+ ifFromAnyStep: false,
314
+ stoppageStepId: -1,
315
+ }
316
+
317
+ wizard.setLoader(true)
318
+ if (
319
+ wizard.isValidateForStep(
320
+ dynamicSteps.selectTemplate,
321
+ currentStep.id,
322
+ nextStep.id
323
+ )
324
+ ) {
325
+ const templateValidation = await checkTemplate(value)
326
+
327
+ value = templateValidation.newValue
328
+ stepHasError = stepHasError || templateValidation.stepHasError
329
+ } else if (
330
+ wizard.isValidateForStep(
331
+ isSphere.value ? dynamicSteps.selectNameFolder : dynamicSteps.selectName,
332
+ currentStep.id,
333
+ nextStep.id
334
+ )
335
+ ) {
336
+ const nameValidation = await checkName(value)
337
+
338
+ value = nameValidation.newValue
339
+ stepHasError = stepHasError || nameValidation.stepHasError
340
+ } else if (
341
+ isSphere.value &&
342
+ wizard.isValidateForStep(
343
+ dynamicSteps.selectComputeResource,
344
+ currentStep.id,
345
+ nextStep.id
346
+ )
347
+ ) {
348
+ const computeResourceValidation = await checkComputeResource(value)
349
+
350
+ value = computeResourceValidation.newValue
351
+ stepHasError = stepHasError || computeResourceValidation.stepHasError
352
+ } else if (
353
+ wizard.isValidateForStep(
354
+ dynamicSteps.selectStorage,
355
+ currentStep.id,
356
+ nextStep.id
357
+ )
358
+ ) {
359
+ const storageValidation = await checkStorage(value)
360
+
361
+ value = storageValidation.newValue
362
+
363
+ stepHasError = stepHasError || storageValidation.stepHasError
364
+ } else if (
365
+ wizard.isValidateForStep(
366
+ dynamicSteps.customizeHardware,
367
+ currentStep.id,
368
+ nextStep.id
369
+ )
370
+ ) {
371
+ const storageValidation = await checkCustomizeHardware(value)
372
+
373
+ value = storageValidation.newValue
374
+
375
+ stepHasError = stepHasError || storageValidation.stepHasError
376
+ }
377
+ wizard.setLoader(false)
378
+
379
+ return {
380
+ newValue: value,
381
+ stepHasError,
382
+ stepShouldStop,
383
+ }
384
+ }
385
+
386
+ const checkTemplate = async (
387
+ value: UI_I_WizardStep[]
388
+ ): Promise<UI_I_ValidationReturn> => {
389
+ let stepHasError = false
390
+
391
+ return new Promise((resolve) => {
392
+ templateSubmit.value = (isValid: boolean) => {
393
+ if (!isValid) {
394
+ stepHasError = wizard.setValidation(
395
+ dynamicSteps.selectTemplate,
396
+ 'template',
397
+ {
398
+ fieldMessage: 'aaa',
399
+ alertMessage: 'aaa',
400
+ }
401
+ )
402
+ } else if (wizard.hasMessage(dynamicSteps.selectTemplate, 'template')) {
403
+ value = wizard.removeValidation(
404
+ dynamicSteps.selectTemplate,
405
+ 'template',
406
+ value
407
+ )
408
+ }
409
+
410
+ resolve({
411
+ stepHasError,
412
+ newValue: value,
413
+ })
414
+ templateSubmit.value = null
415
+ }
416
+ })
417
+ }
418
+ const checkName = async (
419
+ value: UI_I_WizardStep[]
420
+ ): Promise<UI_I_ValidationReturn> => {
421
+ let stepHasError = false
422
+
423
+ return new Promise((resolve) => {
424
+ const step = isSphere.value
425
+ ? dynamicSteps.selectNameFolder
426
+ : dynamicSteps.selectName
427
+ nameFormSubmit.value = (isValid: boolean) => {
428
+ if (!isValid) {
429
+ stepHasError = wizard.setValidation(step, 'name', {
430
+ fieldMessage: 'aaa',
431
+ alertMessage: 'aaa',
432
+ })
433
+ } else if (wizard.hasMessage(step, 'name')) {
434
+ value = wizard.removeValidation(step, 'name', value)
435
+ }
436
+
437
+ resolve({
438
+ stepHasError,
439
+ newValue: value,
440
+ })
441
+ nameFormSubmit.value = null
442
+ }
443
+ })
444
+ }
445
+ const checkComputeResource = async (
446
+ value: UI_I_WizardStep[]
447
+ ): Promise<UI_I_ValidationReturn> => {
448
+ let stepHasError = false
449
+
450
+ return new Promise((resolve) => {
451
+ computeResourceSubmit.value = (isValid: boolean) => {
452
+ if (!isValid) {
453
+ stepHasError = wizard.setValidation(
454
+ dynamicSteps.selectComputeResource,
455
+ 'computeResource',
456
+ {
457
+ fieldMessage: 'aaa',
458
+ alertMessage: 'aaa',
459
+ }
460
+ )
461
+ } else if (
462
+ wizard.hasMessage(dynamicSteps.selectComputeResource, 'computeResource')
463
+ ) {
464
+ value = wizard.removeValidation(
465
+ dynamicSteps.selectComputeResource,
466
+ 'computeResource',
467
+ value
468
+ )
469
+ }
470
+
471
+ resolve({
472
+ stepHasError,
473
+ newValue: value,
474
+ })
475
+ computeResourceSubmit.value = null
476
+ }
477
+ })
478
+ }
479
+ const checkStorage = async (
480
+ value: UI_I_WizardStep[]
481
+ ): Promise<UI_I_ValidationReturn> => {
482
+ let stepHasError = false
483
+
484
+ return new Promise((resolve) => {
485
+ storageSubmit.value = (isValid: boolean) => {
486
+ if (!isValid) {
487
+ stepHasError = wizard.setValidation(
488
+ dynamicSteps.selectStorage,
489
+ 'storage',
490
+ {
491
+ fieldMessage: 'aaa',
492
+ alertMessage: 'aaa',
493
+ }
494
+ )
495
+ } else if (wizard.hasMessage(dynamicSteps.selectStorage, 'storage')) {
496
+ value = wizard.removeValidation(
497
+ dynamicSteps.selectStorage,
498
+ 'storage',
499
+ value
500
+ )
501
+ }
502
+
503
+ resolve({
504
+ stepHasError,
505
+ newValue: value,
506
+ })
507
+ storageSubmit.value = null
508
+ }
509
+ })
510
+ }
511
+ const checkCustomizeHardware = async (
512
+ value: UI_I_WizardStep[]
513
+ ): Promise<UI_I_ValidationReturn> => {
514
+ let stepHasError = false
515
+
516
+ return new Promise((resolve) => {
517
+ customizeHardwareSubmit.value = (isValid: boolean) => {
518
+ if (!isValid) {
519
+ stepHasError = wizard.setValidation(
520
+ dynamicSteps.customizeHardware,
521
+ 'customizeHardware',
522
+ {
523
+ fieldMessage: 'aaa',
524
+ alertMessage: 'aaa',
525
+ }
526
+ )
527
+ } else if (
528
+ wizard.hasMessage(dynamicSteps.customizeHardware, 'customizeHardware')
529
+ ) {
530
+ value = wizard.removeValidation(
531
+ dynamicSteps.customizeHardware,
532
+ 'customizeHardware',
533
+ value
534
+ )
535
+ }
536
+
537
+ resolve({
538
+ stepHasError,
539
+ newValue: value,
540
+ })
541
+ storageSubmit.value = null
542
+ }
543
+ })
544
+ }
545
+
546
+ const storageIdCash = ref<string | null>(null)
547
+ const vmForm = ref<UI_I_VmForm>({
548
+ name: '',
549
+ compatibility: '',
550
+ guestMachineType: null,
551
+ guestOsFamily: null,
552
+ guestOsVersion: null,
553
+ computeResource: null,
554
+ storage: null,
555
+ locationPath: '',
556
+ dataCenter: null,
557
+ })
558
+
559
+ // TODO remove (not used)
560
+ const vmFormCash = ref<UI_I_VmFormCash>({
561
+ dataCenterId: null,
562
+ computeResourceTypeAndId: null,
563
+ })
564
+
565
+ const onChangeName = (name: string, node: UI_I_TreeNode): void => {
566
+ vmForm.value.name = name
567
+ if (isSphere.value) {
568
+ vmForm.value.locationPath = node.id
569
+ vmForm.value.dataCenter = $recursion.findParentByValue(
570
+ node,
571
+ 'datacenter',
572
+ 'type',
573
+ 'parent'
574
+ )
575
+ vmFormCash.value.dataCenterId = vmForm.value.dataCenter?.id || null
576
+ }
577
+ }
578
+ // // Для сферы
579
+ const computeResourcePath = ref<string>('')
580
+ const onSelectComputeResourceTree = (node: UI_I_TreeNode): void => {
581
+ emits('select-compute-resource-tree', node)
582
+ computeResourcePath.value = node.id
583
+ }
584
+ const onChangeComputeResource = (node: UI_I_TreeNode): void => {
585
+ vmForm.value.computeResource = node
586
+ // const type = node.type.toUpperCase()
587
+ // schedRequirementsTemplate.value = `sched_requirements="(${type}_ID=${node.id})"\\`
588
+ vmFormCash.value.computeResourceTypeAndId = `${node.type}${node.id}` || null
589
+ }
590
+ const onChangeStorage = (storage: UI_I_DatastoreTableItem | null): void => {
591
+ if (!storage) return
592
+
593
+ vmForm.value.storage = storage
594
+ storageIdCash.value = storage.id
595
+ }
596
+ const compatibilityInfo = ref<string>('')
597
+ const onChangeCompatibility = (compatibility: UI_I_OptionItem): void => {
598
+ vmForm.value.compatibility = compatibility.value
599
+
600
+ const version = compatibility.value.split('-')[1]
601
+ compatibilityInfo.value = `${localization.value.common.compatibility}: ${compatibility.text} (${localization.value.common.vmVersion} ${version})`
602
+ }
603
+ const customizeHardware = ref<UI_I_SendDataCustomizeHardware | null>(null)
604
+ const onChangeCustomizeHardware = (
605
+ data: UI_I_SendDataCustomizeHardware
606
+ ): void => {
607
+ customizeHardware.value = data
608
+ }
609
+
610
+ const virtualHardwareHardDisksLocal = computed<
611
+ UI_I_SendDataNewHardDisk[] | null
612
+ >(() => customizeHardware.value?.virtualHardware?.hardDisks || null)
613
+ const virtualHardwareNetworksLocal = computed<UI_I_SendDataNewNetwork[] | null>(
614
+ () => customizeHardware.value?.virtualHardware?.networks || null
615
+ )
616
+ const virtualHardwareCdDvdDrivesLocal = computed<
617
+ UI_I_SendDataNewCdDvdDrive[] | null
618
+ >(() => customizeHardware.value?.virtualHardware?.cdDvdDrives || null)
619
+
620
+ const virtualHardwareCpu = computed<UI_I_SendDataCpu | null>(
621
+ () => customizeHardware.value?.virtualHardware?.cpu || null
622
+ )
623
+ const virtualHardwareMemory = computed<UI_I_SendDataMemory | null>(
624
+ () => customizeHardware.value?.virtualHardware?.memory || null
625
+ )
626
+ const virtualHardwareHardDisks = ref<UI_I_SendDataNewHardDisk[] | null>(null)
627
+ const virtualHardwareCdDvdDrives = ref<UI_I_SendDataNewCdDvdDrive[] | null>(
628
+ null
629
+ )
630
+ const virtualHardwareNetworks = ref<UI_I_SendDataNewNetwork[] | null>(null)
631
+ const onChangeBootOrder = (data: UI_T_ChangeBootOrder): void => {
632
+ virtualHardwareHardDisks.value = data[0]
633
+ virtualHardwareCdDvdDrives.value = data[1]
634
+ virtualHardwareNetworks.value = data[2]
635
+ }
636
+
637
+ const isPowerOnByDefault = ref<boolean>(true)
638
+
639
+ watch(
640
+ () => props.vmNameInWizard,
641
+ (newValue) => {
642
+ vmForm.value.name = newValue
643
+ }
644
+ )
645
+
646
+ const validateSendData = async (
647
+ value: UI_I_WizardStep[]
648
+ ): Promise<UI_I_ValidationReturn> => {
649
+ wizard.setLoader(true)
650
+ let stepHasError = false
651
+
652
+ const data = await props.validateSendDataFunc(
653
+ vmForm.value,
654
+ virtualHardwareCpu.value,
655
+ virtualHardwareMemory.value,
656
+ customizeHardware.value,
657
+ virtualHardwareNetworks.value,
658
+ virtualHardwareHardDisks.value,
659
+ virtualHardwareCdDvdDrives.value,
660
+ isPowerOnByDefault.value,
661
+ localization.value,
662
+ vmForm.value.locationPath, // для сферы
663
+ computeResourcePath.value // для сферы
664
+ )
665
+
666
+ wizard.setLoader(false)
667
+ if (data) {
668
+ stepHasError = true
669
+ selectedNavItem.value = data[0]
670
+ data[1] !== null && wizard.selectStepHard(data[1])
671
+ }
672
+
673
+ return {
674
+ stepHasError,
675
+ newValue: value,
676
+ }
677
+ }
678
+ const onFinish = (): void => {
679
+ wizard.setLoader(false)
680
+ props
681
+ .finishFunc(
682
+ vmForm.value,
683
+ virtualHardwareCpu.value,
684
+ virtualHardwareMemory.value,
685
+ customizeHardware.value,
686
+ virtualHardwareNetworks.value,
687
+ virtualHardwareHardDisks.value,
688
+ virtualHardwareCdDvdDrives.value,
689
+ isPowerOnByDefault.value,
690
+ localization.value,
691
+ vmForm.value.locationPath, // для сферы
692
+ computeResourcePath.value, // для сферы
693
+ false
694
+ )
695
+ .then(() => {
696
+ onHideModal()
697
+ wizard.setLoader(false)
698
+ })
699
+ }
700
+
701
+ const selectedNavItem = ref<UI_T_SelectedNavItem>(0)
702
+
703
+ const nameFormSubmit = ref<null | Function>(null)
704
+ const templateSubmit = ref<null | Function>(null)
705
+ const computeResourceSubmit = ref<null | Function>(null)
706
+ const storageSubmit = ref<null | Function>(null)
707
+ const customizeHardwareSubmit = ref<null | Function>(null)
708
+ const compatibility = ref<UI_I_OptionItem[]>(
709
+ capabilities.compatibility.filter((camp) => {
710
+ let result = true
711
+ // if (isDev && camp.value === 'pvm-2') result = false
712
+ if (camp.value === 'pvm-2') result = false
713
+ return result
714
+ })
715
+ )
716
+ const guestOsFamilies = ref<UI_I_OptionItem[]>(capabilities.guestOsFamilies)
717
+ const guestOsVersions = ref<UI_I_ArbitraryObject<UI_I_OptionItem[]>>(
718
+ capabilities.guestOsVersions
719
+ )
720
+ const machineTypes = ref<UI_I_OptionItem[]>(capabilities.machineTypes)
721
+ const cpuModels = ref<UI_I_OptionItem[]>(capabilities.cpuModels)
722
+ const maxCpus = ref<number>(capabilities.maxCpus)
723
+ const maxMemory = ref<number>(capabilities.maxMemory)
724
+
725
+ const selectedTemplate = ref<string>('')
726
+ const onChangeTemplate = (id: string): void => {
727
+ selectedTemplate.value = id
728
+ }
729
+ const selectedOptions = ref<string[]>([])
730
+ const onChangeSelectOptions = (options: string[]) => {
731
+ selectedOptions.value = options
732
+ if (
733
+ options.includes('customize-os') &&
734
+ options.includes('customize-hardware')
735
+ ) {
736
+ wizard.changeScheme(5)
737
+ } else if (options.includes('customize-os')) {
738
+ wizard.changeScheme(3)
739
+ } else if (options.includes('customize-hardware')) {
740
+ wizard.changeScheme(4)
741
+ } else {
742
+ wizard.changeScheme(2)
743
+ }
744
+ }
745
+
746
+ const onHideModal = (): void => {
747
+ emits('hide')
748
+ }
749
+ </script>
750
+
751
+ <style scoped lang="scss">
752
+ :deep(.modal-body) {
753
+ display: flex;
754
+ flex-direction: column;
755
+ }
756
+ .add-vm-content {
757
+ display: flex;
758
+ flex-direction: column;
759
+ flex: 1;
760
+ }
761
+ .vm-hardware-version {
762
+ align-self: flex-end;
763
+ margin-top: auto;
764
+ }
765
+ .power-on-by-default-wrap {
766
+ display: flex;
767
+ align-items: center;
768
+ margin-right: auto;
769
+
770
+ input {
771
+ margin-right: 6px;
772
+ }
773
+ }
774
+ </style>