bfg-common 1.5.39 → 1.5.40

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