bfg-common 1.4.878 → 1.4.879

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