bfg-common 1.5.37 → 1.5.38

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