bfg-common 1.5.63 → 1.5.65

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