bfg-common 1.5.38 → 1.5.40

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